Skip to content

Commit

Permalink
Display last sync date in context menu
Browse files Browse the repository at this point in the history
This way, the user can quickly see what "up to date" refers to.

In case the last sync was done on the same day, the date is hidden and
only the time is shown.
  • Loading branch information
Fabian Müller authored and fmoc committed Apr 15, 2021
1 parent 3754b12 commit ab110bc
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 27 deletions.
6 changes: 6 additions & 0 deletions changelog/unreleased/5644
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Enhancement: Show last sync date in tray menu

Users can see what "Up to date" refers to explicitly now.

https://github.com/owncloud/client/issues/5644
https://github.com/owncloud/client/pull/8547
39 changes: 25 additions & 14 deletions src/gui/folderman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1230,11 +1230,9 @@ void FolderMan::setDirtyNetworkLimits()
}
}

void FolderMan::trayOverallStatus(const QList<Folder *> &folders,
SyncResult::Status *status, bool *unresolvedConflicts)
TrayOverallStatusResult FolderMan::trayOverallStatus(const QList<Folder *> &folders)
{
*status = SyncResult::Undefined;
*unresolvedConflicts = false;
TrayOverallStatusResult result;

int cnt = folders.count();

Expand All @@ -1249,22 +1247,33 @@ void FolderMan::trayOverallStatus(const QList<Folder *> &folders,
if (folder) {
auto syncResult = folder->syncResult();
if (folder->syncPaused()) {
*status = SyncResult::Paused;
result.overallStatus = SyncResult::Paused;
} else {
SyncResult::Status syncStatus = syncResult.status();
switch (syncStatus) {
case SyncResult::Undefined:
*status = SyncResult::Error;
result.overallStatus = SyncResult::Error;
break;
case SyncResult::Problem: // don't show the problem icon in tray.
*status = SyncResult::Success;
result.overallStatus = SyncResult::Success;
break;
default:
*status = syncStatus;
result.overallStatus = syncStatus;
break;
}
}
*unresolvedConflicts = syncResult.hasUnresolvedConflicts();

result.hasUnresolvedConflicts = syncResult.hasUnresolvedConflicts();

auto currentFolderLastSyncDone = QDateTime::currentDateTime().addMSecs(-1 * folder->msecSinceLastSync().count());

if (result.lastSyncDone.isNull()) {
result.lastSyncDone = currentFolderLastSyncDone;
} else {
if (currentFolderLastSyncDone > result.lastSyncDone) {
result.lastSyncDone = currentFolderLastSyncDone;
}
}
}
} else {
int errorsSeen = 0;
Expand Down Expand Up @@ -1304,19 +1313,21 @@ void FolderMan::trayOverallStatus(const QList<Folder *> &folders,
}
}
if (folderResult.hasUnresolvedConflicts())
*unresolvedConflicts = true;
result.hasUnresolvedConflicts = true;
}
if (errorsSeen > 0) {
*status = SyncResult::Error;
result.overallStatus = SyncResult::Error;
} else if (abortOrPausedSeen > 0 && abortOrPausedSeen == cnt) {
// only if all folders are paused
*status = SyncResult::Paused;
result.overallStatus = SyncResult::Paused;
} else if (runSeen > 0) {
*status = SyncResult::SyncRunning;
result.overallStatus = SyncResult::SyncRunning;
} else if (goodSeen > 0) {
*status = SyncResult::Success;
result.overallStatus = SyncResult::Success;
}
}

return result;
}

QString FolderMan::trayTooltipStatusString(
Expand Down
20 changes: 17 additions & 3 deletions src/gui/folderman.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ class SyncResult;
class SocketApi;
class LockWatcher;

/**
* @brief Return object for Folder::trayOverallStatus.
* @ingroup gui
*/
class TrayOverallStatusResult
{
public:
SyncResult::Status overallStatus;
bool hasUnresolvedConflicts;
QDateTime lastSyncDone;
};

/**
* @brief The FolderMan class
* @ingroup gui
Expand Down Expand Up @@ -134,9 +146,11 @@ class FolderMan : public QObject
/// Produce text for use in the tray tooltip
static QString trayTooltipStatusString(SyncResult::Status syncStatus, bool hasUnresolvedConflicts, bool paused);

/// Compute status summarizing multiple folders
static void trayOverallStatus(const QList<Folder *> &folders,
SyncResult::Status *status, bool *unresolvedConflicts);
/**
* Compute status summarizing multiple folders
* @return tuple containing folders, status, unresolvedConflicts and lastSyncDone
*/
static TrayOverallStatusResult trayOverallStatus(const QList<Folder *> &folders);

// Escaping of the alias which is used in QSettings AND the file
// system, thus need to be escaped.
Expand Down
27 changes: 17 additions & 10 deletions src/gui/owncloudgui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,14 +263,12 @@ void ownCloudGui::slotComputeOverallSyncStatus()
FolderMan *folderMan = FolderMan::instance();
Folder::Map map = folderMan->map();

SyncResult::Status overallStatus = SyncResult::Undefined;
bool hasUnresolvedConflicts = false;
FolderMan::trayOverallStatus(map.values(), &overallStatus, &hasUnresolvedConflicts);
auto trayOverallStatusResult = FolderMan::trayOverallStatus(map.values());

// If the sync succeeded but there are unresolved conflicts,
// show the problem icon!
auto iconStatus = overallStatus;
if (iconStatus == SyncResult::Success && hasUnresolvedConflicts) {
auto iconStatus = trayOverallStatusResult.overallStatus;
if (iconStatus == SyncResult::Success && trayOverallStatusResult.hasUnresolvedConflicts) {
iconStatus = SyncResult::Problem;
}

Expand All @@ -286,7 +284,7 @@ void ownCloudGui::slotComputeOverallSyncStatus()
if (map.count() > 0) {
#ifdef Q_OS_WIN
// Windows has a 128-char tray tooltip length limit.
trayMessage = folderMan->trayTooltipStatusString(overallStatus, hasUnresolvedConflicts, false);
trayMessage = folderMan->trayTooltipStatusString(trayOverallStatusResult.overallStatus, trayOverallStatusResult.hasUnresolvedConflicts, false);
#else
QStringList allStatusStrings;
foreach (Folder *folder, map.values()) {
Expand All @@ -300,13 +298,22 @@ void ownCloudGui::slotComputeOverallSyncStatus()
#endif
_tray->setToolTip(trayMessage);

if (overallStatus == SyncResult::Success || overallStatus == SyncResult::Problem) {
if (hasUnresolvedConflicts) {
if (trayOverallStatusResult.overallStatus == SyncResult::Success || trayOverallStatusResult.overallStatus == SyncResult::Problem) {
if (trayOverallStatusResult.hasUnresolvedConflicts) {
setStatusText(tr("Unresolved conflicts"));
} else {
setStatusText(tr("Up to date"));
QString lastSyncDoneString;

// display only the time in case the last sync was today
if (QDateTime::currentDateTime().date() == trayOverallStatusResult.lastSyncDone.date()) {
lastSyncDoneString = QLocale().toString(trayOverallStatusResult.lastSyncDone.time());
} else {
lastSyncDoneString = QLocale().toString(trayOverallStatusResult.lastSyncDone);
}

setStatusText(tr("Up to date (%1)").arg(lastSyncDoneString));
}
} else if (overallStatus == SyncResult::Paused) {
} else if (trayOverallStatusResult.overallStatus == SyncResult::Paused) {
setStatusText(tr("Synchronization is paused"));
} else {
setStatusText(tr("Error during synchronization"));
Expand Down

0 comments on commit ab110bc

Please sign in to comment.