EffectComposer: Add a footer to the code editor

The footer contains:
* Live update button
* Close button
* Apply button

Fixes: QDS-14233
Change-Id: I25070356d5357141be5701ee701d938376bfc141
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Shrief Gabr <shrief.gabr@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2024-11-28 11:35:01 +02:00
parent 3bacff48ea
commit 5f3a1d9475
4 changed files with 86 additions and 9 deletions

View File

@@ -0,0 +1,59 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
import QtQuick
import QtQuick.Layouts
import StudioControls as StudioControls
import StudioTheme as StudioTheme
Rectangle {
id: root
property var rootEditor: shaderEditor
color: StudioTheme.Values.themeToolbarBackground
implicitHeight: rowLayout.height
RowLayout {
id: rowLayout
width: parent.width
anchors.verticalCenter: parent.verticalCenter
spacing: StudioTheme.Values.controlGap
StudioControls.CheckBox {
text: qsTr("Live Update")
actionIndicatorVisible: false
style: StudioTheme.Values.viewBarControlStyle
checked: root.rootEditor ? root.rootEditor.liveUpdate : false
onToggled: root.rootEditor.liveUpdate = checked
Layout.alignment: Qt.AlignVCenter
Layout.leftMargin: StudioTheme.Values.toolbarHorizontalMargin
}
Item { // Spacer
Layout.fillWidth: true
Layout.preferredHeight: 1
}
FooterButton {
buttonIcon: qsTr("Close")
onClicked: root.rootEditor.close()
}
FooterButton {
buttonIcon: qsTr("Apply")
onClicked: root.rootEditor.rebakeRequested()
Layout.rightMargin: StudioTheme.Values.toolbarHorizontalMargin
}
}
component FooterButton: StudioControls.AbstractButton {
iconFontFamily: StudioTheme.Constants.font.family
style: StudioTheme.Values.viewBarControlStyle
checkable: false
Layout.alignment: Qt.AlignVCenter
Layout.preferredWidth: 100
}
}

View File

