diff options
author | Christian Kamm <mail@ckamm.de> | 2018-02-21 14:18:52 +0300 |
---|---|---|
committer | ckamm <mail@ckamm.de> | 2018-03-06 15:02:54 +0300 |
commit | ec281654ae165b11cb50d76d8e3dad5578dddb2d (patch) | |
tree | 9a1cad89b35e9147d5c889871851d308796503c9 /src/gui/issueswidget.cpp | |
parent | 52dfe589bacca6a22a0bf84d1e3a3269d00ed610 (diff) |
Issues tab: Invalidate issues selectively #6226
Everything is invalidated later: after discovery, not before. In
addition entries that should only be invalidated when new local
discovery is done have that behavior now.
Diffstat (limited to 'src/gui/issueswidget.cpp')
-rw-r--r-- | src/gui/issueswidget.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp index 93dbe748c..b49afb9c2 100644 --- a/src/gui/issueswidget.cpp +++ b/src/gui/issueswidget.cpp @@ -18,6 +18,7 @@ #include "issueswidget.h" #include "configfile.h" #include "syncresult.h" +#include "syncengine.h" #include "logger.h" #include "theme.h" #include "folderman.h" @@ -145,7 +146,13 @@ void IssuesWidget::hideEvent(QHideEvent *ev) QWidget::hideEvent(ev); } -void IssuesWidget::cleanItems(const QString &folder) +static bool persistsUntilLocalDiscovery(QTreeWidgetItem *item) +{ + const auto status = ProtocolItem::status(item); + return status == SyncFileItem::Conflict || status == SyncFileItem::FileIgnored; +} + +void IssuesWidget::cleanItems(const std::function<bool(QTreeWidgetItem *)> &shouldDelete) { _ui->_treeWidget->setSortingEnabled(false); @@ -154,10 +161,8 @@ void IssuesWidget::cleanItems(const QString &folder) int itemCnt = _ui->_treeWidget->topLevelItemCount(); for (int cnt = itemCnt - 1; cnt >= 0; cnt--) { QTreeWidgetItem *item = _ui->_treeWidget->topLevelItem(cnt); - QString itemFolder = ProtocolItem::folderName(item); - if (itemFolder == folder) { + if (shouldDelete(item)) delete item; - } } _ui->_treeWidget->setSortingEnabled(true); @@ -209,9 +214,35 @@ void IssuesWidget::slotOpenFile(QTreeWidgetItem *item, int) void IssuesWidget::slotProgressInfo(const QString &folder, const ProgressInfo &progress) { - if (progress.status() == ProgressInfo::Starting) { - // The sync is restarting, clean the old items - cleanItems(folder); + if (progress.status() == ProgressInfo::Reconcile) { + // Wipe all non-persistent entries - as well as the persistent ones + // in cases where a local discovery was done. + auto f = FolderMan::instance()->folder(folder); + if (!f) + return; + const auto &engine = f->syncEngine(); + const auto style = engine.lastLocalDiscoveryStyle(); + const auto &discoveryDirs = engine.currentLocalDiscoveryDirs(); + cleanItems([&](QTreeWidgetItem *item) { + if (ProtocolItem::folderName(item) != folder) + return false; + if (style == LocalDiscoveryStyle::FilesystemOnly) + return true; + if (!persistsUntilLocalDiscovery(item)) + return true; + + // Definitely wipe the entry if the file no longer exists + if (!QFileInfo(f->path() + ProtocolItem::filePath(item)).exists()) + return true; + + auto path = QFileInfo(ProtocolItem::filePath(item)).dir().path().toUtf8(); + if (path == ".") + path.clear(); + + // TODO: This logic has to match csync_ftw's + auto it = discoveryDirs.lower_bound(path); + return it != discoveryDirs.end() && it->startsWith(path); + }); } } |