diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-default.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-default.svg
deleted file mode 100644
index 60f3a69..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-default.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-disconnected.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-disconnected.svg
deleted file mode 100644
index 92839df..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-disconnected.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-error-sync.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-error-sync.svg
deleted file mode 100644
index d3ce4da..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-error-sync.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-error.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-error.svg
deleted file mode 100644
index da5d9fa..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-error.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-notify.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-notify.svg
deleted file mode 100644
index 3efa153..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-notify.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-ok.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-ok.svg
deleted file mode 100644
index bd7a13b..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-ok.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-pause.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-pause.svg
deleted file mode 100644
index 6cee2ad..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-pause.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
diff --git a/model/resources/icons/hicolor/scalable/status/syncthing-flat-sync.svg b/model/resources/icons/hicolor/scalable/status/syncthing-flat-sync.svg
deleted file mode 100644
index cbee803..0000000
--- a/model/resources/icons/hicolor/scalable/status/syncthing-flat-sync.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
diff --git a/model/syncthingicons.cpp b/model/syncthingicons.cpp
index 4564bda..5d366ad 100644
--- a/model/syncthingicons.cpp
+++ b/model/syncthingicons.cpp
@@ -161,17 +161,67 @@ StatusIconSettings::StatusIconSettings()
, errorColor({ QStringLiteral("#DB3C26"), QStringLiteral("#C80828") })
, warningColor({ QStringLiteral("#c9ce3b"), QStringLiteral("#ebb83b") })
, idleColor({ QStringLiteral("#2D9D69"), QStringLiteral("#2D9D69") })
+ , scanningColor({ QStringLiteral("#26B6DB"), QStringLiteral("#0882C8") })
+ , synchronizingColor({ QStringLiteral("#26B6DB"), QStringLiteral("#0882C8") })
+ , pausedColor({ QStringLiteral("#A9A9A9"), QStringLiteral("#58656C") })
, disconnectedColor({ QStringLiteral("#A9A9A9"), QStringLiteral("#58656C") })
{
}
+std::vector StatusIconSettings::colorMapping()
+{
+ return std::vector({
+ { QStringLiteral("Default"), StatusEmblem::None, defaultColor },
+ { QStringLiteral("Error"), StatusEmblem::Alert, errorColor },
+ { QStringLiteral("Warning"), StatusEmblem::Alert, warningColor },
+ { QStringLiteral("Idle"), StatusEmblem::None, idleColor },
+ { QStringLiteral("Scanning"), StatusEmblem::Scanning, scanningColor },
+ { QStringLiteral("Synchronizing"), StatusEmblem::Synchronizing, synchronizingColor },
+ { QStringLiteral("Paused"), StatusEmblem::Paused, pausedColor },
+ { QStringLiteral("Disconnected"), StatusEmblem::None, disconnectedColor },
+ });
+}
+
+StatusIconSettings::StatusIconSettings(const QString &str)
+ : StatusIconSettings()
+{
+ const auto parts = str.splitRef(QChar(';'));
+ int index = 0;
+ for (auto *field :
+ { &defaultColor, &errorColor, &warningColor, &idleColor, &scanningColor, &synchronizingColor, &pausedColor, &disconnectedColor }) {
+ if (index >= parts.size()) {
+ break;
+ }
+ const auto colors = parts[index].split(QChar(','));
+ if (colors.size() >= 2) {
+ field->start = colors[0].toString();
+ field->end = colors[1].toString();
+ }
+ ++index;
+ }
+}
+
+QString StatusIconSettings::toString() const
+{
+ QString res;
+ res.reserve(128);
+ for (auto *field :
+ { &defaultColor, &errorColor, &warningColor, &idleColor, &scanningColor, &synchronizingColor, &pausedColor, &disconnectedColor }) {
+ if (!res.isEmpty()) {
+ res += QChar(';');
+ }
+ res += field->start % QChar(',') % field->end;
+ }
+ return res;
+}
+
StatusIcons::StatusIcons(const StatusIconSettings &settings)
: disconnected(QIcon(renderSvgImage(makeSyncthingIcon(settings.disconnectedColor, StatusEmblem::None))))
- , idling(QIcon(renderSvgImage(makeSyncthingIcon(settings.defaultColor, StatusEmblem::None))))
- , scanninig(QIcon(renderSvgImage(makeSyncthingIcon(settings.defaultColor, StatusEmblem::Scanning))))
+ , idling(QIcon(renderSvgImage(makeSyncthingIcon(settings.idleColor, StatusEmblem::None))))
+ , scanninig(QIcon(renderSvgImage(makeSyncthingIcon(settings.scanningColor, StatusEmblem::Scanning))))
, notify(QIcon(renderSvgImage(makeSyncthingIcon(settings.warningColor, StatusEmblem::Alert))))
- , pause(QIcon(renderSvgImage(makeSyncthingIcon(settings.defaultColor, StatusEmblem::Paused))))
- , sync(QIcon(renderSvgImage(makeSyncthingIcon(settings.defaultColor, StatusEmblem::Synchronizing))))
+ , pause(QIcon(renderSvgImage(makeSyncthingIcon(settings.pausedColor, StatusEmblem::Paused))))
+ , sync(QIcon(renderSvgImage(makeSyncthingIcon(settings.synchronizingColor, StatusEmblem::Synchronizing))))
, syncComplete(QIcon(renderSvgImage(makeSyncthingIcon(settings.defaultColor, StatusEmblem::Complete))))
, error(QIcon(renderSvgImage(makeSyncthingIcon(settings.errorColor, StatusEmblem::Alert))))
, errorSync(QIcon(renderSvgImage(makeSyncthingIcon(settings.errorColor, StatusEmblem::Synchronizing))))
diff --git a/model/syncthingicons.h b/model/syncthingicons.h
index c8bd959..406c1b7 100644
--- a/model/syncthingicons.h
+++ b/model/syncthingicons.h
@@ -6,6 +6,8 @@
#include
#include
+#include
+
QT_FORWARD_DECLARE_CLASS(QColor)
namespace Data {
@@ -21,23 +23,58 @@ enum class StatusEmblem {
};
struct GradientColor {
+ GradientColor(const QString &start, const QString &end);
+ GradientColor(QString &&start, QString &&end);
+ GradientColor(const QColor &start, const QColor &end);
+
QString start;
QString end;
};
+inline GradientColor::GradientColor(const QString &start, const QString &end)
+ : start(start)
+ , end(end)
+{
+}
+
+inline GradientColor::GradientColor(QString &&start, QString &&end)
+ : start(start)
+ , end(end)
+{
+}
+
+inline GradientColor::GradientColor(const QColor &start, const QColor &end)
+ : GradientColor(start.name(), end.name())
+{
+}
+
QByteArray LIB_SYNCTHING_MODEL_EXPORT makeSyncthingIcon(const GradientColor &gradientColor, StatusEmblem statusEmblem);
QPixmap LIB_SYNCTHING_MODEL_EXPORT renderSvgImage(const QString &path, const QSize &size = QSize(128, 128), int margin = 0);
QPixmap LIB_SYNCTHING_MODEL_EXPORT renderSvgImage(const QByteArray &contents, const QSize &size = QSize(128, 128), int margin = 0);
QByteArray LIB_SYNCTHING_MODEL_EXPORT loadFontAwesomeIcon(const QString &iconName, const QColor &color, bool solid = true);
-struct StatusIconSettings {
- StatusIconSettings();
+struct LIB_SYNCTHING_MODEL_EXPORT StatusIconSettings {
+ explicit StatusIconSettings();
+ explicit StatusIconSettings(const QString &str);
GradientColor defaultColor;
GradientColor errorColor;
GradientColor warningColor;
GradientColor idleColor;
+ GradientColor scanningColor;
+ GradientColor synchronizingColor;
+ GradientColor pausedColor;
GradientColor disconnectedColor;
+
+ static constexpr auto distinguishableColorCount = 8;
+
+ struct ColorMapping {
+ QString colorName;
+ StatusEmblem defaultEmblem;
+ GradientColor &setting;
+ };
+ std::vector colorMapping();
+ QString toString() const;
};
struct StatusIcons {
diff --git a/plasmoid/lib/settingsdialog.cpp b/plasmoid/lib/settingsdialog.cpp
index 2a4e9b5..f5d24da 100644
--- a/plasmoid/lib/settingsdialog.cpp
+++ b/plasmoid/lib/settingsdialog.cpp
@@ -126,7 +126,7 @@ SettingsDialog::SettingsDialog(Plasmoid::SyncthingApplet &applet)
category->setDisplayName(QCoreApplication::translate("Plasmoid::SettingsDialog", "Plasmoid"));
category->assignPages(QList()
<< new ConnectionOptionPage(applet.connection()) << new NotificationsOptionPage(GuiType::Plasmoid) << m_appearanceOptionPage
- << new ShortcutOptionPage(applet));
+ << new IconsOptionPage << new ShortcutOptionPage(applet));
category->setIcon(QIcon::fromTheme(QStringLiteral("plasma")));
categories << category;
diff --git a/plasmoid/lib/syncthingapplet.cpp b/plasmoid/lib/syncthingapplet.cpp
index 6decfdb..f2742dc 100644
--- a/plasmoid/lib/syncthingapplet.cpp
+++ b/plasmoid/lib/syncthingapplet.cpp
@@ -391,6 +391,7 @@ void SyncthingApplet::handleSettingsChanged()
m_dirModel.setBrightColors(brightColors);
m_devModel.setBrightColors(brightColors);
m_downloadModel.setBrightColors(brightColors);
+ IconManager::instance().applySettings(settings.statusIcons);
// restore selected states
// note: The settings dialog writes this to the Plasmoid's config like the other settings. However, it
diff --git a/tray/gui/traywidget.cpp b/tray/gui/traywidget.cpp
index 35200df..50a1120 100644
--- a/tray/gui/traywidget.cpp
+++ b/tray/gui/traywidget.cpp
@@ -416,6 +416,7 @@ void TrayWidget::applySettings(const QString &connectionConfig)
m_dirModel.setBrightColors(settings.appearance.brightTextColors);
m_devModel.setBrightColors(settings.appearance.brightTextColors);
m_dlModel.setBrightColors(settings.appearance.brightTextColors);
+ IconManager::instance().applySettings(settings.statusIcons);
// show warning when explicitely specified connection configuration was not found
if (!specifiedConnectionConfigFound && !connectionConfig.isEmpty()) {
diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt
index 6091fb1..2c19015 100644
--- a/widgets/CMakeLists.txt
+++ b/widgets/CMakeLists.txt
@@ -43,6 +43,7 @@ set(WIDGETS_UI_FILES
settings/connectionoptionpage.ui
settings/notificationsoptionpage.ui
settings/appearanceoptionpage.ui
+ settings/iconsoptionpage.ui
settings/autostartoptionpage.ui
settings/launcheroptionpage.ui
settings/systemdoptionpage.ui
diff --git a/widgets/settings/iconsoptionpage.ui b/widgets/settings/iconsoptionpage.ui
new file mode 100644
index 0000000..20d3d4f
--- /dev/null
+++ b/widgets/settings/iconsoptionpage.ui
@@ -0,0 +1,136 @@
+
+
+ QtGui::IconsOptionPage
+
+
+
+ 0
+ 0
+ 390
+ 167
+
+
+
+ Icons
+
+
+
+ ..
+
+
+ -
+
+
+ Status colors
+
+
+
-
+
+
-
+
+
+ Color 1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Color 2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Preview
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
+
+ Requires (so far) a restart to be applied.
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Restore previous settings
+
+
+
+
+
+
+ -
+
+
+ Restore defaults
+
+
+
+ ..
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
+
diff --git a/widgets/settings/settings.cpp b/widgets/settings/settings.cpp
index 93b54a3..abe96f5 100644
--- a/widgets/settings/settings.cpp
+++ b/widgets/settings/settings.cpp
@@ -177,6 +177,7 @@ void restore()
appearance.frameStyle = settings.value(QStringLiteral("frameStyle"), appearance.frameStyle).toInt();
appearance.tabPosition = settings.value(QStringLiteral("tabPos"), appearance.tabPosition).toInt();
appearance.brightTextColors = settings.value(QStringLiteral("brightTextColors"), appearance.brightTextColors).toBool();
+ v.statusIcons = StatusIconSettings(settings.value(QStringLiteral("statusIcons")).toString());
settings.endGroup();
settings.beginGroup(QStringLiteral("startup"));
@@ -264,6 +265,7 @@ void save()
settings.setValue(QStringLiteral("frameStyle"), appearance.frameStyle);
settings.setValue(QStringLiteral("tabPos"), appearance.tabPosition);
settings.setValue(QStringLiteral("brightTextColors"), appearance.brightTextColors);
+ settings.setValue(QStringLiteral("statusIcons"), v.statusIcons.toString());
settings.endGroup();
settings.beginGroup(QStringLiteral("startup"));
diff --git a/widgets/settings/settings.h b/widgets/settings/settings.h
index e28af0b..cb77e24 100644
--- a/widgets/settings/settings.h
+++ b/widgets/settings/settings.h
@@ -2,6 +2,7 @@
#define SETTINGS_H
#include "../../connector/syncthingconnectionsettings.h"
+#include "../../model/syncthingicons.h"
#include "../global.h"
#include
@@ -106,6 +107,7 @@ struct SYNCTHINGWIDGETS_EXPORT Settings {
#endif
unsigned int ignoreInavailabilityAfterStart = 15;
Appearance appearance;
+ Data::StatusIconSettings statusIcons;
Launcher launcher;
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
Systemd systemd;
diff --git a/widgets/settings/settingsdialog.cpp b/widgets/settings/settingsdialog.cpp
index cb9c469..99a3827 100644
--- a/widgets/settings/settingsdialog.cpp
+++ b/widgets/settings/settingsdialog.cpp
@@ -9,11 +9,13 @@
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
#include "../../connector/syncthingservice.h"
#include "../../model/colors.h"
+#include "../../model/syncthingicons.h"
#endif
#include "ui_appearanceoptionpage.h"
#include "ui_autostartoptionpage.h"
#include "ui_connectionoptionpage.h"
+#include "ui_iconsoptionpage.h"
#include "ui_launcheroptionpage.h"
#include "ui_notificationsoptionpage.h"
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
@@ -24,6 +26,7 @@
// use meta-data of syncthingtray application here
#include "resources/../../tray/resources/config.h"
+#include
#include
#include
#include
@@ -489,6 +492,93 @@ void AppearanceOptionPage::reset()
ui()->brightTextColorsCheckBox->setChecked(settings.brightTextColors);
}
+// IconsOptionPage
+IconsOptionPage::IconsOptionPage(QWidget *parentWidget)
+ : IconsOptionPageBase(parentWidget)
+{
+}
+
+IconsOptionPage::~IconsOptionPage()
+{
+}
+
+QWidget *IconsOptionPage::setupWidget()
+{
+ auto *const widget = IconsOptionPageBase::setupWidget();
+
+ // populate form for status icon colors
+ auto *const gridLayout = ui()->gridLayout;
+ auto *const statusColorsGroupBox = ui()->statusColorsGroupBox;
+ int index = 0;
+ for (auto &colorMapping : m_settings.colorMapping()) {
+ // populate widgets array
+ auto &widgetsForColor = m_widgets[index++] = {
+ {
+ new Widgets::ColorButton(statusColorsGroupBox),
+ new Widgets::ColorButton(statusColorsGroupBox),
+ },
+ new QLabel(statusColorsGroupBox),
+ &colorMapping.setting,
+ colorMapping.defaultEmblem,
+ };
+
+ // add label for color name
+ gridLayout->addWidget(new QLabel(colorMapping.colorName, statusColorsGroupBox), index, 0, Qt::AlignRight | Qt::AlignVCenter);
+
+ // setup preview
+ gridLayout->addWidget(widgetsForColor.previewLabel, index, 3, Qt::AlignCenter);
+ const auto updatePreview = [&widgetsForColor] {
+ widgetsForColor.previewLabel->setPixmap(
+ renderSvgImage(makeSyncthingIcon(*widgetsForColor.setting, widgetsForColor.statusEmblem), QSize(32, 32)));
+ };
+ for (const auto &colorButton : widgetsForColor.colorButtons) {
+ QObject::connect(colorButton, &Widgets::ColorButton::colorChanged, updatePreview);
+ }
+
+ // setup color buttons
+ widgetsForColor.colorButtons[0]->setColor(colorMapping.setting.start);
+ widgetsForColor.colorButtons[1]->setColor(colorMapping.setting.end);
+ gridLayout->addWidget(widgetsForColor.colorButtons[0], index, 1);
+ gridLayout->addWidget(widgetsForColor.colorButtons[1], index, 2);
+
+ if (index >= StatusIconSettings::distinguishableColorCount) {
+ break;
+ }
+ }
+
+ // setup additional buttons
+ QObject::connect(ui()->restoreDefaultsPushButton, &QPushButton::clicked, [this] {
+ m_settings = Data::StatusIconSettings();
+ update();
+ });
+ QObject::connect(ui()->restorePreviousPushButton, &QPushButton::clicked, [this] { reset(); });
+
+ return widget;
+}
+
+bool IconsOptionPage::apply()
+{
+ for (auto &widgetsForColor : m_widgets) {
+ *widgetsForColor.setting = GradientColor{ widgetsForColor.colorButtons[0]->color(), widgetsForColor.colorButtons[1]->color() };
+ }
+ values().statusIcons = m_settings;
+ return true;
+}
+
+void IconsOptionPage::update()
+{
+ for (auto &widgetsForColor : m_widgets) {
+ widgetsForColor.colorButtons[0]->setColor(widgetsForColor.setting->start);
+ widgetsForColor.colorButtons[1]->setColor(widgetsForColor.setting->end);
+ }
+}
+
+void IconsOptionPage::reset()
+{
+ m_settings = values().statusIcons;
+ update();
+}
+
// AutostartOptionPage
AutostartOptionPage::AutostartOptionPage(QWidget *parentWidget)
: AutostartOptionPageBase(parentWidget)
@@ -980,8 +1070,8 @@ SettingsDialog::SettingsDialog(Data::SyncthingConnection *connection, QWidget *p
category = new OptionCategory(this);
category->setDisplayName(tr("Tray"));
- category->assignPages(
- QList() << new ConnectionOptionPage(connection) << new NotificationsOptionPage << new AppearanceOptionPage);
+ category->assignPages(QList()
+ << new ConnectionOptionPage(connection) << new NotificationsOptionPage << new AppearanceOptionPage << new IconsOptionPage);
category->setIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
categories << category;
@@ -1027,6 +1117,7 @@ void SettingsDialog::init()
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, ConnectionOptionPage)
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, NotificationsOptionPage)
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, AppearanceOptionPage)
+INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, IconsOptionPage)
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, AutostartOptionPage)
INSTANTIATE_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, LauncherOptionPage)
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
diff --git a/widgets/settings/settingsdialog.h b/widgets/settings/settingsdialog.h
index 64ace73..30c2b99 100644
--- a/widgets/settings/settingsdialog.h
+++ b/widgets/settings/settingsdialog.h
@@ -5,6 +5,8 @@
#include "../webview/webviewdefs.h"
+#include "../../model/syncthingicons.h"
+
#include
#include
#include
@@ -12,6 +14,8 @@
#include
#include
+QT_FORWARD_DECLARE_CLASS(QLabel)
+
namespace ChronoUtilities {
class DateTime;
}
@@ -23,6 +27,10 @@ class SyncthingProcess;
class SyncthingLauncher;
} // namespace Data
+namespace Widgets {
+class ColorButton;
+}
+
namespace QtGui {
/*!
@@ -70,6 +78,19 @@ END_DECLARE_OPTION_PAGE
DECLARE_UI_FILE_BASED_OPTION_PAGE(AppearanceOptionPage)
+BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE(IconsOptionPage)
+DECLARE_SETUP_WIDGETS
+private:
+void update();
+Data::StatusIconSettings m_settings;
+struct {
+ Widgets::ColorButton *colorButtons[2] = {};
+ QLabel *previewLabel = nullptr;
+ Data::GradientColor *setting = nullptr;
+ Data::StatusEmblem statusEmblem = Data::StatusEmblem::None;
+} m_widgets[Data::StatusIconSettings::distinguishableColorCount];
+END_DECLARE_OPTION_PAGE
+
DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_SETUP(AutostartOptionPage)
BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_CTOR(LauncherOptionPage)
@@ -125,6 +146,7 @@ private:
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, ConnectionOptionPage)
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, NotificationsOptionPage)
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, AppearanceOptionPage)
+DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, IconsOptionPage)
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, AutostartOptionPage)
DECLARE_EXTERN_UI_FILE_BASED_OPTION_PAGE_NS(QtGui, LauncherOptionPage)
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD