From b774a671da62d86444812d2b3769ec2f04d767dc Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 1 Dec 2021 03:46:55 +0100 Subject: [PATCH] Remember all the collapsed trees --- src/UserSettingsPage.cpp | 21 +++++++++++-- src/UserSettingsPage.h | 3 ++ src/timeline/CommunitiesModel.cpp | 51 +++++++++++++++++++++++++++++++ src/timeline/CommunitiesModel.h | 3 ++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index f1ef688c..5ba1dcdc 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -69,7 +69,6 @@ UserSettings::load(std::optional profile) hasDesktopNotifications_ = settings.value("user/desktop_notifications", true).toBool(); hasAlertOnNotification_ = settings.value("user/alert_on_notification", false).toBool(); groupView_ = settings.value("user/group_view", true).toBool(); - hiddenTags_ = settings.value("user/hidden_tags", QStringList{}).toStringList(); buttonsInTimeline_ = settings.value("user/timeline/buttons", true).toBool(); timelineMaxWidth_ = settings.value("user/timeline/max_width", 0).toInt(); messageHoverHighlight_ = @@ -117,6 +116,12 @@ UserSettings::load(std::optional profile) homeserver_ = settings.value(prefix + "auth/home_server", "").toString(); userId_ = settings.value(prefix + "auth/user_id", "").toString(); deviceId_ = settings.value(prefix + "auth/device_id", "").toString(); + hiddenTags_ = settings.value(prefix + "user/hidden_tags", QStringList{}).toStringList(); + + collapsedSpaces_.clear(); + for (const auto &e : + settings.value(prefix + "user/collapsed_spaces", QList{}).toList()) + collapsedSpaces_.push_back(e.toStringList()); shareKeysWithTrustedUsers_ = settings.value(prefix + "user/automatically_share_keys_with_trusted_users", false).toBool(); @@ -195,6 +200,13 @@ UserSettings::setHiddenTags(QStringList hiddenTags) save(); } +void +UserSettings::setCollapsedSpaces(QList spaces) +{ + collapsedSpaces_ = spaces; + save(); +} + void UserSettings::setMarkdown(bool state) { @@ -658,7 +670,6 @@ UserSettings::save() settings.setValue("minor_events", sortByImportance_); settings.setValue("read_receipts", readReceipts_); settings.setValue("group_view", groupView_); - settings.setValue("hidden_tags", hiddenTags_); settings.setValue("markdown_enabled", markdown_); settings.setValue("animate_images_on_hover", animateImagesOnHover_); settings.setValue("desktop_notifications", hasDesktopNotifications_); @@ -695,6 +706,12 @@ UserSettings::save() settings.setValue(prefix + "user/only_share_keys_with_verified_users", onlyShareKeysWithVerifiedUsers_); settings.setValue(prefix + "user/online_key_backup", useOnlineKeyBackup_); + settings.setValue(prefix + "user/hidden_tags", hiddenTags_); + + QVariantList v; + for (const auto &e : collapsedSpaces_) + v.push_back(e); + settings.setValue(prefix + "user/collapsed_spaces", v); settings.setValue("disable_certificate_validation", disableCertificateValidation_); diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h index 31e28db2..c47844cb 100644 --- a/src/UserSettingsPage.h +++ b/src/UserSettingsPage.h @@ -172,6 +172,7 @@ public: void setDisableCertificateValidation(bool disabled); void setHiddenTags(QStringList hiddenTags); void setUseIdenticon(bool state); + void setCollapsedSpaces(QList spaces); QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; } bool messageHoverHighlight() const { return messageHoverHighlight_; } @@ -228,6 +229,7 @@ public: bool disableCertificateValidation() const { return disableCertificateValidation_; } QStringList hiddenTags() const { return hiddenTags_; } bool useIdenticon() const { return useIdenticon_ && JdenticonProvider::isAvailable(); } + QList collapsedSpaces() const { return collapsedSpaces_; } signals: void groupViewStateChanged(bool state); @@ -329,6 +331,7 @@ private: QString deviceId_; QString homeserver_; QStringList hiddenTags_; + QList collapsedSpaces_; bool useIdenticon_; QSettings settings; diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp index fb8aac24..3c28463e 100644 --- a/src/timeline/CommunitiesModel.cpp +++ b/src/timeline/CommunitiesModel.cpp @@ -40,6 +40,7 @@ CommunitiesModel::setData(const QModelIndex &index, const QVariant &value, int r const auto cindex = spaceOrder_.lastChild(index.row() - 2); emit dataChanged(index, this->index(cindex + 2), {Collapsed, Qt::DisplayRole}); + spaceOrder_.storeCollapsed(); return true; } else return false; @@ -276,6 +277,7 @@ CommunitiesModel::initializeSidebar() tags_.push_back(QString::fromStdString(t)); hiddentTagIds_ = UserSettings::instance()->hiddenTags(); + spaceOrder_.restoreCollapsed(); endResetModel(); emit tagsChanged(); @@ -283,6 +285,55 @@ CommunitiesModel::initializeSidebar() emit containsSubspacesChanged(); } +void +CommunitiesModel::FlatTree::storeCollapsed() +{ + QList elements; + + int depth = -1; + + QStringList current; + + for (const auto &e : tree) { + if (e.depth > depth) { + current.push_back(e.name); + } else if (e.depth == depth) { + current.back() = e.name; + } else { + current.pop_back(); + current.back() = e.name; + } + + if (e.collapsed) + elements.push_back(current); + } + + UserSettings::instance()->setCollapsedSpaces(elements); +} +void +CommunitiesModel::FlatTree::restoreCollapsed() +{ + QList elements = UserSettings::instance()->collapsedSpaces(); + + int depth = -1; + + QStringList current; + + for (auto &e : tree) { + if (e.depth > depth) { + current.push_back(e.name); + } else if (e.depth == depth) { + current.back() = e.name; + } else { + current.pop_back(); + current.back() = e.name; + } + + if (elements.contains(current)) + e.collapsed = true; + } +} + void CommunitiesModel::clear() { diff --git a/src/timeline/CommunitiesModel.h b/src/timeline/CommunitiesModel.h index 5191b239..0cba7104 100644 --- a/src/timeline/CommunitiesModel.h +++ b/src/timeline/CommunitiesModel.h @@ -92,6 +92,9 @@ public: break; return i; } + + void storeCollapsed(); + void restoreCollapsed(); }; CommunitiesModel(QObject *parent = nullptr);