diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp index f1ef688c7117a8e49e08bbfaf41a7ebb1f0ee74d..5ba1dcdc541d1cc803e8f6e7eb160869ca4c9f6f 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp @@ -69,7 +69,6 @@ UserSettings::load(std::optional<QString> 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<QString> 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<QVariant>{}).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<QStringList> 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 31e28db25f68eaef3156db29f0851821fd362dfa..c47844cb41609e9c01fade941349867817ed317d 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<QStringList> 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<QStringList> collapsedSpaces() const { return collapsedSpaces_; } signals: void groupViewStateChanged(bool state); @@ -329,6 +331,7 @@ private: QString deviceId_; QString homeserver_; QStringList hiddenTags_; + QList<QStringList> collapsedSpaces_; bool useIdenticon_; QSettings settings; diff --git a/src/timeline/CommunitiesModel.cpp b/src/timeline/CommunitiesModel.cpp index fb8aac24c625f16bd5c14fa2bdfd30e14684db2e..3c28463e6461cb724703117e8bee7dc5ad26990f 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<QStringList> 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<QStringList> 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 5191b239c6ed382b07e0a19d89436317e7e31ad8..0cba71047085c54703c90eb9bf97e89340f06c41 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);