From d9774e7faf7a5ff9d388d54d777e769b4262b92e Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 12 Dec 2023 15:15:15 +0200 Subject: [PATCH] EffectMaker: confirm save changes before opening an composition Change-Id: I05659e4cdeba5dc5f437d2fb99bc3768c6a1522d Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Patch Build Bot --- .../effectMakerQmlSources/EffectMaker.qml | 16 ++++++++++++++-- src/plugins/effectmakernew/effectmakerview.cpp | 9 +-------- .../effectmakernew/effectmakerwidget.cpp | 18 +++++++++++++++++- src/plugins/effectmakernew/effectmakerwidget.h | 3 +++ 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMaker.qml b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMaker.qml index 709380d8c31..519854d545f 100644 --- a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMaker.qml +++ b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMaker.qml @@ -16,6 +16,16 @@ Item { property int moveToIdx: 0 property bool previewAnimationRunning: false + // Invoked after save changes is done + property var onSaveChangesCallback: () => {} + + // Invoked from C++ side when open composition is requested and there are unsaved changes + function promptToSaveBeforeOpen() { + root.onSaveChangesCallback = () => { EffectMakerBackend.rootView.doOpenComposition() } + + saveChangesDialog.open() + } + SaveAsDialog { id: saveDialog anchors.centerIn: parent @@ -31,12 +41,12 @@ Item { saveDialog.clearOnClose = true saveDialog.open() } else { - EffectMakerBackend.effectMakerModel.clear() + root.onSaveChangesCallback() } } onDiscard: { - EffectMakerBackend.effectMakerModel.clear() + root.onSaveChangesCallback() } } @@ -47,6 +57,8 @@ Item { EffectMakerTopBar { onAddClicked: { + root.onSaveChangesCallback = () => { EffectMakerBackend.effectMakerModel.clear() } + if (EffectMakerBackend.effectMakerModel.hasUnsavedChanges) saveChangesDialog.open() else diff --git a/src/plugins/effectmakernew/effectmakerview.cpp b/src/plugins/effectmakernew/effectmakerview.cpp index 637c12f6d5a..11624efdeb0 100644 --- a/src/plugins/effectmakernew/effectmakerview.cpp +++ b/src/plugins/effectmakernew/effectmakerview.cpp @@ -7,17 +7,10 @@ #include "effectmakernodesmodel.h" #include "effectmakerwidget.h" -#include "nodeinstanceview.h" #include "qmldesignerconstants.h" #include -#include -#include -#include -#include -#include - namespace EffectMaker { EffectMakerContext::EffectMakerContext(QWidget *widget) @@ -66,7 +59,7 @@ void EffectMakerView::customNotification([[maybe_unused]] const AbstractView *vi { if (identifier == "open_effectmaker_composition" && data.count() > 0) { const QString compositionPath = data[0].toString(); - m_widget->effectMakerModel()->openComposition(compositionPath); + m_widget->openComposition(compositionPath); } } diff --git a/src/plugins/effectmakernew/effectmakerwidget.cpp b/src/plugins/effectmakernew/effectmakerwidget.cpp index 877d0e2d523..db549501f37 100644 --- a/src/plugins/effectmakernew/effectmakerwidget.cpp +++ b/src/plugins/effectmakernew/effectmakerwidget.cpp @@ -12,7 +12,6 @@ //#include "qmldesigner/designercore/imagecache/midsizeimagecacheprovider.h" #include "qmldesignerconstants.h" #include "qmldesignerplugin.h" -#include "qqmlcontext.h" #include "theme.h" #include @@ -30,7 +29,9 @@ #include #include +#include #include +#include #include namespace EffectMaker { @@ -193,6 +194,21 @@ void EffectMakerWidget::initView() reloadQmlSource(); } +void EffectMakerWidget::openComposition(const QString &path) +{ + m_compositionPath = path; + + if (effectMakerModel()->hasUnsavedChanges()) + QMetaObject::invokeMethod(quickWidget()->rootObject(), "promptToSaveBeforeOpen"); + else + doOpenComposition(); +} + +void EffectMakerWidget::doOpenComposition() +{ + effectMakerModel()->openComposition(m_compositionPath); +} + void EffectMakerWidget::reloadQmlSource() { const QString effectMakerQmlPath = qmlSourcesPath() + "/EffectMaker.qml"; diff --git a/src/plugins/effectmakernew/effectmakerwidget.h b/src/plugins/effectmakernew/effectmakerwidget.h index 9204026a9c9..35f43f99b3e 100644 --- a/src/plugins/effectmakernew/effectmakerwidget.h +++ b/src/plugins/effectmakernew/effectmakerwidget.h @@ -39,6 +39,7 @@ public: void delayedUpdateModel(); void updateModel(); void initView(); + void openComposition(const QString &path); StudioQuickWidget *quickWidget() const; QPointer effectMakerModel() const; @@ -46,6 +47,7 @@ public: Q_INVOKABLE void addEffectNode(const QString &nodeQenPath); Q_INVOKABLE void focusSection(int section); + Q_INVOKABLE void doOpenComposition(); Q_INVOKABLE QRect screenRect() const; Q_INVOKABLE QPoint globalPos(const QPoint &point) const; @@ -74,6 +76,7 @@ private: }; ImportScanData m_importScan; + QString m_compositionPath; }; } // namespace EffectMaker