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 <QClipboard>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonValue>
#include <QPlainTextEdit>
#include <QSettings>
#include <QSplitter>
@@ -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<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 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<int>(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();

View File

@@ -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<StudioQuickWidget> m_qmlTabWidget;
QPointer<StudioQuickWidget> m_qmlFooterWidget;
QPointer<QStackedWidget> m_stackedWidget;
QPointer<QSplitter> m_splitter;
QPointer<EffectComposerUniformsTableModel> m_defaultTableModel;
QPointer<EffectComposerEditableNodesModel> m_editableNodesModel;
ShaderEditorData *m_currentEditorData = nullptr;