EffectComposer: Disable effect composer on MCU projects

Fixes: QDS-11867
Change-Id: I2b405faf68623272fd674662b97cb3f0e50170e4
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-01-30 14:03:41 +02:00
parent 58dd1405fe
commit 217ff89827
7 changed files with 56 additions and 26 deletions

View File

@@ -15,6 +15,8 @@ ColumnLayout {
spacing: 1 spacing: 1
readonly property var backendModel: EffectComposerBackend.effectComposerModel
property var draggedSec: null property var draggedSec: null
property var secsY: [] property var secsY: []
property int moveFromIdx: 0 property int moveFromIdx: 0
@@ -32,9 +34,9 @@ ColumnLayout {
} }
Connections { Connections {
target: EffectComposerBackend.effectComposerModel target: root.backendModel
function onIsEmptyChanged() { function onIsEmptyChanged() {
if (EffectComposerBackend.effectComposerModel.isEmpty) if (root.backendModel.isEmpty)
saveAsDialog.close() saveAsDialog.close()
} }
} }
@@ -49,7 +51,7 @@ ColumnLayout {
anchors.centerIn: parent anchors.centerIn: parent
onSave: { onSave: {
if (EffectComposerBackend.effectComposerModel.currentComposition === "") { if (root.backendModel.currentComposition === "") {
// if current composition is unsaved, show save as dialog and clear afterwards // if current composition is unsaved, show save as dialog and clear afterwards
saveAsDialog.clearOnClose = true saveAsDialog.clearOnClose = true
saveAsDialog.open() saveAsDialog.open()
@@ -67,27 +69,27 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
onAddClicked: { onAddClicked: {
root.onSaveChangesCallback = () => { EffectComposerBackend.effectComposerModel.clear(true) } root.onSaveChangesCallback = () => { root.backendModel.clear(true) }
if (EffectComposerBackend.effectComposerModel.hasUnsavedChanges) if (root.backendModel.hasUnsavedChanges)
saveChangesDialog.open() saveChangesDialog.open()
else else
EffectComposerBackend.effectComposerModel.clear(true) root.backendModel.clear(true)
} }
onSaveClicked: { onSaveClicked: {
let name = EffectComposerBackend.effectComposerModel.currentComposition let name = root.backendModel.currentComposition
if (name === "") if (name === "")
saveAsDialog.open() saveAsDialog.open()
else else
EffectComposerBackend.effectComposerModel.saveComposition(name) root.backendModel.saveComposition(name)
} }
onSaveAsClicked: saveAsDialog.open() onSaveAsClicked: saveAsDialog.open()
onAssignToSelectedClicked: { onAssignToSelectedClicked: {
EffectComposerBackend.effectComposerModel.assignToSelected() root.backendModel.assignToSelected()
} }
} }
@@ -153,9 +155,9 @@ ColumnLayout {
style: StudioTheme.Values.viewBarButtonStyle style: StudioTheme.Values.viewBarButtonStyle
buttonIcon: StudioTheme.Constants.clearList_medium buttonIcon: StudioTheme.Constants.clearList_medium
tooltip: qsTr("Remove all effect nodes.") tooltip: qsTr("Remove all effect nodes.")
enabled: !EffectComposerBackend.effectComposerModel.isEmpty enabled: !root.backendModel.isEmpty
onClicked: EffectComposerBackend.effectComposerModel.clear() onClicked: root.backendModel.clear()
} }
HelperWidgets.AbstractButton { HelperWidgets.AbstractButton {
@@ -199,7 +201,7 @@ ColumnLayout {
id: repeater id: repeater
width: parent.width width: parent.width
model: EffectComposerBackend.effectComposerModel model: root.backendModel
onCountChanged: { onCountChanged: {
HelperWidgets.Controller.setCount("EffectComposer", repeater.count) HelperWidgets.Controller.setCount("EffectComposer", repeater.count)
@@ -231,7 +233,7 @@ ColumnLayout {
if (root.moveFromIdx === root.moveToIdx) if (root.moveFromIdx === root.moveToIdx)
root.draggedSec.y = root.secsY[root.moveFromIdx] root.draggedSec.y = root.secsY[root.moveFromIdx]
else else
EffectComposerBackend.effectComposerModel.moveNode(root.moveFromIdx, root.moveToIdx) root.backendModel.moveNode(root.moveFromIdx, root.moveToIdx)
highlightBorder = false highlightBorder = false
root.draggedSec = null root.draggedSec = null
@@ -271,13 +273,14 @@ ColumnLayout {
} // ScrollView } // ScrollView
Text { Text {
text: qsTr("Add an effect node to start") text: root.backendModel.isEnabled ? qsTr("Add an effect node to start")
: qsTr("Effect Composer is disabled on MCU projects")
color: StudioTheme.Values.themeTextColor color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.baseFontSize font.pixelSize: StudioTheme.Values.baseFontSize
anchors.centerIn: parent anchors.centerIn: parent
visible: EffectComposerBackend.effectComposerModel.isEmpty visible: root.backendModel.isEmpty
} }
} // Item } // Item
} // Column } // Column

View File

@@ -13,6 +13,8 @@ Rectangle {
height: StudioTheme.Values.toolbarHeight height: StudioTheme.Values.toolbarHeight
color: StudioTheme.Values.themeToolbarBackground color: StudioTheme.Values.themeToolbarBackground
readonly property var backendModel: EffectComposerBackend.effectComposerModel
signal addClicked signal addClicked
signal saveClicked signal saveClicked
signal saveAsClicked signal saveAsClicked
@@ -26,7 +28,7 @@ Rectangle {
style: StudioTheme.Values.viewBarButtonStyle style: StudioTheme.Values.viewBarButtonStyle
buttonIcon: StudioTheme.Constants.add_medium buttonIcon: StudioTheme.Constants.add_medium
tooltip: qsTr("Add new composition") tooltip: qsTr("Add new composition")
enabled: root.backendModel.isEnabled
onClicked: root.addClicked() onClicked: root.addClicked()
} }
@@ -34,8 +36,8 @@ Rectangle {
style: StudioTheme.Values.viewBarButtonStyle style: StudioTheme.Values.viewBarButtonStyle
buttonIcon: StudioTheme.Constants.save_medium buttonIcon: StudioTheme.Constants.save_medium
tooltip: qsTr("Save current composition") tooltip: qsTr("Save current composition")
enabled: EffectComposerBackend.effectComposerModel.hasUnsavedChanges enabled: root.backendModel.isEnabled && (root.backendModel.hasUnsavedChanges
|| EffectComposerBackend.effectComposerModel.currentComposition === "" || root.backendModel.currentComposition === "")
onClicked: root.saveClicked() onClicked: root.saveClicked()
} }
@@ -44,7 +46,7 @@ Rectangle {
style: StudioTheme.Values.viewBarButtonStyle style: StudioTheme.Values.viewBarButtonStyle
buttonIcon: StudioTheme.Constants.saveAs_medium buttonIcon: StudioTheme.Constants.saveAs_medium
tooltip: qsTr("Save current composition with a new name") tooltip: qsTr("Save current composition with a new name")
enabled: !EffectComposerBackend.effectComposerModel.isEmpty enabled: root.backendModel.isEnabled && !root.backendModel.isEmpty
onClicked: root.saveAsClicked() onClicked: root.saveAsClicked()
} }
@@ -53,7 +55,7 @@ Rectangle {
style: StudioTheme.Values.viewBarButtonStyle style: StudioTheme.Values.viewBarButtonStyle
buttonIcon: StudioTheme.Constants.assignTo_medium buttonIcon: StudioTheme.Constants.assignTo_medium
tooltip: qsTr("Assign current composition to selected item") tooltip: qsTr("Assign current composition to selected item")
enabled: EffectComposerBackend.effectComposerModel.currentComposition !== "" enabled: root.backendModel.isEnabled && root.backendModel.currentComposition !== ""
onClicked: root.assignToSelectedClicked() onClicked: root.assignToSelectedClicked()
} }
@@ -61,7 +63,7 @@ Rectangle {
Text { Text {
readonly property string compName: EffectComposerBackend.effectComposerModel.currentComposition readonly property string compName: root.backendModel.currentComposition
text: compName !== "" ? compName : qsTr("Untitled") text: compName !== "" ? compName : qsTr("Untitled")
anchors.centerIn: parent anchors.centerIn: parent

View File

@@ -1475,6 +1475,19 @@ void EffectComposerModel::setShadersUpToDate(bool UpToDate)
emit shadersUpToDateChanged(); emit shadersUpToDateChanged();
} }
bool EffectComposerModel::isEnabled() const
{
return m_isEnabled;
}
void EffectComposerModel::setIsEnabled(bool enabled)
{
if (m_isEnabled == enabled)
return;
m_isEnabled = enabled;
emit isEnabledChanged();
}
// Returns name for image mipmap property. // Returns name for image mipmap property.
// e.g. "myImage" -> "myImageMipmap". // e.g. "myImage" -> "myImageMipmap".
QString EffectComposerModel::mipmapPropertyName(const QString &name) const QString EffectComposerModel::mipmapPropertyName(const QString &name) const

View File

@@ -46,6 +46,7 @@ class EffectComposerModel : public QAbstractListModel
Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged)
Q_PROPERTY(bool hasUnsavedChanges MEMBER m_hasUnsavedChanges WRITE setHasUnsavedChanges NOTIFY hasUnsavedChangesChanged) Q_PROPERTY(bool hasUnsavedChanges MEMBER m_hasUnsavedChanges WRITE setHasUnsavedChanges NOTIFY hasUnsavedChangesChanged)
Q_PROPERTY(bool shadersUpToDate READ shadersUpToDate WRITE setShadersUpToDate NOTIFY shadersUpToDateChanged) Q_PROPERTY(bool shadersUpToDate READ shadersUpToDate WRITE setShadersUpToDate NOTIFY shadersUpToDateChanged)
Q_PROPERTY(bool isEnabled READ isEnabled WRITE setIsEnabled NOTIFY isEnabledChanged)
Q_PROPERTY(QString qmlComponentString READ qmlComponentString) Q_PROPERTY(QString qmlComponentString READ qmlComponentString)
Q_PROPERTY(QString currentComposition READ currentComposition WRITE setCurrentComposition NOTIFY currentCompositionChanged) Q_PROPERTY(QString currentComposition READ currentComposition WRITE setCurrentComposition NOTIFY currentCompositionChanged)
@@ -73,6 +74,9 @@ public:
bool shadersUpToDate() const; bool shadersUpToDate() const;
void setShadersUpToDate(bool newShadersUpToDate); void setShadersUpToDate(bool newShadersUpToDate);
bool isEnabled() const;
void setIsEnabled(bool enabled);
QString fragmentShader() const; QString fragmentShader() const;
void setFragmentShader(const QString &newFragmentShader); void setFragmentShader(const QString &newFragmentShader);
@@ -105,6 +109,7 @@ signals:
void selectedIndexChanged(int idx); void selectedIndexChanged(int idx);
void effectErrorChanged(); void effectErrorChanged();
void shadersUpToDateChanged(); void shadersUpToDateChanged();
void isEnabledChanged();
void shadersBaked(); void shadersBaked();
void currentCompositionChanged(); void currentCompositionChanged();
void nodesChanged(); void nodesChanged();
@@ -201,6 +206,7 @@ private:
QString m_previewEffectPropertiesString; QString m_previewEffectPropertiesString;
QString m_qmlComponentString; QString m_qmlComponentString;
bool m_loadComponentImages = true; bool m_loadComponentImages = true;
bool m_isEnabled = true;
QString m_currentComposition; QString m_currentComposition;
const QRegularExpression m_spaceReg = QRegularExpression("\\s+"); const QRegularExpression m_spaceReg = QRegularExpression("\\s+");

View File

@@ -7,6 +7,7 @@
#include "effectcomposernodesmodel.h" #include "effectcomposernodesmodel.h"
#include "effectcomposerwidget.h" #include "effectcomposerwidget.h"
#include <designermcumanager.h>
#include <documentmanager.h> #include <documentmanager.h>
#include <modelnodeoperations.h> #include <modelnodeoperations.h>
#include <qmldesignerconstants.h> #include <qmldesignerconstants.h>
@@ -59,7 +60,7 @@ QmlDesigner::WidgetInfo EffectComposerView::widgetInfo()
Core::ICore::addContextObject(context); Core::ICore::addContextObject(context);
} }
return createWidgetInfo(m_widget.data(), "Effect Composer", return createWidgetInfo(m_widget.data(), "EffectComposer",
QmlDesigner::WidgetInfo::LeftPane, 0, tr("Effect Composer [beta]")); QmlDesigner::WidgetInfo::LeftPane, 0, tr("Effect Composer [beta]"));
} }
@@ -82,9 +83,11 @@ void EffectComposerView::modelAttached(QmlDesigner::Model *model)
QString currProjectPath = QmlDesigner::DocumentManager::currentProjectDirPath().toString(); QString currProjectPath = QmlDesigner::DocumentManager::currentProjectDirPath().toString();
// if starting a new project, clear the effect composer if (m_currProjectPath != currProjectPath) { // starting a new project
if (m_currProjectPath != currProjectPath)
m_widget->effectComposerModel()->clear(true); m_widget->effectComposerModel()->clear(true);
m_widget->effectComposerModel()->setIsEnabled(
!QmlDesigner::DesignerMcuManager::instance().isMCUProject());
}
m_currProjectPath = currProjectPath; m_currProjectPath = currProjectPath;

View File

@@ -5,6 +5,8 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include "qmldesignercomponents_global.h"
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QSet> #include <QSet>
@@ -12,7 +14,7 @@
namespace QmlDesigner { namespace QmlDesigner {
class DesignerMcuManager class QMLDESIGNERCOMPONENTS_EXPORT DesignerMcuManager
{ {
public: public:
struct Version { struct Version {

View File

@@ -493,7 +493,8 @@ void DesignModeWidget::setup()
static bool isMcuDisabledView(const QString viewId) static bool isMcuDisabledView(const QString viewId)
{ {
static const QStringList mcuDisabledViews = {"Editor3D", "MaterialEditor", "MaterialBrowser", "TextureEditor"}; static const QStringList mcuDisabledViews = {"Editor3D", "MaterialEditor", "MaterialBrowser",
"TextureEditor", "EffectComposer"};
return mcuDisabledViews.contains(viewId); return mcuDisabledViews.contains(viewId);
} }