Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replaced XML settings with JSON settings #318

Merged
merged 7 commits into from Jul 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -28,6 +28,7 @@ matrix:
- libglm-dev
- libglew-dev
- lcov
- rapidjson-dev

services:
- xvfb
Expand Down
7 changes: 6 additions & 1 deletion lcUI/CMakeLists.txt
Expand Up @@ -189,6 +189,10 @@ find_package(Lua 5.2 REQUIRED)
include_directories(${LUA_INCLUDE_DIR})
link_directories(${LUA_LIBRARY_DIRS})

#RapidJSON
find_package(RapidJSON)
include_directories(${RAPIDJSON_INCLUDE_DIRS})

# BUILDING CONFIG
# SEPARATE BUILDING FLAG
set(SEPARATE_BUILD OFF)
Expand Down Expand Up @@ -257,4 +261,5 @@ ${GLEW_LIBRARY})
# INSTALLATION
install(TARGETS librecad DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(DIRECTORY "${CMAKE_SOURCE_DIR}/lcUI/ui" DESTINATION "usr/share/librecad/lcUI")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/default_ui_settings.xml" DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/default_ui_settings.json" DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/settings_schema.json" DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
1 change: 1 addition & 0 deletions lcUI/default_ui_settings.json
@@ -0,0 +1 @@
{"toolbar":{"tabs":[{"label":"Quick Access","groups":[{"label":"Creation","width":3,"buttons":["LineOperations","CircleOperations","ArcOperations","EllipseOperations","LWPolylineOperations","SplineOperations"]},{"label":"Modify","width":3,"buttons":["CopyOperation","MoveOperation","RemoveOperation","RotateOperation","ScaleOperation","TrimOperation"]},{"label":"Dimensions","width":3,"buttons":["DimAlignedOperations","DimAngularOperations","DimDiametricOperations","DimLinearOperations","DimRadialOperations"]},{"label":"Snap Options","width":2,"buttons":["SnapGrid","SnapIntersection","SnapEntity","SnapMiddle"]}]}]}}
34 changes: 0 additions & 34 deletions lcUI/default_ui_settings.xml

This file was deleted.

2 changes: 1 addition & 1 deletion lcUI/lua/guibridge.cpp
Expand Up @@ -242,7 +242,6 @@ void addLuaGUIAPIBindings(lua_State* L) {
.addFunction("addButton", &api::ToolbarTab::addButton)
.addFunction("buttonByText", &api::ToolbarTab::buttonByText)
.addFunction("groupByName", &api::ToolbarTab::groupByName)
.addFunction("removeButton", &api::ToolbarTab::removeButton)
.addFunction("label", &api::ToolbarTab::label)
.addFunction("setLabel", &api::ToolbarTab::setLabel)
.addFunction("groups", &api::ToolbarTab::groups)
Expand Down Expand Up @@ -285,6 +284,7 @@ void addLuaGUIAPIBindings(lua_State* L) {
.addFunction("buttons", &lc::ui::api::ToolbarGroup::buttons)
.addFunction("remove", &lc::ui::api::ToolbarGroup::remove)
.addFunction("setWidth", &lc::ui::api::ToolbarGroup::setWidth)
.addFunction("width", &lc::ui::api::ToolbarGroup::width)
.addOverloadedFunctions("hide", [](lc::ui::api::ToolbarGroup& self) { self.hide(); })
.addOverloadedFunctions("show", [](lc::ui::api::ToolbarGroup& self) { self.show(); })
.addOverloadedFunctions("enable", [](lc::ui::api::ToolbarGroup& self) { self.setEnabled(true); })
Expand Down
9 changes: 5 additions & 4 deletions lcUI/mainwindow.cpp
Expand Up @@ -381,7 +381,7 @@ lc::ui::api::Menu* MainWindow::menuByPosition(int pos) {
return nullptr;
}

return static_cast<lc::ui::api::Menu*>(menuList[pos]->menu());
return dynamic_cast<lc::ui::api::Menu*>(menuList[pos]->menu());
}

void MainWindow::removeFromMenuMap(std::string menuName) {
Expand All @@ -404,14 +404,15 @@ void MainWindow::removeFromMenuMap(std::string menuName) {
void MainWindow::removeMenu(const char* menuLabel) {
lc::ui::api::Menu* menuremove = menuByName(menuLabel);
if (menuremove != nullptr) {
std::cout << "NOt null" << std::endl;
menuremove->remove();
}
menuremove->remove();
}

void MainWindow::removeMenu(int position) {
lc::ui::api::Menu* menuremove = menuByPosition(position);
menuremove->remove();
if (menuremove != nullptr) {
menuremove->remove();
}
}

/* Trigger slots */
Expand Down
89 changes: 72 additions & 17 deletions lcUI/managers/uisettings.cpp
@@ -1,39 +1,94 @@
#include "uisettings.h"
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QFile>

#include <rapidjson/document.h>
#include <rapidjson/schema.h>
#include <rapidjson/ostreamwrapper.h>
#include <rapidjson/istreamwrapper.h>
#include <fstream>

#include <iostream>

using namespace lc::ui;

void UiSettings::writeSettings(widgets::CustomizeToolbar* customizeToolbar) {
QFile settingsFile(settingsFileName);
std::ofstream settingsFile(settingsFileName);

if (!settingsFile.open(QIODevice::WriteOnly)) {
if (settingsFile.fail()) {
std::cout << "File could not be opened" << std::endl;
return;
}

QXmlStreamWriter streamWriter(&settingsFile);

streamWriter.setAutoFormatting(true);
streamWriter.writeStartDocument();
rapidjson::OStreamWrapper osw(settingsFile);
rapidjson::Writer<rapidjson::OStreamWrapper> writer(osw);

customizeToolbar->generateData(&streamWriter);
customizeToolbar->generateData(writer);

streamWriter.writeEndDocument();
settingsFile.close();
}

void UiSettings::readSettings(widgets::CustomizeToolbar* customizeToolbar, bool defaultSettings) {
QString fileName = defaultSettings ? defaultSettingsFileName : settingsFileName;
QFile settingsFile(fileName);
std::string fileName = defaultSettings ? defaultSettingsFileName : settingsFileName;
std::ifstream settingsFile(fileName);

if (!settingsFile.open(QIODevice::ReadOnly)) {
std::cout << "File could not be opened" << std::endl;
while(settingsFile.fail()){
if (fileName == settingsFileName) {
std::cout << "No settings file found, loading default settings." << std::endl;
fileName = defaultSettingsFileName;
settingsFile.open(fileName);
}else{
std::cout << "Default settings not found" << std::endl;
return;
}
}

rapidjson::IStreamWrapper isw(settingsFile);
rapidjson::Document settingsDocument;

if (settingsDocument.ParseStream(isw).HasParseError()) {
std::cout << "Erro with settings document, not in json format" << std::endl;
return;
}

if (!validateSettingsDocument(settingsDocument)) {
settingsFile.close();
return;
}

QXmlStreamReader streamReader(&settingsFile);
customizeToolbar->readData(&streamReader);
customizeToolbar->readData(settingsDocument);

settingsFile.close();
}

bool UiSettings::validateSettingsDocument(rapidjson::Document& inputDocument) {
std::ifstream schemaFile(schemaFileName);

if (schemaFile.fail()) {
std::cout << "Schema file not found" << std::endl;
return true;
}

rapidjson::IStreamWrapper isw(schemaFile);
rapidjson::Document schemaDocument;

if (schemaDocument.ParseStream(isw).HasParseError()) {
std::cout << "Schema file is invalid, not json format." << std::endl;
return true;
}

rapidjson::SchemaDocument schema(schemaDocument);
rapidjson::SchemaValidator validator(schema);

if (!inputDocument.Accept(validator)) {
rapidjson::StringBuffer sb;
validator.GetInvalidSchemaPointer().StringifyUriFragment(sb);
printf("Invalid schema: %s\n", sb.GetString());
printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword());
sb.Clear();
validator.GetInvalidDocumentPointer().StringifyUriFragment(sb);
printf("Invalid document: %s\n", sb.GetString());

return false;
}

return true;
}
13 changes: 11 additions & 2 deletions lcUI/managers/uisettings.h
Expand Up @@ -25,8 +25,17 @@ namespace lc
void readSettings(widgets::CustomizeToolbar* customizeToolbar, bool defaultSettings = false);

private:
const QString settingsFileName = "ui_settings.xml";
const QString defaultSettingsFileName = "default_ui_settings.xml";
/**
* \brief Validates with schema file
* \param input document
* \return bool, true if validates or any problem with schema document, else returns false
*/
bool validateSettingsDocument(rapidjson::Document& inputDocument);

private:
const std::string settingsFileName = "ui_settings.json";
const std::string defaultSettingsFileName = "default_ui_settings.json";
const std::string schemaFileName = "settings_schema.json";
};
}
}
62 changes: 62 additions & 0 deletions lcUI/settings_schema.json
@@ -0,0 +1,62 @@
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"required": [
"toolbar"
],
"title": "Toolbar Data Schema",
"properties": {
"toolbar": {
"type": "object",
"properties": {
"tabs": {
"type": "array",
"items": {
"$ref": "#/definitions/tab"
}
}
}
}
},
"definitions": {
"tab": {
"type": "object",
"required": [
"label"
],
"properties": {
"label": {
"type": "string"
},
"groups": {
"type": "array",
"items": {
"$ref": "#/definitions/group"
}
}
}
},
"group": {
"type": "object",
"required": [
"label"
],
"properties": {
"label": {
"type": "string"
},
"width": {
"type": "number",
"minimum": 0,
"maximum": 10
},
"buttons": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
4 changes: 4 additions & 0 deletions lcUI/widgets/clicommand.cpp
Expand Up @@ -229,6 +229,10 @@ void CliCommand::closeEvent(QCloseEvent* event)

void CliCommand::runCommand(const char* command)
{
if (_commands_cb.find(command) == _commands_cb.end()) {
return;
}

if (!_commands_enabled[command]) {
write(std::string(command) + " command has been disabled.");
return;
Expand Down