diff --git a/src/imports/mvvmcore/plugins.qmltypes b/src/imports/mvvmcore/plugins.qmltypes index d119137..07305d4 100644 --- a/src/imports/mvvmcore/plugins.qmltypes +++ b/src/imports/mvvmcore/plugins.qmltypes @@ -485,6 +485,7 @@ Module { revision: 1 Parameter { name: "key"; type: "string" } } + Signal { name: "resetAccepted"; revision: 1 } Method { name: "callAction" Parameter { name: "key"; type: "string" } @@ -514,6 +515,11 @@ Module { name: "resetValue" Parameter { name: "key"; type: "string" } } + Method { + name: "resetAll" + revision: 1 + Parameter { name: "setup"; type: "SettingsElements::Setup" } + } } Component { name: "QtMvvm::ViewModel" diff --git a/src/imports/mvvmquick/settingsuibuilder.cpp b/src/imports/mvvmquick/settingsuibuilder.cpp index 05bf0a7..a145c7f 100644 --- a/src/imports/mvvmquick/settingsuibuilder.cpp +++ b/src/imports/mvvmquick/settingsuibuilder.cpp @@ -64,21 +64,7 @@ void SettingsUiBuilder::restoreDefaults() { if(!_viewModel->canRestoreDefaults()) return; - - auto result = CoreApp::showDialog(_viewModel->restoreConfig()); - connect(result, &MessageResult::dialogDone, this, [this](MessageConfig::StandardButton btn) { - if(btn != MessageConfig::Yes) - return; - for(const auto &category : qAsConst(_currentSetup.categories)) { - for(const auto §ion : category.sections) { - for(const auto &group : section.groups) { - for(const auto &entry : group.entries) - _viewModel->resetValue(entry.key); - } - } - } - emit closeSettings(); - }, Qt::QueuedConnection); + _viewModel->resetAll(_currentSetup); } void SettingsUiBuilder::setFilterText(QString filterText) @@ -118,3 +104,16 @@ void SettingsUiBuilder::startBuildUi() emit presentOverview(_sectionFilterModel, _sectionModel->hasSections()); } } + +void SettingsUiBuilder::setViewModel(SettingsViewModel *viewModel) +{ + if(_viewModel == viewModel) + return; + + disconnect(_viewModel, &SettingsViewModel::resetAccepted, + this, &SettingsUiBuilder::closeSettings); + _viewModel = viewModel; + connect(_viewModel, &SettingsViewModel::resetAccepted, + this, &SettingsUiBuilder::closeSettings); + emit viewModelChanged(_viewModel); +} diff --git a/src/imports/mvvmquick/settingsuibuilder.h b/src/imports/mvvmquick/settingsuibuilder.h index ab3a921..1917358 100644 --- a/src/imports/mvvmquick/settingsuibuilder.h +++ b/src/imports/mvvmquick/settingsuibuilder.h @@ -19,7 +19,7 @@ class SettingsUiBuilder : public QObject Q_OBJECT Q_PROPERTY(QQuickItem* buildView MEMBER _buildView NOTIFY buildViewChanged) - Q_PROPERTY(SettingsViewModel* viewModel MEMBER _viewModel NOTIFY viewModelChanged) + Q_PROPERTY(SettingsViewModel* viewModel MEMBER _viewModel WRITE setViewModel NOTIFY viewModelChanged) Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(bool allowSearch MEMBER _allowSearch NOTIFY allowSearchChanged) Q_PROPERTY(bool allowRestore MEMBER _allowRestore NOTIFY allowRestoreChanged) @@ -50,6 +50,8 @@ Q_SIGNALS: private Q_SLOTS: void startBuildUi(); + void setViewModel(SettingsViewModel *viewModel); + private: QQuickItem* _buildView = nullptr; SettingsViewModel *_viewModel = nullptr; diff --git a/src/mvvmcore/coreapp.cpp b/src/mvvmcore/coreapp.cpp index c387504..1d0b314 100644 --- a/src/mvvmcore/coreapp.cpp +++ b/src/mvvmcore/coreapp.cpp @@ -2,6 +2,7 @@ #include "coreapp_p.h" #include "qtmvvm_logging_p.h" #include "serviceregistry_p.h" +#include "settingssetup.h" #include #include @@ -32,6 +33,13 @@ void CoreApp::registerApp() //register metatypes qRegisterMetaType("const QMetaObject*"); qRegisterMetaType(); + + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + registerInterfaceConverter(); //setup diff --git a/src/mvvmcore/settingsviewmodel.cpp b/src/mvvmcore/settingsviewmodel.cpp index 9b713a2..841c2d0 100644 --- a/src/mvvmcore/settingsviewmodel.cpp +++ b/src/mvvmcore/settingsviewmodel.cpp @@ -76,6 +76,28 @@ void SettingsViewModel::resetValue(const QString &key) emit valueChanged(key); } +void SettingsViewModel::resetAll(const SettingsElements::Setup &setup) +{ + if(!canRestoreDefaults()) + return; + + auto result = CoreApp::showDialog(restoreConfig()); + connect(result, &MessageResult::dialogDone, this, [this, setup](MessageConfig::StandardButton btn) { + if(btn != MessageConfig::Yes) + return; + for(const auto &category : setup.categories) { + for(const auto §ion : category.sections) { + for(const auto &group : section.groups) { + for(const auto &entry : group.entries) { + resetValue(entry.key); + } + } + } + } + emit resetAccepted({}); + }, Qt::QueuedConnection); +} + void SettingsViewModel::callAction(const QString &key, const QVariantMap ¶meters) { Q_UNUSED(parameters) diff --git a/src/mvvmcore/settingsviewmodel.h b/src/mvvmcore/settingsviewmodel.h index e9bd080..28a59e6 100644 --- a/src/mvvmcore/settingsviewmodel.h +++ b/src/mvvmcore/settingsviewmodel.h @@ -59,6 +59,7 @@ public: Q_INVOKABLE virtual void saveValue(const QString &key, const QVariant &value); //! Resets the value or group identified by the key Q_INVOKABLE virtual void resetValue(const QString &key); + Q_REVISION(1) Q_INVOKABLE virtual void resetAll(const SettingsElements::Setup &setup); public Q_SLOTS: //! Is called when an action type edit is pressed @@ -75,6 +76,7 @@ Q_SIGNALS: void beginLoadSetup(); Q_REVISION(1) void valueChanged(const QString &key); //TODO add to save/reset doc + Q_REVISION(1) void resetAccepted(QPrivateSignal); protected: void onInit(const QVariantHash ¶ms) override; diff --git a/src/mvvmwidgets/settingsdialog.cpp b/src/mvvmwidgets/settingsdialog.cpp index 487f7c9..6b2bcca 100644 --- a/src/mvvmwidgets/settingsdialog.cpp +++ b/src/mvvmwidgets/settingsdialog.cpp @@ -27,6 +27,8 @@ SettingsDialog::SettingsDialog(ViewModel *viewModel, QWidget *parent) : connect(d->viewModel, &SettingsViewModel::valueChanged, d, &SettingsDialogPrivate::entryChanged, Qt::QueuedConnection); // to detach updated from the bulk save operation + connect(d->viewModel, &SettingsViewModel::resetAccepted, + this, &SettingsDialog::accept); if(parentWidget()) { setWindowModality(Qt::WindowModal); @@ -95,7 +97,7 @@ void SettingsDialogPrivate::createUi() auto icoUrl = q->iconOverwrite(); if(icoUrl.isValid()) viewModel->settingsSetupLoader()->changeDefaultIcon(icoUrl); - auto setup = viewModel->loadSetup(QStringLiteral("widgets")); + setup = viewModel->loadSetup(QStringLiteral("widgets")); ui->filterLineEdit->setVisible(setup.allowSearch); ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->setVisible(setup.allowRestore && viewModel->canRestoreDefaults()); @@ -246,8 +248,9 @@ void SettingsDialogPrivate::saveValues() void SettingsDialogPrivate::restoreValues() { - for(const auto &info : qAsConst(entryMap)) - viewModel->resetValue(info.first.key); + if(!viewModel->canRestoreDefaults()) + return; + viewModel->resetAll(setup); } int SettingsDialogPrivate::calcSpacing(Qt::Orientation orientation) @@ -434,15 +437,7 @@ void SettingsDialogPrivate::buttonBoxClicked(QAbstractButton *button) saveValues(); break; case QDialogButtonBox::RestoreDefaults: - if(viewModel->canRestoreDefaults()) { - auto result = CoreApp::showDialog(viewModel->restoreConfig()); - connect(result, &MessageResult::dialogDone, this, [this](MessageConfig::StandardButton btnResult) { - if(btnResult == MessageConfig::Yes) { - restoreValues(); - q->accept(); - } - }); - } + restoreValues(); break; default: Q_UNREACHABLE(); diff --git a/src/mvvmwidgets/settingsdialog_p.h b/src/mvvmwidgets/settingsdialog_p.h index b7e7e96..37fe5cf 100644 --- a/src/mvvmwidgets/settingsdialog_p.h +++ b/src/mvvmwidgets/settingsdialog_p.h @@ -54,6 +54,8 @@ public: CategoryItemDelegate *delegate = nullptr; int maxWidthBase = 0; + SettingsElements::Setup setup; + using EntryInfo = QPair; QHash entryMap; QHash keyMap;