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<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();
@@ -196,6 +201,13 @@ UserSettings::setHiddenTags(QStringList hiddenTags)
}
void
+UserSettings::setCollapsedSpaces(QList<QStringList> spaces)
+{
+ collapsedSpaces_ = spaces;
+ save();
+}
+
+void
UserSettings::setMarkdown(bool state)
{
if (state == markdown_)
@@ -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<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 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();
@@ -284,6 +286,55 @@ CommunitiesModel::initializeSidebar()
}
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()
{
beginResetModel();
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);
|