forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user