Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5970ddb

Browse files
TheOneRingKlaas Freitag
authored and
Klaas Freitag
committedAug 10, 2021
Align sync status icons
Display info state if we have ignored issues Fixes: #7715 Fixes: #7365 Fixes: #7200 Fixes: #5860
1 parent d684bce commit 5970ddb

File tree

10 files changed

+136
-160
lines changed

10 files changed

+136
-160
lines changed
 

‎changelog/unreleased/7715

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Enhancement: Display the information state in case we encountered ignored errors
2+
3+
If syncing a file fails multiple times we mark it as ignored to skip it for a certain amount of time.
4+
If we have ignored files we are not in sync, we now don't display the green icon.
5+
6+
Additionally this change aligns the icon displayed in the system tray with the icon displayed in the app.
7+
8+
https://github.com/owncloud/client/issues/7715
9+
https://github.com/owncloud/client/issues/7365
10+
https://github.com/owncloud/client/issues/7200
11+
https://github.com/owncloud/client/issues/5860
12+
13+
https://github.com/owncloud/client/pull/8858

‎src/gui/folderman.cpp

+69-85
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,60 @@ static const char versionC[] = "version";
4040
static const int maxFoldersVersion = 1;
4141

4242
namespace OCC {
43-
4443
Q_LOGGING_CATEGORY(lcFolderMan, "gui.folder.manager", QtInfoMsg)
4544

45+
void TrayOverallStatusResult::addResult(const SyncResult &result)
46+
{
47+
_overallStatus._numNewConflictItems += result._numNewConflictItems;
48+
_overallStatus._numErrorItems += result._numErrorItems;
49+
50+
switch (result.status()) {
51+
case SyncResult::Success:
52+
// only if every result is success
53+
if (_overallStatus.status() == SyncResult::Undefined) {
54+
_overallStatus.setStatus(SyncResult::Success);
55+
}
56+
break;
57+
case SyncResult::Paused:
58+
Q_FALLTHROUGH();
59+
case SyncResult::SyncAbortRequested:
60+
// Problem has a high enum value but real problems and errors
61+
// take precedence
62+
if (_overallStatus.status() < SyncResult::Problem) {
63+
_overallStatus.setStatus(SyncResult::Paused);
64+
}
65+
break;
66+
case SyncResult::NotYetStarted:
67+
Q_FALLTHROUGH();
68+
case SyncResult::SyncPrepare:
69+
Q_FALLTHROUGH();
70+
case SyncResult::SyncRunning:
71+
if (_overallStatus.status() < SyncResult::Problem) {
72+
_overallStatus.setStatus(SyncResult::SyncRunning);
73+
}
74+
break;
75+
case SyncResult::Undefined:
76+
if (_overallStatus.status() < SyncResult::Problem) {
77+
_overallStatus.setStatus(SyncResult::Problem);
78+
}
79+
break;
80+
case SyncResult::Problem:
81+
Q_FALLTHROUGH();
82+
case SyncResult::Error:
83+
Q_FALLTHROUGH();
84+
case SyncResult::SetupError:
85+
if (_overallStatus.status() < result.status()) {
86+
_overallStatus.setStatus(result.status());
87+
}
88+
break;
89+
}
90+
}
91+
92+
const SyncResult &TrayOverallStatusResult::overallStatus() const
93+
{
94+
return _overallStatus;
95+
}
96+
4697
FolderMan *FolderMan::_instance = nullptr;
4798

4899
FolderMan::FolderMan(QObject *parent)
@@ -1220,107 +1271,39 @@ TrayOverallStatusResult FolderMan::trayOverallStatus(const QList<Folder *> &fold
12201271
{
12211272
TrayOverallStatusResult result;
12221273

1223-
int cnt = folders.count();
1224-
12251274
// if one folder: show the state of the one folder.
12261275
// if more folders:
12271276
// if one of them has an error -> show error
12281277
// if one is paused, but others ok, show ok
12291278
// do not show "problem" in the tray
12301279
//
1231-
if (cnt == 1) {
1232-
Folder *folder = folders.at(0);
1233-
if (folder) {
1234-
auto syncResult = folder->syncResult();
1235-
if (folder->syncPaused()) {
1236-
result.overallStatus = SyncResult::Paused;
1237-
} else {
1238-
SyncResult::Status syncStatus = syncResult.status();
1239-
switch (syncStatus) {
1240-
case SyncResult::Undefined:
1241-
result.overallStatus = SyncResult::Error;
1242-
break;
1243-
case SyncResult::Problem: // don't show the problem icon in tray.
1244-
result.overallStatus = SyncResult::Success;
1245-
break;
1246-
default:
1247-
result.overallStatus = syncStatus;
1248-
break;
1249-
}
1250-
}
1280+
if (folders.count() == 1) {
1281+
const auto currentFolderLastSyncDone = QDateTime::currentDateTime().addMSecs(-1 * folders.first()->msecSinceLastSync().count());
12511282

1252-
result.hasUnresolvedConflicts = syncResult.hasUnresolvedConflicts();
1253-
1254-
auto currentFolderLastSyncDone = QDateTime::currentDateTime().addMSecs(-1 * folder->msecSinceLastSync().count());
1255-
1256-
if (result.lastSyncDone.isNull()) {
1283+
if (result.lastSyncDone.isNull()) {
1284+
result.lastSyncDone = currentFolderLastSyncDone;
1285+
} else {
1286+
if (currentFolderLastSyncDone > result.lastSyncDone) {
12571287
result.lastSyncDone = currentFolderLastSyncDone;
1258-
} else {
1259-
if (currentFolderLastSyncDone > result.lastSyncDone) {
1260-
result.lastSyncDone = currentFolderLastSyncDone;
1261-
}
1262-
}
1263-
}
1264-
} else {
1265-
int errorsSeen = 0;
1266-
int goodSeen = 0;
1267-
int abortOrPausedSeen = 0;
1268-
int runSeen = 0;
1269-
int various = 0;
1270-
1271-
for (auto *folder : folders) {
1272-
SyncResult folderResult = folder->syncResult();
1273-
if (folder->syncPaused()) {
1274-
abortOrPausedSeen++;
1275-
} else {
1276-
SyncResult::Status syncStatus = folderResult.status();
1277-
1278-
switch (syncStatus) {
1279-
case SyncResult::Undefined:
1280-
case SyncResult::NotYetStarted:
1281-
various++;
1282-
break;
1283-
case SyncResult::SyncPrepare:
1284-
case SyncResult::SyncRunning:
1285-
runSeen++;
1286-
break;
1287-
case SyncResult::Problem: // don't show the problem icon in tray.
1288-
case SyncResult::Success:
1289-
goodSeen++;
1290-
break;
1291-
case SyncResult::Error:
1292-
case SyncResult::SetupError:
1293-
errorsSeen++;
1294-
break;
1295-
case SyncResult::SyncAbortRequested:
1296-
case SyncResult::Paused:
1297-
abortOrPausedSeen++;
1298-
// no default case on purpose, check compiler warnings
1299-
}
13001288
}
1301-
if (folderResult.hasUnresolvedConflicts())
1302-
result.hasUnresolvedConflicts = true;
13031289
}
1304-
if (errorsSeen > 0) {
1305-
result.overallStatus = SyncResult::Error;
1306-
} else if (abortOrPausedSeen > 0 && abortOrPausedSeen == cnt) {
1307-
// only if all folders are paused
1308-
result.overallStatus = SyncResult::Paused;
1309-
} else if (runSeen > 0) {
1310-
result.overallStatus = SyncResult::SyncRunning;
1311-
} else if (goodSeen > 0) {
1312-
result.overallStatus = SyncResult::Success;
1290+
}
1291+
for (auto *folder : folders) {
1292+
const SyncResult folderResult = folder->syncResult();
1293+
if (folder->syncPaused()) {
1294+
result.addResult(SyncResult { SyncResult::Paused });
1295+
} else {
1296+
result.addResult(folderResult);
13131297
}
13141298
}
1315-
13161299
return result;
13171300
}
13181301

13191302
QString FolderMan::trayTooltipStatusString(
1320-
SyncResult::Status syncStatus, bool hasUnresolvedConflicts, bool paused)
1303+
const SyncResult &result, bool paused)
13211304
{
13221305
QString folderMessage;
1323-
switch (syncStatus) {
1306+
switch (result.status()) {
13241307
case SyncResult::Undefined:
13251308
folderMessage = tr("Undefined State.");
13261309
break;
@@ -1335,7 +1318,7 @@ QString FolderMan::trayTooltipStatusString(
13351318
break;
13361319
case SyncResult::Success:
13371320
case SyncResult::Problem:
1338-
if (hasUnresolvedConflicts) {
1321+
if (result.hasUnresolvedConflicts()) {
13391322
folderMessage = tr("Sync was successful, unresolved conflicts.");
13401323
} else {
13411324
folderMessage = tr("Last Sync was successful.");
@@ -1539,4 +1522,5 @@ void FolderMan::restartApplication()
15391522
}
15401523
}
15411524

1525+
15421526
} // namespace OCC

‎src/gui/folderman.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,13 @@ class LockWatcher;
4343
class TrayOverallStatusResult
4444
{
4545
public:
46-
SyncResult::Status overallStatus;
47-
bool hasUnresolvedConflicts;
4846
QDateTime lastSyncDone;
47+
48+
void addResult(const SyncResult &result);
49+
const SyncResult &overallStatus() const;
50+
51+
private:
52+
SyncResult _overallStatus;
4953
};
5054

5155
/**
@@ -145,7 +149,7 @@ class FolderMan : public QObject
145149
bool startFromScratch(const QString &);
146150

147151
/// Produce text for use in the tray tooltip
148-
static QString trayTooltipStatusString(SyncResult::Status syncStatus, bool hasUnresolvedConflicts, bool paused);
152+
static QString trayTooltipStatusString(const SyncResult &result, bool paused);
149153

150154
/**
151155
* Compute status summarizing multiple folders

‎src/gui/folderstatusmodel.cpp

+1-19
Original file line numberDiff line numberDiff line change
@@ -239,28 +239,10 @@ QVariant FolderStatusModel::data(const QModelIndex &index, int role) const
239239
case FolderStatusDelegate::FolderStatusIconRole:
240240
if (accountConnected) {
241241
auto theme = Theme::instance();
242-
auto status = f->syncResult().status();
243242
if (f->syncPaused()) {
244243
return theme->folderDisabledIcon();
245244
} else {
246-
if (status == SyncResult::SyncPrepare) {
247-
return theme->syncStateIcon(SyncResult::SyncRunning);
248-
} else if (status == SyncResult::Undefined) {
249-
return theme->syncStateIcon(SyncResult::SyncRunning);
250-
} else {
251-
// The "Problem" *result* just means some files weren't
252-
// synced, so we show "Success" in these cases. But we
253-
// do use the "Problem" *icon* for unresolved conflicts.
254-
if (status == SyncResult::Success || status == SyncResult::Problem) {
255-
if (f->syncResult().hasUnresolvedConflicts()) {
256-
return theme->syncStateIcon(SyncResult::Problem);
257-
} else {
258-
return theme->syncStateIcon(SyncResult::Success);
259-
}
260-
} else {
261-
return theme->syncStateIcon(status);
262-
}
263-
}
245+
return theme->syncStateIcon(f->syncResult().status());
264246
}
265247
} else {
266248
return Theme::instance()->folderOfflineIcon();

‎src/gui/libcloudproviders/libcloudproviders.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,7 @@ void LibCloudProvidersPrivate::updateFolderExport()
213213
status = CLOUD_PROVIDERS_ACCOUNT_STATUS_ERROR;
214214

215215
auto message = FolderMan::trayTooltipStatusString(
216-
syncResult.status(),
217-
syncResult.hasUnresolvedConflicts(),
216+
syncResult,
218217
folder->syncPaused());
219218

220219
cloud_providers_account_exporter_set_status(folderExport._exporter, status);

‎src/gui/owncloudgui.cpp

+9-20
Original file line numberDiff line numberDiff line change
@@ -265,42 +265,31 @@ void ownCloudGui::slotComputeOverallSyncStatus()
265265

266266
auto trayOverallStatusResult = FolderMan::trayOverallStatus(map.values());
267267

268-
// If the sync succeeded but there are unresolved conflicts,
269-
// show the problem icon!
270-
auto iconStatus = trayOverallStatusResult.overallStatus;
271-
if (iconStatus == SyncResult::Success && trayOverallStatusResult.hasUnresolvedConflicts) {
272-
iconStatus = SyncResult::Problem;
273-
}
274-
275-
// If we don't get a status for whatever reason, that's a Problem
276-
if (iconStatus == SyncResult::Undefined) {
277-
iconStatus = SyncResult::Problem;
278-
}
279-
280-
QIcon statusIcon = Theme::instance()->syncStateIcon(iconStatus, true, contextMenuVisible());
268+
const QIcon statusIcon = Theme::instance()->syncStateIcon(trayOverallStatusResult.overallStatus(), true, contextMenuVisible());
281269
_tray->setIcon(statusIcon);
282270

283271
// create the tray blob message, check if we have an defined state
284272
if (map.count() > 0) {
285273
#ifdef Q_OS_WIN
286274
// Windows has a 128-char tray tooltip length limit.
287-
trayMessage = FolderMan::instance()->trayTooltipStatusString(trayOverallStatusResult.overallStatus, trayOverallStatusResult.hasUnresolvedConflicts, false);
275+
trayMessage = FolderMan::instance()->trayTooltipStatusString(trayOverallStatusResult.overallStatus(), false);
288276
#else
289277
QStringList allStatusStrings;
290278
for (auto *folder : map) {
291279
QString folderMessage = FolderMan::trayTooltipStatusString(
292-
folder->syncResult().status(),
293-
folder->syncResult().hasUnresolvedConflicts(),
280+
folder->syncResult(),
294281
folder->syncPaused());
295282
allStatusStrings += tr("Folder %1: %2").arg(folder->shortGuiLocalPath(), folderMessage);
296283
}
297284
trayMessage = allStatusStrings.join(QLatin1String("\n"));
298285
#endif
299286
_tray->setToolTip(trayMessage);
300287

301-
if (trayOverallStatusResult.overallStatus == SyncResult::Success || trayOverallStatusResult.overallStatus == SyncResult::Problem) {
302-
if (trayOverallStatusResult.hasUnresolvedConflicts) {
303-
setStatusText(tr("Unresolved conflicts"));
288+
if (trayOverallStatusResult.overallStatus().status() == SyncResult::Success || trayOverallStatusResult.overallStatus().status() == SyncResult::Problem) {
289+
if (trayOverallStatusResult.overallStatus().hasUnresolvedConflicts()) {
290+
setStatusText(tr("Unresolved %1 conflicts").arg(QString::number(trayOverallStatusResult.overallStatus().numNewConflictItems())));
291+
} else if (trayOverallStatusResult.overallStatus().numErrorItems() != 0) {
292+
setStatusText(tr("Errors %1").arg(QString::number(trayOverallStatusResult.overallStatus().numErrorItems())));
304293
} else {
305294
QString lastSyncDoneString;
306295

@@ -313,7 +302,7 @@ void ownCloudGui::slotComputeOverallSyncStatus()
313302

314303
setStatusText(tr("Up to date (%1)").arg(lastSyncDoneString));
315304
}
316-
} else if (trayOverallStatusResult.overallStatus == SyncResult::Paused) {
305+
} else if (trayOverallStatusResult.overallStatus().status() == SyncResult::Paused) {
317306
setStatusText(tr("Synchronization is paused"));
318307
} else {
319308
setStatusText(tr("Error during synchronization"));

‎src/libsync/syncresult.cpp

+4-12
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,16 @@
1414

1515
#include "syncresult.h"
1616
#include "progressdispatcher.h"
17+
#include "theme.h"
1718

1819
namespace OCC {
1920

20-
SyncResult::SyncResult()
21-
: _status(Undefined)
22-
, _foundFilesNotSynced(false)
23-
, _folderStructureWasChanged(false)
24-
, _numNewItems(0)
25-
, _numRemovedItems(0)
26-
, _numUpdatedItems(0)
27-
, _numRenamedItems(0)
28-
, _numNewConflictItems(0)
29-
, _numOldConflictItems(0)
30-
, _numErrorItems(0)
31-
21+
SyncResult::SyncResult(Status status)
22+
: _status(status)
3223
{
3324
}
3425

26+
3527
SyncResult::Status SyncResult::status() const
3628
{
3729
return _status;

0 commit comments

Comments
 (0)
Please sign in to comment.