From 7047ec9a22b9b905139c698a7d16c4c82c8be0a2 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Sat, 30 Nov 2024 16:09:52 +0200 Subject: [PATCH] EffectComposer: Tweak code editor geometry * Code editor is a non-modal tool * Saves the geometry on closing * Reads and applies geometry on opening * Remembers the splitter sizes. Fixes: QDS-14243 Change-Id: I5ee083080587453e917f2083e2d6a41a4eb65ee0 Reviewed-by: Miikka Heikkinen --- .../effectshaderscodeeditor.cpp | 84 ++++++++++++++++--- .../effectcomposer/effectshaderscodeeditor.h | 5 ++ 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/plugins/effectcomposer/effectshaderscodeeditor.cpp b/src/plugins/effectcomposer/effectshaderscodeeditor.cpp index 484e16de3d5..009e03e9936 100644 --- a/src/plugins/effectcomposer/effectshaderscodeeditor.cpp +++ b/src/plugins/effectcomposer/effectshaderscodeeditor.cpp @@ -25,6 +25,9 @@ #include #include +#include +#include +#include #include #include #include @@ -34,6 +37,9 @@ namespace { inline constexpr char EFFECTCOMPOSER_LIVE_UPDATE_KEY[] = "EffectComposer/CodeEditor/LiveUpdate"; +inline constexpr char EFFECTCOMPOSER_SHADER_EDITOR_GEO_KEY[] = "EffectComposer/CodeEditor/Geometry"; +inline constexpr char EFFECTCOMPOSER_SHADER_EDITOR_SPLITTER_KEY[] + = "EffectComposer/CodeEditor/SplitterSizes"; inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_HEADER[] = "QQuickWidgetEffectComposerCodeEditorHeader"; inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_EDITOR_TABS[] @@ -53,6 +59,32 @@ QString propertyEditorResourcesPath() return Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources").toString(); } +template +QByteArray serializeList(const QList &list) +{ + QJsonDocument doc; + QJsonArray jsonArray; + for (const T &value : list) + jsonArray.push_back(value); + doc.setArray(jsonArray); + return doc.toJson(); +} + +template +QList deserializeList(const QByteArray &serialData) +{ + const QJsonDocument doc = QJsonDocument::fromJson(serialData); + if (!doc.isArray()) + return {}; + + QList result; + const QJsonArray jsonArray = doc.array(); + for (const QJsonValue &val : jsonArray) + result.append(val.toVariant().value()); + + return result; +} + } // namespace namespace EffectComposer { @@ -64,7 +96,7 @@ EffectShadersCodeEditor::EffectShadersCodeEditor(const QString &title, QWidget * , m_editableNodesModel(new EffectComposerEditableNodesModel(this)) { setWindowFlag(Qt::Tool, true); - setWindowFlag(Qt::WindowStaysOnTopHint); + setWindowModality(Qt::WindowModality::NonModal); setWindowTitle(title); setupUIComponents(); @@ -85,6 +117,7 @@ EffectShadersCodeEditor::~EffectShadersCodeEditor() void EffectShadersCodeEditor::showWidget() { readAndApplyLiveUpdateSettings(); + setParent(Core::ICore::dialogParent()); show(); raise(); setOpened(true); @@ -222,8 +255,8 @@ void EffectShadersCodeEditor::insertTextToCursorPosition(const QString &text) EffectShadersCodeEditor *EffectShadersCodeEditor::instance() { - static EffectShadersCodeEditor *editorInstance = new EffectShadersCodeEditor( - tr("Shaders Code Editor")); + static EffectShadersCodeEditor *editorInstance + = new EffectShadersCodeEditor(tr("Shaders Code Editor"), Core::ICore::dialogParent()); return editorInstance; } @@ -254,30 +287,30 @@ EffectCodeEditorWidget *EffectShadersCodeEditor::createJSEditor() void EffectShadersCodeEditor::setupUIComponents() { QVBoxLayout *verticalLayout = new QVBoxLayout(this); - QSplitter *splitter = new QSplitter(this); + m_splitter = new QSplitter(this); QWidget *tabComplexWidget = new QWidget(this); QVBoxLayout *tabsLayout = new QVBoxLayout(tabComplexWidget); m_stackedWidget = new QStackedWidget(tabComplexWidget); - splitter->setOrientation(Qt::Vertical); + m_splitter->setOrientation(Qt::Vertical); createHeader(); createQmlTabs(); createQmlFooter(); verticalLayout->setContentsMargins(0, 0, 0, 0); - verticalLayout->addWidget(splitter); + verticalLayout->addWidget(m_splitter); tabsLayout->setContentsMargins(0, 0, 0, 0); tabsLayout->setSpacing(0); tabsLayout->addWidget(m_qmlTabWidget); tabsLayout->addWidget(m_stackedWidget); tabsLayout->addWidget(m_qmlFooterWidget); - splitter->addWidget(m_headerWidget.get()); - splitter->addWidget(tabComplexWidget); + m_splitter->addWidget(m_headerWidget.get()); + m_splitter->addWidget(tabComplexWidget); - splitter->setCollapsible(0, false); - splitter->setCollapsible(1, false); + m_splitter->setCollapsible(0, false); + m_splitter->setCollapsible(1, false); connect( m_stackedWidget.get(), @@ -285,7 +318,8 @@ void EffectShadersCodeEditor::setupUIComponents() this, &EffectShadersCodeEditor::onEditorWidgetChanged); - this->resize(660, 240); + setMinimumSize(660, 240); + resize(900, 600); } void EffectShadersCodeEditor::setOpened(bool value) @@ -295,6 +329,7 @@ void EffectShadersCodeEditor::setOpened(bool value) m_opened = value; emit openedChanged(m_opened); + onOpenStateChanged(); } void EffectShadersCodeEditor::closeEvent(QCloseEvent *event) @@ -318,6 +353,25 @@ void EffectShadersCodeEditor::readAndApplyLiveUpdateSettings() setLiveUpdate(liveUpdateStatus); } +void EffectShadersCodeEditor::writeGeometrySettings() +{ + const QByteArray &splitterSizeData = ::serializeList(m_splitter->sizes()); + m_settings->setValue(EFFECTCOMPOSER_SHADER_EDITOR_GEO_KEY, saveGeometry()); + m_settings->setValue(EFFECTCOMPOSER_SHADER_EDITOR_SPLITTER_KEY, splitterSizeData); +} + +void EffectShadersCodeEditor::readAndApplyGeometrySettings() +{ + if (m_settings->contains(EFFECTCOMPOSER_SHADER_EDITOR_GEO_KEY)) + restoreGeometry(m_settings->value(EFFECTCOMPOSER_SHADER_EDITOR_GEO_KEY).toByteArray()); + + if (m_settings->contains(EFFECTCOMPOSER_SHADER_EDITOR_SPLITTER_KEY)) { + const QByteArray &splitterSizeData + = m_settings->value(EFFECTCOMPOSER_SHADER_EDITOR_SPLITTER_KEY).toByteArray(); + m_splitter->setSizes(::deserializeList(splitterSizeData)); + } +} + void EffectShadersCodeEditor::createHeader() { m_headerWidget = new StudioQuickWidget(this); @@ -423,6 +477,14 @@ void EffectShadersCodeEditor::onEditorWidgetChanged() setSelectedShaderName({}); } +void EffectShadersCodeEditor::onOpenStateChanged() +{ + if (isOpened()) + readAndApplyGeometrySettings(); + else + writeGeometrySettings(); +} + EffectCodeEditorWidget *EffectShadersCodeEditor::currentEditor() const { QWidget *currentTab = m_stackedWidget->currentWidget(); diff --git a/src/plugins/effectcomposer/effectshaderscodeeditor.h b/src/plugins/effectcomposer/effectshaderscodeeditor.h index cc5fea86d2b..b6c825ebc04 100644 --- a/src/plugins/effectcomposer/effectshaderscodeeditor.h +++ b/src/plugins/effectcomposer/effectshaderscodeeditor.h @@ -11,6 +11,7 @@ QT_FORWARD_DECLARE_CLASS(QSettings) QT_FORWARD_DECLARE_CLASS(QStackedWidget) +QT_FORWARD_DECLARE_CLASS(QSplitter) class StudioQuickWidget; @@ -94,6 +95,8 @@ protected: private: void writeLiveUpdateSettings(); void readAndApplyLiveUpdateSettings(); + void writeGeometrySettings(); + void readAndApplyGeometrySettings(); void createHeader(); void createQmlTabs(); void createQmlFooter(); @@ -102,6 +105,7 @@ private: void selectNonEmptyShader(ShaderEditorData *data); void setSelectedShaderName(const QString &shaderName); void onEditorWidgetChanged(); + void onOpenStateChanged(); EffectCodeEditorWidget *currentEditor() const; @@ -110,6 +114,7 @@ private: QPointer m_qmlTabWidget; QPointer m_qmlFooterWidget; QPointer m_stackedWidget; + QPointer m_splitter; QPointer m_defaultTableModel; QPointer m_editableNodesModel; ShaderEditorData *m_currentEditorData = nullptr;