Move icon rendering to model backend

This commit is contained in:
Martchus 2017-02-20 18:03:20 +01:00
parent eab769b654
commit 8c6b0fd3d4
10 changed files with 102 additions and 86 deletions

View File

@ -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)

View File

@ -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;

View File

@ -41,12 +41,6 @@ private Q_SLOTS:
private:
const std::vector<SyncthingDev> &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

View File

@ -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;
}

View File

@ -34,12 +34,6 @@ private Q_SLOTS:
private:
const std::vector<SyncthingDir> &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

40
model/syncthingicons.cpp Normal file
View File

@ -0,0 +1,40 @@
#include "./syncthingicons.h"
#include <QSvgRenderer>
#include <QPainter>
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

30
model/syncthingicons.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef DATA_SYNCTHINGICONS_H
#define DATA_SYNCTHINGICONS_H
#include "./global.h"
#include <QSize>
#include <QIcon>
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

View File

@ -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)

View File

@ -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 <qtutilities/misc/dialogutils.h>
#include <QCoreApplication>
#include <QSvgRenderer>
#include <QPainter>
#include <QPixmap>
#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;
}
}

View File

@ -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;