From 05da0465a7c1fe8aaa38203d7bc09758f4a4f657 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 19 May 2019 17:56:11 +0200 Subject: [PATCH] Allow customizing status icon colors --- .../status/syncthing-flat-default.svg | 19 --- .../status/syncthing-flat-disconnected.svg | 19 --- .../status/syncthing-flat-error-sync.svg | 30 ---- .../scalable/status/syncthing-flat-error.svg | 30 ---- .../scalable/status/syncthing-flat-notify.svg | 30 ---- .../scalable/status/syncthing-flat-ok.svg | 19 --- .../scalable/status/syncthing-flat-pause.svg | 30 ---- .../scalable/status/syncthing-flat-sync.svg | 30 ---- model/syncthingicons.cpp | 58 +++++++- model/syncthingicons.h | 41 +++++- plasmoid/lib/settingsdialog.cpp | 2 +- plasmoid/lib/syncthingapplet.cpp | 1 + tray/gui/traywidget.cpp | 1 + widgets/CMakeLists.txt | 1 + widgets/settings/iconsoptionpage.ui | 136 ++++++++++++++++++ widgets/settings/settings.cpp | 2 + widgets/settings/settings.h | 2 + widgets/settings/settingsdialog.cpp | 95 +++++++++++- widgets/settings/settingsdialog.h | 22 +++ 19 files changed, 352 insertions(+), 216 deletions(-) delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-default.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-disconnected.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-error-sync.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-error.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-notify.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-ok.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-pause.svg delete mode 100644 model/resources/icons/hicolor/scalable/status/syncthing-flat-sync.svg create mode 100644 widgets/settings/iconsoptionpage.ui 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