From 553403dbc817ffdc565a346cbb027cda91abf2c9 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 14 Jun 2023 15:29:08 +0200 Subject: [PATCH] Draft: Persist filter settings for Not Synced tab Fixes: #10884 --- src/common/utility.h | 14 ++++++++++++++ src/gui/issueswidget.cpp | 35 ++++++++++++++++++++++++++++++++++- src/libsync/configfile.cpp | 18 ++++++++++++++++++ src/libsync/configfile.h | 3 +++ src/libsync/syncfileitem.cpp | 33 +++++++++++++++++++++++++++++++++ src/libsync/syncfileitem.h | 5 +++++ 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/src/common/utility.h b/src/common/utility.h index e85530a453d..6e83425e1c8 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -359,6 +359,20 @@ OCSYNC_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcUtility) Q_UNREACHABLE(); } + template + QString enumToConfigName(E) + { + static_assert(std::is_same::value, "Not implemented"); + Q_UNREACHABLE(); + } + + template + std::optional configNameToEnum(const QString &) + { + static_assert(std::is_same::value, "Not implemented"); + Q_UNREACHABLE(); + } + template class asKeyValueRange { diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp index a8ed7575ddc..4d4d8a230e6 100644 --- a/src/gui/issueswidget.cpp +++ b/src/gui/issueswidget.cpp @@ -58,7 +58,7 @@ class SyncFileItemStatusSetSortFilterProxyModel : public Models::SignalledQSortF explicit SyncFileItemStatusSetSortFilterProxyModel(QObject *parent = nullptr) : Models::SignalledQSortFilterProxyModel(parent) { - resetFilter(); + restoreFilter(); } ~SyncFileItemStatusSetSortFilterProxyModel() override @@ -74,6 +74,7 @@ class SyncFileItemStatusSetSortFilterProxyModel : public Models::SignalledQSortF { if (_filter != newFilter) { _filter = newFilter; + saveFilter(); invalidateFilter(); emit filterChanged(); } @@ -138,6 +139,38 @@ class SyncFileItemStatusSetSortFilterProxyModel : public Models::SignalledQSortF return defaultSet; } + void saveFilter() + { + QStringList checked; + for (uint8_t s = SyncFileItem::NoStatus; s < SyncFileItem::StatusCount; ++s) { + if (_filter[s]) { + checked.append(Utility::enumToConfigName(static_cast(s))); + } + } + ConfigFile().setIssuesWidgetFilter(checked); + } + + void restoreFilter() + { + StatusSet filter; + bool filterHasValidValues = false; + QStringList checked = ConfigFile().issuesWidgetFilter(); + + for (const QString &s : checked) { + auto status = Utility::configNameToEnum(s); + if (status.has_value()) { + filter[status.value()] = true; + filterHasValidValues = true; + } + } + + if (filterHasValidValues) { + setFilter(filter); + } else { + resetFilter(); + } + } + private: StatusSet _filter; }; diff --git a/src/libsync/configfile.cpp b/src/libsync/configfile.cpp index ffe1c30b6df..58fdfa64041 100644 --- a/src/libsync/configfile.cpp +++ b/src/libsync/configfile.cpp @@ -91,7 +91,12 @@ const QString newBigFolderSizeLimitC() { return QStringLiteral("newBigFolderSize const QString useNewBigFolderSizeLimitC() { return QStringLiteral("useNewBigFolderSizeLimit"); } const QString confirmExternalStorageC() { return QStringLiteral("confirmExternalStorage"); } const QString moveToTrashC() { return QStringLiteral("moveToTrash"); } + +const QString issuesWidgetFilterC() +{ + return QStringLiteral("issuesWidgetFilter"); } +} // anonymous namespace QString ConfigFile::_confDir = QString(); const std::chrono::seconds DefaultRemotePollInterval { 30 }; @@ -146,6 +151,19 @@ void ConfigFile::setShowInExplorerNavigationPane(bool show) settings.sync(); } +QStringList ConfigFile::issuesWidgetFilter() const +{ + auto settings = makeQSettings(); + return settings.value(issuesWidgetFilterC()).toStringList(); +} + +void ConfigFile::setIssuesWidgetFilter(const QStringList &checked) +{ + auto settings = makeQSettings(); + settings.setValue(issuesWidgetFilterC(), checked); + settings.sync(); +} + std::chrono::seconds ConfigFile::timeout() const { auto settings = makeQSettings(); diff --git a/src/libsync/configfile.h b/src/libsync/configfile.h index 4551791895c..732bb04dc14 100644 --- a/src/libsync/configfile.h +++ b/src/libsync/configfile.h @@ -158,6 +158,9 @@ class OWNCLOUDSYNC_EXPORT ConfigFile bool showInExplorerNavigationPane() const; void setShowInExplorerNavigationPane(bool show); + QStringList issuesWidgetFilter() const; + void setIssuesWidgetFilter(const QStringList &checked); + std::chrono::seconds timeout() const; qint64 chunkSize() const; qint64 maxChunkSize() const; diff --git a/src/libsync/syncfileitem.cpp b/src/libsync/syncfileitem.cpp index bb4aa588e73..bab31e4a497 100644 --- a/src/libsync/syncfileitem.cpp +++ b/src/libsync/syncfileitem.cpp @@ -109,8 +109,41 @@ QString Utility::enumToDisplayName(SyncFileItem::Status s) } Q_UNREACHABLE(); } + +static std::array statusConfigNames = { + QStringLiteral("NoStatus"), + QStringLiteral("FatalError"), + QStringLiteral("NormalError"), + QStringLiteral("SoftError"), + QStringLiteral("Success"), + QStringLiteral("Conflict"), + QStringLiteral("FileIgnored"), + QStringLiteral("Restoration"), + QStringLiteral("DetailError"), + QStringLiteral("BlacklistedError"), + QStringLiteral("Excluded"), + QStringLiteral("Message"), +}; + +template <> +QString Utility::enumToConfigName(SyncFileItem::Status s) +{ + return statusConfigNames[s]; } +template <> +std::optional Utility::configNameToEnum(const QString &s) +{ + auto it = std::find(statusConfigNames.begin(), statusConfigNames.end(), s); + if (it == statusConfigNames.end()) { + return {}; + } + + return static_cast(std::distance(statusConfigNames.begin(), it)); +} + +} // OCC namespace + QDebug operator<<(QDebug debug, const OCC::SyncFileItem *item) { if (!item) { diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index c892a6a4b88..523d3518384 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -304,6 +304,11 @@ class OWNCLOUDSYNC_EXPORT SyncFileItem template <> OWNCLOUDSYNC_EXPORT QString Utility::enumToDisplayName(SyncFileItem::Status s); +template <> +OWNCLOUDSYNC_EXPORT QString Utility::enumToConfigName(SyncFileItem::Status s); + +template <> +OWNCLOUDSYNC_EXPORT std::optional Utility::configNameToEnum(const QString &s); inline bool operator<(const SyncFileItemPtr &item1, const SyncFileItemPtr &item2) {