aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/effectcomposer/effectshaderscodeeditor.cpp
diff options
context:
space:
mode:
authorAli Kianian <ali.kianian@qt.io>2024-11-25 18:41:22 +0200
committerAli Kianian <ali.kianian@qt.io>2024-11-28 12:58:28 +0000
commit91f76efd40f905ad7abaa1043329cdf3f97a201c (patch)
treeaef6ab49b0ebcacac528ceb5280dd9cda798a8f4 /src/plugins/effectcomposer/effectshaderscodeeditor.cpp
parent2e18a94ebcc6155d4f239602de169cc373c0b392 (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.cpp176
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