@@ -47,15 +47,6 @@ Rectangle {
style: StudioTheme.Values.viewBarControlStyle style: StudioTheme.Values.viewBarControlStyle
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
} }
StudioControls.CheckBox {
text: qsTr("Live Update")
actionIndicatorVisible: false
style: StudioTheme.Values.viewBarControlStyle
checked: root.rootEditor ? root.rootEditor.liveUpdate : false
onToggled: root.rootEditor.liveUpdate = checked
Layout.alignment: Qt.AlignVCenter
}
} }
CodeEditorUniformsView { CodeEditorUniformsView {

View File

@@ -38,6 +38,8 @@ 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[]
= "QQuickWidgetEffectComposerCodeEditorTabs"; = "QQuickWidgetEffectComposerCodeEditorTabs";
inline constexpr char OBJECT_NAME_EFFECTCOMPOSER_SHADER_EDITOR_FOOTER[]
= "QQuickWidgetEffectComposerCodeEditorFooter";
inline constexpr char EFFECTCOMPOSER_VERTEX_ID[] = "VERTEX"; inline constexpr char EFFECTCOMPOSER_VERTEX_ID[] = "VERTEX";
inline constexpr char EFFECTCOMPOSER_FRAGMENT_ID[] = "FRAGMENT"; inline constexpr char EFFECTCOMPOSER_FRAGMENT_ID[] = "FRAGMENT";
@@ -77,6 +79,7 @@ EffectShadersCodeEditor::~EffectShadersCodeEditor()
m_headerWidget->setSource({}); m_headerWidget->setSource({});
m_qmlTabWidget->setSource({}); m_qmlTabWidget->setSource({});
m_qmlFooterWidget->setSource({});
} }
void EffectShadersCodeEditor::showWidget() void EffectShadersCodeEditor::showWidget()
@@ -260,11 +263,15 @@ void EffectShadersCodeEditor::setupUIComponents()
createHeader(); createHeader();
createQmlTabs(); createQmlTabs();
createQmlFooter();
verticalLayout->setContentsMargins(0, 0, 0, 0); verticalLayout->setContentsMargins(0, 0, 0, 0);
verticalLayout->addWidget(splitter); verticalLayout->addWidget(splitter);
tabsLayout->setContentsMargins(0, 0, 0, 0);
tabsLayout->setSpacing(0);
tabsLayout->addWidget(m_qmlTabWidget); tabsLayout->addWidget(m_qmlTabWidget);
tabsLayout->addWidget(m_stackedWidget); tabsLayout->addWidget(m_stackedWidget);
tabsLayout->addWidget(m_qmlFooterWidget);
splitter->addWidget(m_headerWidget.get()); splitter->addWidget(m_headerWidget.get());
splitter->addWidget(tabComplexWidget); splitter->addWidget(tabComplexWidget);
@@ -340,6 +347,20 @@ void EffectShadersCodeEditor::createQmlTabs()
m_qmlTabWidget->setFixedHeight(43); m_qmlTabWidget->setFixedHeight(43);
} }
void EffectShadersCodeEditor::createQmlFooter()
{
m_qmlFooterWidget = new StudioQuickWidget(this);
m_qmlFooterWidget->quickWidget()->setObjectName(OBJECT_NAME_EFFECTCOMPOSER_SHADER_EDITOR_FOOTER);
m_qmlFooterWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
QmlDesigner::Theme::setupTheme(m_qmlFooterWidget->engine());
m_qmlFooterWidget->engine()->addImportPath(propertyEditorResourcesPath() + "/imports");
m_qmlFooterWidget->engine()->addImportPath(EffectUtils::nodesSourcesPath() + "/common");
m_qmlFooterWidget->setClearColor(QmlDesigner::Theme::getColor(
QmlDesigner::Theme::Color::QmlDesigner_BackgroundColorDarkAlternate));
m_qmlFooterWidget->rootContext()->setContextProperty("shaderEditor", QVariant::fromValue(this));
m_qmlFooterWidget->setFixedHeight(40);
}
void EffectShadersCodeEditor::loadQml() void EffectShadersCodeEditor::loadQml()
{ {
const QString headerQmlPath = EffectComposerWidget::qmlSourcesPath() + "/CodeEditorHeader.qml"; const QString headerQmlPath = EffectComposerWidget::qmlSourcesPath() + "/CodeEditorHeader.qml";
@@ -350,6 +371,10 @@ void EffectShadersCodeEditor::loadQml()
+ "/CodeEditorTabs.qml"; + "/CodeEditorTabs.qml";
QTC_ASSERT(QFileInfo::exists(editorTabsQmlPath), return); QTC_ASSERT(QFileInfo::exists(editorTabsQmlPath), return);
m_qmlTabWidget->setSource(QUrl::fromLocalFile(editorTabsQmlPath)); m_qmlTabWidget->setSource(QUrl::fromLocalFile(editorTabsQmlPath));
const QString footerQmlPath = EffectComposerWidget::qmlSourcesPath() + "/CodeEditorFooter.qml";
QTC_ASSERT(QFileInfo::exists(footerQmlPath), return);
m_qmlFooterWidget->setSource(QUrl::fromLocalFile(footerQmlPath));
} }
void EffectShadersCodeEditor::setUniformsModel(EffectComposerUniformsTableModel *uniformsTable) void EffectShadersCodeEditor::setUniformsModel(EffectComposerUniformsTableModel *uniformsTable)

View File

@@ -96,6 +96,7 @@ private:
void readAndApplyLiveUpdateSettings(); void readAndApplyLiveUpdateSettings();
void createHeader(); void createHeader();
void createQmlTabs(); void createQmlTabs();
void createQmlFooter();
void loadQml(); void loadQml();
void setUniformsModel(EffectComposerUniformsTableModel *uniforms); void setUniformsModel(EffectComposerUniformsTableModel *uniforms);
void selectNonEmptyShader(ShaderEditorData *data); void selectNonEmptyShader(ShaderEditorData *data);
@@ -107,6 +108,7 @@ private:
QSettings *m_settings = nullptr; QSettings *m_settings = nullptr;
QPointer<StudioQuickWidget> m_headerWidget; QPointer<StudioQuickWidget> m_headerWidget;
QPointer<StudioQuickWidget> m_qmlTabWidget; QPointer<StudioQuickWidget> m_qmlTabWidget;
QPointer<StudioQuickWidget> m_qmlFooterWidget;
QPointer<QStackedWidget> m_stackedWidget; QPointer<QStackedWidget> m_stackedWidget;
QPointer<EffectComposerUniformsTableModel> m_defaultTableModel; QPointer<EffectComposerUniformsTableModel> m_defaultTableModel;
QPointer<EffectComposerEditableNodesModel> m_editableNodesModel; QPointer<EffectComposerEditableNodesModel> m_editableNodesModel;