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 <miikka.heikkinen@qt.io>
This commit is contained in:
Ali Kianian
2024-11-30 16:09:52 +02:00
parent 653b9ba215
commit 7047ec9a22
2 changed files with 78 additions and 11 deletions

View File

@@ -25,6 +25,9 @@
#include <QApplication> #include <QApplication>
#include <QClipboard> #include <QClipboard>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonValue>
#include <QPlainTextEdit> #include <QPlainTextEdit>
#include <QSettings> #include <QSettings>
#include <QSplitter> #include <QSplitter>
@@ -34,6 +37,9 @@
namespace { namespace {
inline constexpr char EFFECTCOMPOSER_LIVE_UPDATE_KEY[] = "EffectComposer/CodeEditor/LiveUpdate"; 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[] inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_HEADER[]
= "QQuickWidgetEffectComposerCodeEditorHeader"; = "QQuickWidgetEffectComposerCodeEditorHeader";
inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_EDITOR_TABS[] inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_EDITOR_TABS[]
@@ -53,6 +59,32 @@ QString propertyEditorResourcesPath()
return Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources").toString(); return Core::ICore::resourcePath("qmldesigner/propertyEditorQmlSources").toString();
} }
template<typename T>
QByteArray serializeList(const QList<T> &list)
{
QJsonDocument doc;
QJsonArray jsonArray;
for (const T &value : list)
jsonArray.push_back(value);
doc.setArray(jsonArray);
return doc.toJson();
}
template<typename T>
QList<T> deserializeList(const QByteArray &serialData)
{
const QJsonDocument doc = QJsonDocument::fromJson(serialData);
if (!doc.isArray())
return {};
QList<T> result;
const QJsonArray jsonArray = doc.array();
for (const QJsonValue &val : jsonArray)
result.append(val.toVariant().value<T>());
return result;
}
} // namespace } // namespace
namespace EffectComposer { namespace EffectComposer {
@@ -64,7 +96,7 @@ EffectShadersCodeEditor::EffectShadersCodeEditor(const QString &title, QWidget *
, m_editableNodesModel(new EffectComposerEditableNodesModel(this)) , m_editableNodesModel(new EffectComposerEditableNodesModel(this))
{ {
setWindowFlag(Qt::Tool, true); setWindowFlag(Qt::Tool, true);
setWindowFlag(Qt::WindowStaysOnTopHint); setWindowModality(Qt::WindowModality::NonModal);
setWindowTitle(title); setWindowTitle(title);
setupUIComponents(); setupUIComponents();
@@ -85,6 +117,7 @@ EffectShadersCodeEditor::~EffectShadersCodeEditor()
void EffectShadersCodeEditor::showWidget() void EffectShadersCodeEditor::showWidget()
{ {
readAndApplyLiveUpdateSettings(); readAndApplyLiveUpdateSettings();
setParent(Core::ICore::dialogParent());
show(); show();
raise(); raise();
setOpened(true); setOpened(true);
@@ -222,8 +255,8 @@ void EffectShadersCodeEditor::insertTextToCursorPosition(const QString &text)
EffectShadersCodeEditor *EffectShadersCodeEditor::instance() EffectShadersCodeEditor *EffectShadersCodeEditor::instance()
{ {
static EffectShadersCodeEditor *editorInstance = new EffectShadersCodeEditor( static EffectShadersCodeEditor *editorInstance
tr("Shaders Code Editor")); = new EffectShadersCodeEditor(tr("Shaders Code Editor"), Core::ICore::dialogParent());
return editorInstance; return editorInstance;
} }
@@ -254,30 +287,30 @@ EffectCodeEditorWidget *EffectShadersCodeEditor::createJSEditor()
void EffectShadersCodeEditor::setupUIComponents() void EffectShadersCodeEditor::setupUIComponents()
{ {
QVBoxLayout *verticalLayout = new QVBoxLayout(this); QVBoxLayout *verticalLayout = new QVBoxLayout(this);
QSplitter *splitter = new QSplitter(this); m_splitter = new QSplitter(this);
QWidget *tabComplexWidget = new QWidget(this); QWidget *tabComplexWidget = new QWidget(this);
QVBoxLayout *tabsLayout = new QVBoxLayout(tabComplexWidget); QVBoxLayout *tabsLayout = new QVBoxLayout(tabComplexWidget);
m_stackedWidget = new QStackedWidget(tabComplexWidget); m_stackedWidget = new QStackedWidget(tabComplexWidget);
splitter->setOrientation(Qt::Vertical); m_splitter->setOrientation(Qt::Vertical);
createHeader(); createHeader();
createQmlTabs(); createQmlTabs();
createQmlFooter(); createQmlFooter();
verticalLayout->setContentsMargins(0, 0, 0, 0); verticalLayout->setContentsMargins(0, 0, 0, 0);
verticalLayout->addWidget(splitter); verticalLayout->addWidget(m_splitter);
tabsLayout->setContentsMargins(0, 0, 0, 0); tabsLayout->setContentsMargins(0, 0, 0, 0);
tabsLayout->setSpacing(0); tabsLayout->setSpacing(0);
tabsLayout->addWidget(m_qmlTabWidget); tabsLayout->addWidget(m_qmlTabWidget);
tabsLayout->addWidget(m_stackedWidget); tabsLayout->addWidget(m_stackedWidget);
tabsLayout->addWidget(m_qmlFooterWidget); tabsLayout->addWidget(m_qmlFooterWidget);
splitter->addWidget(m_headerWidget.get()); m_splitter->addWidget(m_headerWidget.get());
splitter->addWidget(tabComplexWidget); m_splitter->addWidget(tabComplexWidget);
splitter->setCollapsible(0, false); m_splitter->setCollapsible(0, false);
splitter->setCollapsible(1, false); m_splitter->setCollapsible(1, false);
connect( connect(
m_stackedWidget.get(), m_stackedWidget.get(),
@@ -285,7 +318,8 @@ void EffectShadersCodeEditor::setupUIComponents()
this, this,
&EffectShadersCodeEditor::onEditorWidgetChanged); &EffectShadersCodeEditor::onEditorWidgetChanged);
this->resize(660, 240); setMinimumSize(660, 240);
resize(900, 600);
} }
void EffectShadersCodeEditor::setOpened(bool value) void EffectShadersCodeEditor::setOpened(bool value)
@@ -295,6 +329,7 @@ void EffectShadersCodeEditor::setOpened(bool value)
m_opened = value; m_opened = value;
emit openedChanged(m_opened); emit openedChanged(m_opened);
onOpenStateChanged();
} }
void EffectShadersCodeEditor::closeEvent(QCloseEvent *event) void EffectShadersCodeEditor::closeEvent(QCloseEvent *event)
@@ -318,6 +353,25 @@ void EffectShadersCodeEditor::readAndApplyLiveUpdateSettings()
setLiveUpdate(liveUpdateStatus); 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<int>(splitterSizeData));
}
}
void EffectShadersCodeEditor::createHeader() void EffectShadersCodeEditor::createHeader()
{ {
m_headerWidget = new StudioQuickWidget(this); m_headerWidget = new StudioQuickWidget(this);
@@ -423,6 +477,14 @@ void EffectShadersCodeEditor::onEditorWidgetChanged()
setSelectedShaderName({}); setSelectedShaderName({});
} }
void EffectShadersCodeEditor::onOpenStateChanged()
{
if (isOpened())
readAndApplyGeometrySettings();
else
writeGeometrySettings();
}
EffectCodeEditorWidget *EffectShadersCodeEditor::currentEditor() const EffectCodeEditorWidget *EffectShadersCodeEditor::currentEditor() const
{ {
QWidget *currentTab = m_stackedWidget->currentWidget(); QWidget *currentTab = m_stackedWidget->currentWidget();

View File

@@ -11,6 +11,7 @@
QT_FORWARD_DECLARE_CLASS(QSettings) QT_FORWARD_DECLARE_CLASS(QSettings)
QT_FORWARD_DECLARE_CLASS(QStackedWidget) QT_FORWARD_DECLARE_CLASS(QStackedWidget)
QT_FORWARD_DECLARE_CLASS(QSplitter)
class StudioQuickWidget; class StudioQuickWidget;
@@ -94,6 +95,8 @@ protected:
private: private:
void writeLiveUpdateSettings(); void writeLiveUpdateSettings();
void readAndApplyLiveUpdateSettings(); void readAndApplyLiveUpdateSettings();
void writeGeometrySettings();
void readAndApplyGeometrySettings();
void createHeader(); void createHeader();
void createQmlTabs(); void createQmlTabs();
void createQmlFooter(); void createQmlFooter();
@@ -102,6 +105,7 @@ private:
void selectNonEmptyShader(ShaderEditorData *data); void selectNonEmptyShader(ShaderEditorData *data);
void setSelectedShaderName(const QString &shaderName); void setSelectedShaderName(const QString &shaderName);
void onEditorWidgetChanged(); void onEditorWidgetChanged();
void onOpenStateChanged();
EffectCodeEditorWidget *currentEditor() const; EffectCodeEditorWidget *currentEditor() const;
@@ -110,6 +114,7 @@ private:
QPointer<StudioQuickWidget> m_qmlTabWidget; QPointer<StudioQuickWidget> m_qmlTabWidget;
QPointer<StudioQuickWidget> m_qmlFooterWidget; QPointer<StudioQuickWidget> m_qmlFooterWidget;
QPointer<QStackedWidget> m_stackedWidget; QPointer<QStackedWidget> m_stackedWidget;
QPointer<QSplitter> m_splitter;
QPointer<EffectComposerUniformsTableModel> m_defaultTableModel; QPointer<EffectComposerUniformsTableModel> m_defaultTableModel;
QPointer<EffectComposerEditableNodesModel> m_editableNodesModel; QPointer<EffectComposerEditableNodesModel> m_editableNodesModel;
ShaderEditorData *m_currentEditorData = nullptr; ShaderEditorData *m_currentEditorData = nullptr;