mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-10-31 10:00:46 +03:00
159 lines
5.4 KiB
C++
159 lines
5.4 KiB
C++
|
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
||
|
//
|
||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
||
|
#include "CommunitiesModel.h"
|
||
|
|
||
|
#include <set>
|
||
|
|
||
|
#include "Cache.h"
|
||
|
#include "UserSettingsPage.h"
|
||
|
|
||
|
CommunitiesModel::CommunitiesModel(QObject *parent)
|
||
|
: QAbstractListModel(parent)
|
||
|
{}
|
||
|
|
||
|
QHash<int, QByteArray>
|
||
|
CommunitiesModel::roleNames() const
|
||
|
{
|
||
|
return {
|
||
|
{AvatarUrl, "avatarUrl"},
|
||
|
{DisplayName, "displayName"},
|
||
|
{Tooltip, "tooltip"},
|
||
|
{ChildrenHidden, "childrenHidden"},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
QVariant
|
||
|
CommunitiesModel::data(const QModelIndex &index, int role) const
|
||
|
{
|
||
|
if (index.row() == 0) {
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::AvatarUrl:
|
||
|
return QString(":/icons/icons/ui/world.png");
|
||
|
case CommunitiesModel::Roles::DisplayName:
|
||
|
return tr("All rooms");
|
||
|
case CommunitiesModel::Roles::Tooltip:
|
||
|
return tr("Shows all rooms without filtering.");
|
||
|
case CommunitiesModel::Roles::ChildrenHidden:
|
||
|
return false;
|
||
|
case CommunitiesModel::Roles::Id:
|
||
|
return "";
|
||
|
}
|
||
|
} else if (index.row() - 1 < tags_.size()) {
|
||
|
auto tag = tags_.at(index.row() - 1);
|
||
|
if (tag == "m.favourite") {
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::AvatarUrl:
|
||
|
return QString(":/icons/icons/ui/star.png");
|
||
|
case CommunitiesModel::Roles::DisplayName:
|
||
|
return tr("Favourites");
|
||
|
case CommunitiesModel::Roles::Tooltip:
|
||
|
return tr("Rooms you have favourited.");
|
||
|
}
|
||
|
} else if (tag == "m.lowpriority") {
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::AvatarUrl:
|
||
|
return QString(":/icons/icons/ui/star.png");
|
||
|
case CommunitiesModel::Roles::DisplayName:
|
||
|
return tr("Low Priority");
|
||
|
case CommunitiesModel::Roles::Tooltip:
|
||
|
return tr("Rooms with low priority.");
|
||
|
}
|
||
|
} else if (tag == "m.server_notice") {
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::AvatarUrl:
|
||
|
return QString(":/icons/icons/ui/tag.png");
|
||
|
case CommunitiesModel::Roles::DisplayName:
|
||
|
return tr("Server Notices");
|
||
|
case CommunitiesModel::Roles::Tooltip:
|
||
|
return tr("Messages from your server or administrator.");
|
||
|
}
|
||
|
} else {
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::AvatarUrl:
|
||
|
return QString(":/icons/icons/ui/tag.png");
|
||
|
case CommunitiesModel::Roles::DisplayName:
|
||
|
return tag.right(2);
|
||
|
case CommunitiesModel::Roles::Tooltip:
|
||
|
return tag.right(2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch (role) {
|
||
|
case CommunitiesModel::Roles::ChildrenHidden:
|
||
|
return UserSettings::instance()->hiddenTags().contains("tag:" + tag);
|
||
|
case CommunitiesModel::Roles::Id:
|
||
|
return "tag:" + tag;
|
||
|
}
|
||
|
}
|
||
|
return QVariant();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CommunitiesModel::initializeSidebar()
|
||
|
{
|
||
|
std::set<std::string> ts;
|
||
|
for (const auto &e : cache::roomInfo()) {
|
||
|
for (const auto &t : e.tags) {
|
||
|
if (t.find("u.") == 0 || t.find("m." == 0)) {
|
||
|
ts.insert(t);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
beginResetModel();
|
||
|
tags_.clear();
|
||
|
for (const auto &t : ts)
|
||
|
tags_.push_back(QString::fromStdString(t));
|
||
|
endResetModel();
|
||
|
|
||
|
emit tagsChanged();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CommunitiesModel::clear()
|
||
|
{
|
||
|
beginResetModel();
|
||
|
tags_.clear();
|
||
|
endResetModel();
|
||
|
|
||
|
emit tagsChanged();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CommunitiesModel::sync(const mtx::responses::Rooms &rooms)
|
||
|
{
|
||
|
bool tagsUpdated = false;
|
||
|
|
||
|
for (const auto &[roomid, room] : rooms.join) {
|
||
|
(void)roomid;
|
||
|
for (const auto &e : room.account_data.events)
|
||
|
if (std::holds_alternative<
|
||
|
mtx::events::AccountDataEvent<mtx::events::account_data::Tags>>(e)) {
|
||
|
tagsUpdated = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (tagsUpdated)
|
||
|
initializeSidebar();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CommunitiesModel::setCurrentTagId(QString tagId)
|
||
|
{
|
||
|
if (tagId.startsWith("tag:")) {
|
||
|
auto tag = tagId.remove(0, 4);
|
||
|
for (const auto &t : tags_) {
|
||
|
if (t == tag) {
|
||
|
this->currentTagId_ = tagId;
|
||
|
emit currentTagIdChanged();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this->currentTagId_ = "";
|
||
|
emit currentTagIdChanged();
|
||
|
}
|