diff --git a/builder/builder.cpp b/builder/builder.cpp index 22491b939..a4441c5ec 100644 --- a/builder/builder.cpp +++ b/builder/builder.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -21,7 +21,7 @@ Builder::Builder() { void Builder::setPlatform(const QString &platform) { ProjectManager *project = ProjectManager::instance(); - SettingsManager::instance()->loadSettings(); + EditorSettings::instance()->loadSettings(); if(platform.isEmpty()) { for(QString &it : project->platforms()) { m_Stack.push(it); diff --git a/engine/includes/editor/settingsmanager.h b/engine/includes/editor/editorsettings.h similarity index 65% rename from engine/includes/editor/settingsmanager.h rename to engine/includes/editor/editorsettings.h index 6641fc541..5a188b118 100644 --- a/engine/includes/editor/settingsmanager.h +++ b/engine/includes/editor/editorsettings.h @@ -1,5 +1,5 @@ -#ifndef SETTINGSMANAGER_H -#define SETTINGSMANAGER_H +#ifndef EDITORSETTINGS_H +#define EDITORSETTINGS_H #include #include @@ -8,11 +8,11 @@ class QTranslator; -class ENGINE_EXPORT SettingsManager : public QObject { +class ENGINE_EXPORT EditorSettings : public QObject { Q_OBJECT public: - static SettingsManager *instance(); + static EditorSettings *instance(); static void destroy(); @@ -34,13 +34,13 @@ public slots: bool eventFilter(QObject *obj, QEvent *event); private: - SettingsManager(); + EditorSettings(); - static SettingsManager *m_pInstance; + static EditorSettings *m_pInstance; - QTranslator *m_Translator; - QLocale m_Locale; + QTranslator *m_translator; + QLocale m_locale; }; -#endif // SETTINGSMANAGER_H +#endif // EDITORSETTINGS_H diff --git a/engine/src/editor/settingsmanager.cpp b/engine/src/editor/editorsettings.cpp similarity index 66% rename from engine/src/editor/settingsmanager.cpp rename to engine/src/editor/editorsettings.cpp index 68fb8f399..fc77b9693 100644 --- a/engine/src/editor/settingsmanager.cpp +++ b/engine/src/editor/editorsettings.cpp @@ -1,45 +1,50 @@ -#include "settingsmanager.h" +#include "editorsettings.h" #include #include #include -#include #include #include #include +#include #include #define SETTINGS ".Settings" -SettingsManager *SettingsManager::m_pInstance = nullptr; +EditorSettings *EditorSettings::m_pInstance = nullptr; + +EditorSettings::EditorSettings() : + m_translator(new QTranslator()) { -SettingsManager::SettingsManager() : - m_Translator(new QTranslator()) { installEventFilter(this); + + connect(this, &EditorSettings::updated, this, &EditorSettings::saveSettings); } -SettingsManager *SettingsManager::instance() { +EditorSettings *EditorSettings::instance() { if(!m_pInstance) { - m_pInstance = new SettingsManager; + m_pInstance = new EditorSettings; } return m_pInstance; } -void SettingsManager::destroy() { +void EditorSettings::destroy() { delete m_pInstance; m_pInstance = nullptr; } -void SettingsManager::registerProperty(const char *name, const QVariant &value) { +void EditorSettings::registerProperty(const char *name, const QVariant &value) { int32_t index = dynamicPropertyNames().indexOf(name); if(index == -1) { + blockSignals(true); setProperty(name, value); + blockSignals(false); } } -QVariant SettingsManager::value(const char *name, const QVariant &defaultValue) { +QVariant EditorSettings::value(const char *name, const QVariant &defaultValue) { QVariant result = property(name); if(!result.isValid()) { result = defaultValue; @@ -47,14 +52,14 @@ QVariant SettingsManager::value(const char *name, const QVariant &defaultValue) return result; } -void SettingsManager::setValue(const char *name, const QVariant &value) { - QVariant current = SettingsManager::value(name); +void EditorSettings::setValue(const char *name, const QVariant &value) { + QVariant current = EditorSettings::value(name); if(current != value) { setProperty(name, value); } } -void SettingsManager::loadSettings() { +void EditorSettings::loadSettings() { QSettings settings(COMPANY_NAME, EDITOR_NAME); QVariantMap data = settings.value(SETTINGS).toMap(); @@ -71,6 +76,7 @@ void SettingsManager::loadSettings() { } } else if(userType == QMetaType::type("QLocale")) { QLocale locale(data[it].toString()); + setLanguage(locale); setProperty(it, locale); } else if(userType == QMetaType::Bool) { @@ -85,10 +91,9 @@ void SettingsManager::loadSettings() { } blockSignals(false); - emit updated(); } -void SettingsManager::saveSettings() { +void EditorSettings::saveSettings() { QVariantMap data; for(QByteArray &it : dynamicPropertyNames()) { @@ -101,6 +106,12 @@ void SettingsManager::saveSettings() { } else if(userType == QMetaType::type("QLocale")) { setLanguage(value.value()); data[it] = value.value().name(); + } else if(userType == QMetaType::Bool) { + data[it] = value.toBool(); + } else if(userType == QMetaType::Int) { + data[it] = value.toInt(); + } else if(userType == QMetaType::Float) { + data[it] = value.toFloat(); } else { data[it] = value.toString(); } @@ -110,7 +121,7 @@ void SettingsManager::saveSettings() { settings.setValue(SETTINGS, data); } -bool SettingsManager::eventFilter(QObject *obj, QEvent *event) { +bool EditorSettings::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::DynamicPropertyChange) { emit updated(); return true; @@ -119,11 +130,11 @@ bool SettingsManager::eventFilter(QObject *obj, QEvent *event) { } } -void SettingsManager::setLanguage(const QLocale &locale) { - if(m_Translator && m_Locale != locale) { - m_Locale = locale; - QCoreApplication::removeTranslator(m_Translator); - m_Translator->load(locale, QString(), QString(), ":/Translations"); - QCoreApplication::installTranslator(m_Translator); +void EditorSettings::setLanguage(const QLocale &locale) { + if(m_translator && m_locale != locale) { + m_locale = locale; + QCoreApplication::removeTranslator(m_translator); + m_translator->load(locale, QString(), QString(), ":/Translations"); + QCoreApplication::installTranslator(m_translator); } } diff --git a/engine/src/editor/viewport/viewport.cpp b/engine/src/editor/viewport/viewport.cpp index 9c16de7a6..09fc6d368 100644 --- a/engine/src/editor/viewport/viewport.cpp +++ b/engine/src/editor/viewport/viewport.cpp @@ -29,13 +29,12 @@ #include #include -#include +#include namespace { - const char *postSettings("Graphics/"); - const char *outlineWidth("General/Colors/Outline_Width"); - const char *outlineColor("General/Colors/Outline_Color"); - const char *gridColor("General/Colors/Grid_Color"); + const char *outlineWidth("Viewport/Outline/Width"); + const char *outlineColor("Viewport/Outline/Color"); + const char *gridColor("Viewport/Grid/Color"); } class Outline : public PipelineTask { @@ -64,8 +63,8 @@ class Outline : public PipelineTask { setName("Outline"); - SettingsManager::instance()->registerProperty(outlineWidth, 1.0f); - SettingsManager::instance()->registerProperty(outlineColor, QColor(255, 128, 0, 255)); + EditorSettings::instance()->registerProperty(outlineWidth, 1.0f); + EditorSettings::instance()->registerProperty(outlineColor, QColor(255, 128, 0, 255)); m_inputs.push_back("In"); @@ -73,9 +72,9 @@ class Outline : public PipelineTask { } void loadSettings() { - QColor color = SettingsManager::instance()->property(qPrintable(outlineColor)).value(); + QColor color = EditorSettings::instance()->property(qPrintable(outlineColor)).value(); m_color = Vector4(color.redF(), color.greenF(), color.blueF(), color.alphaF()); - m_width = SettingsManager::instance()->property(qPrintable(outlineWidth)).toFloat(); + m_width = EditorSettings::instance()->property(qPrintable(outlineWidth)).toFloat(); if(m_combineMaterial) { m_combineMaterial->setFloat("width", &m_width); @@ -162,7 +161,7 @@ class GridRender : public PipelineTask { m_grid = m->createInstance(); } - SettingsManager::instance()->registerProperty(gridColor, QColor(102, 102, 102, 102)); + EditorSettings::instance()->registerProperty(gridColor, QColor(102, 102, 102, 102)); m_inputs.push_back("In"); m_inputs.push_back("depthMap"); @@ -175,7 +174,7 @@ class GridRender : public PipelineTask { } void loadSettings() { - QColor color = SettingsManager::instance()->property(gridColor).value(); + QColor color = EditorSettings::instance()->property(gridColor).value(); m_gridColor = Vector4(color.redF(), color.greenF(), color.blueF(), color.alphaF()); } @@ -471,7 +470,7 @@ Viewport::Viewport(QWidget *parent) : setMouseTracking(true); - QObject::connect(SettingsManager::instance(), &SettingsManager::updated, this, &Viewport::onApplySettings); + QObject::connect(EditorSettings::instance(), &EditorSettings::updated, this, &Viewport::onApplySettings); } void Viewport::init() { @@ -517,12 +516,6 @@ void Viewport::init() { pipelineContext->insertRenderTask(m_outlinePass, lastLayer); pipelineContext->insertRenderTask(m_gizmoRender, lastLayer); - for(auto it : pipelineContext->renderTasks()) { - if(!it->name().empty()) { - SettingsManager::instance()->registerProperty(qPrintable(QString(postSettings) + it->name().c_str()), it->isEnabled()); - } - } - Handles::init(); } @@ -565,17 +558,6 @@ void Viewport::onCursorUnset() { } void Viewport::onApplySettings() { - if(m_renderSystem) { - PipelineContext *pipelineContext = m_renderSystem->pipelineContext(); - if(pipelineContext) { - for(auto it : pipelineContext->renderTasks()) { - if(!it->name().empty()) { - bool value = SettingsManager::instance()->property(qPrintable(QString(postSettings) + it->name().c_str())).toBool(); - it->setEnabled(value); - } - } - } - } if(m_outlinePass) { m_outlinePass->loadSettings(); } @@ -769,7 +751,6 @@ void Viewport::onPostEffectChanged(bool checked) { for(auto &it : m_renderSystem->pipelineContext()->renderTasks()) { if(action->data().toString().toStdString() == it->name()) { it->setEnabled(checked); - SettingsManager::instance()->setProperty(qPrintable(QString(postSettings) + it->name().c_str()), checked); } } } diff --git a/modules/editor/qbstools/converter/qbsbuilder.cpp b/modules/editor/qbstools/converter/qbsbuilder.cpp index 8992d3cc3..1c9ce196d 100644 --- a/modules/editor/qbstools/converter/qbsbuilder.cpp +++ b/modules/editor/qbstools/converter/qbsbuilder.cpp @@ -9,7 +9,7 @@ #include #include -#include +#include #include namespace { @@ -50,7 +50,7 @@ QbsBuilder::QbsBuilder() : m_settings << "--settings-dir" << QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/.."; - SettingsManager *settings = SettingsManager::instance(); + EditorSettings *settings = EditorSettings::instance(); settings->registerProperty(gAndroidJava, QVariant::fromValue(QFileInfo("/"))); settings->registerProperty(gAndroidSdk, QVariant::fromValue(QFileInfo("/"))); settings->registerProperty(gAndroidNdk, QVariant::fromValue(QFileInfo("/"))); @@ -80,7 +80,7 @@ bool QbsBuilder::buildProject() { aInfo() << gLabel << "Build started."; ProjectManager *mgr = ProjectManager::instance(); - m_qbsPath = SettingsManager::instance()->value(gQBSPath).value(); + m_qbsPath = EditorSettings::instance()->value(gQBSPath).value(); if(m_qbsPath.absoluteFilePath().isEmpty()) { QString suffix; #if defined(Q_OS_WIN) @@ -150,7 +150,7 @@ bool QbsBuilder::buildProject() { } void QbsBuilder::builderInit() { - SettingsManager *settings = SettingsManager::instance(); + EditorSettings *settings = EditorSettings::instance(); if(!checkProfiles()) { { QProcess qbs(this); @@ -250,21 +250,21 @@ QString QbsBuilder::getProfile(const QString &platform) const { QString profile; if(platform == "desktop") { #if defined(Q_OS_WIN) - SettingsManager *settings = SettingsManager::instance(); + EditorSettings *settings = EditorSettings::instance(); profile = settings->property(gQBSProfile).toString(); if(profile.isEmpty()) { profile = "MSVC2015-amd64"; settings->setProperty(gQBSProfile, profile); } #elif defined(Q_OS_MAC) - SettingsManager *settings = SettingsManager::instance(); + EditorSettings *settings = EditorSettings::instance(); profile = settings->property(gQBSProfile).toString(); if(profile.isEmpty()) { profile = "xcode-macosx-x86_64"; settings->setProperty(gQBSProfile, profile); } #elif defined(Q_OS_UNIX) - SettingsManager *settings = SettingsManager::instance(); + EditorSettings *settings = EditorSettings::instance(); profile = settings->property(gQBSProfile).toString(); if(profile.isEmpty()) { profile = "clang"; diff --git a/modules/editor/texteditor/editor/textwidget.cpp b/modules/editor/texteditor/editor/textwidget.cpp index 17f084b35..8113bd302 100644 --- a/modules/editor/texteditor/editor/textwidget.cpp +++ b/modules/editor/texteditor/editor/textwidget.cpp @@ -19,7 +19,7 @@ #include -#include +#include #include #include @@ -35,6 +35,8 @@ namespace { const char *gSpaces("Editors/Text_Editor/Indents/Use_Spaces"); const char *gTabSize("Editors/Text_Editor/Indents/Tab_Size"); + + const char *gDefaultFont("Source Code Pro"); }; TextWidget::TextWidget(QWidget *parent) : @@ -67,18 +69,18 @@ TextWidget::TextWidget(QWidget *parent) : option.setFlags(option.flags() | QTextOption::AddSpaceForLineAndParagraphSeparators); document()->setDefaultTextOption(option); - SettingsManager *settings = SettingsManager::instance(); - settings->registerProperty(qPrintable(gFont), "Source Code Pro"); - settings->registerProperty(qPrintable(gZoom), QVariant::fromValue(100)); + EditorSettings *settings = EditorSettings::instance(); + settings->registerProperty(gFont, gDefaultFont); + settings->registerProperty(gZoom, QVariant::fromValue(100)); - settings->registerProperty(qPrintable(gLineNumbers), QVariant::fromValue(true)); - settings->registerProperty(qPrintable(gFoldingMarkers), QVariant::fromValue(true)); - settings->registerProperty(qPrintable(gWhitespaces), QVariant::fromValue(false)); + settings->registerProperty(gLineNumbers, QVariant::fromValue(true)); + settings->registerProperty(gFoldingMarkers, QVariant::fromValue(true)); + settings->registerProperty(gWhitespaces, QVariant::fromValue(false)); - settings->registerProperty(qPrintable(gSpaces), QVariant::fromValue(true)); - settings->registerProperty(qPrintable(gTabSize), QVariant::fromValue(4)); + settings->registerProperty(gSpaces, QVariant::fromValue(true)); + settings->registerProperty(gTabSize, QVariant::fromValue(4)); - connect(settings, &SettingsManager::updated, this, &TextWidget::onApplySettings); + connect(settings, &EditorSettings::updated, this, &TextWidget::onApplySettings); onApplySettings(); @@ -832,24 +834,31 @@ void TextWidget::insertFromMimeData(const QMimeData *source) { } void TextWidget::onApplySettings() { - SettingsManager *s = SettingsManager::instance(); - QString name = s->property(qPrintable(gFont)).toString(); + EditorSettings *s = EditorSettings::instance(); + QString name = s->property(gFont).toString(); if(name.isEmpty()) { - name = "Source Code Pro"; + name = gDefaultFont; + s->setProperty(gFont, name); } QFont font(name, 10); font.setFixedPitch(true); setFont(font); - int32_t range = 0.01f * font.pointSize() * s->property(qPrintable(gZoom)).toFloat() - font.pointSize(); + int zoom = s->property(gZoom).toInt(); + if(zoom <= 0) { + zoom = 100; + s->setProperty(gZoom, zoom); + } + + int32_t range = 0.01f * font.pointSize() * float(zoom) - font.pointSize(); zoomIn(range); - displayLineNumbers(s->property(qPrintable(gLineNumbers)).toBool()); - displayFoldingMarkers(s->property(qPrintable(gFoldingMarkers)).toBool()); + displayLineNumbers(s->property(gLineNumbers).toBool()); + displayFoldingMarkers(s->property(gFoldingMarkers).toBool()); - decorateWhitespaces(s->property(qPrintable(gWhitespaces)).toBool()); + decorateWhitespaces(s->property(gWhitespaces).toBool()); - setSpaceTabs(s->property(qPrintable(gSpaces)).toBool(), s->property(qPrintable(gTabSize)).toInt()); + setSpaceTabs(s->property(gSpaces).toBool(), s->property(gTabSize).toInt()); } void TextWidget::onClassModelChanged() { diff --git a/worldeditor/CMakeLists.txt b/worldeditor/CMakeLists.txt index 51fc6dbad..fcda069b9 100644 --- a/worldeditor/CMakeLists.txt +++ b/worldeditor/CMakeLists.txt @@ -20,7 +20,9 @@ file(GLOB ${PROJECT_NAME}_srcFiles "src/screens/componentbrowser/*.cpp" "src/screens/consoleoutput/*.cpp" "src/screens/contentbrowser/*.cpp" + "src/screens/editorsettings/*.cpp" "src/screens/objecthierarchy/*.cpp" + "src/screens/projectsettings/*.cpp" "src/screens/propertyedit/*.cpp" "src/screens/propertyedit/custom/alignment/*.cpp" "src/screens/propertyedit/custom/array/*.cpp" @@ -59,7 +61,9 @@ file(GLOB ${PROJECT_NAME}_ui "src/screens/componentbrowser/*.ui" "src/screens/consoleoutput/*.ui" "src/screens/contentbrowser/*.ui" + "src/screens/editorsettings/*.ui" "src/screens/objecthierarchy/*.ui" + "src/screens/projectsettings/*.ui" "src/screens/propertyedit/*.ui" "src/screens/propertyedit/custom/alignment/*.ui" "src/screens/propertyedit/custom/array/*.ui" @@ -89,7 +93,9 @@ file(GLOB MOC_HEADERS "src/screens/componentbrowser/*.h" "src/screens/consoleoutput/*.h" "src/screens/contentbrowser/*.h" + "src/screens/editorsettings/*.h" "src/screens/objecthierarchy/*.h" + "src/screens/projectsettings/*.h" "src/screens/propertyedit/*.h" "src/screens/propertyedit/custom/alignment/*.h" "src/screens/propertyedit/custom/array/*.h" diff --git a/worldeditor/res/styles/dark/style.qss b/worldeditor/res/styles/dark/style.qss index 926096154..469593f89 100644 --- a/worldeditor/res/styles/dark/style.qss +++ b/worldeditor/res/styles/dark/style.qss @@ -381,7 +381,7 @@ QProgressBar::chunk { } QCheckBox { - padding: 2px 2px; + padding: 1px 1px; } QCheckBox:unchecked { background: #00000000; diff --git a/worldeditor/src/main.cpp b/worldeditor/src/main.cpp index 92aafcd74..93e7cd283 100644 --- a/worldeditor/src/main.cpp +++ b/worldeditor/src/main.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include diff --git a/worldeditor/src/main/mainwindow.cpp b/worldeditor/src/main/mainwindow.cpp index ea9616449..581b3e1c9 100644 --- a/worldeditor/src/main/mainwindow.cpp +++ b/worldeditor/src/main/mainwindow.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include "documentmodel.h" @@ -38,6 +38,8 @@ #include "screens/componentbrowser/componentmodel.h" #include "screens/propertyedit/propertyeditor.h" #include "screens/objecthierarchy/hierarchybrowser.h" +#include "screens/projectsettings/projectsettings.h" +#include "screens/editorsettings/editorsettingsbrowser.h" #include "screens/scenecomposer/scenecomposer.h" #include "screens/preview/preview.h" @@ -59,6 +61,7 @@ MainWindow::MainWindow(Engine *engine, QWidget *parent) : m_projectModel(new ProjectModel), m_feedManager(new FeedManager), m_documentModel(nullptr), + m_editorSettings(new EditorSettingsBrowser(this)), m_undo(nullptr), m_redo(nullptr), m_preview(nullptr), @@ -75,7 +78,7 @@ MainWindow::MainWindow(Engine *engine, QWidget *parent) : qmlRegisterType("com.frostspear.thunderengine", 1, 0, "ProjectModel"); - SettingsManager::instance()->registerProperty("General/Language", QLocale()); + EditorSettings::instance()->registerProperty("General/Language", QLocale()); ui->setupUi(this); @@ -85,12 +88,6 @@ MainWindow::MainWindow(Engine *engine, QWidget *parent) : connect(ui->playButton, &QPushButton::clicked, this, &MainWindow::on_actionPlay_triggered); connect(ui->pauseButton, &QPushButton::clicked, this, &MainWindow::on_actionPause_triggered); - ui->projectWidget->setWindowTitle(tr("Project Settings")); - ui->projectWidget->setWindowIcon(QIcon(":/Style/styles/dark/icons/gear.png")); - - ui->preferencesWidget->setWindowTitle(tr("Editor Preferences")); - ui->preferencesWidget->setWindowIcon(QIcon(":/Style/styles/dark/icons/equalizer.png")); - m_undo = UndoManager::instance()->createUndoAction(ui->menuEdit); m_undo->setShortcut(QKeySequence("Ctrl+Z")); ui->menuEdit->insertAction(ui->actionPlay, m_undo); @@ -127,10 +124,11 @@ MainWindow::MainWindow(Engine *engine, QWidget *parent) : ui->toolPanel->setVisible(false); ui->toolWidget->setVisible(false); - ui->toolWidget->addToolWindow(ui->contentBrowser, QToolWindowManager::NoArea); - ui->toolWidget->addToolWindow(ui->consoleOutput, QToolWindowManager::NoArea); - ui->toolWidget->addToolWindow(ui->projectWidget, QToolWindowManager::NoArea); - ui->toolWidget->addToolWindow(ui->preferencesWidget, QToolWindowManager::NoArea); + ui->toolWidget->addToolWindow(ui->contentBrowser, QToolWindowManager::NoArea); + ui->toolWidget->addToolWindow(ui->consoleOutput, QToolWindowManager::NoArea); + + ui->toolWidget->addToolWindow(new ProjectSettings(this), QToolWindowManager::NoArea); + ui->toolWidget->addToolWindow(m_editorSettings, QToolWindowManager::NoArea); connect(AssetManager::instance(), &AssetManager::buildSuccessful, ComponentModel::instance(), &ComponentModel::update); @@ -224,9 +222,6 @@ void MainWindow::closeEvent(QCloseEvent *event) { settings.setValue(str, QString::fromStdString(Json::save(editors))); } - // Save editor preferences - SettingsManager::instance()->saveSettings(); - // Save workspace settings.setValue(gGeometry, saveGeometry()); settings.setValue(gWindows, ui->toolWidget->saveState()); @@ -317,24 +312,24 @@ void MainWindow::onOpenProject(const QString &path) { ProjectManager::instance()->loadPlatforms(); // Read settings early for converters - SettingsManager::instance()->loadSettings(); + EditorSettings::instance()->loadSettings(); m_forceReimport = false; QString projectSDK = ProjectManager::instance()->projectSdk(); - if(projectSDK != SDK_VERSION) { - m_forceReimport = true; - } - - Engine::file()->fsearchPathAdd(qPrintable(ProjectManager::instance()->importPath()), true); - if(!PluginManager::instance()->rescanProject(ProjectManager::instance()->pluginsPath())) { AssetManager::instance()->rebuild(); } + Engine::file()->fsearchPathAdd(qPrintable(ProjectManager::instance()->importPath()), true); + m_forceReimport |= !Engine::reloadBundle(); PluginManager::instance()->initSystems(); + if(projectSDK != SDK_VERSION) { + m_forceReimport = true; + } + AssetManager::instance()->rescan(m_forceReimport); for(QString &it : ProjectManager::instance()->platforms()) { @@ -378,6 +373,9 @@ void MainWindow::onImportFinished() { m_preview = new Preview(this); + EditorSettings::instance()->loadSettings(); + m_editorSettings->onSettingsUpdated(); + addGadget(new PropertyEditor(this)); addGadget(new HierarchyBrowser(this)); for(auto &it : PluginManager::instance()->extensions("gadget")) { @@ -442,10 +440,6 @@ void MainWindow::onImportFinished() { disconnect(m_queue, nullptr, this, nullptr); ComponentModel::instance()->update(); - SettingsManager::instance()->loadSettings(); - - ui->projectWidget->onItemsSelected({ProjectManager::instance()}); - ui->preferencesWidget->onItemsSelected({SettingsManager::instance()}); ui->actionNew->setEnabled(true); ui->actionOpen->setEnabled(true); diff --git a/worldeditor/src/main/mainwindow.h b/worldeditor/src/main/mainwindow.h index a3d1bf4f2..855bcb329 100644 --- a/worldeditor/src/main/mainwindow.h +++ b/worldeditor/src/main/mainwindow.h @@ -21,6 +21,8 @@ class Preview; class AssetEditor; class EditorGadget; +class EditorSettingsBrowser; + namespace Ui { class MainWindow; } @@ -76,6 +78,8 @@ public slots: FeedManager *m_feedManager; DocumentModel *m_documentModel; + EditorSettingsBrowser *m_editorSettings; + QAction *m_undo; QAction *m_redo; diff --git a/worldeditor/src/main/mainwindow.ui b/worldeditor/src/main/mainwindow.ui index 30a899bf5..25865a1b6 100644 --- a/worldeditor/src/main/mainwindow.ui +++ b/worldeditor/src/main/mainwindow.ui @@ -152,16 +152,6 @@ - - - - 210 - 0 - 201 - 201 - - - @@ -178,16 +168,6 @@ - - - - 630 - 0 - 201 - 201 - - - @@ -515,12 +495,6 @@
screens/consoleoutput/consolemanager.h
1 - - PropertyEditor - QWidget -
screens/propertyedit/propertyeditor.h
- 1 -
diff --git a/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp new file mode 100644 index 000000000..88f24bdb6 --- /dev/null +++ b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.cpp @@ -0,0 +1,74 @@ +#include "editorsettingsbrowser.h" +#include "ui_editorsettingsbrowser.h" + +#include +#include +#include + +#include + +class StringListModel : public QStringListModel { + QVariant data(const QModelIndex &index, int role) const { + switch(role) { + case Qt::BackgroundRole: { + return QApplication::palette("QTreeView").brush(QPalette::Normal, QPalette::Button).color(); + } break; + case Qt::FontRole: { + QFont font = QApplication::font("QTreeView"); + font.setBold(true); + font.setPointSize(10); + return font; + } break; + case Qt::SizeHintRole: { + return QSize(1, 26); + } + default: break; + } + + return QStringListModel::data(index, role); + } + + Qt::ItemFlags flags(const QModelIndex &index) const { + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; + } +}; + +EditorSettingsBrowser::EditorSettingsBrowser(QWidget *parent) : + QWidget(parent), + ui(new Ui::EditorSettingsBrowser), + m_groupModel(new StringListModel) { + + ui->setupUi(this); + + ui->groups->setModel(m_groupModel); +} + +EditorSettingsBrowser::~EditorSettingsBrowser() { + delete ui; +} + +void EditorSettingsBrowser::onSettingsUpdated() { + ui->propertiesWidget->onItemsSelected({EditorSettings::instance()}); + + QStringList groups; + QAbstractItemModel *m = ui->propertiesWidget->model(); + for(uint32_t i = 0; i < m->rowCount(); i++) { + QModelIndex index = m->index(i, 0, QModelIndex()); + groups << m->data(index).toString(); + } + + static_cast(m_groupModel)->setStringList(groups); + + ui->propertiesWidget->setGroup(groups.front()); + ui->groups->setCurrentIndex(m_groupModel->index(0, 0)); +} + +void EditorSettingsBrowser::changeEvent(QEvent *event) { + if(event->type() == QEvent::LanguageChange) { + ui->retranslateUi(this); + } +} + +void EditorSettingsBrowser::on_groups_clicked(const QModelIndex &index) { + ui->propertiesWidget->setGroup(ui->groups->model()->data(index).toString()); +} diff --git a/worldeditor/src/screens/editorsettings/editorsettingsbrowser.h b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.h new file mode 100644 index 000000000..38ed9a995 --- /dev/null +++ b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.h @@ -0,0 +1,32 @@ +#ifndef EDITORSETTINGSBROWSER_H +#define EDITORSETTINGSBROWSER_H + +#include + +namespace Ui { + class EditorSettingsBrowser; +} + +class QAbstractItemModel; + +class EditorSettingsBrowser : public QWidget { + Q_OBJECT +public: + explicit EditorSettingsBrowser(QWidget *parent = 0); + ~EditorSettingsBrowser(); + + void onSettingsUpdated(); + +private slots: + void on_groups_clicked(const QModelIndex &index); + +private: + void changeEvent(QEvent *event) override; + + Ui::EditorSettingsBrowser *ui; + + QAbstractItemModel *m_groupModel; + +}; + +#endif // EDITORSETTINGSBROWSER_H diff --git a/worldeditor/src/screens/editorsettings/editorsettingsbrowser.ui b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.ui new file mode 100644 index 000000000..6e0fbe128 --- /dev/null +++ b/worldeditor/src/screens/editorsettings/editorsettingsbrowser.ui @@ -0,0 +1,67 @@ + + + EditorSettingsBrowser + + + + 0 + 0 + 800 + 600 + + + + Editor Preferences + + + + :/Style/styles/dark/icons/equalizer.png:/Style/styles/dark/icons/equalizer.png + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + 200 + 0 + + + + + 200 + 16777215 + + + + + + + + + + + + PropertyEditor + QWidget +
screens/propertyedit/propertyeditor.h
+ 1 +
+
+ + + + + +
diff --git a/worldeditor/src/screens/projectsettings/projectsettings.cpp b/worldeditor/src/screens/projectsettings/projectsettings.cpp new file mode 100644 index 000000000..baaa5fbb1 --- /dev/null +++ b/worldeditor/src/screens/projectsettings/projectsettings.cpp @@ -0,0 +1,30 @@ +#include "projectsettings.h" +#include "ui_projectsettings.h" + +#include +#include + +#include + +ProjectSettings::ProjectSettings(QWidget *parent) : + QWidget(parent), + ui(new Ui::ProjectSettings) { + + ui->setupUi(this); + + connect(ProjectManager::instance(), &ProjectManager::updated, this, &ProjectSettings::onSettingsUpdated); +} + +ProjectSettings::~ProjectSettings() { + delete ui; +} + +void ProjectSettings::onSettingsUpdated() { + ui->projectWidget->onItemsSelected({ProjectManager::instance()}); +} + +void ProjectSettings::changeEvent(QEvent *event) { + if(event->type() == QEvent::LanguageChange) { + ui->retranslateUi(this); + } +} diff --git a/worldeditor/src/screens/projectsettings/projectsettings.h b/worldeditor/src/screens/projectsettings/projectsettings.h new file mode 100644 index 000000000..20d5f3f83 --- /dev/null +++ b/worldeditor/src/screens/projectsettings/projectsettings.h @@ -0,0 +1,26 @@ +#ifndef PROJECTSETTINGS_H +#define PROJECTSETTINGS_H + +#include + +namespace Ui { + class ProjectSettings; +} + +class ProjectSettings : public QWidget { + Q_OBJECT +public: + explicit ProjectSettings(QWidget *parent = 0); + ~ProjectSettings(); + +private slots: + void onSettingsUpdated(); + +private: + void changeEvent(QEvent *event) override; + + Ui::ProjectSettings *ui; + +}; + +#endif // PROJECTSETTINGS_H diff --git a/worldeditor/src/screens/projectsettings/projectsettings.ui b/worldeditor/src/screens/projectsettings/projectsettings.ui new file mode 100644 index 000000000..e7a97691b --- /dev/null +++ b/worldeditor/src/screens/projectsettings/projectsettings.ui @@ -0,0 +1,51 @@ + + + ProjectSettings + + + + 0 + 0 + 800 + 600 + + + + Project Settings + + + + :/Style/styles/dark/icons/gear.png:/Style/styles/dark/icons/gear.png + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + PropertyEditor + QWidget +
screens/propertyedit/propertyeditor.h
+ 1 +
+
+ + + + + +
diff --git a/worldeditor/src/screens/propertyedit/custom/array/arrayelement.ui b/worldeditor/src/screens/propertyedit/custom/array/arrayelement.ui index ed4186bb1..719b0f8d6 100644 --- a/worldeditor/src/screens/propertyedit/custom/array/arrayelement.ui +++ b/worldeditor/src/screens/propertyedit/custom/array/arrayelement.ui @@ -21,7 +21,7 @@ - 0 + 6 0 diff --git a/worldeditor/src/screens/propertyedit/custom/color/coloredit.cpp b/worldeditor/src/screens/propertyedit/custom/color/coloredit.cpp index 7e4aa6b72..1f9442c6b 100644 --- a/worldeditor/src/screens/propertyedit/custom/color/coloredit.cpp +++ b/worldeditor/src/screens/propertyedit/custom/color/coloredit.cpp @@ -10,6 +10,7 @@ ColorEdit::ColorEdit(QWidget *parent) : m_brush = QBrush(QPixmap(":/Images/Cell.png").scaled(16, 16)); setMaximumHeight(20); + setMinimumHeight(20); } QVariant ColorEdit::data() const { diff --git a/worldeditor/src/screens/propertyedit/editors/BooleanEdit.ui b/worldeditor/src/screens/propertyedit/editors/BooleanEdit.ui index 2fc93fb81..04d0b359b 100644 --- a/worldeditor/src/screens/propertyedit/editors/BooleanEdit.ui +++ b/worldeditor/src/screens/propertyedit/editors/BooleanEdit.ui @@ -10,6 +10,18 @@ 22 + + + 0 + 22 + + + + + 16777215 + 22 + + 2 @@ -27,7 +39,20 @@ 1 - + + + + 0 + 16 + + + + + 16777215 + 16 + + + diff --git a/worldeditor/src/screens/propertyedit/propertyeditor.cpp b/worldeditor/src/screens/propertyedit/propertyeditor.cpp index b152aa57c..25c3d5658 100644 --- a/worldeditor/src/screens/propertyedit/propertyeditor.cpp +++ b/worldeditor/src/screens/propertyedit/propertyeditor.cpp @@ -23,7 +23,7 @@ #include "editor/assetmanager.h" #include "editor/asseteditor.h" #include "editor/projectmanager.h" -#include "editor/settingsmanager.h" +#include "editor/editorsettings.h" PropertyEdit *createCustomEditor(int userType, QWidget *parent, const QString &, QObject *) { switch(userType) { @@ -45,25 +45,61 @@ class PropertyFilter : public QSortFilterProxyModel { QSortFilterProxyModel(parent) { } + void setGroup(const QString &group) { + m_group = group; + invalidate(); + } + protected: void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) { QSortFilterProxyModel::sort(column, order); } bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { + bool result = true; + if(!m_group.isEmpty()) { + result = checkGroupFilter(sourceRow, sourceParent); + } + result &= checkNameFilter(sourceRow, sourceParent); + + return result; + } + + bool checkGroupFilter(int sourceRow, const QModelIndex &sourceParent) const { + if(!sourceParent.isValid()) { + QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + + QString type = sourceModel()->data(index).toString(); + if(m_group == type || type.isEmpty()) { + return true; + } + + return false; + } + + return true; + } + + bool checkNameFilter(int sourceRow, const QModelIndex &sourceParent) const { QAbstractItemModel *model = sourceModel(); QModelIndex index = model->index(sourceRow, 0, sourceParent); + if(!filterRegExp().isEmpty() && index.isValid()) { for(int i = 0; i < model->rowCount(index); i++) { if(filterAcceptsRow(i, index)) { return true; } } + QString key = model->data(index, filterRole()).toString(); return key.contains(filterRegExp()); } return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); } + +protected: + QString m_group; + }; class PropertyDelegate : public QStyledItemDelegate { @@ -94,6 +130,7 @@ class PropertyDelegate : public QStyledItemDelegate { } parseEditorHints(editor, p->editorHints()); } + return editor; } @@ -233,16 +270,10 @@ void PropertyEditor::onItemsSelected(QList items) { ProjectManager *projectManager = dynamic_cast(m_propertyObject); if(projectManager && projectManager != item) { disconnect(projectManager, &ProjectManager::updated, this, &PropertyEditor::onSettingsUpdated); - - disconnect(this, &PropertyEditor::commited, projectManager, &ProjectManager::saveSettings); - disconnect(this, &PropertyEditor::reverted, projectManager, &ProjectManager::loadSettings); } else { - SettingsManager *settingsManager = dynamic_cast(item); + EditorSettings *settingsManager = dynamic_cast(item); if(settingsManager) { - disconnect(settingsManager, &SettingsManager::updated, this, &PropertyEditor::onSettingsUpdated); - - disconnect(this, &PropertyEditor::commited, SettingsManager::instance(), &SettingsManager::saveSettings); - disconnect(this, &PropertyEditor::reverted, SettingsManager::instance(), &SettingsManager::loadSettings); + disconnect(settingsManager, &EditorSettings::updated, this, &PropertyEditor::onSettingsUpdated); } } } @@ -261,20 +292,10 @@ void PropertyEditor::onItemsSelected(QList items) { ProjectManager *projectManager = dynamic_cast(item); if(projectManager) { connect(projectManager, &ProjectManager::updated, this, &PropertyEditor::onSettingsUpdated, Qt::UniqueConnection); - - connect(this, &PropertyEditor::commited, ProjectManager::instance(), &ProjectManager::saveSettings); - connect(this, &PropertyEditor::reverted, ProjectManager::instance(), &ProjectManager::loadSettings); - - isCommitVisible = true; } else { - SettingsManager *settingsManager = dynamic_cast(item); + EditorSettings *settingsManager = dynamic_cast(item); if(settingsManager) { - connect(settingsManager, &SettingsManager::updated, this, &PropertyEditor::onSettingsUpdated, Qt::UniqueConnection); - - connect(this, &PropertyEditor::commited, SettingsManager::instance(), &SettingsManager::saveSettings); - connect(this, &PropertyEditor::reverted, SettingsManager::instance(), &SettingsManager::loadSettings); - - isCommitVisible = true; + connect(settingsManager, &EditorSettings::updated, this, &PropertyEditor::onSettingsUpdated, Qt::UniqueConnection); } } } @@ -314,6 +335,15 @@ void PropertyEditor::onObjectsSelected(QList objects) { } } +QAbstractItemModel *PropertyEditor::model() { + return m_filter->sourceModel(); +} + +void PropertyEditor::setGroup(const QString &group) { + m_filter->setGroup(group); + ui->treeView->expandToDepth(-1); +} + void PropertyEditor::onUpdated() { if(m_propertyObject == m_nextObject) { m_nextObject->onUpdated(); @@ -346,9 +376,6 @@ void PropertyEditor::onSettingsUpdated() { if(settings) { ui->commitButton->setEnabled(settings->isModified()); ui->revertButton->setEnabled(settings->isModified()); - } else { - ui->commitButton->setEnabled(true); - ui->revertButton->setEnabled(true); } } diff --git a/worldeditor/src/screens/propertyedit/propertyeditor.h b/worldeditor/src/screens/propertyedit/propertyeditor.h index 06aa3adfc..d9bcbc7bd 100644 --- a/worldeditor/src/screens/propertyedit/propertyeditor.h +++ b/worldeditor/src/screens/propertyedit/propertyeditor.h @@ -3,8 +3,7 @@ #include -class PropertyModel; -class Property; +class QAbstractItemModel; class PropertyFilter; class Object; @@ -28,12 +27,16 @@ class PropertyEditor : public EditorGadget { void onObjectsSelected(QList objects) override; + QAbstractItemModel *model(); + + void setGroup(const QString &group); + signals: void commited(); void reverted(); protected: - void setCurrentEditor(AssetEditor *editor); + void setCurrentEditor(AssetEditor *editor) override; void updatePersistent(const QModelIndex &index); diff --git a/worldeditor/src/screens/propertyedit/propertymodel.cpp b/worldeditor/src/screens/propertyedit/propertymodel.cpp index b82746b8f..bc22d19a8 100644 --- a/worldeditor/src/screens/propertyedit/propertymodel.cpp +++ b/worldeditor/src/screens/propertyedit/propertymodel.cpp @@ -244,36 +244,6 @@ void PropertyModel::addItem(QObject *propertyObject, const QString &propertyName emit layoutChanged(); } -void PropertyModel::updateItem(QObject *propertyObject) { - if(!propertyObject) { - propertyObject = m_rootItem; - } - - QList childs = propertyObject->children(); - for(int i = 0; i < childs.count(); i++) { - Property *p = dynamic_cast(childs[i]); - if(p) { - if(!p->isRoot()) { - if(!p->value().isValid()) { - p->setParent(nullptr); - p->deleteLater(); - } - } else { - updateItem(p); - if(p->children().isEmpty()) { - p->setParent(nullptr); - p->deleteLater(); - } else { - updateDynamicProperties(p, p->propertyObject()); - } - } - } - } - - emit layoutAboutToBeChanged(); - emit layoutChanged(); -} - void PropertyModel::updateDynamicProperties(Property *parent, QObject *propertyObject) { // Get dynamic property names QList dynamicProperties = propertyObject->dynamicPropertyNames(); diff --git a/worldeditor/src/screens/propertyedit/propertymodel.h b/worldeditor/src/screens/propertyedit/propertymodel.h index 53e5d7c2b..bc5a5ba7b 100644 --- a/worldeditor/src/screens/propertyedit/propertymodel.h +++ b/worldeditor/src/screens/propertyedit/propertymodel.h @@ -29,8 +29,6 @@ class PropertyModel : public BaseObjectModel { void addItem(QObject *propertyObject, const QString &propertyName = QString(), QObject *parent = nullptr); - void updateItem(QObject *propertyObject); - void clear(); private: diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp index 70f6a1f89..1888d791c 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp @@ -32,7 +32,7 @@ #include #include -#include +#include #include @@ -182,12 +182,12 @@ ObjectController::ObjectController() : m_canceled(false), m_local(false) { - connect(SettingsManager::instance(), &SettingsManager::updated, this, &ObjectController::onApplySettings); + connect(EditorSettings::instance(), &EditorSettings::updated, this, &ObjectController::onApplySettings); connect(AssetManager::instance(), &AssetManager::prefabCreated, this, &ObjectController::onPrefabCreated); connect(this, &ObjectController::sceneUpdated, this, &ObjectController::onUpdated); - SettingsManager::instance()->registerProperty(gBackgroundColor, QColor(51, 51, 51, 0)); - SettingsManager::instance()->registerProperty(gIsolationColor, QColor(0, 76, 140, 0)); + EditorSettings::instance()->registerProperty(gBackgroundColor, QColor(51, 51, 51, 0)); + EditorSettings::instance()->registerProperty(gIsolationColor, QColor(0, 76, 140, 0)); m_tools = { new SelectTool(this, m_selected), @@ -372,7 +372,7 @@ void ObjectController::setDrag(bool drag) { void ObjectController::onApplySettings() { if(m_activeCamera) { - QColor color = SettingsManager::instance()->property(m_isolatedActor ? gIsolationColor : gBackgroundColor).value(); + QColor color = EditorSettings::instance()->property(m_isolatedActor ? gIsolationColor : gBackgroundColor).value(); m_activeCamera->setColor(Vector4(color.redF(), color.greenF(), color.blueF(), color.alphaF())); } } @@ -429,9 +429,9 @@ void ObjectController::setIsolatedActor(Actor *actor) { QColor color; if(m_isolatedActor) { - color = SettingsManager::instance()->property(gIsolationColor).value(); + color = EditorSettings::instance()->property(gIsolationColor).value(); } else { - color = SettingsManager::instance()->property(gBackgroundColor).value(); + color = EditorSettings::instance()->property(gBackgroundColor).value(); } m_activeCamera->setColor(Vector4(color.redF(), color.greenF(), color.blueF(), color.alphaF())); }