Skip to content

Commit

Permalink
Draft: Persist filter settings for Not Synced tab
Browse files Browse the repository at this point in the history
Fixes: #10884
  • Loading branch information
erikjv committed Jun 14, 2023
1 parent 6088104 commit 553403d
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/common/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,20 @@ OCSYNC_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcUtility)
Q_UNREACHABLE();
}

template <class E = void>
QString enumToConfigName(E)
{
static_assert(std::is_same<E, void>::value, "Not implemented");
Q_UNREACHABLE();
}

template <class E = void>
std::optional<E> configNameToEnum(const QString &)
{
static_assert(std::is_same<E, void>::value, "Not implemented");
Q_UNREACHABLE();
}

template <typename T>
class asKeyValueRange
{
Expand Down
35 changes: 34 additions & 1 deletion src/gui/issueswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class SyncFileItemStatusSetSortFilterProxyModel : public Models::SignalledQSortF
explicit SyncFileItemStatusSetSortFilterProxyModel(QObject *parent = nullptr)
: Models::SignalledQSortFilterProxyModel(parent)
{
resetFilter();
restoreFilter();
}

~SyncFileItemStatusSetSortFilterProxyModel() override
Expand All @@ -74,6 +74,7 @@ class SyncFileItemStatusSetSortFilterProxyModel : public Models::SignalledQSortF
{
if (_filter != newFilter) {
_filter = newFilter;
saveFilter();
invalidateFilter();
emit filterChanged();
}
Expand Down Expand Up @@ -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<SyncFileItem::Status>(s)));
}
}
ConfigFile().setIssuesWidgetFilter(checked);
}

void restoreFilter()
{
StatusSet filter;
bool filterHasValidValues = false;
QStringList checked = ConfigFile().issuesWidgetFilter();

for (const QString &s : checked) {
auto status = Utility::configNameToEnum<SyncFileItem::Status>(s);
if (status.has_value()) {
filter[status.value()] = true;
filterHasValidValues = true;
}
}

if (filterHasValidValues) {
setFilter(filter);
} else {
resetFilter();
}
}

private:
StatusSet _filter;
};
Expand Down
18 changes: 18 additions & 0 deletions src/libsync/configfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand Down Expand Up @@ -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();
Expand Down
3 changes: 3 additions & 0 deletions src/libsync/configfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions src/libsync/syncfileitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,41 @@ QString Utility::enumToDisplayName(SyncFileItem::Status s)
}
Q_UNREACHABLE();
}

static std::array<QString, OCC::SyncFileItem::StatusCount> 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<SyncFileItem::Status> Utility::configNameToEnum(const QString &s)
{
auto it = std::find(statusConfigNames.begin(), statusConfigNames.end(), s);
if (it == statusConfigNames.end()) {
return {};
}

return static_cast<SyncFileItem::Status>(std::distance(statusConfigNames.begin(), it));
}

} // OCC namespace

QDebug operator<<(QDebug debug, const OCC::SyncFileItem *item)
{
if (!item) {
Expand Down
5 changes: 5 additions & 0 deletions src/libsync/syncfileitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<SyncFileItem::Status> Utility::configNameToEnum(const QString &s);

inline bool operator<(const SyncFileItemPtr &item1, const SyncFileItemPtr &item2)
{
Expand Down

0 comments on commit 553403d

Please sign in to comment.