diff --git a/src/framework/global/modularity/ioc.h b/src/framework/global/modularity/ioc.h index 30607fef65af8..40d2c461a5801 100644 --- a/src/framework/global/modularity/ioc.h +++ b/src/framework/global/modularity/ioc.h @@ -93,6 +93,6 @@ struct QmlIoCContext : public QObject Contextable::GetContext iocCtxForQmlObject(const QObject* o); modularity::ContextPtr iocCtxForQmlContext(const QQmlContext* c); -modularity::ContextPtr iocCtxForQWidget(const QWidget* o); +muse::Contextable::GetContext iocCtxForQWidget(const QWidget* o); #endif } diff --git a/src/framework/global/modularity/ioccontext.cpp b/src/framework/global/modularity/ioccontext.cpp index 053151cdac5a5..e0ba6a989bd2c 100644 --- a/src/framework/global/modularity/ioccontext.cpp +++ b/src/framework/global/modularity/ioccontext.cpp @@ -63,9 +63,26 @@ muse::modularity::ContextPtr muse::iocCtxForQmlContext(const QQmlContext* ctx) return qmlIoc->ctx; } -muse::modularity::ContextPtr muse::iocCtxForQWidget(const QWidget*) +muse::Contextable::GetContext muse::iocCtxForQWidget(const QWidget* w) { - return muse::modularity::globalCtx(); + return [w]() { + IF_ASSERT_FAILED(w) { + return modularity::ContextPtr(); + } + + const QObject* obj = w; + while (obj) { + bool ok = false; + int ctxId = obj->property("ioc_context").toInt(&ok); + if (ok) { + return std::make_shared(ctxId); + } + obj = obj->parent(); + } + + UNREACHABLE; + return modularity::ContextPtr(); + }; } #endif diff --git a/src/framework/interactive/CMakeLists.txt b/src/framework/interactive/CMakeLists.txt index c3478339193ad..17ddd556471ad 100644 --- a/src/framework/interactive/CMakeLists.txt +++ b/src/framework/interactive/CMakeLists.txt @@ -73,6 +73,8 @@ else() endif() endif() +target_link_libraries(muse_interactive PRIVATE muse::ui) + if (MUSE_QT_SUPPORT) target_link_libraries(muse_interactive PUBLIC Qt::Core Qt::Gui Qt::Quick Qt::Widgets) endif() diff --git a/src/framework/interactive/dev/testdialog.cpp b/src/framework/interactive/dev/testdialog.cpp index 26dea089bbf96..2d027a149ffcd 100644 --- a/src/framework/interactive/dev/testdialog.cpp +++ b/src/framework/interactive/dev/testdialog.cpp @@ -25,7 +25,7 @@ using namespace muse::interactive; TestDialog::TestDialog(QWidget* parent) - : QDialog(parent), + : muse::ui::WidgetDialog(parent), ui(new Ui::TestDialog) { ui->setupUi(this); diff --git a/src/framework/interactive/dev/testdialog.h b/src/framework/interactive/dev/testdialog.h index 0eae758fa48ba..3f5291cf83513 100644 --- a/src/framework/interactive/dev/testdialog.h +++ b/src/framework/interactive/dev/testdialog.h @@ -22,14 +22,14 @@ #pragma once -#include +#include "ui/view/widgetdialog.h" namespace Ui { class TestDialog; } namespace muse::interactive { -class TestDialog : public QDialog +class TestDialog : public muse::ui::WidgetDialog { Q_OBJECT @@ -39,6 +39,8 @@ class TestDialog : public QDialog explicit TestDialog(QWidget* parent = nullptr); ~TestDialog() override; + void componentComplete() override {} + QString title() const; public slots: diff --git a/src/framework/interactive/iinteractiveuriregister.h b/src/framework/interactive/iinteractiveuriregister.h index 2da60f3d52800..d52c63ebb1ddd 100644 --- a/src/framework/interactive/iinteractiveuriregister.h +++ b/src/framework/interactive/iinteractiveuriregister.h @@ -27,6 +27,7 @@ #include "modularity/imoduleinterface.h" #include "types/uri.h" #include "interactivetypes.h" +#include "ui/view/widgetdialog.h" class QWidget; @@ -56,7 +57,7 @@ class IInteractiveUriRegister : MODULE_GLOBAL_INTERFACE template void registerWidgetUri(const Uri& uri) { - static_assert(std::is_base_of::value, "T must derive from QWidget"); + static_assert(std::is_base_of::value, "T must derive from muse::ui::WidgetDialog"); registerUri(uri, ContainerMeta(ContainerMeta::Type::QWidgetDialog, qRegisterMetaType())); } diff --git a/src/framework/interactive/internal/interactive.cpp b/src/framework/interactive/internal/interactive.cpp index 4d0eb14cbb159..f7236dbdc0903 100644 --- a/src/framework/interactive/internal/interactive.cpp +++ b/src/framework/interactive/internal/interactive.cpp @@ -39,6 +39,7 @@ #include "diagnostics/diagnosticutils.h" #include "widgetdialogadapter.h" +#include "ui/view/widgetdialog.h" #include "muse_framework_config.h" @@ -1008,15 +1009,21 @@ RetVal Interactive::openWidgetDialog(const Uri& uri, cons QString objectId = QString("%1_%2").arg(widgetMetaTypeId).arg(++count); QMetaType metaType = QMetaType(widgetMetaTypeId); - QDialog* dialog = static_cast(metaType.create()); + ui::WidgetDialog* dialog = static_cast(metaType.create()); if (!dialog) { result.ret = make_ret(Ret::Code::UnknownError); return result; } + dialog->setProperty("ioc_context", iocContext()->id); + + dialog->classBegin(); + fillData(dialog, params); + dialog->componentComplete(); + //! NOTE Will be deleted with the dialog WidgetDialogAdapter* adapter = new WidgetDialogAdapter(dialog); adapter->onShow([this, objectId, dialog]() { diff --git a/src/framework/ui/CMakeLists.txt b/src/framework/ui/CMakeLists.txt index 1d49be25b43f1..846b92360c835 100644 --- a/src/framework/ui/CMakeLists.txt +++ b/src/framework/ui/CMakeLists.txt @@ -92,6 +92,8 @@ target_sources(muse_ui PRIVATE view/widgetstatestore.cpp view/widgetstatestore.h view/widgetutils.h + view/widgetdialog.cpp + view/widgetdialog.h ) if (OS_IS_MAC) diff --git a/src/framework/ui/view/widgetdialog.cpp b/src/framework/ui/view/widgetdialog.cpp new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/src/framework/ui/view/widgetdialog.h b/src/framework/ui/view/widgetdialog.h new file mode 100644 index 0000000000000..b51310aeb462c --- /dev/null +++ b/src/framework/ui/view/widgetdialog.h @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-CLA-applies + * + * MuseScore + * Music Composition & Notation + * + * Copyright (C) 2026 MuseScore Limited and others + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#include "modularity/ioc.h" + +namespace muse::ui { +class WidgetDialog : public QDialog, public muse::Contextable +{ + Q_OBJECT + +public: + explicit WidgetDialog(QWidget* parent = nullptr) + : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + {} + + virtual void classBegin() {} + virtual void componentComplete() {} +}; +} diff --git a/src/framework/uicomponents/view/topleveldialog.cpp b/src/framework/uicomponents/view/topleveldialog.cpp index 2820dfa865a1a..35efb73485bde 100644 --- a/src/framework/uicomponents/view/topleveldialog.cpp +++ b/src/framework/uicomponents/view/topleveldialog.cpp @@ -27,7 +27,7 @@ using namespace muse::uicomponents; TopLevelDialog::TopLevelDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setWindowFlag(Qt::WindowContextHelpButtonHint, false); diff --git a/src/framework/uicomponents/view/topleveldialog.h b/src/framework/uicomponents/view/topleveldialog.h index 73b85afd6af62..2618fbbe88000 100644 --- a/src/framework/uicomponents/view/topleveldialog.h +++ b/src/framework/uicomponents/view/topleveldialog.h @@ -22,13 +22,13 @@ #pragma once -#include +#include "ui/view/widgetdialog.h" #include "modularity/ioc.h" #include "ui/imainwindow.h" namespace muse::uicomponents { -class TopLevelDialog : public QDialog, public muse::Contextable +class TopLevelDialog : public muse::ui::WidgetDialog { public: muse::ContextInject mainWindow = { this }; @@ -36,6 +36,8 @@ class TopLevelDialog : public QDialog, public muse::Contextable public: explicit TopLevelDialog(QWidget* parent = nullptr); + void componentComplete() override {} + protected: bool event(QEvent* e) override; }; diff --git a/src/importexport/audioexport/internal/abstractaudiowriter.cpp b/src/importexport/audioexport/internal/abstractaudiowriter.cpp index 7373f348c8bbc..1ed428ed47f6f 100644 --- a/src/importexport/audioexport/internal/abstractaudiowriter.cpp +++ b/src/importexport/audioexport/internal/abstractaudiowriter.cpp @@ -143,9 +143,11 @@ void AbstractAudioWriter::doWrite(io::IODevice& dstDevice, const SoundTrackForma }; playback()->sequenceIdList() - .onResolve(this, [this, playback, &dstDevice, format, sendProgress](const TrackSequenceIdList& sequenceIdList) { + .onResolve(this, [this, &dstDevice, format, sendProgress](const TrackSequenceIdList& sequenceIdList) { m_progress.start(); + muse::ContextInject playback = { m_iocContext }; + for (const TrackSequenceId sequenceId : sequenceIdList) { playback()->saveSoundTrackProgressChanged(sequenceId) .onReceive(this, [sendProgress](int64_t current, int64_t total, SaveSoundTrackStage stage) { diff --git a/src/notationscene/widgets/breaksdialog.cpp b/src/notationscene/widgets/breaksdialog.cpp index 0e3486412093c..e52670e3fb93c 100644 --- a/src/notationscene/widgets/breaksdialog.cpp +++ b/src/notationscene/widgets/breaksdialog.cpp @@ -31,7 +31,7 @@ static constexpr int DEFAULT_INTERVAL = 4; //--------------------------------------------------------- BreaksDialog::BreaksDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -53,6 +53,10 @@ BreaksDialog::BreaksDialog(QWidget* parent) intervalLabel2->setText(part2); } +void BreaksDialog::componentComplete() +{ +} + //--------------------------------------------------------- // accept //--------------------------------------------------------- diff --git a/src/notationscene/widgets/breaksdialog.h b/src/notationscene/widgets/breaksdialog.h index 675c4833d9de9..b81f43e6ca22d 100644 --- a/src/notationscene/widgets/breaksdialog.h +++ b/src/notationscene/widgets/breaksdialog.h @@ -23,6 +23,8 @@ #ifndef MU_NOTATION_BREAKSDIALOG_H #define MU_NOTATION_BREAKSDIALOG_H +#include "ui/view/widgetdialog.h" + #include "ui_breaksdialog.h" #include "context/iglobalcontext.h" @@ -33,7 +35,7 @@ namespace mu::notation { // BreaksDialog //--------------------------------------------------------- -class BreaksDialog : public QDialog, public Ui::BreaksDialog, public muse::Contextable +class BreaksDialog : public muse::ui::WidgetDialog, private Ui::BreaksDialog { Q_OBJECT @@ -42,6 +44,8 @@ class BreaksDialog : public QDialog, public Ui::BreaksDialog, public muse::Conte public: BreaksDialog(QWidget* parent = nullptr); + void componentComplete() override; + private slots: void accept() override; diff --git a/src/notationscene/widgets/editstaff.cpp b/src/notationscene/widgets/editstaff.cpp index f5db540a7bf02..d191388d9e94b 100644 --- a/src/notationscene/widgets/editstaff.cpp +++ b/src/notationscene/widgets/editstaff.cpp @@ -57,18 +57,13 @@ static const QChar GO_DOWN_ICON = iconCodeToChar(IconCode::Code::ARROW_DOWN); static const QChar EDIT_ICON = iconCodeToChar(IconCode::Code::EDIT); EditStaff::EditStaff(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("EditStaff"); setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); setModal(true); - initStaff(); - - editStaffTypeDialog = new EditStaffType(this); - editStaffTypeDialog->setWindowModality(Qt::WindowModal); - connect(buttonBox, &QDialogButtonBox::clicked, this, &EditStaff::bboxClicked); connect(changeInstrument, &QPushButton::clicked, this, &EditStaff::showReplaceInstrumentDialog); connect(changeStaffType, &QPushButton::clicked, this, &EditStaff::showStaffTypeDialog); @@ -108,6 +103,14 @@ EditStaff::EditStaff(QWidget* parent) setFocus(); } +void EditStaff::componentComplete() +{ + editStaffTypeDialog = new EditStaffType(iocContext(), this); + editStaffTypeDialog->setWindowModality(Qt::WindowModal); + + initStaff(); +} + void EditStaff::setStaff(Staff* s, const Fraction& tick) { if (m_staff != nullptr) { diff --git a/src/notationscene/widgets/editstaff.h b/src/notationscene/widgets/editstaff.h index e15498562615d..679b5570f0572 100644 --- a/src/notationscene/widgets/editstaff.h +++ b/src/notationscene/widgets/editstaff.h @@ -22,7 +22,7 @@ #pragma once -#include +#include "ui/view/widgetdialog.h" #include "ui_editstaff.h" #include "engraving/dom/stafftype.h" @@ -37,7 +37,7 @@ namespace mu::notation { class EditStaffType; -class EditStaff : public QDialog, private Ui::EditStaffBase, public muse::Contextable, public muse::async::Asyncable +class EditStaff : public muse::ui::WidgetDialog, private Ui::EditStaffBase, public muse::async::Asyncable { Q_OBJECT @@ -49,6 +49,7 @@ class EditStaff : public QDialog, private Ui::EditStaffBase, public muse::Contex EditStaff(QWidget* parent = nullptr); private: + void componentComplete() override; void showEvent(QShowEvent*) override; void hideEvent(QHideEvent*) override; void apply(); diff --git a/src/notationscene/widgets/editstafftype.cpp b/src/notationscene/widgets/editstafftype.cpp index 5a50ef910e416..8325c08c97c11 100644 --- a/src/notationscene/widgets/editstafftype.cpp +++ b/src/notationscene/widgets/editstafftype.cpp @@ -60,8 +60,8 @@ mu::engraving::NoteHeadScheme noteHeadSchemes[] = { // EditStaffType //--------------------------------------------------------- -EditStaffType::EditStaffType(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) +EditStaffType::EditStaffType(const muse::modularity::ContextPtr& ctx, QWidget* parent) + : QDialog(parent), muse::Contextable(ctx) { setObjectName("EditStaffType"); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); diff --git a/src/notationscene/widgets/editstafftype.h b/src/notationscene/widgets/editstafftype.h index 1e899be2fc39b..1e96012215abc 100644 --- a/src/notationscene/widgets/editstafftype.h +++ b/src/notationscene/widgets/editstafftype.h @@ -69,7 +69,7 @@ private slots: void addToTemplatesClicked(); public: - EditStaffType(QWidget* parent = nullptr); + EditStaffType(const muse::modularity::ContextPtr& ctx, QWidget* parent = nullptr); ~EditStaffType() {} void setStaffType(const mu::engraving::StaffType* staffType); mu::engraving::StaffType getStaffType() const { return staffType; } diff --git a/src/notationscene/widgets/editstringdata.cpp b/src/notationscene/widgets/editstringdata.cpp index 85b8df124320c..ad5403917baca 100644 --- a/src/notationscene/widgets/editstringdata.cpp +++ b/src/notationscene/widgets/editstringdata.cpp @@ -48,7 +48,7 @@ using namespace muse::ui; //--------------------------------------------------------- EditStringData::EditStringData(QWidget* parent, const std::vector& strings, int frets) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("EditStringData"); setupUi(this); @@ -58,6 +58,11 @@ EditStringData::EditStringData(QWidget* parent, const std::vector& _strings = strings; _frets = frets; + qApp->installEventFilter(this); +} + +void EditStringData::componentComplete() +{ if (_strings.empty()) { initStringsData(); } @@ -66,8 +71,6 @@ EditStringData::EditStringData(QWidget* parent, const std::vector& //! NOTE: It is necessary for the correct start of navigation in the dialog setFocus(); - - qApp->installEventFilter(this); } std::vector EditStringData::strings() const diff --git a/src/notationscene/widgets/editstringdata.h b/src/notationscene/widgets/editstringdata.h index 03f1ae6ec8cdb..e9360f432c5d0 100644 --- a/src/notationscene/widgets/editstringdata.h +++ b/src/notationscene/widgets/editstringdata.h @@ -21,7 +21,7 @@ */ #pragma once -#include +#include "ui/view/widgetdialog.h" #include "ui_editstringdata.h" #include "engraving/dom/stringdata.h" @@ -34,7 +34,7 @@ namespace mu::notation { // EditStringData //--------------------------------------------------------- -class EditStringData : public QDialog, private Ui::EditStringDataBase, public muse::Contextable +class EditStringData : public muse::ui::WidgetDialog, private Ui::EditStringDataBase { Q_OBJECT @@ -43,6 +43,8 @@ class EditStringData : public QDialog, private Ui::EditStringDataBase, public mu public: EditStringData(QWidget* parent = nullptr, const std::vector& strings = {}, int frets = 0); + void componentComplete() override; + std::vector strings() const; int frets() const; diff --git a/src/notationscene/widgets/editstyle.cpp b/src/notationscene/widgets/editstyle.cpp index 50c575dd256de..98fdd88eeffe2 100644 --- a/src/notationscene/widgets/editstyle.cpp +++ b/src/notationscene/widgets/editstyle.cpp @@ -228,7 +228,11 @@ static void fillDynamicHairpinComboBox(QComboBox* comboBox) //--------------------------------------------------------- EditStyle::EditStyle(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) +{ +} + +void EditStyle::classBegin() { //! NOTE: suppress all accessibility events causing a long delay when opening the dialog (massive spam from setupUi) accessibilityController()->setIgnoreQtAccessibilityEvents(true); @@ -1017,8 +1021,8 @@ EditStyle::EditStyle(QWidget* parent) // Signal Mappers // ==================================================== - QSignalMapper* setSignalMapper = new QSignalMapper(this); // value change signals - QSignalMapper* resetSignalMapper = new QSignalMapper(this); // reset style signals + QSignalMapper* setSignalMapper = new QSignalMapper(this); // value change signals + QSignalMapper* resetSignalMapper = new QSignalMapper(this); // reset style signals const auto mapFunction = QOverload<>::of(&QSignalMapper::map); diff --git a/src/notationscene/widgets/editstyle.h b/src/notationscene/widgets/editstyle.h index 9320d4cf9152e..99cc906d21c1e 100644 --- a/src/notationscene/widgets/editstyle.h +++ b/src/notationscene/widgets/editstyle.h @@ -22,6 +22,8 @@ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_editstyle.h" #include "modularity/ioc.h" @@ -38,7 +40,7 @@ class QQuickView; namespace mu::notation { -class EditStyle : public QDialog, private Ui::EditStyleBase, public muse::Contextable +class EditStyle : public muse::ui::WidgetDialog, private Ui::EditStyleBase { Q_OBJECT @@ -56,12 +58,14 @@ class EditStyle : public QDialog, private Ui::EditStyleBase, public muse::Contex public: EditStyle(QWidget* = nullptr); + void classBegin() override; + QString currentPageCode() const; QString currentSubPageCode() const; public slots: - void accept(); - void reject(); + void accept() override; + void reject() override; void setCurrentPageCode(const QString& code); void setCurrentSubPageCode(const QString& code); @@ -73,10 +77,10 @@ public slots: void currentSubPageChanged(); private: - void showEvent(QShowEvent*); - void hideEvent(QHideEvent*); - void changeEvent(QEvent*); - void keyPressEvent(QKeyEvent* event); + void showEvent(QShowEvent*) override; + void hideEvent(QHideEvent*) override; + void changeEvent(QEvent*) override; + void keyPressEvent(QKeyEvent* event) override; void retranslate(); void setHeaderFooterMacroInfoText(); diff --git a/src/notationscene/widgets/measureproperties.cpp b/src/notationscene/widgets/measureproperties.cpp index 8da0cf7ae908b..578293c3d1e9c 100644 --- a/src/notationscene/widgets/measureproperties.cpp +++ b/src/notationscene/widgets/measureproperties.cpp @@ -45,12 +45,17 @@ using namespace muse::ui; static const int ITEM_ACCESSIBLE_TITLE_ROLE = Qt::UserRole + 1; MeasurePropertiesDialog::MeasurePropertiesDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("MeasureProperties"); setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); + qApp->installEventFilter(this); +} + +void MeasurePropertiesDialog::componentComplete() +{ m_notation = context()->currentNotation(); initMeasure(); @@ -73,8 +78,6 @@ MeasurePropertiesDialog::MeasurePropertiesDialog(QWidget* parent) //! NOTE: It is necessary for the correct start of navigation in the dialog setFocus(); - - qApp->installEventFilter(this); } void MeasurePropertiesDialog::initMeasure() diff --git a/src/notationscene/widgets/measureproperties.h b/src/notationscene/widgets/measureproperties.h index 11502c43abca8..3335b4d5767ad 100644 --- a/src/notationscene/widgets/measureproperties.h +++ b/src/notationscene/widgets/measureproperties.h @@ -22,7 +22,7 @@ #pragma once -#include +#include "ui/view/widgetdialog.h" #include "ui_measureproperties.h" #include "modularity/ioc.h" @@ -34,7 +34,7 @@ class Measure; } namespace mu::notation { -class MeasurePropertiesDialog : public QDialog, private Ui::MeasurePropertiesBase, public muse::Contextable +class MeasurePropertiesDialog : public muse::ui::WidgetDialog, private Ui::MeasurePropertiesBase { Q_OBJECT @@ -43,6 +43,8 @@ class MeasurePropertiesDialog : public QDialog, private Ui::MeasurePropertiesBas public: MeasurePropertiesDialog(QWidget* parent = nullptr); + void componentComplete() override; + private slots: void bboxClicked(QAbstractButton* button); void gotoNextMeasure(); diff --git a/src/notationscene/widgets/pagesettings.cpp b/src/notationscene/widgets/pagesettings.cpp index 441eaaba8c26e..10b566ecdea64 100644 --- a/src/notationscene/widgets/pagesettings.cpp +++ b/src/notationscene/widgets/pagesettings.cpp @@ -37,13 +37,16 @@ using namespace muse::ui; using namespace mu::engraving; PageSettings::PageSettings(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("PageSettings"); setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setModal(true); +} +void PageSettings::componentComplete() +{ mmUnit = configuration()->metricUnit(); _changeFlag = false; diff --git a/src/notationscene/widgets/pagesettings.h b/src/notationscene/widgets/pagesettings.h index 98c5f6fd17f7e..ba2debeaa9978 100644 --- a/src/notationscene/widgets/pagesettings.h +++ b/src/notationscene/widgets/pagesettings.h @@ -22,6 +22,8 @@ #ifndef MU_NOTATION_PAGESETTINGS_H #define MU_NOTATION_PAGESETTINGS_H +#include "ui/view/widgetdialog.h" + #include "ui_pagesettings.h" #include "modularity/ioc.h" #include "context/iglobalcontext.h" @@ -32,7 +34,7 @@ class Score; } namespace mu::notation { -class PageSettings : public QDialog, private Ui::PageSettingsBase, public muse::Contextable +class PageSettings : public muse::ui::WidgetDialog, private Ui::PageSettingsBase { Q_OBJECT @@ -42,14 +44,16 @@ class PageSettings : public QDialog, private Ui::PageSettingsBase, public muse:: public: explicit PageSettings(QWidget* parent = 0); + void componentComplete() override; + public slots: - void accept(); - void reject(); + void accept() override; + void reject() override; private: - void showEvent(QShowEvent*); - void hideEvent(QHideEvent*); - void keyPressEvent(QKeyEvent* event); + void showEvent(QShowEvent*) override; + void hideEvent(QHideEvent*) override; + void keyPressEvent(QKeyEvent* event) override; void updateValues(); void blockSignals(bool); diff --git a/src/notationscene/widgets/realizeharmonydialog.cpp b/src/notationscene/widgets/realizeharmonydialog.cpp index 89342d1c2186b..3cd10f5468162 100644 --- a/src/notationscene/widgets/realizeharmonydialog.cpp +++ b/src/notationscene/widgets/realizeharmonydialog.cpp @@ -30,11 +30,14 @@ using namespace mu::notation; RealizeHarmonyDialog::RealizeHarmonyDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("RealizeHarmonyDialog"); setupUi(this); +} +void RealizeHarmonyDialog::componentComplete() +{ chordTable->setVisible(false); connect(showButton, SIGNAL(clicked()), SLOT(toggleChordTable())); diff --git a/src/notationscene/widgets/realizeharmonydialog.h b/src/notationscene/widgets/realizeharmonydialog.h index e9fefa9260120..d2890b8fd9b6b 100644 --- a/src/notationscene/widgets/realizeharmonydialog.h +++ b/src/notationscene/widgets/realizeharmonydialog.h @@ -23,6 +23,8 @@ #ifndef __REALIZEHARMONYDIALOG_H__ #define __REALIZEHARMONYDIALOG_H__ +#include "ui/view/widgetdialog.h" + #include "ui_realizeharmonydialog.h" #include "modularity/ioc.h" @@ -33,7 +35,7 @@ class Harmony; } namespace mu::notation { -class RealizeHarmonyDialog : public QDialog, Ui::RealizeHarmonyDialogBase, public muse::Contextable +class RealizeHarmonyDialog : public muse::ui::WidgetDialog, private Ui::RealizeHarmonyDialogBase { Q_OBJECT @@ -42,6 +44,8 @@ class RealizeHarmonyDialog : public QDialog, Ui::RealizeHarmonyDialogBase, publi public: RealizeHarmonyDialog(QWidget* parent = nullptr); + void componentComplete() override; + private slots: INotationInteractionPtr interaction() const; diff --git a/src/notationscene/widgets/selectdialog.cpp b/src/notationscene/widgets/selectdialog.cpp index adcd2f148f8e8..c14f90429371f 100644 --- a/src/notationscene/widgets/selectdialog.cpp +++ b/src/notationscene/widgets/selectdialog.cpp @@ -38,12 +38,15 @@ using namespace muse::ui; //--------------------------------------------------------- SelectDialog::SelectDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("SelectDialog"); setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); +} +void SelectDialog::componentComplete() +{ const INotationInteractionPtr interaction = globalContext()->currentNotation()->interaction(); IF_ASSERT_FAILED(interaction) { return; diff --git a/src/notationscene/widgets/selectdialog.h b/src/notationscene/widgets/selectdialog.h index 3126e0e245565..c3d3aa3a316a4 100644 --- a/src/notationscene/widgets/selectdialog.h +++ b/src/notationscene/widgets/selectdialog.h @@ -21,6 +21,8 @@ */ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_selectdialog.h" #include "modularity/ioc.h" @@ -35,7 +37,7 @@ namespace mu::notation { // SelectDialog //--------------------------------------------------------- -class SelectDialog : public QDialog, Ui::SelectDialog, public muse::Contextable +class SelectDialog : public muse::ui::WidgetDialog, private Ui::SelectDialog { Q_OBJECT @@ -44,6 +46,8 @@ class SelectDialog : public QDialog, Ui::SelectDialog, public muse::Contextable public: SelectDialog(QWidget* parent = nullptr); + void componentComplete() override; + bool doReplace() const; bool doAdd() const; bool doSubtract() const; diff --git a/src/notationscene/widgets/selectnotedialog.cpp b/src/notationscene/widgets/selectnotedialog.cpp index 1feafb67de2cf..a9404f7b9acbf 100644 --- a/src/notationscene/widgets/selectnotedialog.cpp +++ b/src/notationscene/widgets/selectnotedialog.cpp @@ -51,12 +51,15 @@ using namespace muse::ui; //--------------------------------------------------------- SelectNoteDialog::SelectNoteDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("SelectNoteDialog"); setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); +} +void SelectNoteDialog::componentComplete() +{ const INotationInteractionPtr interaction = globalContext()->currentNotation()->interaction(); IF_ASSERT_FAILED(interaction) { return; diff --git a/src/notationscene/widgets/selectnotedialog.h b/src/notationscene/widgets/selectnotedialog.h index cae5b6a97745a..a2c9b4b072cd4 100644 --- a/src/notationscene/widgets/selectnotedialog.h +++ b/src/notationscene/widgets/selectnotedialog.h @@ -21,6 +21,8 @@ */ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_selectnotedialog.h" #include "modularity/ioc.h" @@ -32,7 +34,7 @@ class Note; } namespace mu::notation { -class SelectNoteDialog : public QDialog, Ui::SelectNoteDialog, public muse::Contextable +class SelectNoteDialog : public muse::ui::WidgetDialog, private Ui::SelectNoteDialog { Q_OBJECT @@ -41,6 +43,8 @@ class SelectNoteDialog : public QDialog, Ui::SelectNoteDialog, public muse::Cont public: SelectNoteDialog(QWidget* parent = nullptr); + void componentComplete() override; + bool doReplace() const; bool doAdd() const; bool doSubtract() const; diff --git a/src/notationscene/widgets/stafftextpropertiesdialog.cpp b/src/notationscene/widgets/stafftextpropertiesdialog.cpp index 33ff4fef7f8ef..bf23dcce7f305 100644 --- a/src/notationscene/widgets/stafftextpropertiesdialog.cpp +++ b/src/notationscene/widgets/stafftextpropertiesdialog.cpp @@ -36,11 +36,19 @@ using namespace mu::engraving; static const QString STAFF_TEXT_PROPERTIES_DIALOG_NAME("StaffTextPropertiesDialog"); StaffTextPropertiesDialog::StaffTextPropertiesDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName(STAFF_TEXT_PROPERTIES_DIALOG_NAME); setupUi(this); +} + +StaffTextPropertiesDialog::~StaffTextPropertiesDialog() +{ + delete m_staffText; +} +void StaffTextPropertiesDialog::componentComplete() +{ const INotationPtr notation = globalContext()->currentNotation(); const INotationInteractionPtr interaction = notation ? notation->interaction() : nullptr; EngravingItem* element = interaction ? interaction->hitElementContext().element : nullptr; @@ -85,11 +93,6 @@ StaffTextPropertiesDialog::StaffTextPropertiesDialog(QWidget* parent) connect(this, &QDialog::accepted, this, &StaffTextPropertiesDialog::saveValues); } -StaffTextPropertiesDialog::~StaffTextPropertiesDialog() -{ - delete m_staffText; -} - void StaffTextPropertiesDialog::showEvent(QShowEvent* event) { muse::ui::WidgetStateStore::restoreGeometry(this); diff --git a/src/notationscene/widgets/stafftextpropertiesdialog.h b/src/notationscene/widgets/stafftextpropertiesdialog.h index a5950554579e3..6bece36497ac0 100644 --- a/src/notationscene/widgets/stafftextpropertiesdialog.h +++ b/src/notationscene/widgets/stafftextpropertiesdialog.h @@ -21,6 +21,8 @@ */ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_stafftextpropertiesdialog.h" #include "modularity/ioc.h" @@ -31,7 +33,7 @@ class StaffTextBase; } namespace mu::notation { -class StaffTextPropertiesDialog : public QDialog, public Ui::StaffTextPropertiesDialog, public muse::Contextable +class StaffTextPropertiesDialog : public muse::ui::WidgetDialog, private Ui::StaffTextPropertiesDialog { Q_OBJECT @@ -41,6 +43,8 @@ class StaffTextPropertiesDialog : public QDialog, public Ui::StaffTextProperties StaffTextPropertiesDialog(QWidget* parent = nullptr); ~StaffTextPropertiesDialog() override; + void componentComplete() override; + private slots: void saveValues(); void setSwingControls(bool); diff --git a/src/notationscene/widgets/transposedialog.cpp b/src/notationscene/widgets/transposedialog.cpp index d26a5afc6262d..896095308a547 100644 --- a/src/notationscene/widgets/transposedialog.cpp +++ b/src/notationscene/widgets/transposedialog.cpp @@ -35,7 +35,7 @@ using namespace muse::ui; //--------------------------------------------------------- TransposeDialog::TransposeDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("TransposeDialog"); setupUi(this); @@ -45,7 +45,10 @@ TransposeDialog::TransposeDialog(QWidget* parent) connect(transposeByInterval, &QGroupBox::clicked, this, &TransposeDialog::transposeByIntervalToggled); connect(chromaticBox, &QGroupBox::clicked, this, &TransposeDialog::chromaticBoxToggled); connect(diatonicBox, &QGroupBox::clicked, this, &TransposeDialog::diatonicBoxToggled); +} +void TransposeDialog::componentComplete() +{ if (selection()->isNone()) { interaction()->selectAll(); m_allSelected = true; diff --git a/src/notationscene/widgets/transposedialog.h b/src/notationscene/widgets/transposedialog.h index 15202c332695b..9898a3ca8e40d 100644 --- a/src/notationscene/widgets/transposedialog.h +++ b/src/notationscene/widgets/transposedialog.h @@ -22,6 +22,8 @@ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_transposedialog.h" #include "modularity/ioc.h" @@ -46,7 +48,7 @@ struct TransposeDialogState { int needTransposeDoubleSharpsFlatsIdx = 1; }; -class TransposeDialog : public QDialog, Ui::TransposeDialogBase, public muse::Contextable +class TransposeDialog : public muse::ui::WidgetDialog, private Ui::TransposeDialogBase { Q_OBJECT @@ -56,6 +58,8 @@ class TransposeDialog : public QDialog, Ui::TransposeDialogBase, public muse::Co TransposeDialog(QWidget* parent = 0); + void componentComplete() override; + private slots: void transposeByKeyToggled(bool); void transposeByIntervalToggled(bool); diff --git a/src/notationscene/widgets/tupletdialog.cpp b/src/notationscene/widgets/tupletdialog.cpp index 7d8fdd327064f..9ae1f7eddcb48 100644 --- a/src/notationscene/widgets/tupletdialog.cpp +++ b/src/notationscene/widgets/tupletdialog.cpp @@ -34,12 +34,15 @@ using namespace muse::actions; //--------------------------------------------------------- TupletDialog::TupletDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName("TupletDialog"); setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); +} +void TupletDialog::componentComplete() +{ connect(buttonBox, &QDialogButtonBox::clicked, this, &TupletDialog::bboxClicked); defaultToStyleSettings(); diff --git a/src/notationscene/widgets/tupletdialog.h b/src/notationscene/widgets/tupletdialog.h index 37e1bb0683e7a..0cee68e1bc4f7 100644 --- a/src/notationscene/widgets/tupletdialog.h +++ b/src/notationscene/widgets/tupletdialog.h @@ -21,6 +21,8 @@ */ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_tupletdialog.h" #include "modularity/ioc.h" @@ -28,7 +30,7 @@ #include "actions/iactionsdispatcher.h" namespace mu::notation { -class TupletDialog : public QDialog, Ui::TupletDialog, public muse::Contextable +class TupletDialog : public muse::ui::WidgetDialog, private Ui::TupletDialog { Q_OBJECT @@ -41,6 +43,8 @@ class TupletDialog : public QDialog, Ui::TupletDialog, public muse::Contextable public: TupletDialog(QWidget* parent = nullptr); + void componentComplete() override; + void defaultToStyleSettings(); TupletNumberType numberType() const; diff --git a/src/palette/palettemodule.cpp b/src/palette/palettemodule.cpp index cad451ef0889e..6776551bae3e5 100644 --- a/src/palette/palettemodule.cpp +++ b/src/palette/palettemodule.cpp @@ -68,8 +68,9 @@ void PaletteModule::resolveImports() ir->registerWidgetUri(Uri("musescore://palette/specialcharacters")); ir->registerWidgetUri(Uri("musescore://palette/timesignatureproperties")); ir->registerWidgetUri(Uri("musescore://palette/customizekit")); - ir->registerWidgetUri(Uri("musescore://notation/keysignatures")); - ir->registerWidgetUri(Uri("musescore://notation/timesignatures")); + //! FIXME This is not a widget dialog + //ir->registerWidgetUri(Uri("musescore://notation/keysignatures")); + //ir->registerWidgetUri(Uri("musescore://notation/timesignatures")); ir->registerQmlUri(Uri("musescore://palette/properties"), "MuseScore.Palette", "PalettePropertiesDialog"); ir->registerQmlUri(Uri("musescore://palette/cellproperties"), "MuseScore.Palette", "PaletteCellPropertiesDialog"); diff --git a/src/palette/widgets/customizekitdialog.cpp b/src/palette/widgets/customizekitdialog.cpp index 912deeaab097e..6b66fa0bd2149 100644 --- a/src/palette/widgets/customizekitdialog.cpp +++ b/src/palette/widgets/customizekitdialog.cpp @@ -143,17 +143,10 @@ struct SymbolIcon { }; CustomizeKitDialog::CustomizeKitDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName(QStringLiteral("CustomizeKitDialog")); - m_notation = globalContext()->currentNotation(); - if (!m_notation) { - return; - } - - initDrumsetAndKey(); - setupUi(this); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); @@ -278,6 +271,16 @@ CustomizeKitDialog::CustomizeKitDialog(QWidget* parent) setFocus(); } +void CustomizeKitDialog::componentComplete() +{ + m_notation = globalContext()->currentNotation(); + if (!m_notation) { + return; + } + + initDrumsetAndKey(); +} + //--------------------------------------------------------- // customGboxToggled //--------------------------------------------------------- diff --git a/src/palette/widgets/customizekitdialog.h b/src/palette/widgets/customizekitdialog.h index 2d8b3555a2fe2..e3e118ee091ef 100644 --- a/src/palette/widgets/customizekitdialog.h +++ b/src/palette/widgets/customizekitdialog.h @@ -22,6 +22,8 @@ #ifndef MU_PALETTE_CUSTOMIZEKITDIALOG_H #define MU_PALETTE_CUSTOMIZEKITDIALOG_H +#include "ui/view/widgetdialog.h" + #include "ui_customizekitdialog.h" #include "modularity/ioc.h" @@ -40,7 +42,7 @@ namespace mu::palette { // CustomizeKitDialog //--------------------------------------------------------- -class CustomizeKitDialog : public QDialog, private Ui::CustomizeKitDialog, public muse::Contextable +class CustomizeKitDialog : public muse::ui::WidgetDialog, private Ui::CustomizeKitDialog { Q_OBJECT @@ -55,6 +57,8 @@ class CustomizeKitDialog : public QDialog, private Ui::CustomizeKitDialog, publi public: CustomizeKitDialog(QWidget* parent = nullptr); + void componentComplete() override; + private slots: void bboxClicked(QAbstractButton* button); void itemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); diff --git a/src/palette/widgets/masterpalette.cpp b/src/palette/widgets/masterpalette.cpp index f06fc5f6140f3..513012fa960fa 100644 --- a/src/palette/widgets/masterpalette.cpp +++ b/src/palette/widgets/masterpalette.cpp @@ -88,6 +88,11 @@ MasterPalette::MasterPalette(QWidget* parent) setObjectName("MasterPalette"); setupUi(this); +} + +void MasterPalette::componentComplete() +{ + TopLevelDialog::componentComplete(); treeWidget->clear(); diff --git a/src/palette/widgets/masterpalette.h b/src/palette/widgets/masterpalette.h index 9529b3a03b188..660c629aa7d49 100644 --- a/src/palette/widgets/masterpalette.h +++ b/src/palette/widgets/masterpalette.h @@ -42,6 +42,8 @@ class MasterPalette : public muse::uicomponents::TopLevelDialog, Ui::MasterPalet public: explicit MasterPalette(QWidget* parent = nullptr); + void componentComplete() override; + QString selectedPaletteName() const; public slots: diff --git a/src/palette/widgets/timesignaturepropertiesdialog.cpp b/src/palette/widgets/timesignaturepropertiesdialog.cpp index 42cfd698cc552..c8adb0f6e0419 100644 --- a/src/palette/widgets/timesignaturepropertiesdialog.cpp +++ b/src/palette/widgets/timesignaturepropertiesdialog.cpp @@ -45,11 +45,19 @@ using namespace mu::engraving; //--------------------------------------------------------- TimeSignaturePropertiesDialog::TimeSignaturePropertiesDialog(QWidget* parent) - : QDialog(parent), muse::Contextable(muse::iocCtxForQWidget(this)) + : muse::ui::WidgetDialog(parent) { setObjectName(TIME_SIGNATURE_PROPERTIES_DIALOG_NAME); setupUi(this); +} + +TimeSignaturePropertiesDialog::~TimeSignaturePropertiesDialog() +{ + delete m_editedTimeSig; +} +void TimeSignaturePropertiesDialog::componentComplete() +{ QString musicalFontFamily = QString::fromStdString(uiConfiguration()->musicalFontFamily()); int musicalFontSize = uiConfiguration()->musicalFontSize(); @@ -157,11 +165,6 @@ TimeSignaturePropertiesDialog::TimeSignaturePropertiesDialog(QWidget* parent) groups->setSig(m_editedTimeSig->sig(), g, m_editedTimeSig->numeratorString(), m_editedTimeSig->denominatorString()); } -TimeSignaturePropertiesDialog::~TimeSignaturePropertiesDialog() -{ - delete m_editedTimeSig; -} - void TimeSignaturePropertiesDialog::showEvent(QShowEvent* event) { WidgetStateStore::restoreGeometry(this); diff --git a/src/palette/widgets/timesignaturepropertiesdialog.h b/src/palette/widgets/timesignaturepropertiesdialog.h index 8c595562eecc0..51f831f288350 100644 --- a/src/palette/widgets/timesignaturepropertiesdialog.h +++ b/src/palette/widgets/timesignaturepropertiesdialog.h @@ -22,6 +22,8 @@ #pragma once +#include "ui/view/widgetdialog.h" + #include "ui_timesignaturepropertiesdialog.h" #include "modularity/ioc.h" @@ -34,7 +36,7 @@ class TimeSig; } namespace mu::palette { -class TimeSignaturePropertiesDialog : public QDialog, public Ui::TimeSigProperties, public muse::Contextable +class TimeSignaturePropertiesDialog : public muse::ui::WidgetDialog, public Ui::TimeSigProperties { Q_OBJECT @@ -46,6 +48,8 @@ class TimeSignaturePropertiesDialog : public QDialog, public Ui::TimeSigProperti TimeSignaturePropertiesDialog(QWidget* parent = nullptr); ~TimeSignaturePropertiesDialog() override; + void componentComplete() override; + private slots: void accept() override;