diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt index 90fe48f..82b2a65 100644 --- a/model/CMakeLists.txt +++ b/model/CMakeLists.txt @@ -9,11 +9,13 @@ set(META_PROJECT_VARNAME_UPPER LIB_SYNCTHING_MODEL) # add project files set(HEADER_FILES + syncthingmodel.h syncthingdirectorymodel.h syncthingdevicemodel.h syncthingdownloadmodel.h ) set(SRC_FILES + syncthingmodel.cpp syncthingdirectorymodel.cpp syncthingdevicemodel.cpp syncthingdownloadmodel.cpp diff --git a/model/syncthingdevicemodel.cpp b/model/syncthingdevicemodel.cpp index 564942d..ec74503 100644 --- a/model/syncthingdevicemodel.cpp +++ b/model/syncthingdevicemodel.cpp @@ -8,8 +8,7 @@ using namespace ChronoUtilities; namespace Data { SyncthingDeviceModel::SyncthingDeviceModel(SyncthingConnection &connection, QObject *parent) : - QAbstractItemModel(parent), - m_connection(connection), + 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"))), @@ -113,12 +112,12 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const switch(index.row()) { case 2: if(dev.lastSeen.isNull()) { - return QColor(Qt::gray); + return (m_brightColors ? QColor(Qt::lightGray) : QColor(Qt::darkGray)); } break; case 4: if(dev.certName.isEmpty()) { - return QColor(Qt::gray); + return (m_brightColors ? QColor(Qt::lightGray) : QColor(Qt::darkGray)); } break; } @@ -199,10 +198,10 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const case SyncthingDevStatus::Unknown: break; case SyncthingDevStatus::Disconnected: break; case SyncthingDevStatus::OwnDevice: - case SyncthingDevStatus::Idle: return QColor(Qt::darkGreen); - case SyncthingDevStatus::Synchronizing: return QColor(Qt::darkBlue); + case SyncthingDevStatus::Idle: return (m_brightColors ? QColor(Qt::green) : QColor(Qt::darkGreen)); + case SyncthingDevStatus::Synchronizing: return (m_brightColors ? QColor(0x3FA5FF) : QColor(Qt::darkBlue)); case SyncthingDevStatus::OutOfSync: - case SyncthingDevStatus::Rejected: return QColor(Qt::red); + case SyncthingDevStatus::Rejected: return (m_brightColors ? QColor(0xFF7B84) : QColor(Qt::red)); } } break; diff --git a/model/syncthingdevicemodel.h b/model/syncthingdevicemodel.h index 5a674f4..3e0bc14 100644 --- a/model/syncthingdevicemodel.h +++ b/model/syncthingdevicemodel.h @@ -1,19 +1,17 @@ #ifndef DATA_SYNCTHINGDEVICEMODEL_H #define DATA_SYNCTHINGDEVICEMODEL_H -#include "./global.h" +#include "./syncthingmodel.h" -#include #include #include namespace Data { -class SyncthingConnection; struct SyncthingDev; -class LIB_SYNCTHING_MODEL_EXPORT SyncthingDeviceModel : public QAbstractItemModel +class LIB_SYNCTHING_MODEL_EXPORT SyncthingDeviceModel : public SyncthingModel { Q_OBJECT public: @@ -42,7 +40,6 @@ private Q_SLOTS: void devStatusChanged(const SyncthingDev &, int index); private: - Data::SyncthingConnection &m_connection; const std::vector &m_devs; const QIcon m_unknownIcon; const QIcon m_idleIcon; diff --git a/model/syncthingdirectorymodel.cpp b/model/syncthingdirectorymodel.cpp index 30dd94e..49d8abf 100644 --- a/model/syncthingdirectorymodel.cpp +++ b/model/syncthingdirectorymodel.cpp @@ -10,8 +10,7 @@ using namespace ChronoUtilities; namespace Data { SyncthingDirectoryModel::SyncthingDirectoryModel(SyncthingConnection &connection, QObject *parent) : - QAbstractItemModel(parent), - m_connection(connection), + 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"))), @@ -119,18 +118,20 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const switch(index.row()) { case 5: if(dir.lastScanTime.isNull()) { - return QColor(Qt::gray); + return (m_brightColors ? QColor(Qt::lightGray) : QColor(Qt::darkGray)); } break; case 6: if(dir.lastFileName.isEmpty()) { - return QColor(Qt::gray); + return (m_brightColors ? QColor(Qt::lightGray) : QColor(Qt::darkGray)); } else if(dir.lastFileDeleted) { - return QColor(Qt::red); + return (m_brightColors ? QColor(0xFF7B84) : QColor(Qt::red)); } break; case 7: - return dir.errors.empty() ? QColor(Qt::gray) : QColor(Qt::red); + return dir.errors.empty() + ? (m_brightColors ? QColor(Qt::lightGray) : QColor(Qt::darkGray)) + : (m_brightColors ? QColor(0xFF7B84) : QColor(Qt::red)); } } break; @@ -216,12 +217,12 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const case 1: switch(dir.status) { case SyncthingDirStatus::Unknown: break; - case SyncthingDirStatus::Idle: return QColor(Qt::darkGreen); - case SyncthingDirStatus::Unshared: return QColor(0xA85900); - case SyncthingDirStatus::Scanning: return QColor(Qt::blue); - case SyncthingDirStatus::Synchronizing: return QColor(Qt::blue); + case SyncthingDirStatus::Idle: return (m_brightColors ? QColor(Qt::green) : QColor(Qt::darkGreen)); + case SyncthingDirStatus::Unshared: return (m_brightColors ? QColor(0xFFC500) : QColor(0xA85900)); + case SyncthingDirStatus::Scanning: + case SyncthingDirStatus::Synchronizing: return (m_brightColors ? QColor(0x3FA5FF) : QColor(Qt::darkBlue)); case SyncthingDirStatus::Paused: break; - case SyncthingDirStatus::OutOfSync: return QColor(Qt::red); + case SyncthingDirStatus::OutOfSync: return (m_brightColors ? QColor(0xFF7B84) : QColor(Qt::red)); } break; } diff --git a/model/syncthingdirectorymodel.h b/model/syncthingdirectorymodel.h index b487ad9..e41a922 100644 --- a/model/syncthingdirectorymodel.h +++ b/model/syncthingdirectorymodel.h @@ -1,19 +1,17 @@ #ifndef DATA_SYNCTHINGDIRECTORYMODEL_H #define DATA_SYNCTHINGDIRECTORYMODEL_H -#include "./global.h" +#include "./syncthingmodel.h" -#include #include #include namespace Data { -class SyncthingConnection; struct SyncthingDir; -class LIB_SYNCTHING_MODEL_EXPORT SyncthingDirectoryModel : public QAbstractItemModel +class LIB_SYNCTHING_MODEL_EXPORT SyncthingDirectoryModel : public SyncthingModel { Q_OBJECT public: @@ -35,7 +33,6 @@ private Q_SLOTS: void dirStatusChanged(const SyncthingDir &, int index); private: - Data::SyncthingConnection &m_connection; const std::vector &m_dirs; const QIcon m_unknownIcon; const QIcon m_idleIcon; diff --git a/model/syncthingdownloadmodel.cpp b/model/syncthingdownloadmodel.cpp index 2d7b521..7e09511 100644 --- a/model/syncthingdownloadmodel.cpp +++ b/model/syncthingdownloadmodel.cpp @@ -10,8 +10,7 @@ using namespace ChronoUtilities; namespace Data { SyncthingDownloadModel::SyncthingDownloadModel(SyncthingConnection &connection, QObject *parent) : - QAbstractItemModel(parent), - m_connection(connection), + SyncthingModel(connection, parent), m_dirs(connection.dirInfo()), m_unknownIcon(QIcon::fromTheme(QStringLiteral("text-x-generic"), QIcon(QStringLiteral(":/icons/hicolor/scalable/mimetypes/text-x-generic.svg")))), m_pendingDirs(0), diff --git a/model/syncthingdownloadmodel.h b/model/syncthingdownloadmodel.h index dbf1c12..2211d81 100644 --- a/model/syncthingdownloadmodel.h +++ b/model/syncthingdownloadmodel.h @@ -1,9 +1,8 @@ #ifndef DATA_SYNCTHINGDOWNLOADMODEL_H #define DATA_SYNCTHINGDOWNLOADMODEL_H -#include "./global.h" +#include "./syncthingmodel.h" -#include #include #include @@ -11,11 +10,10 @@ namespace Data { -class SyncthingConnection; struct SyncthingDir; struct SyncthingItemDownloadProgress; -class LIB_SYNCTHING_MODEL_EXPORT SyncthingDownloadModel : public QAbstractItemModel +class LIB_SYNCTHING_MODEL_EXPORT SyncthingDownloadModel : public SyncthingModel { Q_OBJECT Q_PROPERTY(unsigned int pendingDownloads READ pendingDownloads NOTIFY pendingDownloadsChanged) @@ -52,7 +50,6 @@ private Q_SLOTS: void downloadProgressChanged(); private: - Data::SyncthingConnection &m_connection; const std::vector &m_dirs; const QIcon m_unknownIcon; const QFileIconProvider m_fileIconProvider; diff --git a/model/syncthingmodel.cpp b/model/syncthingmodel.cpp new file mode 100644 index 0000000..859ae14 --- /dev/null +++ b/model/syncthingmodel.cpp @@ -0,0 +1,18 @@ +#include "./syncthingmodel.h" + +namespace Data { + +SyncthingModel::SyncthingModel(SyncthingConnection &connection, QObject *parent) : + QAbstractItemModel(parent), + m_connection(connection) +{} + +void SyncthingModel::setBrightColors(bool brightColors) +{ + if(m_brightColors != brightColors) { + m_brightColors = brightColors; + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1), QVector() << Qt::ForegroundRole); + } +} + +} // namespace Data diff --git a/model/syncthingmodel.h b/model/syncthingmodel.h new file mode 100644 index 0000000..d42400c --- /dev/null +++ b/model/syncthingmodel.h @@ -0,0 +1,34 @@ +#ifndef DATA_SYNCTHINGMODEL_H +#define DATA_SYNCTHINGMODEL_H + +#include "./global.h" + +#include + +namespace Data { + +class SyncthingConnection; + +class LIB_SYNCTHING_MODEL_EXPORT SyncthingModel : public QAbstractItemModel +{ + Q_OBJECT + Q_PROPERTY(bool brightColors READ brightColors WRITE setBrightColors) + +public: + explicit SyncthingModel(SyncthingConnection &connection, QObject *parent = nullptr); + bool brightColors() const; + void setBrightColors(bool brightColors); + +protected: + Data::SyncthingConnection &m_connection; + bool m_brightColors; +}; + +inline bool SyncthingModel::brightColors() const +{ + return m_brightColors; +} + +} // namespace Data + +#endif // DATA_SYNCTHINGMODEL_H diff --git a/tray/application/settings.cpp b/tray/application/settings.cpp index 6dcaccd..42fbc52 100644 --- a/tray/application/settings.cpp +++ b/tray/application/settings.cpp @@ -79,6 +79,7 @@ void restore() appearance.trayMenuSize = settings.value(QStringLiteral("trayMenuSize"), appearance.trayMenuSize).toSize(); 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(); settings.endGroup(); settings.beginGroup(QStringLiteral("startup")); @@ -137,6 +138,7 @@ void save() settings.setValue(QStringLiteral("trayMenuSize"), appearance.trayMenuSize); settings.setValue(QStringLiteral("frameStyle"), appearance.frameStyle); settings.setValue(QStringLiteral("tabPos"), appearance.tabPosition); + settings.setValue(QStringLiteral("brightTextColors"), appearance.brightTextColors); settings.endGroup(); settings.beginGroup(QStringLiteral("startup")); diff --git a/tray/application/settings.h b/tray/application/settings.h index 26258fe..56e5230 100644 --- a/tray/application/settings.h +++ b/tray/application/settings.h @@ -46,6 +46,7 @@ struct Appearance QSize trayMenuSize = QSize(450, 400); int frameStyle = QFrame::StyledPanel | QFrame::Sunken; int tabPosition = QTabWidget::South; + bool brightTextColors = false; }; struct Launcher diff --git a/tray/gui/appearanceoptionpage.ui b/tray/gui/appearanceoptionpage.ui index 0300883..341d447 100644 --- a/tray/gui/appearanceoptionpage.ui +++ b/tray/gui/appearanceoptionpage.ui @@ -178,6 +178,20 @@ + + + + Colors + + + + + + + Bright custom text colors (use for dark color scheme) + + + diff --git a/tray/gui/settingsdialog.cpp b/tray/gui/settingsdialog.cpp index fbaa416..57df3a2 100644 --- a/tray/gui/settingsdialog.cpp +++ b/tray/gui/settingsdialog.cpp @@ -282,6 +282,7 @@ bool AppearanceOptionPage::apply() } settings.frameStyle = style; settings.tabPosition = ui()->tabPosComboBox->currentIndex(); + settings.brightTextColors = ui()->brightTextColorsCheckBox->isChecked(); } return true; } @@ -308,6 +309,7 @@ void AppearanceOptionPage::reset() } ui()->frameShadowComboBox->setCurrentIndex(index); ui()->tabPosComboBox->setCurrentIndex(settings.tabPosition); + ui()->brightTextColorsCheckBox->setChecked(settings.brightTextColors); } } diff --git a/tray/gui/traywidget.cpp b/tray/gui/traywidget.cpp index b08546d..4dc721e 100644 --- a/tray/gui/traywidget.cpp +++ b/tray/gui/traywidget.cpp @@ -358,6 +358,9 @@ void TrayWidget::applySettings() if(settings.appearance.tabPosition >= QTabWidget::North && settings.appearance.tabPosition <= QTabWidget::East) { instance->m_ui->tabWidget->setTabPosition(static_cast(settings.appearance.tabPosition)); } + instance->m_dirModel.setBrightColors(settings.appearance.brightTextColors); + instance->m_devModel.setBrightColors(settings.appearance.brightTextColors); + instance->m_dlModel.setBrightColors(settings.appearance.brightTextColors); } }