From 3d44174992b86ca67f62f5fb7acdd81ae4edfc92 Mon Sep 17 00:00:00 2001 From: Martchus Date: Tue, 6 Sep 2016 22:55:49 +0200 Subject: [PATCH] Add SyncthingStatus::Reconnecting, prevent some warnings --- README.md | 2 +- data/syncthingconnection.cpp | 12 +++- data/syncthingconnection.h | 3 +- data/syncthingdevicemodel.cpp | 19 ++++--- data/syncthingdirectorymodel.cpp | 11 ++-- gui/trayicon.cpp | 5 ++ gui/traywidget.cpp | 43 ++++++++++----- gui/traywidget.h | 2 +- translations/syncthingtray_de_DE.ts | 85 ++++++++++++++++------------- translations/syncthingtray_en_US.ts | 85 ++++++++++++++++------------- 10 files changed, 159 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index a8d6470..60e09cd 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ I will provide packages for Arch Linux and Windows when releasing. For more info ## Build instructions The application depends on [c++utilities](https://github.com/Martchus/cpp-utilities) and [qtutilities](https://github.com/Martchus/qtutilities) and is built the same way as these libaries. For basic instructions checkout the README file of [c++utilities](https://github.com/Martchus/cpp-utilities). -The following Qt 5 modules are requried: core network gui widgets webenginewidgets/webkitwidgets +The following Qt 5 modules are requried: core network gui widgets svg webenginewidgets/webkitwidgets #### Select Qt modules for WebView * If Qt WebKitWidgets is installed on the system, the tray will link against it. Otherwise it will link against Qt WebEngineWidgets. diff --git a/data/syncthingconnection.cpp b/data/syncthingconnection.cpp index 862237e..3e89ec9 100644 --- a/data/syncthingconnection.cpp +++ b/data/syncthingconnection.cpp @@ -145,6 +145,8 @@ QString SyncthingConnection::statusText() const switch(m_status) { case SyncthingStatus::Disconnected: return tr("disconnected"); + case SyncthingStatus::Reconnecting: + return tr("reconnecting"); case SyncthingStatus::Idle: return tr("connected"); case SyncthingStatus::NotificationsAvailable: @@ -225,7 +227,7 @@ void SyncthingConnection::reconnect(Settings::ConnectionSettings &connectionSett void SyncthingConnection::continueReconnect() { emit newConfig(QJsonObject()); // configuration will be invalidated - m_status = SyncthingStatus::Disconnected; + setStatus(SyncthingStatus::Reconnecting); m_keepPolling = true; m_reconnecting = false; m_lastEventId = 0; @@ -581,10 +583,12 @@ void SyncthingConnection::readConfig() } else { emit error(tr("Unable to parse Syncthing config: ") + jsonError.errorString()); } + break; } case QNetworkReply::OperationCanceledError: return; // intended, not an error default: emit error(tr("Unable to request Syncthing config: ") + reply->errorString()); + setStatus(SyncthingStatus::Disconnected); } } @@ -681,6 +685,7 @@ void SyncthingConnection::readStatus() } else { emit error(tr("Unable to parse Syncthing config: ") + jsonError.errorString()); } + break; } case QNetworkReply::OperationCanceledError: return; // intended, not an error default: @@ -761,6 +766,7 @@ void SyncthingConnection::readConnections() } else { emit error(tr("Unable to parse connections: ") + jsonError.errorString()); } + break; } case QNetworkReply::OperationCanceledError: return; // intended, not an error default: @@ -821,6 +827,7 @@ void SyncthingConnection::readDirStatistics() } else { emit error(tr("Unable to parse directory statistics: ") + jsonError.errorString()); } + break; } case QNetworkReply::OperationCanceledError: return; // intended, not an error default: @@ -863,6 +870,7 @@ void SyncthingConnection::readDeviceStatistics() } else { emit error(tr("Unable to parse device statistics: ") + jsonError.errorString()); } + break; } case QNetworkReply::OperationCanceledError: return; // intended, not an error default: @@ -921,6 +929,7 @@ void SyncthingConnection::readEvents() setStatus(SyncthingStatus::Disconnected); return; } + break; } case QNetworkReply::TimeoutError: // no new events available, keep polling break; @@ -1190,6 +1199,7 @@ void SyncthingConnection::setStatus(SyncthingStatus status) { switch(status) { case SyncthingStatus::Disconnected: + case SyncthingStatus::Reconnecting: break; default: if(m_unreadNotifications) { diff --git a/data/syncthingconnection.h b/data/syncthingconnection.h index c2b8e31..8d03bcc 100644 --- a/data/syncthingconnection.h +++ b/data/syncthingconnection.h @@ -28,6 +28,7 @@ QNetworkAccessManager &networkAccessManager(); enum class SyncthingStatus { Disconnected, + Reconnecting, Idle, Scanning, NotificationsAvailable, @@ -378,7 +379,7 @@ inline SyncthingStatus SyncthingConnection::status() const */ inline bool SyncthingConnection::isConnected() const { - return m_status != SyncthingStatus::Disconnected; + return m_status != SyncthingStatus::Disconnected && m_status != SyncthingStatus::Reconnecting; } /*! diff --git a/data/syncthingdevicemodel.cpp b/data/syncthingdevicemodel.cpp index 7aed6e4..75b918f 100644 --- a/data/syncthingdevicemodel.cpp +++ b/data/syncthingdevicemodel.cpp @@ -27,7 +27,7 @@ SyncthingDeviceModel::SyncthingDeviceModel(SyncthingConnection &connection, QObj */ const SyncthingDev *SyncthingDeviceModel::devInfo(const QModelIndex &index) const { - return (index.parent().isValid() ? devInfo(index.parent()) : (index.row() < m_devs.size() ? &m_devs[index.row()] : nullptr)); + return (index.parent().isValid() ? devInfo(index.parent()) : (static_cast(index.row()) < m_devs.size() ? &m_devs[static_cast(index.row())] : nullptr)); } QModelIndex SyncthingDeviceModel::index(int row, int column, const QModelIndex &parent) const @@ -35,12 +35,12 @@ QModelIndex SyncthingDeviceModel::index(int row, int column, const QModelIndex & if(!parent.isValid()) { // top-level: all dev IDs if(row < rowCount(parent)) { - return createIndex(row, column, -1); + return createIndex(row, column, static_cast(-1)); } } else if(!parent.parent().isValid()) { // dev-level: dev attributes if(row < rowCount(parent)) { - return createIndex(row, column, parent.row()); + return createIndex(row, column, static_cast(parent.row())); } } return QModelIndex(); @@ -48,7 +48,7 @@ QModelIndex SyncthingDeviceModel::index(int row, int column, const QModelIndex & QModelIndex SyncthingDeviceModel::parent(const QModelIndex &child) const { - return child.internalId() != static_cast(-1) ? index(child.internalId(), 0, QModelIndex()) : QModelIndex(); + return child.internalId() != static_cast(-1) ? index(static_cast(child.internalId()), 0, QModelIndex()) : QModelIndex(); } QVariant SyncthingDeviceModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -77,7 +77,7 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const if(index.isValid()) { if(index.parent().isValid()) { // dir attributes - if(index.parent().row() < m_devs.size()) { + if(static_cast(index.parent().row()) < m_devs.size()) { switch(role) { case Qt::DisplayRole: case Qt::EditRole: @@ -93,7 +93,7 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const } break; case 1: // attribute values - const SyncthingDev &dev = m_devs[index.parent().row()]; + const SyncthingDev &dev = m_devs[static_cast(index.parent().row())]; switch(index.row()) { case 0: return dev.id; case 1: return dev.addresses.join(QStringLiteral(", ")); @@ -139,9 +139,9 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const ; } } - } else if(index.row() < m_devs.size()) { + } else if(static_cast(index.row()) < m_devs.size()) { // dir IDs and status - const SyncthingDev &dev = m_devs[index.row()]; + const SyncthingDev &dev = m_devs[static_cast(index.row())]; switch(role) { case Qt::DisplayRole: case Qt::EditRole: @@ -223,13 +223,14 @@ QVariant SyncthingDeviceModel::data(const QModelIndex &index, int role) const bool SyncthingDeviceModel::setData(const QModelIndex &index, const QVariant &value, int role) { + Q_UNUSED(index) Q_UNUSED(value) Q_UNUSED(role) return false; } int SyncthingDeviceModel::rowCount(const QModelIndex &parent) const { if(!parent.isValid()) { - return m_devs.size(); + return static_cast(m_devs.size()); } else if(!parent.parent().isValid()) { return 6; } else { diff --git a/data/syncthingdirectorymodel.cpp b/data/syncthingdirectorymodel.cpp index 406889c..c58479d 100644 --- a/data/syncthingdirectorymodel.cpp +++ b/data/syncthingdirectorymodel.cpp @@ -27,7 +27,7 @@ SyncthingDirectoryModel::SyncthingDirectoryModel(SyncthingConnection &connection */ const SyncthingDir *SyncthingDirectoryModel::dirInfo(const QModelIndex &index) const { - return (index.parent().isValid() ? dirInfo(index.parent()) : (index.row() < m_dirs.size() ? &m_dirs[index.row()] : nullptr)); + return (index.parent().isValid() ? dirInfo(index.parent()) : (static_cast(index.row()) < m_dirs.size() ? &m_dirs[static_cast(index.row())] : nullptr)); } QModelIndex SyncthingDirectoryModel::index(int row, int column, const QModelIndex &parent) const @@ -77,7 +77,7 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const if(index.isValid()) { if(index.parent().isValid()) { // dir attributes - if(index.parent().row() < m_dirs.size()) { + if(static_cast(index.parent().row()) < m_dirs.size()) { switch(role) { case Qt::DisplayRole: case Qt::EditRole: @@ -152,9 +152,9 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const ; } } - } else if(index.row() < m_dirs.size()) { + } else if(static_cast(index.row()) < m_dirs.size()) { // dir IDs and status - const SyncthingDir &dir = m_dirs[index.row()]; + const SyncthingDir &dir = m_dirs[static_cast(index.row())]; switch(role) { case Qt::DisplayRole: case Qt::EditRole: @@ -217,13 +217,14 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const bool SyncthingDirectoryModel::setData(const QModelIndex &index, const QVariant &value, int role) { + Q_UNUSED(index) Q_UNUSED(value) Q_UNUSED(role) return false; } int SyncthingDirectoryModel::rowCount(const QModelIndex &parent) const { if(!parent.isValid()) { - return m_dirs.size(); + return static_cast(m_dirs.size()); } else if(!parent.parent().isValid()) { return 7; } else { diff --git a/gui/trayicon.cpp b/gui/trayicon.cpp index 2695e90..1b21d03 100644 --- a/gui/trayicon.cpp +++ b/gui/trayicon.cpp @@ -96,6 +96,10 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) showMessage(QCoreApplication::applicationName(), tr("Disconnected from Syncthing"), QSystemTrayIcon::Warning); } break; + case SyncthingStatus::Reconnecting: + setIcon(m_statusIconDisconnected); + setToolTip(tr("Reconnecting ...")); + break; case SyncthingStatus::Idle: setIcon(m_statusIconIdling); setToolTip(tr("Syncthing is idling")); @@ -119,6 +123,7 @@ void TrayIcon::updateStatusIconAndText(SyncthingStatus status) } switch(status) { case SyncthingStatus::Disconnected: + case SyncthingStatus::Reconnecting: case SyncthingStatus::Synchronizing: break; default: diff --git a/gui/traywidget.cpp b/gui/traywidget.cpp index 862ae63..5984202 100644 --- a/gui/traywidget.cpp +++ b/gui/traywidget.cpp @@ -104,7 +104,7 @@ TrayWidget::TrayWidget(TrayMenu *parent) : connect(m_ui->aboutPushButton, &QPushButton::clicked, this, &TrayWidget::showAboutDialog); connect(m_ui->webUiPushButton, &QPushButton::clicked, this, &TrayWidget::showWebUi); connect(m_ui->settingsPushButton, &QPushButton::clicked, this, &TrayWidget::showSettingsDialog); - connect(&m_connection, &SyncthingConnection::statusChanged, this, &TrayWidget::updateStatusButton); + connect(&m_connection, &SyncthingConnection::statusChanged, this, &TrayWidget::handleStatusChanged); connect(&m_connection, &SyncthingConnection::trafficChanged, this, &TrayWidget::updateTraffic); connect(&m_connection, &SyncthingConnection::newNotification, this, &TrayWidget::handleNewNotification); connect(m_ui->dirsTreeView, &DirView::openDir, this, &TrayWidget::openDir); @@ -238,13 +238,18 @@ void TrayWidget::showLog() dlg->activateWindow(); } -void TrayWidget::updateStatusButton(SyncthingStatus status) +void TrayWidget::handleStatusChanged(SyncthingStatus status) { switch(status) { case SyncthingStatus::Disconnected: m_ui->statusPushButton->setText(tr("Connect")); m_ui->statusPushButton->setToolTip(tr("Not connected to Syncthing, click to connect")); m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/view-refresh.svg")))); + m_ui->statusPushButton->setHidden(false); + updateTraffic(); // ensure previous traffic statistics are no longer shown + break; + case SyncthingStatus::Reconnecting: + m_ui->statusPushButton->setHidden(true); break; case SyncthingStatus::Idle: case SyncthingStatus::Scanning: @@ -253,11 +258,13 @@ void TrayWidget::updateStatusButton(SyncthingStatus status) m_ui->statusPushButton->setText(tr("Pause")); m_ui->statusPushButton->setToolTip(tr("Syncthing is running, click to pause all devices")); m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-pause.svg")))); + m_ui->statusPushButton->setHidden(false); break; case SyncthingStatus::Paused: m_ui->statusPushButton->setText(tr("Continue")); m_ui->statusPushButton->setToolTip(tr("At least one device is paused, click to resume")); m_ui->statusPushButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"), QIcon(QStringLiteral(":/icons/hicolor/scalable/actions/media-playback-resume.svg")))); + m_ui->statusPushButton->setHidden(false); break; } } @@ -349,6 +356,8 @@ void TrayWidget::changeStatus() case SyncthingStatus::Disconnected: m_connection.connect(); break; + case SyncthingStatus::Reconnecting: + break; case SyncthingStatus::Idle: case SyncthingStatus::Scanning: case SyncthingStatus::NotificationsAvailable: @@ -366,19 +375,25 @@ void TrayWidget::updateTraffic() if(m_ui->trafficFrame->isHidden()) { return; } - if(m_connection.totalIncomingRate() != 0.0) { - m_ui->inTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 - ? QStringLiteral("%1 (%2)").arg(QString::fromUtf8(bitrateToString(m_connection.totalIncomingRate(), true).data()), QString::fromUtf8(dataSizeToString(m_connection.totalIncomingTraffic()).data())) - : QString::fromUtf8(bitrateToString(m_connection.totalIncomingRate(), true).data())); + static const QString unknownStr(tr("unknown")); + if(m_connection.isConnected()) { + if(m_connection.totalIncomingRate() != 0.0) { + m_ui->inTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 + ? QStringLiteral("%1 (%2)").arg(QString::fromUtf8(bitrateToString(m_connection.totalIncomingRate(), true).data()), QString::fromUtf8(dataSizeToString(m_connection.totalIncomingTraffic()).data())) + : QString::fromUtf8(bitrateToString(m_connection.totalIncomingRate(), true).data())); + } else { + m_ui->inTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 ? QString::fromUtf8(dataSizeToString(m_connection.totalIncomingTraffic()).data()) : unknownStr); + } + if(m_connection.totalOutgoingRate() != 0.0) { + m_ui->outTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 + ? QStringLiteral("%1 (%2)").arg(QString::fromUtf8(bitrateToString(m_connection.totalOutgoingRate(), true).data()), QString::fromUtf8(dataSizeToString(m_connection.totalOutgoingTraffic()).data())) + : QString::fromUtf8(bitrateToString(m_connection.totalOutgoingRate(), true).data())); + } else { + m_ui->outTrafficLabel->setText(m_connection.totalOutgoingTraffic() >= 0 ? QString::fromUtf8(dataSizeToString(m_connection.totalOutgoingTraffic()).data()) : unknownStr); + } } else { - m_ui->inTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 ? QString::fromUtf8(dataSizeToString(m_connection.totalIncomingTraffic()).data()) : tr("unknown")); - } - if(m_connection.totalOutgoingRate() != 0.0) { - m_ui->outTrafficLabel->setText(m_connection.totalIncomingTraffic() >= 0 - ? QStringLiteral("%1 (%2)").arg(QString::fromUtf8(bitrateToString(m_connection.totalOutgoingRate(), true).data()), QString::fromUtf8(dataSizeToString(m_connection.totalOutgoingTraffic()).data())) - : QString::fromUtf8(bitrateToString(m_connection.totalOutgoingRate(), true).data())); - } else { - m_ui->outTrafficLabel->setText(m_connection.totalOutgoingTraffic() >= 0 ? QString::fromUtf8(dataSizeToString(m_connection.totalOutgoingTraffic()).data()) : tr("unknown")); + m_ui->inTrafficLabel->setText(unknownStr); + m_ui->outTrafficLabel->setText(unknownStr); } } diff --git a/gui/traywidget.h b/gui/traywidget.h index 545f4d3..4c2d226 100644 --- a/gui/traywidget.h +++ b/gui/traywidget.h @@ -54,7 +54,7 @@ public slots: void showLog(); private slots: - void updateStatusButton(Data::SyncthingStatus status); + void handleStatusChanged(Data::SyncthingStatus status); void applySettings(); void openDir(const QModelIndex &dirIndex); void scanDir(const QModelIndex &dirIndex); diff --git a/translations/syncthingtray_de_DE.ts b/translations/syncthingtray_de_DE.ts index 90770f6..130ea44 100644 --- a/translations/syncthingtray_de_DE.ts +++ b/translations/syncthingtray_de_DE.ts @@ -10,124 +10,129 @@ - connected + reconnecting - connected, notifications available + connected - connected, paused + connected, notifications available - connected, synchronizing + connected, paused + connected, synchronizing + + + + unknown - - + + Connection configuration is insufficient. - + Unable to parse Syncthing log: - + Unable to request system log: - + Unable to locate certificate used by Syncthing GUI. - + Unable to load certificate used by Syncthing GUI. - - + + Unable to parse Syncthing config: - - + + Unable to request Syncthing config: - + Unable to parse connections: - + Unable to request connections: - + Unable to parse directory statistics: - + Unable to request directory statistics: - + Unable to parse device statistics: - + Unable to request device statistics: - + Unable to parse Syncthing events: - + Unable to request Syncthing events: - + Unable to request rescan: - + Unable to request pause/resume: - + Unable to request restart: - + Unable to request QR-Code: @@ -769,31 +774,36 @@ - Syncthing is idling + Reconnecting ... - Syncthing is scanning + Syncthing is idling - Notifications available + Syncthing is scanning - At least one device is paused + Notifications available + At least one device is paused + + + + Synchronization is ongoing - + Synchronization complete @@ -834,8 +844,7 @@ - - + unknown @@ -916,27 +925,27 @@ - + Pause - + Syncthing is running, click to pause all devices - + At least one device is paused, click to resume - + The directory <i>%1</i> does not exist on the local machine. - + Continue diff --git a/translations/syncthingtray_en_US.ts b/translations/syncthingtray_en_US.ts index 5e8bd42..fecd935 100644 --- a/translations/syncthingtray_en_US.ts +++ b/translations/syncthingtray_en_US.ts @@ -10,124 +10,129 @@ - connected + reconnecting - connected, notifications available + connected - connected, paused + connected, notifications available - connected, synchronizing + connected, paused + connected, synchronizing + + + + unknown - - + + Connection configuration is insufficient. - + Unable to parse Syncthing log: - + Unable to request system log: - + Unable to locate certificate used by Syncthing GUI. - + Unable to load certificate used by Syncthing GUI. - - + + Unable to parse Syncthing config: - - + + Unable to request Syncthing config: - + Unable to parse connections: - + Unable to request connections: - + Unable to parse directory statistics: - + Unable to request directory statistics: - + Unable to parse device statistics: - + Unable to request device statistics: - + Unable to parse Syncthing events: - + Unable to request Syncthing events: - + Unable to request rescan: - + Unable to request pause/resume: - + Unable to request restart: - + Unable to request QR-Code: @@ -769,31 +774,36 @@ - Syncthing is idling + Reconnecting ... - Syncthing is scanning + Syncthing is idling - Notifications available + Syncthing is scanning - At least one device is paused + Notifications available + At least one device is paused + + + + Synchronization is ongoing - + Synchronization complete @@ -834,8 +844,7 @@ - - + unknown @@ -916,27 +925,27 @@ - + Pause - + Syncthing is running, click to pause all devices - + At least one device is paused, click to resume - + The directory <i>%1</i> does not exist on the local machine. - + Continue