From 20725da050b1fcac39f6bbe6973b6677c7e89ab5 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 16 Jan 2020 12:46:45 +0100 Subject: [PATCH] CPaster: Use new pattern for SettingsPage Change-Id: I90f8684e51dd7855000dd93b68b94c7c6b56402b Reviewed-by: Christian Stenger --- src/plugins/cpaster/cpasterplugin.cpp | 7 ++- src/plugins/cpaster/cpasterplugin.h | 3 +- src/plugins/cpaster/settingspage.cpp | 71 +++++++++++---------------- src/plugins/cpaster/settingspage.h | 35 +------------ 4 files changed, 38 insertions(+), 78 deletions(-) diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index 13c4faabe36..c1198a26a6f 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -115,9 +115,10 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *errorMe // Create the settings Page m_settings->fromSettings(ICore::settings()); - auto settingsPage = new SettingsPage(m_settings, this); // Create the protocols and append them to the Settings + QStringList protocolNames; + Protocol *protos[] = {new PasteBinDotComProtocol, new FileShareProtocol, new PasteCodeDotXyzProtocol, @@ -126,10 +127,12 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *errorMe for (int i = 0; i < count; ++i) { connect(protos[i], &Protocol::pasteDone, this, &CodepasterPlugin::finishPost); connect(protos[i], &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch); - settingsPage->addProtocol(protos[i]->name()); + protocolNames.append(protos[i]->name()); m_protocols.append(protos[i]); } + (void) new SettingsPage(m_settings, protocolNames, this); + m_urlOpen = new UrlOpenProtocol; connect(m_urlOpen, &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch); diff --git a/src/plugins/cpaster/cpasterplugin.h b/src/plugins/cpaster/cpasterplugin.h index 46207ca2867..35342aa4315 100644 --- a/src/plugins/cpaster/cpasterplugin.h +++ b/src/plugins/cpaster/cpasterplugin.h @@ -30,7 +30,6 @@ #include #include -#include QT_BEGIN_NAMESPACE class QAction; @@ -87,7 +86,7 @@ private: void fetchUrl(); static CodepasterPlugin *m_instance; - const QSharedPointer m_settings; + Settings *m_settings = nullptr; QAction *m_postEditorAction = nullptr; QAction *m_fetchAction = nullptr; QAction *m_fetchUrlAction = nullptr; diff --git a/src/plugins/cpaster/settingspage.cpp b/src/plugins/cpaster/settingspage.cpp index 497e19019f8..57fbc2b60a6 100644 --- a/src/plugins/cpaster/settingspage.cpp +++ b/src/plugins/cpaster/settingspage.cpp @@ -34,24 +34,33 @@ namespace CodePaster { -SettingsWidget::SettingsWidget(const QStringList &protocols, QWidget *parent) : - QWidget(parent) +class SettingsWidget final : public Core::IOptionsPageWidget +{ +public: + SettingsWidget(const QStringList &protocols, Settings *settings); + +private: + void apply() final; + + Settings *m_settings; + Internal::Ui::SettingsPage m_ui; +}; + +SettingsWidget::SettingsWidget(const QStringList &protocols, Settings *settings) + : m_settings(settings) { m_ui.setupUi(this); m_ui.defaultProtocol->addItems(protocols); -} -void SettingsWidget::setSettings(const Settings &settings) -{ - m_ui.userEdit->setText(settings.username); - const int index = m_ui.defaultProtocol->findText(settings.protocol); + m_ui.userEdit->setText(m_settings->username); + const int index = m_ui.defaultProtocol->findText(m_settings->protocol); m_ui.defaultProtocol->setCurrentIndex(index == -1 ? 0 : index); - m_ui.expirySpinBox->setValue(settings.expiryDays); - m_ui.clipboardBox->setChecked(settings.copyToClipboard); - m_ui.displayBox->setChecked(settings.displayOutput); + m_ui.expirySpinBox->setValue(m_settings->expiryDays); + m_ui.clipboardBox->setChecked(m_settings->copyToClipboard); + m_ui.displayBox->setChecked(m_settings->displayOutput); } -Settings SettingsWidget::settings() +void SettingsWidget::apply() { Settings rc; rc.username = m_ui.userEdit->text(); @@ -59,44 +68,24 @@ Settings SettingsWidget::settings() rc.expiryDays = m_ui.expirySpinBox->value(); rc.copyToClipboard = m_ui.clipboardBox->isChecked(); rc.displayOutput = m_ui.displayBox->isChecked(); - return rc; + + if (rc != *m_settings) { + *m_settings = rc; + m_settings->toSettings(Core::ICore::settings()); + } } -SettingsPage::SettingsPage(const QSharedPointer &settings, QObject *parent) - : Core::IOptionsPage(parent), m_settings(settings), m_widget(nullptr) +SettingsPage::SettingsPage(Settings *settings, const QStringList &protocolNames, QObject *parent) + : Core::IOptionsPage(parent) { setId("A.CodePaster.General"); setDisplayName(tr("General")); setCategory(Constants::CPASTER_SETTINGS_CATEGORY); setDisplayCategory(QCoreApplication::translate("CodePaster", "Code Pasting")); setCategoryIconPath(":/cpaster/images/settingscategory_cpaster.png"); -} - -SettingsPage::~SettingsPage() = default; - -QWidget *SettingsPage::widget() -{ - if (!m_widget) { - m_widget = new SettingsWidget(m_protocols); - m_widget->setSettings(*m_settings); - } - return m_widget; -} - -void SettingsPage::apply() -{ - if (!m_widget) // page was never shown - return; - const Settings newSettings = m_widget->settings(); - if (newSettings != *m_settings) { - *m_settings = newSettings; - m_settings->toSettings(Core::ICore::settings()); - } -} - -void SettingsPage::addProtocol(const QString &name) -{ - m_protocols.append(name); + setWidgetCreator([settings, protocolNames] { + return new SettingsWidget(protocolNames, settings); + }); } } // namespace CodePaster diff --git a/src/plugins/cpaster/settingspage.h b/src/plugins/cpaster/settingspage.h index e2b9715ead7..10e0d927151 100644 --- a/src/plugins/cpaster/settingspage.h +++ b/src/plugins/cpaster/settingspage.h @@ -30,46 +30,15 @@ #include #include -#include -#include namespace CodePaster { class Settings; -class SettingsWidget : public QWidget +class SettingsPage final : public Core::IOptionsPage { - Q_OBJECT - public: - explicit SettingsWidget(const QStringList &protocols, QWidget *parent = nullptr); - - void setSettings(const Settings &); - Settings settings(); - -private: - Internal::Ui::SettingsPage m_ui; -}; - -class SettingsPage : public Core::IOptionsPage -{ - Q_OBJECT - -public: - explicit SettingsPage(const QSharedPointer &settings, QObject *parent); - ~SettingsPage() override; - - QWidget *widget() override; - void apply() override; - void finish() override { } - - void addProtocol(const QString& name); - -private: - const QSharedPointer m_settings; - - QPointer m_widget; - QStringList m_protocols; + SettingsPage(Settings *settings, const QStringList &protocolNames, QObject *parent); }; } // namespace CodePaster