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
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);

View File

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

View File

@@ -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> &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

View File

@@ -30,46 +30,15 @@
#include <coreplugin/dialogs/ioptionspage.h>
#include <QStringList>
#include <QSharedPointer>
#include <QPointer>
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> &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;
SettingsPage(Settings *settings, const QStringList &protocolNames, QObject *parent);
};
} // namespace CodePaster