Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show last sync date in tray menu #8547

Merged
merged 1 commit into from
Apr 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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