diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt index d8ad343..6c99829 100644 --- a/model/CMakeLists.txt +++ b/model/CMakeLists.txt @@ -16,6 +16,7 @@ set(HEADER_FILES syncthingdirectorymodel.h syncthingdevicemodel.h syncthingdownloadmodel.h + syncthingicons.h colors.h ) set(SRC_FILES @@ -23,6 +24,7 @@ set(SRC_FILES syncthingdirectorymodel.cpp syncthingdevicemodel.cpp syncthingdownloadmodel.cpp + syncthingicons.cpp ) set(RES_FILES resources/${META_PROJECT_NAME}icons.qrc @@ -46,7 +48,7 @@ find_package(syncthingconnector ${META_APP_VERSION} REQUIRED) use_syncthingconnector() # link also explicitely against the following Qt 5 modules -list(APPEND ADDITIONAL_QT_MODULES Network Gui Widgets) +list(APPEND ADDITIONAL_QT_MODULES Network Gui Widgets Svg) # include modules to apply configuration include(BasicConfig) diff --git a/model/syncthingdevicemodel.cpp b/model/syncthingdevicemodel.cpp index f82a1d6..4f0a1ab 100644 --- a/model/syncthingdevicemodel.cpp +++ b/model/syncthingdevicemodel.cpp @@ -1,4 +1,5 @@ #include "./syncthingdevicemodel.h" +#include "./syncthingicons.h" #include "./colors.h" #include "../connector/syncthingconnection.h" @@ -10,13 +11,7 @@ namespace Data { SyncthingDeviceModel::SyncthingDeviceModel(SyncthingConnection &connection, QObject *parent) : SyncthingModel(connection, parent), - m_devs(connection.devInfo()), - m_unknownIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-disconnected.svg"))), - m_idleIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-ok.svg"))), - m_syncIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg"))), - m_errorIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error.svg"))), - m_pausedIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg"))), - m_otherIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-default.svg"))) + m_devs(connection.devInfo()) { connect(&m_connection, &SyncthingConnection::newConfig, this, &SyncthingDeviceModel::newConfig); connect(&m_connection, &SyncthingConnection::newDevices, this, &SyncthingDeviceModel::newDevices); @@ -168,17 +163,17 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const case Qt::DecorationRole: switch(index.column()) { case 0: - if(dev.paused) { - return m_pausedIcon; + if(dev.paused) { + return statusIcons().pause; } else { switch(dev.status) { case SyncthingDevStatus::Unknown: - case SyncthingDevStatus::Disconnected: return m_unknownIcon; + case SyncthingDevStatus::Disconnected: return statusIcons().disconnected; case SyncthingDevStatus::OwnDevice: - case SyncthingDevStatus::Idle: return m_idleIcon; - case SyncthingDevStatus::Synchronizing: return m_syncIcon; + case SyncthingDevStatus::Idle: return statusIcons().idling; + case SyncthingDevStatus::Synchronizing: return statusIcons().sync; case SyncthingDevStatus::OutOfSync: - case SyncthingDevStatus::Rejected: return m_errorIcon; + case SyncthingDevStatus::Rejected: return statusIcons().error; } } break; diff --git a/model/syncthingdevicemodel.h b/model/syncthingdevicemodel.h index 3e0bc14..4f3b483 100644 --- a/model/syncthingdevicemodel.h +++ b/model/syncthingdevicemodel.h @@ -41,12 +41,6 @@ private Q_SLOTS: private: const std::vector &m_devs; - const QIcon m_unknownIcon; - const QIcon m_idleIcon; - const QIcon m_syncIcon; - const QIcon m_errorIcon; - const QIcon m_pausedIcon; - const QIcon m_otherIcon; }; } // namespace Data diff --git a/model/syncthingdirectorymodel.cpp b/model/syncthingdirectorymodel.cpp index a00a80d..7787a21 100644 --- a/model/syncthingdirectorymodel.cpp +++ b/model/syncthingdirectorymodel.cpp @@ -1,4 +1,5 @@ #include "./syncthingdirectorymodel.h" +#include "./syncthingicons.h" #include "./colors.h" #include "../connector/syncthingconnection.h" @@ -12,13 +13,7 @@ namespace Data { SyncthingDirectoryModel::SyncthingDirectoryModel(SyncthingConnection &connection, QObject *parent) : SyncthingModel(connection, parent), - m_dirs(connection.dirInfo()), - m_unknownIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-disconnected.svg"))), - m_idleIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-ok.svg"))), - m_syncIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg"))), - m_errorIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error.svg"))), - m_pausedIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg"))), - m_otherIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-default.svg"))) + m_dirs(connection.dirInfo()) { connect(&m_connection, &SyncthingConnection::newConfig, this, &SyncthingDirectoryModel::newConfig); connect(&m_connection, &SyncthingConnection::newDirs, this, &SyncthingDirectoryModel::newDirs); @@ -188,13 +183,13 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const switch(index.column()) { case 0: switch(dir.status) { - case SyncthingDirStatus::Unknown: return m_unknownIcon; - case SyncthingDirStatus::Unshared: return m_unknownIcon; - case SyncthingDirStatus::Idle: return m_idleIcon; - case SyncthingDirStatus::Scanning: return m_otherIcon; - case SyncthingDirStatus::Synchronizing: return m_syncIcon; - case SyncthingDirStatus::Paused: return m_pausedIcon; - case SyncthingDirStatus::OutOfSync: return m_errorIcon; + case SyncthingDirStatus::Unknown: + case SyncthingDirStatus::Unshared: return statusIcons().disconnected; + case SyncthingDirStatus::Idle: return statusIcons().idling; + case SyncthingDirStatus::Scanning: return statusIcons().scanninig; + case SyncthingDirStatus::Synchronizing: return statusIcons().sync; + case SyncthingDirStatus::Paused: return statusIcons().pause; + case SyncthingDirStatus::OutOfSync: return statusIcons().error; } break; } diff --git a/model/syncthingdirectorymodel.h b/model/syncthingdirectorymodel.h index e41a922..c2dbb06 100644 --- a/model/syncthingdirectorymodel.h +++ b/model/syncthingdirectorymodel.h @@ -34,12 +34,6 @@ private Q_SLOTS: private: const std::vector &m_dirs; - const QIcon m_unknownIcon; - const QIcon m_idleIcon; - const QIcon m_syncIcon; - const QIcon m_errorIcon; - const QIcon m_pausedIcon; - const QIcon m_otherIcon; }; } // namespace Data diff --git a/model/syncthingicons.cpp b/model/syncthingicons.cpp new file mode 100644 index 0000000..72688cf --- /dev/null +++ b/model/syncthingicons.cpp @@ -0,0 +1,40 @@ +#include "./syncthingicons.h" + +#include +#include + +namespace Data { + +/*! + * \brief Renders an SVG image to a QPixmap. + * \remarks If instantiating QIcon directly from SVG image the icon is not displayed in the tray under Plasma 5. It works + * with Tint2, however. + */ +QPixmap renderSvgImage(const QString &path, const QSize &size) +{ + QSvgRenderer renderer(path); + QPixmap pm(size); + pm.fill(QColor(Qt::transparent)); + QPainter painter(&pm); + renderer.render(&painter, pm.rect()); + return pm; +} + +StatusIcons::StatusIcons() : + disconnected(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-disconnected.svg")))), + idling(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-ok.svg")))), + scanninig(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-default.svg")))), + notify(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-notify.svg")))), + pause(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg")))), + sync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))), + error(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error.svg")))), + errorSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error-sync.svg")))) +{} + +const StatusIcons LIB_SYNCTHING_MODEL_EXPORT &statusIcons() +{ + static const StatusIcons icons; + return icons; +} + +} // namespace Data diff --git a/model/syncthingicons.h b/model/syncthingicons.h new file mode 100644 index 0000000..225d9a5 --- /dev/null +++ b/model/syncthingicons.h @@ -0,0 +1,30 @@ +#ifndef DATA_SYNCTHINGICONS_H +#define DATA_SYNCTHINGICONS_H + +#include "./global.h" + +#include +#include + +namespace Data { + +QPixmap LIB_SYNCTHING_MODEL_EXPORT renderSvgImage(const QString &path, const QSize &size = QSize(128, 128)); + +struct StatusIcons +{ + StatusIcons(); + QIcon disconnected; + QIcon idling; + QIcon scanninig; + QIcon notify; + QIcon pause; + QIcon sync; + QIcon error; + QIcon errorSync; +}; + +const StatusIcons LIB_SYNCTHING_MODEL_EXPORT &statusIcons(); + +} // namespace Data + +#endif // DATA_SYNCTHINGICONS_H diff --git a/tray/CMakeLists.txt b/tray/CMakeLists.txt index 8e3b8fd..19312f5 100644 --- a/tray/CMakeLists.txt +++ b/tray/CMakeLists.txt @@ -125,7 +125,7 @@ find_package(syncthingmodel ${META_APP_VERSION} REQUIRED) use_syncthingmodel() # link also explicitely against the following Qt 5 modules -list(APPEND ADDITIONAL_QT_MODULES Network Svg) +list(APPEND ADDITIONAL_QT_MODULES Network) # include modules to apply configuration include(BasicConfig) diff --git a/tray/gui/trayicon.cpp b/tray/gui/trayicon.cpp index 6d31a83..93efb5e 100644 --- a/tray/gui/trayicon.cpp +++ b/tray/gui/trayicon.cpp @@ -3,6 +3,8 @@ #include "../application/settings.h" +#include "../../model/syncthingicons.h" + #include "../../connector/syncthingconnection.h" #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD # include "../../connector/syncthingservice.h" @@ -12,7 +14,6 @@ #include #include -#include #include #include #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD @@ -34,15 +35,6 @@ namespace QtGui { TrayIcon::TrayIcon(QObject *parent) : QSystemTrayIcon(parent), m_initialized(false), - m_size(QSize(128, 128)), - m_statusIconDisconnected(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-disconnected.svg")))), - m_statusIconIdling(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-ok.svg")))), - m_statusIconScanning(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-default.svg")))), - m_statusIconNotify(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-notify.svg")))), - m_statusIconPause(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-pause.svg")))), - m_statusIconSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-sync.svg")))), - m_statusIconError(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error.svg")))), - m_statusIconErrorSync(QIcon(renderSvgImage(QStringLiteral(":/icons/hicolor/scalable/status/syncthing-error-sync.svg")))), m_trayMenu(this), m_status(SyncthingStatus::Disconnected) #ifdef QT_UTILITIES_SUPPORT_DBUS_NOTIFICATIONS @@ -185,7 +177,7 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) const auto &settings = Settings::values(); switch(status) { case SyncthingStatus::Disconnected: - setIcon(m_statusIconDisconnected); + setIcon(statusIcons().disconnected); if(connection.autoReconnectInterval() > 0) { setToolTip(tr("Not connected to Syncthing - trying to reconnect every %1 ms") .arg(connection.autoReconnectInterval())); @@ -208,7 +200,7 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) } break; case SyncthingStatus::Reconnecting: - setIcon(m_statusIconDisconnected); + setIcon(statusIcons().disconnected); setToolTip(tr("Reconnecting ...")); break; default: @@ -217,31 +209,31 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) #endif if(connection.hasOutOfSyncDirs()) { if(status == SyncthingStatus::Synchronizing) { - setIcon(m_statusIconErrorSync); + setIcon(statusIcons().errorSync); setToolTip(tr("Synchronization is ongoing but at least one directory is out of sync")); } else { - setIcon(m_statusIconError); + setIcon(statusIcons().error); setToolTip(tr("At least one directory is out of sync")); } } else if(connection.hasUnreadNotifications()) { - setIcon(m_statusIconNotify); + setIcon(statusIcons().notify); setToolTip(tr("Notifications available")); } else { switch(status) { case SyncthingStatus::Idle: - setIcon(m_statusIconIdling); + setIcon(statusIcons().idling); setToolTip(tr("Syncthing is idling")); break; case SyncthingStatus::Scanning: - setIcon(m_statusIconScanning); + setIcon(statusIcons().scanninig); setToolTip(tr("Syncthing is scanning")); break; case SyncthingStatus::Paused: - setIcon(m_statusIconPause); + setIcon(statusIcons().pause); setToolTip(tr("At least one device is paused")); break; case SyncthingStatus::Synchronizing: - setIcon(m_statusIconSync); + setIcon(statusIcons().sync); setToolTip(tr("Synchronization is ongoing")); break; default: @@ -283,19 +275,4 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) m_status = status; } -/*! - * \brief Renders an SVG image to a QPixmap. - * \remarks If instantiating QIcon directly from SVG image the icon is not displayed under Plasma 5. It would work - * with Tint2, tough. - */ -QPixmap TrayIcon::renderSvgImage(const QString &path) -{ - QSvgRenderer renderer(path); - QPixmap pm(m_size); - pm.fill(QColor(Qt::transparent)); - QPainter painter(&pm); - renderer.render(&painter, pm.rect()); - return pm; -} - } diff --git a/tray/gui/trayicon.h b/tray/gui/trayicon.h index 88f1c70..c3bfb0d 100644 --- a/tray/gui/trayicon.h +++ b/tray/gui/trayicon.h @@ -39,18 +39,7 @@ private slots: void handleSyncthingNotificationAction(const QString &action); private: - QPixmap renderSvgImage(const QString &path); - bool m_initialized; - const QSize m_size; - const QIcon m_statusIconDisconnected; - const QIcon m_statusIconIdling; - const QIcon m_statusIconScanning; - const QIcon m_statusIconNotify; - const QIcon m_statusIconPause; - const QIcon m_statusIconSync; - const QIcon m_statusIconError; - const QIcon m_statusIconErrorSync; TrayMenu m_trayMenu; QMenu m_contextMenu; Data::SyncthingStatus m_status;