CPaster: Aspectify general settings

Change-Id: Ia0a24dd5fdc03217c54aee50ed1f39be0110a415
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2021-03-22 17:01:23 +01:00
parent bc97b10488
commit 123133841e
13 changed files with 141 additions and 324 deletions

View File

@@ -24,7 +24,6 @@ add_qtc_plugin(CodePaster
pasteview.cpp pasteview.h pasteview.ui
protocol.cpp protocol.h
settings.cpp settings.h
settingspage.cpp settingspage.h settingspage.ui
stickynotespasteprotocol.cpp stickynotespasteprotocol.h
urlopenprotocol.cpp urlopenprotocol.h

View File

@@ -2,7 +2,6 @@ QT += network
include(../../qtcreatorplugin.pri)
HEADERS += cpasterplugin.h \
dpastedotcomprotocol.h \
settingspage.h \
protocol.h \
pasteview.h \
cpasterconstants.h \
@@ -18,7 +17,6 @@ HEADERS += cpasterplugin.h \
SOURCES += cpasterplugin.cpp \
dpastedotcomprotocol.cpp \
settingspage.cpp \
protocol.cpp \
pasteview.cpp \
pastebindotcomprotocol.cpp \
@@ -30,7 +28,7 @@ SOURCES += cpasterplugin.cpp \
stickynotespasteprotocol.cpp \
urlopenprotocol.cpp
FORMS += settingspage.ui \
FORMS += \
pasteselect.ui \
pasteview.ui \
pastebindotcomsettings.ui \

View File

@@ -39,9 +39,6 @@ QtcPlugin {
"protocol.h",
"settings.cpp",
"settings.h",
"settingspage.cpp",
"settingspage.h",
"settingspage.ui",
"stickynotespasteprotocol.cpp",
"stickynotespasteprotocol.h",
"urlopenprotocol.cpp",

View File

@@ -30,7 +30,6 @@
#include "pastebindotcomprotocol.h"
#include "pasteselectdialog.h"
#include "pasteview.h"
#include "settingspage.h"
#include "settings.h"
#include "urlopenprotocol.h"
@@ -98,10 +97,7 @@ public:
&dpasteProto
};
SettingsPage m_settingsPage {
&m_settings,
Utils::transform(m_protocols, &Protocol::name)
};
SettingsPage m_settingsPage{&m_settings};
QStringList m_fetchedSnippets;
@@ -154,15 +150,19 @@ bool CodePasterPlugin::initialize(const QStringList &arguments, QString *errorMe
CodePasterPluginPrivate::CodePasterPluginPrivate()
{
// Create the settings Page
m_settings.fromSettings(ICore::settings());
// Connect protocols
for (Protocol *proto : m_protocols) {
connect(proto, &Protocol::pasteDone, this, &CodePasterPluginPrivate::finishPost);
connect(proto, &Protocol::fetchDone, this, &CodePasterPluginPrivate::finishFetch);
if (!m_protocols.isEmpty()) {
for (Protocol *proto : m_protocols) {
m_settings.protocols.addOption(proto->name());
connect(proto, &Protocol::pasteDone, this, &CodePasterPluginPrivate::finishPost);
connect(proto, &Protocol::fetchDone, this, &CodePasterPluginPrivate::finishFetch);
}
m_settings.protocols.setDefaultValue(m_protocols.at(0)->name());
}
// Create the settings Page
m_settings.readSettings(ICore::settings());
connect(&m_urlOpen, &Protocol::fetchDone, this, &CodePasterPluginPrivate::finishFetch);
//register actions
@@ -267,20 +267,20 @@ void CodePasterPluginPrivate::post(QString data, const QString &mimeType)
{
fixSpecialCharacters(data);
const QString username = m_settings.username;
const QString username = m_settings.username.value();
PasteView view(m_protocols, mimeType, ICore::dialogParent());
view.setProtocol(m_settings.protocol);
view.setProtocol(m_settings.protocols.stringValue());
const FileDataList diffChunks = splitDiffToFiles(data);
const int dialogResult = diffChunks.isEmpty() ?
view.show(username, QString(), QString(), m_settings.expiryDays, m_settings.publicPaste, data) :
view.show(username, QString(), QString(), m_settings.expiryDays, m_settings.publicPaste, diffChunks);
view.show(username, {}, {}, m_settings.expiryDays.value(), m_settings.publicPaste.value(), data) :
view.show(username, {}, {}, m_settings.expiryDays.value(), m_settings.publicPaste.value(), diffChunks);
// Save new protocol in case user changed it.
if (dialogResult == QDialog::Accepted && m_settings.protocol != view.protocol()) {
m_settings.protocol = view.protocol();
m_settings.toSettings(ICore::settings());
if (dialogResult == QDialog::Accepted && m_settings.protocols.value() != view.protocol()) {
m_settings.protocols.setValue(view.protocol());
m_settings.writeSettings(ICore::settings());
}
}
@@ -304,14 +304,14 @@ void CodePasterPluginPrivate::pasteSnippet()
void CodePasterPluginPrivate::fetch()
{
PasteSelectDialog dialog(m_protocols, ICore::dialogParent());
dialog.setProtocol(m_settings.protocol);
dialog.setProtocol(m_settings.protocols.stringValue());
if (dialog.exec() != QDialog::Accepted)
return;
// Save new protocol in case user changed it.
if (m_settings.protocol != dialog.protocol()) {
m_settings.protocol = dialog.protocol();
m_settings.toSettings(ICore::settings());
if (m_settings.protocols.value() != dialog.protocol()) {
m_settings.protocols.setValue(dialog.protocol());
m_settings.writeSettings(ICore::settings());
}
const QString pasteID = dialog.pasteId();
@@ -324,9 +324,9 @@ void CodePasterPluginPrivate::fetch()
void CodePasterPluginPrivate::finishPost(const QString &link)
{
if (m_settings.copyToClipboard)
if (m_settings.copyToClipboard.value())
QApplication::clipboard()->setText(link);
if (m_settings.displayOutput)
if (m_settings.displayOutput.value())
MessageManager::writeDisrupting(link);
else
MessageManager::writeSilently(link);

View File

@@ -84,9 +84,9 @@ void PasteSelectDialog::setProtocol(const QString &p)
}
}
QString PasteSelectDialog::protocol() const
int PasteSelectDialog::protocol() const
{
return m_ui.protocolBox->currentText();
return m_ui.protocolBox->currentIndex();
}
int PasteSelectDialog::protocolIndex() const

View File

@@ -44,7 +44,7 @@ public:
QString pasteId() const;
QString protocol() const;
int protocol() const;
void setProtocol(const QString &);
int protocolIndex() const;

View File

@@ -94,9 +94,9 @@ QString PasteView::content() const
return newContent;
}
QString PasteView::protocol() const
int PasteView::protocol() const
{
return m_ui.protocolBox->currentText();
return m_ui.protocolBox->currentIndex();
}
void PasteView::contentChanged()

View File

@@ -63,7 +63,7 @@ public:
QString description() const;
QString comment() const;
QString content() const;
QString protocol() const;
int protocol() const;
void setExpiryDays(int d);
void setMakePublic(bool p);
int expiryDays() const;

View File

@@ -24,51 +24,109 @@
****************************************************************************/
#include "settings.h"
#include "cpasterconstants.h"
#include "pastebindotcomprotocol.h"
#include <utils/environment.h>
#include <coreplugin/icore.h>
#include <QSettings>
#include <utils/layoutbuilder.h>
static const char groupC[] = "CodePaster";
static const char userNameKeyC[] = "UserName";
static const char expiryDaysKeyC[] = "ExpiryDays";
static const char defaultProtocolKeyC[] = "DefaultProtocol";
static const char copyToClipboardKeyC[] = "CopyToClipboard";
static const char displayOutputKeyC[] = "DisplayOutput";
static const char publicPasteKeyC[] = "DisplayOutput";
using namespace Utils;
namespace CodePaster {
bool Settings::equals(const Settings &rhs) const
Settings::Settings()
{
return copyToClipboard == rhs.copyToClipboard && displayOutput == rhs.displayOutput
&& expiryDays == rhs.expiryDays && username == rhs.username
&& protocol == rhs.protocol && publicPaste == rhs.publicPaste;
setSettingsGroup("CodePaster");
setAutoApply(false);
registerAspect(&username);
username.setDisplayStyle(StringAspect::LineEditDisplay);
username.setSettingsKey("UserName");
username.setLabelText(tr("Username:"));
registerAspect(&protocols);
protocols.setSettingsKey("DefaultProtocol");
protocols.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox);
protocols.setLabelText(tr("Default protocol:"));
protocols.setToSettingsTransformation([this](const QVariant &val) {
return protocols.displayForIndex(val.toInt());
});
protocols.setFromSettingsTransformation([this](const QVariant &val) {
return protocols.indexForDisplay(val.toString());
});
registerAspect(&expiryDays);
expiryDays.setSettingsKey("ExpiryDays");
expiryDays.setDefaultValue(1);
expiryDays.setSuffix(tr(" Days"));
expiryDays.setLabelText(tr("&Expires after:"));
registerAspect(&copyToClipboard);
copyToClipboard.setSettingsKey("CopyToClipboard");
copyToClipboard.setDefaultValue(true);
copyToClipboard.setLabelText(tr("Copy-paste URL to clipboard"));
registerAspect(&displayOutput);
displayOutput.setSettingsKey("DisplayOutput");
displayOutput.setDefaultValue(true);
displayOutput.setLabelText(tr("Display Output pane after sending a post"));
registerAspect(&publicPaste);
publicPaste.setSettingsKey("DisplayOutput");
publicPaste.setLabelText(tr("Make pasted content public by default"));
}
void Settings::toSettings(QSettings *settings) const
// SettingsPage
class SettingsWidget final : public Core::IOptionsPageWidget
{
settings->beginGroup(QLatin1String(groupC));
settings->setValue(QLatin1String(userNameKeyC), username);
settings->setValue(QLatin1String(defaultProtocolKeyC), protocol);
settings->setValue(QLatin1String(expiryDaysKeyC), expiryDays);
settings->setValue(QLatin1String(copyToClipboardKeyC), copyToClipboard);
settings->setValue(QLatin1String(displayOutputKeyC), displayOutput);
settings->setValue(publicPasteKeyC, publicPaste);
settings->endGroup();
public:
SettingsWidget(Settings *settings);
private:
void apply() final;
Settings *m_settings;
};
SettingsWidget::SettingsWidget(Settings *settings)
: m_settings(settings)
{
Settings &s = *settings;
using namespace Layouting;
const Break nl;
Column {
Form {
s.protocols, nl,
s.username, nl,
s.expiryDays
},
s.copyToClipboard,
s.displayOutput,
s.publicPaste,
Stretch()
}.attachTo(this);
}
void Settings::fromSettings(const QSettings *settings)
void SettingsWidget::apply()
{
const QString rootKey = QLatin1String(groupC) + QLatin1Char('/');
const QString defaultUser = Utils::Environment::systemEnvironment().userName();
expiryDays = settings->value(rootKey + QLatin1String(expiryDaysKeyC), 1).toInt();
username = settings->value(rootKey + QLatin1String(userNameKeyC), defaultUser).toString();
protocol = settings->value(rootKey + QLatin1String(defaultProtocolKeyC), PasteBinDotComProtocol::protocolName()).toString();
copyToClipboard = settings->value(rootKey + QLatin1String(copyToClipboardKeyC), true).toBool();
displayOutput = settings->value(rootKey + QLatin1String(displayOutputKeyC), true).toBool();
publicPaste = settings->value(rootKey + publicPasteKeyC, false).toBool();
if (m_settings->isDirty()) {
m_settings->apply();
m_settings->writeSettings(Core::ICore::settings());
}
}
SettingsPage::SettingsPage(Settings *settings)
{
setId("A.CodePaster.General");
setDisplayName(tr("General"));
setCategory(Constants::CPASTER_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("CodePaster", "Code Pasting"));
setCategoryIconPath(":/cpaster/images/settingscategory_cpaster.png");
setWidgetCreator([settings] { return new SettingsWidget(settings); });
}
} // namespace CodePaster

View File

@@ -25,29 +25,33 @@
#pragma once
#include <QString>
#include <coreplugin/dialogs/ioptionspage.h>
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
#include <utils/aspects.h>
namespace CodePaster {
class Settings {
public:
void toSettings(QSettings *s) const;
void fromSettings(const QSettings *s);
bool equals(const Settings &s) const;
class Settings : public Utils::AspectContainer
{
Q_DECLARE_TR_FUNCTIONS(CodePaster::Settings)
QString username;
QString protocol;
int expiryDays = 1;
bool copyToClipboard = true;
bool displayOutput = true;
bool publicPaste = false;
public:
Settings();
Utils::StringAspect username;
Utils::SelectionAspect protocols;
Utils::IntegerAspect expiryDays;
Utils::BoolAspect copyToClipboard;
Utils::BoolAspect displayOutput;
Utils::BoolAspect publicPaste;
};
inline bool operator==(const Settings &s1, const Settings &s2) { return s1.equals(s2); }
inline bool operator!=(const Settings &s1, const Settings &s2) { return !s1.equals(s2); }
class SettingsPage final : public Core::IOptionsPage
{
Q_DECLARE_TR_FUNCTIONS(CodePaster::SettingsPage)
public:
SettingsPage(Settings *settings);
};
} // namespace CodePaster

View File

@@ -1,92 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "settingspage.h"
#include "settings.h"
#include "cpasterconstants.h"
#include <coreplugin/icore.h>
#include <QTextStream>
#include <QCoreApplication>
namespace CodePaster {
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);
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(m_settings->expiryDays);
m_ui.publicCheckBox->setChecked(m_settings->publicPaste);
m_ui.clipboardBox->setChecked(m_settings->copyToClipboard);
m_ui.displayBox->setChecked(m_settings->displayOutput);
}
void SettingsWidget::apply()
{
Settings rc;
rc.username = m_ui.userEdit->text();
rc.protocol = m_ui.defaultProtocol->currentText();
rc.expiryDays = m_ui.expirySpinBox->value();
rc.publicPaste = m_ui.publicCheckBox->isChecked();
rc.copyToClipboard = m_ui.clipboardBox->isChecked();
rc.displayOutput = m_ui.displayBox->isChecked();
if (rc != *m_settings) {
*m_settings = rc;
m_settings->toSettings(Core::ICore::settings());
}
}
SettingsPage::SettingsPage(Settings *settings, const QStringList &protocolNames)
{
setId("A.CodePaster.General");
setDisplayName(tr("General"));
setCategory(Constants::CPASTER_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("CodePaster", "Code Pasting"));
setCategoryIconPath(":/cpaster/images/settingscategory_cpaster.png");
setWidgetCreator([settings, protocolNames] {
return new SettingsWidget(protocolNames, settings);
});
}
} // namespace CodePaster

View File

@@ -1,45 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include "ui_settingspage.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include <QStringList>
namespace CodePaster {
class Settings;
class SettingsPage final : public Core::IOptionsPage
{
Q_DECLARE_TR_FUNCTIONS(CodePaster::SettingsPage)
public:
SettingsPage(Settings *settings, const QStringList &protocolNames);
};
} // namespace CodePaster

View File

@@ -1,102 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CodePaster::Internal::SettingsPage</class>
<widget class="QWidget" name="CodePaster::Internal::SettingsPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>370</width>
<height>229</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="clipboardBox">
<property name="text">
<string>Copy-paste URL to clipboard</string>
</property>
</widget>
</item>
<item row="9" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>223</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="userEdit"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="defaultProtocol"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="protocolLabel">
<property name="text">
<string>Default protocol:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="expiryLabel">
<property name="text">
<string>&amp;Expires after:</string>
</property>
<property name="buddy">
<cstring>expirySpinBox</cstring>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="displayBox">
<property name="text">
<string>Display Output pane after sending a post</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="userNameLabel">
<property name="text">
<string>Username:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="expirySpinBox">
<property name="suffix">
<string> Days</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>365</number>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="publicCheckBox">
<property name="text">
<string>Make pasted content public by default</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>defaultProtocol</tabstop>
<tabstop>userEdit</tabstop>
<tabstop>expirySpinBox</tabstop>
<tabstop>clipboardBox</tabstop>
<tabstop>displayBox</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>