diff --git a/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp b/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp
index 4ccc07f..157c2b9 100644
--- a/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp
+++ b/fileitemactionplugin/syncthingfileitemactionstaticdata.cpp
@@ -67,7 +67,7 @@ void SyncthingFileItemActionStaticData::initialize()
}
// use default icon settings
- IconManager::instance().applySettings(StatusIconSettings());
+ IconManager::instance().applySettings();
m_initialized = true;
}
diff --git a/model/syncthingicons.cpp b/model/syncthingicons.cpp
index 066dd70..9eb974b 100644
--- a/model/syncthingicons.cpp
+++ b/model/syncthingicons.cpp
@@ -278,6 +278,7 @@ FontAwesomeIcons::FontAwesomeIcons(const QColor &color, const QSize &size, int m
IconManager::IconManager()
: m_statusIcons()
+ , m_trayIcons(m_statusIcons)
, m_fontAwesomeIconsForLightTheme(QColor(10, 10, 10), QSize(64, 64), 8)
, m_fontAwesomeIconsForDarkTheme(Qt::white, QSize(64, 64), 8)
{
diff --git a/model/syncthingicons.h b/model/syncthingicons.h
index 366d41d..c400c92 100644
--- a/model/syncthingicons.h
+++ b/model/syncthingicons.h
@@ -87,6 +87,8 @@ struct LIB_SYNCTHING_MODEL_EXPORT StatusIconSettings {
struct LIB_SYNCTHING_MODEL_EXPORT StatusIcons {
StatusIcons();
StatusIcons(const StatusIconSettings &settings);
+ StatusIcons(const StatusIcons &other) = default;
+ StatusIcons &operator=(const StatusIcons &other) = default;
QIcon disconnected;
QIcon idling;
QIcon scanninig;
@@ -133,25 +135,37 @@ class LIB_SYNCTHING_MODEL_EXPORT IconManager : public QObject {
public:
static IconManager &instance();
- void applySettings(const StatusIconSettings &settings);
+ void applySettings(const StatusIconSettings *statusIconSettings = nullptr, const StatusIconSettings *trayIconSettings = nullptr);
const StatusIcons &statusIcons() const;
+ const StatusIcons &trayIcons() const;
const FontAwesomeIcons &fontAwesomeIconsForLightTheme() const;
const FontAwesomeIcons &fontAwesomeIconsForDarkTheme() const;
Q_SIGNALS:
- void statusIconsChanged(const StatusIcons &newStatusIcons);
+ void statusIconsChanged(const StatusIcons &newStatusIcons, const StatusIcons &newTrayIcons);
private:
IconManager();
StatusIcons m_statusIcons;
+ StatusIcons m_trayIcons;
FontAwesomeIcons m_fontAwesomeIconsForLightTheme;
FontAwesomeIcons m_fontAwesomeIconsForDarkTheme;
};
-inline void IconManager::applySettings(const StatusIconSettings &settings)
+inline void IconManager::applySettings(const StatusIconSettings *statusIconSettings, const StatusIconSettings *trayIconSettings)
{
- emit statusIconsChanged(m_statusIcons = StatusIcons(settings));
+ if (statusIconSettings) {
+ m_statusIcons = StatusIcons(*statusIconSettings);
+ } else {
+ m_statusIcons = StatusIcons(StatusIconSettings());
+ }
+ if (trayIconSettings) {
+ m_trayIcons = StatusIcons(*trayIconSettings);
+ } else {
+ m_trayIcons = m_statusIcons;
+ }
+ emit statusIconsChanged(m_statusIcons, m_trayIcons);
}
inline const StatusIcons &IconManager::statusIcons() const
@@ -159,6 +173,11 @@ inline const StatusIcons &IconManager::statusIcons() const
return m_statusIcons;
}
+inline const StatusIcons &IconManager::trayIcons() const
+{
+ return m_trayIcons;
+}
+
inline const FontAwesomeIcons &IconManager::fontAwesomeIconsForLightTheme() const
{
return m_fontAwesomeIconsForLightTheme;
@@ -174,6 +193,11 @@ inline const StatusIcons &statusIcons()
return IconManager::instance().statusIcons();
}
+inline const StatusIcons &trayIcons()
+{
+ return IconManager::instance().trayIcons();
+}
+
inline const FontAwesomeIcons &fontAwesomeIconsForLightTheme()
{
return IconManager::instance().fontAwesomeIconsForLightTheme();
diff --git a/plasmoid/lib/syncthingapplet.cpp b/plasmoid/lib/syncthingapplet.cpp
index 4a73b7d..3d54b25 100644
--- a/plasmoid/lib/syncthingapplet.cpp
+++ b/plasmoid/lib/syncthingapplet.cpp
@@ -398,7 +398,7 @@ void SyncthingApplet::handleSettingsChanged()
m_dirModel.setBrightColors(brightColors);
m_devModel.setBrightColors(brightColors);
m_downloadModel.setBrightColors(brightColors);
- IconManager::instance().applySettings(settings.statusIcons);
+ IconManager::instance().applySettings(&settings.icons.status);
// 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 e01c8d5..84a7438 100644
--- a/tray/gui/traywidget.cpp
+++ b/tray/gui/traywidget.cpp
@@ -465,7 +465,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);
+ IconManager::instance().applySettings(&settings.icons.status, settings.icons.distinguishTrayIcons ? &settings.icons.tray : nullptr);
// show warning when explicitely specified connection configuration was not found
if (!specifiedConnectionConfigFound && !connectionConfig.isEmpty()) {
diff --git a/widgets/misc/dbusstatusnotifier.cpp b/widgets/misc/dbusstatusnotifier.cpp
index 92aa372..053ccc6 100644
--- a/widgets/misc/dbusstatusnotifier.cpp
+++ b/widgets/misc/dbusstatusnotifier.cpp
@@ -58,10 +58,10 @@ DBusStatusNotifier::DBusStatusNotifier(QObject *parent)
const auto &iconManager = IconManager::instance();
connect(&iconManager, &Data::IconManager::statusIconsChanged, this, &DBusStatusNotifier::setIcons);
- setIcons(iconManager.statusIcons());
+ setIcons(iconManager.statusIcons(), iconManager.trayIcons());
}
-void DBusStatusNotifier::setIcons(const StatusIcons &icons)
+void DBusStatusNotifier::setIcons(const StatusIcons &, const StatusIcons &icons)
{
if (!icons.isValid) {
return;
diff --git a/widgets/misc/dbusstatusnotifier.h b/widgets/misc/dbusstatusnotifier.h
index aa0e332..d85d028 100644
--- a/widgets/misc/dbusstatusnotifier.h
+++ b/widgets/misc/dbusstatusnotifier.h
@@ -32,7 +32,7 @@ public Q_SLOTS:
void showSyncComplete(const QString &message);
void showNewDev(const QString &devId, const QString &message);
void showNewDir(const QString &devId, const QString &dirId, const QString &message);
- void setIcons(const Data::StatusIcons &icons);
+ void setIcons(const Data::StatusIcons &statusIcons, const Data::StatusIcons &icons);
Q_SIGNALS:
void connectRequested();
diff --git a/widgets/misc/statusinfo.cpp b/widgets/misc/statusinfo.cpp
index c710700..2eb72af 100644
--- a/widgets/misc/statusinfo.cpp
+++ b/widgets/misc/statusinfo.cpp
@@ -15,7 +15,7 @@ namespace QtGui {
StatusInfo::StatusInfo()
: m_statusText(QCoreApplication::translate("QtGui::StatusInfo", "Initializing ..."))
- , m_statusIcon(&statusIcons().disconnected)
+ , m_statusIcon(&trayIcons().disconnected)
{
}
@@ -36,6 +36,7 @@ void StatusInfo::updateConnectionStatus(const SyncthingConnection &connection)
{
m_additionalStatusInfo.clear();
+ const auto &icons = trayIcons();
switch (connection.status()) {
case SyncthingStatus::Disconnected:
if (connection.autoReconnectInterval() > 0) {
@@ -45,11 +46,11 @@ void StatusInfo::updateConnectionStatus(const SyncthingConnection &connection)
} else {
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Not connected to Syncthing");
}
- m_statusIcon = &statusIcons().disconnected;
+ m_statusIcon = &icons.disconnected;
break;
case SyncthingStatus::Reconnecting:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Reconnecting ...");
- m_statusIcon = &statusIcons().disconnected;
+ m_statusIcon = &icons.disconnected;
break;
default:
if (connection.hasOutOfSyncDirs()) {
@@ -57,36 +58,36 @@ void StatusInfo::updateConnectionStatus(const SyncthingConnection &connection)
case SyncthingStatus::Synchronizing:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Synchronization is ongoing");
m_additionalStatusInfo = QCoreApplication::translate("QtGui::StatusInfo", "At least one directory is out of sync");
- m_statusIcon = &statusIcons().errorSync;
+ m_statusIcon = &icons.errorSync;
break;
default:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "At least one directory is out of sync");
- m_statusIcon = &statusIcons().error;
+ m_statusIcon = &icons.error;
}
} else if (connection.hasUnreadNotifications()) {
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Notifications available");
- m_statusIcon = &statusIcons().notify;
+ m_statusIcon = &icons.notify;
} else {
switch (connection.status()) {
case SyncthingStatus::Idle:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Syncthing is idling");
- m_statusIcon = &statusIcons().idling;
+ m_statusIcon = &icons.idling;
break;
case SyncthingStatus::Scanning:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Syncthing is scanning");
- m_statusIcon = &statusIcons().scanninig;
+ m_statusIcon = &icons.scanninig;
break;
case SyncthingStatus::Paused:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "At least one device is paused");
- m_statusIcon = &statusIcons().pause;
+ m_statusIcon = &icons.pause;
break;
case SyncthingStatus::Synchronizing:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Synchronization is ongoing");
- m_statusIcon = &statusIcons().sync;
+ m_statusIcon = &icons.sync;
break;
default:
m_statusText = QCoreApplication::translate("QtGui::StatusInfo", "Status is unknown");
- m_statusIcon = &statusIcons().disconnected;
+ m_statusIcon = &icons.disconnected;
}
}
}
diff --git a/widgets/settings/iconsoptionpage.ui b/widgets/settings/iconsoptionpage.ui
index c032457..4a11f48 100644
--- a/widgets/settings/iconsoptionpage.ui
+++ b/widgets/settings/iconsoptionpage.ui
@@ -10,6 +10,12 @@
..
+ -
+
+
+ -
+
+
-
@@ -128,5 +134,22 @@
-
+
+
+ contextCheckBox
+ toggled(bool)
+ statusIconsGroupBox
+ setDisabled(bool)
+
+
+ 224
+ 39
+
+
+ 224
+ 115
+
+
+
+
diff --git a/widgets/settings/settings.cpp b/widgets/settings/settings.cpp
index 1799aaf..b31e6cc 100644
--- a/widgets/settings/settings.cpp
+++ b/widgets/settings/settings.cpp
@@ -257,7 +257,9 @@ 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());
+ v.icons.status = StatusIconSettings(settings.value(QStringLiteral("statusIcons")).toString());
+ v.icons.tray = StatusIconSettings(settings.value(QStringLiteral("trayIcons")).toString());
+ v.icons.distinguishTrayIcons = settings.value(QStringLiteral("distinguishTrayIcons")).toBool();
settings.beginGroup(QStringLiteral("positioning"));
auto &positioning = appearance.positioning;
positioning.useCursorPosition = settings.value(QStringLiteral("useCursorPos"), positioning.useCursorPosition).toBool();
@@ -353,7 +355,9 @@ 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.setValue(QStringLiteral("statusIcons"), v.icons.status.toString());
+ settings.setValue(QStringLiteral("trayIcons"), v.icons.tray.toString());
+ settings.setValue(QStringLiteral("distinguishTrayIcons"), v.icons.distinguishTrayIcons);
settings.beginGroup(QStringLiteral("positioning"));
settings.setValue(QStringLiteral("useCursorPos"), appearance.positioning.useCursorPosition);
settings.setValue(QStringLiteral("assumedIconPos"), appearance.positioning.assumedIconPosition);
diff --git a/widgets/settings/settings.h b/widgets/settings/settings.h
index 7837ca1..4f3961d 100644
--- a/widgets/settings/settings.h
+++ b/widgets/settings/settings.h
@@ -134,7 +134,11 @@ struct SYNCTHINGWIDGETS_EXPORT Settings {
#endif
unsigned int ignoreInavailabilityAfterStart = 15;
Appearance appearance;
- Data::StatusIconSettings statusIcons;
+ struct SYNCTHINGWIDGETS_EXPORT Icons {
+ Data::StatusIconSettings status;
+ Data::StatusIconSettings tray;
+ bool distinguishTrayIcons = false;
+ } icons;
Launcher launcher;
#ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD
Systemd systemd;
diff --git a/widgets/settings/settingsdialog.cpp b/widgets/settings/settingsdialog.cpp
index 893c300..d887962 100644
--- a/widgets/settings/settingsdialog.cpp
+++ b/widgets/settings/settingsdialog.cpp
@@ -505,8 +505,9 @@ void AppearanceOptionPage::reset()
}
// IconsOptionPage
-IconsOptionPage::IconsOptionPage(QWidget *parentWidget)
+IconsOptionPage::IconsOptionPage(Context context, QWidget *parentWidget)
: IconsOptionPageBase(parentWidget)
+ , m_context(context)
{
}
@@ -518,6 +519,24 @@ QWidget *IconsOptionPage::setupWidget()
{
auto *const widget = IconsOptionPageBase::setupWidget();
+ // set context-specific elements
+ switch (m_context) {
+ case Context::Combined:
+ ui()->contextLabel->hide();
+ ui()->contextCheckBox->hide();
+ break;
+ case Context::UI:
+ widget->setWindowTitle(QCoreApplication::translate("QtGui::IconsOptionPageBase", "UI icons"));
+ ui()->contextLabel->setText(QCoreApplication::translate("QtGui::IconsOptionPageBase", "These icon colors are used within Syncthing Tray's UI."));
+ ui()->contextCheckBox->hide();
+ break;
+ case Context::System:
+ widget->setWindowTitle(QCoreApplication::translate("QtGui::IconsOptionPageBase", "System icons"));
+ ui()->contextLabel->setText(QCoreApplication::translate("QtGui::IconsOptionPageBase", "These icon colors are used for the system tray icon and the notifications."));
+ ui()->contextCheckBox->setText(QCoreApplication::translate("QtGui::IconsOptionPageBase", "Use same colors as for UI icons"));
+ break;
+ }
+
// populate form for status icon colors
auto *const gridLayout = ui()->gridLayout;
auto *const statusIconsGroupBox = ui()->statusIconsGroupBox;
@@ -586,7 +605,17 @@ bool IconsOptionPage::apply()
widgetsForColor.colorButtons[2]->color(),
};
}
- values().statusIcons = m_settings;
+ auto &iconSettings = values().icons;
+ switch (m_context) {
+ case Context::Combined:
+ case Context::UI:
+ iconSettings.status = m_settings;
+ break;
+ case Context::System:
+ iconSettings.tray = m_settings;
+ iconSettings.distinguishTrayIcons = !ui()->contextCheckBox->isChecked();
+ break;
+ }
return true;
}
@@ -601,7 +630,17 @@ void IconsOptionPage::update()
void IconsOptionPage::reset()
{
- m_settings = values().statusIcons;
+ const auto &iconSettings = values().icons;
+ switch (m_context) {
+ case Context::Combined:
+ case Context::UI:
+ m_settings = iconSettings.status;
+ break;
+ case Context::System:
+ m_settings = iconSettings.tray;
+ ui()->contextCheckBox->setChecked(!iconSettings.distinguishTrayIcons);
+ break;
+ }
update();
}
@@ -1237,7 +1276,7 @@ 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
- << new IconsOptionPage);
+ << new IconsOptionPage(IconsOptionPage::Context::UI) << new IconsOptionPage(IconsOptionPage::Context::System));
category->setIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg")));
categories << category;
diff --git a/widgets/settings/settingsdialog.h b/widgets/settings/settingsdialog.h
index 1021a82..00489ff 100644
--- a/widgets/settings/settingsdialog.h
+++ b/widgets/settings/settingsdialog.h
@@ -79,10 +79,14 @@ END_DECLARE_OPTION_PAGE
DECLARE_UI_FILE_BASED_OPTION_PAGE(AppearanceOptionPage)
-BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE(IconsOptionPage)
+BEGIN_DECLARE_UI_FILE_BASED_OPTION_PAGE_CUSTOM_CTOR(IconsOptionPage)
+public:
+ enum class Context { Combined, UI, System };
+ explicit IconsOptionPage(Context context = Context::Combined, QWidget *parentWidget = nullptr);
DECLARE_SETUP_WIDGETS
private:
void update();
+Context m_context;
Data::StatusIconSettings m_settings;
struct {
QtUtilities::ColorButton *colorButtons[3] = {};