From 2f08f5181c682f212d69852ce5b519033c9fbf70 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 9 Jul 2021 09:36:33 +0200 Subject: Redesign invites and room preview joins --- src/timeline/RoomlistModel.cpp | 64 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 8 deletions(-) (limited to 'src/timeline/RoomlistModel.cpp') 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(); + connect(ChatPage::instance(), &ChatPage::decryptSidebarChanged, this, [this]() { auto decrypt = ChatPage::instance()->userSettings()->decryptSidebar(); QHash>::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(); } } @@ -529,6 +539,19 @@ RoomlistModel::clear() endResetModel(); } +void +RoomlistModel::joinPreview(QString roomid, QString parentSpace) +{ + if (previewedRooms.contains(roomid)) { + auto child = cache::client()->getStateEvent( + parentSpace.toStdString(), roomid.toStdString()); + ChatPage::instance()->joinRoomVia(roomid.toStdString(), + (child && child->content.via) + ? child->content.via.value() + : std::vector{}, + false); + } +} void RoomlistModel::acceptInvite(QString 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 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()); } -- cgit 1.5.1