summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/ChatPage.cpp12
-rw-r--r--src/RoomList.cpp66
-rw-r--r--src/RoomList.h2
3 files changed, 80 insertions, 0 deletions
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp

index 9574751b..2191c6de 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -18,6 +18,7 @@ #include <QApplication> #include <QImageReader> #include <QSettings> +#include <QShortcut> #include <QtConcurrent> #include "AvatarProvider.h" @@ -148,6 +149,17 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) trySync(); }); + connect( + new QShortcut(QKeySequence("Ctrl+Down"), this), &QShortcut::activated, this, [this]() { + if (isVisible()) + room_list_->nextRoom(); + }); + connect( + new QShortcut(QKeySequence("Ctrl+Up"), this), &QShortcut::activated, this, [this]() { + if (isVisible()) + room_list_->previousRoom(); + }); + connect(top_bar_, &TopRoomBar::mentionsClicked, this, [this](const QPoint &mentionsPos) { if (user_mentions_popup_->isVisible()) { user_mentions_popup_->hide(); diff --git a/src/RoomList.cpp b/src/RoomList.cpp
index dfd4eff8..6434489e 100644 --- a/src/RoomList.cpp +++ b/src/RoomList.cpp
@@ -224,6 +224,72 @@ RoomList::highlightSelectedRoom(const QString &room_id) } void +RoomList::nextRoom() +{ + for (int ii = 0; ii < contentsLayout_->count() - 1; ++ii) { + auto room = qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(ii)->widget()); + + if (!room) + continue; + + if (room->roomId() == selectedRoom_) { + auto nextRoom = qobject_cast<RoomInfoListItem *>( + contentsLayout_->itemAt(ii + 1)->widget()); + + // Not a room message. + if (!nextRoom || nextRoom->isInvite()) + return; + + emit roomChanged(nextRoom->roomId()); + if (!roomExists(nextRoom->roomId())) { + nhlog::ui()->warn("roomlist: clicked unknown room_id"); + return; + } + + room->setPressedState(false); + nextRoom->setPressedState(true); + + scrollArea_->ensureWidgetVisible(nextRoom); + selectedRoom_ = nextRoom->roomId(); + return; + } + } +} + +void +RoomList::previousRoom() +{ + for (int ii = 1; ii < contentsLayout_->count(); ++ii) { + auto room = qobject_cast<RoomInfoListItem *>(contentsLayout_->itemAt(ii)->widget()); + + if (!room) + continue; + + if (room->roomId() == selectedRoom_) { + auto nextRoom = qobject_cast<RoomInfoListItem *>( + contentsLayout_->itemAt(ii - 1)->widget()); + + // Not a room message. + if (!nextRoom || nextRoom->isInvite()) + return; + + emit roomChanged(nextRoom->roomId()); + if (!roomExists(nextRoom->roomId())) { + nhlog::ui()->warn("roomlist: clicked unknown room_id"); + return; + } + + room->setPressedState(false); + nextRoom->setPressedState(true); + + scrollArea_->ensureWidgetVisible(nextRoom); + selectedRoom_ = nextRoom->roomId(); + return; + } + } +} + +void RoomList::updateRoomAvatar(const QString &roomid, const QString &img) { if (!roomExists(roomid)) { diff --git a/src/RoomList.h b/src/RoomList.h
index 95fc0d9b..d921990b 100644 --- a/src/RoomList.h +++ b/src/RoomList.h
@@ -72,6 +72,8 @@ public slots: void updateRoomDescription(const QString &roomid, const DescInfo &info); void closeJoinRoomDialog(bool isJoining, QString roomAlias); void updateReadStatus(const std::map<QString, bool> &status); + void nextRoom(); + void previousRoom(); protected: void paintEvent(QPaintEvent *event) override;