diff --git a/connector/syncthingconnection.cpp b/connector/syncthingconnection.cpp index 963587b..509c482 100644 --- a/connector/syncthingconnection.cpp +++ b/connector/syncthingconnection.cpp @@ -794,11 +794,14 @@ void SyncthingConnection::setStatus(SyncthingStatus status) // reset reconnect tries m_autoReconnectTries = 0; - // check whether at least one directory is scanning or synchronizing + // check whether at least one directory is scanning, preparing to synchronize or synchronizing + // note: We don't distinguish between "preparing to sync" and "synchronizing" for computing the overall + // status at the moment. bool scanning = false; bool synchronizing = false; for (const SyncthingDir &dir : m_dirs) { switch (dir.status) { + case SyncthingDirStatus::PreparingToSync: case SyncthingDirStatus::Synchronizing: synchronizing = true; break; @@ -807,6 +810,9 @@ void SyncthingConnection::setStatus(SyncthingStatus status) break; default:; } + if (synchronizing) { + break; // skip remaining dirs, "synchronizing" overrides "scanning" anyways + } } if (synchronizing) { diff --git a/connector/syncthingdir.cpp b/connector/syncthingdir.cpp index 2d56850..cd67766 100644 --- a/connector/syncthingdir.cpp +++ b/connector/syncthingdir.cpp @@ -19,6 +19,8 @@ QString statusString(SyncthingDirStatus status) return QCoreApplication::translate("SyncthingDirStatus", "idle"); case SyncthingDirStatus::Scanning: return QCoreApplication::translate("SyncthingDirStatus", "scanning"); + case SyncthingDirStatus::PreparingToSync: + return QCoreApplication::translate("SyncthingDirStatus", "preparing to sync"); case SyncthingDirStatus::Synchronizing: return QCoreApplication::translate("SyncthingDirStatus", "synchronizing"); case SyncthingDirStatus::OutOfSync: @@ -55,7 +57,7 @@ bool SyncthingDir::checkWhetherStatusUpdateRelevant(DateTime time) bool SyncthingDir::finalizeStatusUpdate(SyncthingDirStatus newStatus, DateTime time) { // handle obsoletion of out-of-sync items: no FolderErrors are accepted older than the last "sync" state are accepted - if (newStatus == SyncthingDirStatus::Synchronizing) { + if (newStatus == SyncthingDirStatus::PreparingToSync || newStatus == SyncthingDirStatus::Synchronizing) { // update time of last "sync" state and obsolete currently assigned errors lastSyncStarted = time; // used internally and not displayed, hence keep it GMT itemErrors.clear(); @@ -101,6 +103,12 @@ bool SyncthingDir::assignStatus(const QString &statusStr, CppUtilities::DateTime newStatus = SyncthingDirStatus::Idle; } else if (statusStr == QLatin1String("scanning")) { newStatus = SyncthingDirStatus::Scanning; + } else if (statusStr == QLatin1String("sync-preparing")) { + // ensure status changed signal is emitted + if (!itemErrors.empty()) { + status = SyncthingDirStatus::Unknown; + } + newStatus = SyncthingDirStatus::PreparingToSync; } else if (statusStr == QLatin1String("syncing")) { // ensure status changed signal is emitted if (!itemErrors.empty()) { diff --git a/connector/syncthingdir.h b/connector/syncthingdir.h index 9dc8bd4..1fc84c9 100644 --- a/connector/syncthingdir.h +++ b/connector/syncthingdir.h @@ -12,7 +12,7 @@ namespace Data { -enum class SyncthingDirStatus { Unknown, Idle, Scanning, Synchronizing, OutOfSync }; +enum class SyncthingDirStatus { Unknown, Idle, Scanning, PreparingToSync, Synchronizing, OutOfSync }; QString LIB_SYNCTHING_CONNECTOR_EXPORT statusString(SyncthingDirStatus status); diff --git a/connector/tests/misctests.cpp b/connector/tests/misctests.cpp index c212f80..68284b9 100644 --- a/connector/tests/misctests.cpp +++ b/connector/tests/misctests.cpp @@ -221,13 +221,20 @@ void MiscTests::testSyncthingDir() CPPUNIT_ASSERT(!dir.assignStatus(SyncthingDirStatus::Idle, updateTime += TimeSpan::fromMinutes(1.5))); CPPUNIT_ASSERT_EQUAL(updateTime, dir.lastSyncStarted); const auto lastSyncTime(updateTime += TimeSpan::fromMinutes(1.5)); + dir.itemErrors.emplace_back(); CPPUNIT_ASSERT(dir.assignStatus(SyncthingDirStatus::Synchronizing, lastSyncTime)); CPPUNIT_ASSERT_EQUAL(QStringLiteral("synchronizing"), dir.statusString()); CPPUNIT_ASSERT_EQUAL(0_st, dir.itemErrors.size()); CPPUNIT_ASSERT_EQUAL(lastSyncTime, dir.lastSyncStarted); + const auto lastSyncTime2(updateTime += TimeSpan::fromMinutes(2.0)); + dir.itemErrors.emplace_back(); + CPPUNIT_ASSERT(dir.assignStatus(SyncthingDirStatus::PreparingToSync, lastSyncTime2)); + CPPUNIT_ASSERT_EQUAL(QStringLiteral("preparing to sync"), dir.statusString()); + CPPUNIT_ASSERT_EQUAL(0_st, dir.itemErrors.size()); + CPPUNIT_ASSERT_EQUAL(lastSyncTime2, dir.lastSyncStarted); CPPUNIT_ASSERT(dir.assignStatus(SyncthingDirStatus::Idle, updateTime += TimeSpan::fromMinutes(1.5))); - CPPUNIT_ASSERT_EQUAL(lastSyncTime, dir.lastSyncStarted); + CPPUNIT_ASSERT_EQUAL(lastSyncTime2, dir.lastSyncStarted); CPPUNIT_ASSERT(dir.assignStatus(QStringLiteral("syncing"), updateTime += TimeSpan::fromMinutes(1.5))); CPPUNIT_ASSERT_EQUAL(updateTime, dir.lastSyncStarted); diff --git a/fileitemactionplugin/syncthingdiractions.cpp b/fileitemactionplugin/syncthingdiractions.cpp index 667aa3d..0846c50 100644 --- a/fileitemactionplugin/syncthingdiractions.cpp +++ b/fileitemactionplugin/syncthingdiractions.cpp @@ -54,6 +54,7 @@ bool SyncthingDirActions::updateStatus(const SyncthingDir &dir) case SyncthingDirStatus::Scanning: m_statusAction.setIcon(statusIcons().scanninig); break; + case SyncthingDirStatus::PreparingToSync: case SyncthingDirStatus::Synchronizing: m_statusAction.setIcon(statusIcons().sync); break; diff --git a/model/syncthingdirectorymodel.cpp b/model/syncthingdirectorymodel.cpp index 9eab918..4d94184 100644 --- a/model/syncthingdirectorymodel.cpp +++ b/model/syncthingdirectorymodel.cpp @@ -316,6 +316,7 @@ QVariant SyncthingDirectoryModel::data(const QModelIndex &index, int role) const return statusIcons().idling; case SyncthingDirStatus::Scanning: return statusIcons().scanninig; + case SyncthingDirStatus::PreparingToSync: case SyncthingDirStatus::Synchronizing: return statusIcons().sync; case SyncthingDirStatus::OutOfSync: @@ -466,6 +467,8 @@ QString SyncthingDirectoryModel::dirStatusString(const SyncthingDir &dir) return tr("Scanning (%1 %)").arg(dir.scanningPercentage); } return tr("Scanning"); + case SyncthingDirStatus::PreparingToSync: + return tr("Preparing to sync"); case SyncthingDirStatus::Synchronizing: return dir.completionPercentage > 0 ? tr("Synchronizing (%1 %)").arg(dir.completionPercentage) : tr("Synchronizing"); case SyncthingDirStatus::OutOfSync: @@ -488,6 +491,7 @@ QVariant SyncthingDirectoryModel::dirStatusColor(const SyncthingDir &dir) const case SyncthingDirStatus::Idle: return Colors::green(m_brightColors); case SyncthingDirStatus::Scanning: + case SyncthingDirStatus::PreparingToSync: case SyncthingDirStatus::Synchronizing: return Colors::blue(m_brightColors); case SyncthingDirStatus::OutOfSync: