CPaster: Use new pattern for SettingsPage

Change-Id: I90f8684e51dd7855000dd93b68b94c7c6b56402b
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2020-01-16 12:46:45 +01:00
parent 43113470a4
commit 20725da050
4 changed files with 38 additions and 78 deletions

View File

@@ -115,9 +115,10 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *errorMe
// Create the settings Page // Create the settings Page
m_settings->fromSettings(ICore::settings()); m_settings->fromSettings(ICore::settings());
auto settingsPage = new SettingsPage(m_settings, this);
// Create the protocols and append them to the Settings // Create the protocols and append them to the Settings
QStringList protocolNames;
Protocol *protos[] = {new PasteBinDotComProtocol, Protocol *protos[] = {new PasteBinDotComProtocol,
new FileShareProtocol, new FileShareProtocol,
new PasteCodeDotXyzProtocol, new PasteCodeDotXyzProtocol,
@@ -126,10 +127,12 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *errorMe
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
connect(protos[i], &Protocol::pasteDone, this, &CodepasterPlugin::finishPost); connect(protos[i], &Protocol::pasteDone, this, &CodepasterPlugin::finishPost);
connect(protos[i], &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch); connect(protos[i], &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch);
settingsPage->addProtocol(protos[i]->name()); protocolNames.append(protos[i]->name());
m_protocols.append(protos[i]); m_protocols.append(protos[i]);
} }
(void) new SettingsPage(m_settings, protocolNames, this);
m_urlOpen = new UrlOpenProtocol; m_urlOpen = new UrlOpenProtocol;
connect(m_urlOpen, &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch); connect(m_urlOpen, &Protocol::fetchDone, this, &CodepasterPlugin::finishFetch);

View File

@@ -30,7 +30,6 @@
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QStringList> #include <QStringList>
#include <QSharedPointer>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QAction; class QAction;
@@ -87,7 +86,7 @@ private:
void fetchUrl(); void fetchUrl();
static CodepasterPlugin *m_instance; static CodepasterPlugin *m_instance;
const QSharedPointer<Settings> m_settings; Settings *m_settings = nullptr;
QAction *m_postEditorAction = nullptr; QAction *m_postEditorAction = nullptr;
QAction *m_fetchAction = nullptr; QAction *m_fetchAction = nullptr;
QAction *m_fetchUrlAction = nullptr; QAction *m_fetchUrlAction = nullptr;

View File

@@ -34,24 +34,33 @@
namespace CodePaster { namespace CodePaster {
SettingsWidget::SettingsWidget(const QStringList &protocols, QWidget *parent) : class SettingsWidget final : public Core::IOptionsPageWidget
QWidget(parent) {
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.setupUi(this);
m_ui.defaultProtocol->addItems(protocols); m_ui.defaultProtocol->addItems(protocols);
}
void SettingsWidget::setSettings(const Settings &settings) m_ui.userEdit->setText(m_settings->username);
{ const int index = m_ui.defaultProtocol->findText(m_settings->protocol);
m_ui.userEdit->setText(settings.username);
const int index = m_ui.defaultProtocol->findText(settings.protocol);
m_ui.defaultProtocol->setCurrentIndex(index == -1 ? 0 : index); m_ui.defaultProtocol->setCurrentIndex(index == -1 ? 0 : index);
m_ui.expirySpinBox->setValue(settings.expiryDays); m_ui.expirySpinBox->setValue(m_settings->expiryDays);
m_ui.clipboardBox->setChecked(settings.copyToClipboard); m_ui.clipboardBox->setChecked(m_settings->copyToClipboard);
m_ui.displayBox->setChecked(settings.displayOutput); m_ui.displayBox->setChecked(m_settings->displayOutput);
} }
Settings SettingsWidget::settings() void SettingsWidget::apply()
{ {
Settings rc; Settings rc;
rc.username = m_ui.userEdit->text(); rc.username = m_ui.userEdit->text();
@@ -59,44 +68,24 @@ Settings SettingsWidget::settings()
rc.expiryDays = m_ui.expirySpinBox->value(); rc.expiryDays = m_ui.expirySpinBox->value();
rc.copyToClipboard = m_ui.clipboardBox->isChecked(); rc.copyToClipboard = m_ui.clipboardBox->isChecked();
rc.displayOutput = m_ui.displayBox->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> &settings, QObject *parent) SettingsPage::SettingsPage(Settings *settings, const QStringList &protocolNames, QObject *parent)
: Core::IOptionsPage(parent), m_settings(settings), m_widget(nullptr) : Core::IOptionsPage(parent)
{ {
setId("A.CodePaster.General"); setId("A.CodePaster.General");
setDisplayName(tr("General")); setDisplayName(tr("General"));
setCategory(Constants::CPASTER_SETTINGS_CATEGORY); setCategory(Constants::CPASTER_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("CodePaster", "Code Pasting")); setDisplayCategory(QCoreApplication::translate("CodePaster", "Code Pasting"));
setCategoryIconPath(":/cpaster/images/settingscategory_cpaster.png"); setCategoryIconPath(":/cpaster/images/settingscategory_cpaster.png");
} setWidgetCreator([settings, protocolNames] {
return new SettingsWidget(protocolNames, settings);
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);
} }
} // namespace CodePaster } // namespace CodePaster

View File

@@ -30,46 +30,15 @@
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <QStringList> #include <QStringList>
#include <QSharedPointer>
#include <QPointer>
namespace CodePaster { namespace CodePaster {
class Settings; class Settings;
class SettingsWidget : public QWidget class SettingsPage final : public Core::IOptionsPage
{ {
Q_OBJECT
public: public:
explicit SettingsWidget(const QStringList &protocols, QWidget *parent = nullptr); SettingsPage(Settings *settings, const QStringList &protocolNames, QObject *parent);
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> &settings, QObject *parent);
~SettingsPage() override;
QWidget *widget() override;
void apply() override;
void finish() override { }
void addProtocol(const QString& name);
private:
const QSharedPointer<Settings> m_settings;
QPointer<SettingsWidget> m_widget;
QStringList m_protocols;
}; };
} // namespace CodePaster } // namespace CodePaster