summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-05-28 17:25:46 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2021-05-28 17:25:46 +0200
commite2765212fb229e8d025d2255314a04a376207749 (patch)
tree62e6c90edd681c2963a69bc348d2cfe3adde5aca /src
parentReenable invites (diff)
downloadnheko-e2765212fb229e8d025d2255314a04a376207749.tar.xz
Reimplement room context menus
Diffstat (limited to 'src')
-rw-r--r--src/timeline/RoomlistModel.cpp72
-rw-r--r--src/timeline/RoomlistModel.h6
2 files changed, 78 insertions, 0 deletions
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp

index f3d4dad7..63054aa9 100644 --- a/src/timeline/RoomlistModel.cpp +++ b/src/timeline/RoomlistModel.cpp
@@ -49,6 +49,7 @@ RoomlistModel::roleNames() const {NotificationCount, "notificationCount"}, {IsInvite, "isInvite"}, {IsSpace, "isSpace"}, + {Tags, "tags"}, }; } @@ -84,6 +85,13 @@ RoomlistModel::data(const QModelIndex &index, int role) const case Roles::IsInvite: case Roles::IsSpace: return false; + case Roles::Tags: { + auto info = cache::singleRoomInfo(roomid.toStdString()); + QStringList list; + for (const auto &t : info.tags) + list.push_back(QString::fromStdString(t)); + return list; + } default: return {}; } @@ -111,6 +119,8 @@ RoomlistModel::data(const QModelIndex &index, int role) const return true; case Roles::IsSpace: return false; + case Roles::Tags: + return QStringList(); default: return {}; } @@ -364,6 +374,21 @@ RoomlistModel::declineInvite(QString roomid) } } } +void +RoomlistModel::leave(QString roomid) +{ + if (models.contains(roomid)) { + auto idx = roomidToIndex(roomid); + + if (idx != -1) { + beginRemoveRows(QModelIndex(), idx, idx); + roomids.erase(roomids.begin() + idx); + models.remove(roomid); + endRemoveRows(); + ChatPage::instance()->leaveRoom(roomid); + } + } +} namespace { enum NotificationImportance : short @@ -440,3 +465,50 @@ FilteredRoomlistModel::FilteredRoomlistModel(RoomlistModel *model, QObject *pare sort(0); } + +QStringList +FilteredRoomlistModel::tags() +{ + std::set<std::string> ts; + for (const auto &e : cache::roomInfo()) { + for (const auto &t : e.tags) { + if (t.find("u.") == 0) { + ts.insert(t); + } + } + } + + QStringList ret{{ + "m.favourite", + "m.lowpriority", + }}; + + for (const auto &t : ts) + ret.push_back(QString::fromStdString(t)); + + return ret; +} + +void +FilteredRoomlistModel::toggleTag(QString roomid, QString tag, bool on) +{ + if (on) { + http::client()->put_tag( + roomid.toStdString(), tag.toStdString(), {}, [tag](mtx::http::RequestErr err) { + if (err) { + nhlog::ui()->error("Failed to add tag: {}, {}", + tag.toStdString(), + err->matrix_error.error); + } + }); + } else { + http::client()->delete_tag( + roomid.toStdString(), tag.toStdString(), [tag](mtx::http::RequestErr err) { + if (err) { + nhlog::ui()->error("Failed to delete tag: {}, {}", + tag.toStdString(), + err->matrix_error.error); + } + }); + } +} diff --git a/src/timeline/RoomlistModel.h b/src/timeline/RoomlistModel.h
index ff85614c..2d1e5264 100644 --- a/src/timeline/RoomlistModel.h +++ b/src/timeline/RoomlistModel.h
@@ -10,6 +10,7 @@ #include <QSharedPointer> #include <QSortFilterProxyModel> #include <QString> +#include <set> #include <mtx/responses/sync.hpp> @@ -33,6 +34,7 @@ public: NotificationCount, IsInvite, IsSpace, + Tags, }; RoomlistModel(TimelineViewManager *parent = nullptr); @@ -66,6 +68,7 @@ public slots: } void acceptInvite(QString roomid); void declineInvite(QString roomid); + void leave(QString roomid); private slots: void updateReadStatus(const std::map<QString, bool> roomReadStatus_); @@ -100,6 +103,9 @@ public slots: } void acceptInvite(QString roomid) { roomlistmodel->acceptInvite(roomid); } void declineInvite(QString roomid) { roomlistmodel->declineInvite(roomid); } + void leave(QString roomid) { roomlistmodel->leave(roomid); } + QStringList tags(); + void toggleTag(QString roomid, QString tag, bool on); private: short int calculateImportance(const QModelIndex &idx) const;