summary refs log tree commit diff
path: root/src/timeline/RoomlistModel.cpp
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2021-07-09 09:36:33 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2021-07-09 11:36:34 +0200
commit2f08f5181c682f212d69852ce5b519033c9fbf70 (patch)
treec913f941f5e93cb2ca6addde05bac9636b42f114 /src/timeline/RoomlistModel.cpp
parentMerge branch 'nheko_loading_spinner' into 'master' (diff)
downloadnheko-2f08f5181c682f212d69852ce5b519033c9fbf70.tar.xz
Redesign invites and room preview joins
Diffstat (limited to 'src/timeline/RoomlistModel.cpp')
-rw-r--r--src/timeline/RoomlistModel.cpp64
1 files changed, 56 insertions, 8 deletions
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp

index 87940948..e2901260 100644 --- a/src/timeline/RoomlistModel.cpp +++ b/src/timeline/RoomlistModel.cpp
@@ -16,6 +16,8 @@ RoomlistModel::RoomlistModel(TimelineViewManager *parent) : QAbstractListModel(parent) , manager(parent) { + [[maybe_unused]] static auto id = qRegisterMetaType<RoomPreview>(); + connect(ChatPage::instance(), &ChatPage::decryptSidebarChanged, this, [this]() { auto decrypt = ChatPage::instance()->userSettings()->decryptSidebar(); QHash<QString, QSharedPointer<TimelineModel>>::iterator i; @@ -137,7 +139,7 @@ RoomlistModel::data(const QModelIndex &index, int role) const case Roles::RoomName: return QString::fromStdString(room.name); case Roles::LastMessage: - return QString(); + return tr("Pending invite."); case Roles::Time: return QString(); case Roles::Timestamp: @@ -434,9 +436,11 @@ void RoomlistModel::sync(const mtx::responses::Rooms &rooms) { for (const auto &[room_id, room] : rooms.join) { + auto qroomid = QString::fromStdString(room_id); + // addRoom will only add the room, if it doesn't exist - addRoom(QString::fromStdString(room_id)); - const auto &room_model = models.value(QString::fromStdString(room_id)); + addRoom(qroomid); + const auto &room_model = models.value(qroomid); room_model->sync(room); // room_model->addEvents(room.timeline); connect(room_model.data(), @@ -465,14 +469,20 @@ RoomlistModel::sync(const mtx::responses::Rooms &rooms) for (const auto &[room_id, room] : rooms.leave) { (void)room; - auto idx = this->roomidToIndex(QString::fromStdString(room_id)); + auto qroomid = QString::fromStdString(room_id); + + if ((currentRoom_ && currentRoom_->roomId() == qroomid) || + (currentRoomPreview_ && currentRoomPreview_->roomid() == qroomid)) + resetCurrentRoom(); + + auto idx = this->roomidToIndex(qroomid); if (idx != -1) { beginRemoveRows(QModelIndex(), idx, idx); roomids.erase(roomids.begin() + idx); - if (models.contains(QString::fromStdString(room_id))) - models.remove(QString::fromStdString(room_id)); - else if (invites.contains(QString::fromStdString(room_id))) - invites.remove(QString::fromStdString(room_id)); + if (models.contains(qroomid)) + models.remove(qroomid); + else if (invites.contains(qroomid)) + invites.remove(qroomid); endRemoveRows(); } } @@ -530,6 +540,19 @@ RoomlistModel::clear() } void +RoomlistModel::joinPreview(QString roomid, QString parentSpace) +{ + if (previewedRooms.contains(roomid)) { + auto child = cache::client()->getStateEvent<mtx::events::state::space::Child>( + parentSpace.toStdString(), roomid.toStdString()); + ChatPage::instance()->joinRoomVia(roomid.toStdString(), + (child && child->content.via) + ? child->content.via.value() + : std::vector<std::string>{}, + false); + } +} +void RoomlistModel::acceptInvite(QString roomid) { if (invites.contains(roomid)) { @@ -581,6 +604,31 @@ RoomlistModel::setCurrentRoom(QString roomid) nhlog::ui()->debug("Trying to switch to: {}", roomid.toStdString()); if (models.contains(roomid)) { currentRoom_ = models.value(roomid); + currentRoomPreview_.reset(); + emit currentRoomChanged(); + nhlog::ui()->debug("Switched to: {}", roomid.toStdString()); + } else if (invites.contains(roomid) || previewedRooms.contains(roomid)) { + currentRoom_ = nullptr; + std::optional<RoomInfo> i; + + RoomPreview p; + + if (invites.contains(roomid)) { + i = invites.value(roomid); + p.isInvite_ = true; + } else { + i = previewedRooms.value(roomid); + p.isInvite_ = false; + } + + if (i) { + p.roomid_ = roomid; + p.roomName_ = QString::fromStdString(i->name); + p.roomTopic_ = QString::fromStdString(i->topic); + p.roomAvatarUrl_ = QString::fromStdString(i->avatar_url); + currentRoomPreview_ = std::move(p); + } + emit currentRoomChanged(); nhlog::ui()->debug("Switched to: {}", roomid.toStdString()); }