diff options
| author | Ali Kianian <ali.kianian@qt.io> | 2024-11-25 18:41:22 +0200 |
|---|---|---|
| committer | Ali Kianian <ali.kianian@qt.io> | 2024-11-28 12:58:28 +0000 |
| commit | 91f76efd40f905ad7abaa1043329cdf3f97a201c (patch) | |
| tree | aef6ab49b0ebcacac528ceb5280dd9cda798a8f4 /src/plugins/effectcomposer/effectshaderscodeeditor.cpp | |
| parent | 2e18a94ebcc6155d4f239602de169cc373c0b392 (diff) | |
EffectComposer: Use a single EffectsShaderCodeEditor for all nodes
* Composition nodes use ShaderEditorData to share data with the editor
* ShaderEditorData contains a table model for unions, shader documents
and also a private instance of the editors.
Task-number: QDS-14220
Change-Id: I63ca943d4abcbde273b6b3b64dffcf24f8f28f48
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/plugins/effectcomposer/effectshaderscodeeditor.cpp')
| -rw-r--r-- | src/plugins/effectcomposer/effectshaderscodeeditor.cpp | 176 |
1 files changed, 92 insertions, 84 deletions
diff --git a/src/plugins/effectcomposer/effectshaderscodeeditor.cpp b/src/plugins/effectcomposer/effectshaderscodeeditor.cpp index 3f1a48033ee..08b9824b145 100644 --- a/src/plugins/effectcomposer/effectshaderscodeeditor.cpp +++ b/src/plugins/effectcomposer/effectshaderscodeeditor.cpp @@ -3,7 +3,6 @@ #include "effectshaderscodeeditor.h" -#include "effectcodeeditorwidget.h" #include "effectcomposeruniformsmodel.h" #include "effectcomposeruniformstablemodel.h" #include "effectcomposerwidget.h" @@ -52,34 +51,20 @@ namespace EffectComposer { EffectShadersCodeEditor::EffectShadersCodeEditor(const QString &title, QWidget *parent) : QWidget(parent) , m_settings(new QSettings(qApp->organizationName(), qApp->applicationName(), this)) + , m_defaultTableModel(new EffectComposerUniformsTableModel(nullptr, this)) { setWindowFlag(Qt::Tool, true); setWindowFlag(Qt::WindowStaysOnTopHint); setWindowTitle(title); - m_fragmentEditor = createJSEditor(); - m_vertexEditor = createJSEditor(); - - connect( - m_fragmentEditor, - &QPlainTextEdit::textChanged, - this, - &EffectShadersCodeEditor::fragmentValueChanged); - connect( - m_vertexEditor, - &QPlainTextEdit::textChanged, - this, - &EffectShadersCodeEditor::vertexValueChanged); - setupUIComponents(); + setUniformsModel(nullptr); } EffectShadersCodeEditor::~EffectShadersCodeEditor() { if (isOpened()) close(); - m_fragmentEditor->deleteLater(); - m_vertexEditor->deleteLater(); } void EffectShadersCodeEditor::showWidget() @@ -97,34 +82,6 @@ void EffectShadersCodeEditor::showWidget(int x, int y) move(QPoint(x, y)); } -QString EffectShadersCodeEditor::fragmentValue() const -{ - if (!m_fragmentEditor) - return {}; - - return m_fragmentEditor->document()->toPlainText(); -} - -void EffectShadersCodeEditor::setFragmentValue(const QString &text) -{ - if (m_fragmentEditor) - m_fragmentEditor->setEditorTextWithIndentation(text); -} - -QString EffectShadersCodeEditor::vertexValue() const -{ - if (!m_vertexEditor) - return {}; - - return m_vertexEditor->document()->toPlainText(); -} - -void EffectShadersCodeEditor::setVertexValue(const QString &text) -{ - if (m_vertexEditor) - m_vertexEditor->setEditorTextWithIndentation(text); -} - bool EffectShadersCodeEditor::liveUpdate() const { return m_liveUpdate; @@ -149,30 +106,67 @@ bool EffectShadersCodeEditor::isOpened() const return m_opened; } -void EffectShadersCodeEditor::setUniformsModel(EffectComposerUniformsModel *uniforms) +void EffectShadersCodeEditor::setupShader(ShaderEditorData *data) +{ + if (m_currentEditorData == data) + return; + + while (m_tabWidget->count()) + m_tabWidget->removeTab(0); + + if (data) { + m_tabWidget->addTab(data->fragmentEditor.get(), tr("Fragment Shader")); + m_tabWidget->addTab(data->vertexEditor.get(), tr("Vertex Shader")); + + selectNonEmptyShader(data); + setUniformsModel(data->tableModel); + } else { + setUniformsModel(nullptr); + } + + m_currentEditorData = data; +} + +void EffectShadersCodeEditor::cleanFromData(ShaderEditorData *data) { - std::function<QStringList()> uniformNames = [uniforms]() -> QStringList { - if (!uniforms) - return {}; - int count = uniforms->rowCount(); - QStringList result; - for (int i = 0; i < count; ++i) { - const QModelIndex mIndex = uniforms->index(i, 0); - result.append(mIndex.data(EffectComposerUniformsModel::NameRole).toString()); - } - return result; - }; - m_fragmentEditor->setUniformsCallback(uniformNames); - m_vertexEditor->setUniformsCallback(uniformNames); - - if (m_headerWidget && uniforms) { - m_uniformsTableModel - = Utils::makeUniqueObjectLatePtr<EffectComposerUniformsTableModel>(uniforms, this); - EffectComposerUniformsTableModel *uniformsTable = m_uniformsTableModel.get(); - - m_headerWidget->rootContext() - ->setContextProperty("uniformsTableModel", QVariant::fromValue(uniformsTable)); + if (m_currentEditorData == data) + setupShader(nullptr); +} + +ShaderEditorData *EffectShadersCodeEditor::createEditorData( + const QString &fragmentDocument, + const QString &vertexDocument, + EffectComposerUniformsModel *uniforms) +{ + ShaderEditorData *result = new ShaderEditorData; + result->fragmentEditor.reset(createJSEditor()); + result->vertexEditor.reset(createJSEditor()); + + result->fragmentEditor->setPlainText(fragmentDocument); + result->vertexEditor->setPlainText(vertexDocument); + + result->fragmentDocument = result->fragmentEditor->textDocumentPtr(); + result->vertexDocument = result->vertexEditor->textDocumentPtr(); + + if (uniforms) { + result->tableModel = new EffectComposerUniformsTableModel(uniforms, uniforms); + std::function<QStringList()> uniformNames = + [uniformsTable = result->tableModel]() -> QStringList { + if (!uniformsTable) + return {}; + + auto uniformsModel = uniformsTable->sourceModel(); + if (!uniformsModel) + return {}; + + return uniformsModel->uniformNames(); + }; + + result->fragmentEditor->setUniformsCallback(uniformNames); + result->vertexEditor->setUniformsCallback(uniformNames); } + + return result; } void EffectShadersCodeEditor::copyText(const QString &text) @@ -180,6 +174,13 @@ void EffectShadersCodeEditor::copyText(const QString &text) qApp->clipboard()->setText(text); } +EffectShadersCodeEditor *EffectShadersCodeEditor::instance() +{ + static EffectShadersCodeEditor *editorInstance = new EffectShadersCodeEditor( + tr("Shaders Code Editor")); + return editorInstance; +} + EffectCodeEditorWidget *EffectShadersCodeEditor::createJSEditor() { static EffectCodeEditorFactory f; @@ -208,35 +209,20 @@ void EffectShadersCodeEditor::setupUIComponents() { QVBoxLayout *verticalLayout = new QVBoxLayout(this); QSplitter *splitter = new QSplitter(this); - QTabWidget *tabWidget = new QTabWidget(this); + m_tabWidget = new QTabWidget(this); splitter->setOrientation(Qt::Vertical); createHeader(); - tabWidget->addTab(m_fragmentEditor, tr("Fragment Shader")); - tabWidget->addTab(m_vertexEditor, tr("Vertex Shader")); - verticalLayout->setContentsMargins(0, 0, 0, 0); verticalLayout->addWidget(splitter); splitter->addWidget(m_headerWidget.get()); - splitter->addWidget(tabWidget); + splitter->addWidget(m_tabWidget); splitter->setCollapsible(0, false); splitter->setCollapsible(1, false); - connect(this, &EffectShadersCodeEditor::openedChanged, tabWidget, [this, tabWidget](bool opened) { - if (!opened) - return; - - QWidget *widgetToSelect = (m_vertexEditor->document()->isEmpty() - && !m_fragmentEditor->document()->isEmpty()) - ? m_fragmentEditor.get() - : m_vertexEditor.get(); - tabWidget->setCurrentWidget(widgetToSelect); - widgetToSelect->setFocus(); - }); - this->resize(660, 240); } @@ -290,4 +276,26 @@ void EffectShadersCodeEditor::reloadQml() m_headerWidget->setSource(QUrl::fromLocalFile(headerQmlPath)); } +void EffectShadersCodeEditor::setUniformsModel(EffectComposerUniformsTableModel *uniformsTable) +{ + if (!uniformsTable) + uniformsTable = m_defaultTableModel; + + m_headerWidget->rootContext() + ->setContextProperty("uniformsTableModel", QVariant::fromValue(uniformsTable)); +} + +void EffectShadersCodeEditor::selectNonEmptyShader(ShaderEditorData *data) +{ + auto vertexDoc = data->vertexDocument->document(); + auto fragmentDoc = data->fragmentDocument->document(); + + QWidget *widgetToSelect = (vertexDoc->isEmpty() && !fragmentDoc->isEmpty()) + ? data->fragmentEditor.get() + : data->vertexEditor.get(); + + m_tabWidget->setCurrentWidget(widgetToSelect); + widgetToSelect->setFocus(); +} + } // namespace EffectComposer |
