diff --git a/src/models/sortfilterroomtreemodel.cpp b/src/models/sortfilterroomtreemodel.cpp index 93ed073aa..77f150280 100644 --- a/src/models/sortfilterroomtreemodel.cpp +++ b/src/models/sortfilterroomtreemodel.cpp @@ -205,4 +205,14 @@ void SortFilterRoomTreeModel::setMode(SortFilterRoomTreeModel::Mode mode) invalidate(); } +QModelIndex SortFilterRoomTreeModel::currentRoomIndex() const +{ + const auto roomModel = dynamic_cast(sourceModel()); + if (roomModel == nullptr) { + return {}; + } + + return mapFromSource(roomModel->indexForRoom(RoomManager::instance().currentRoom())); +} + #include "moc_sortfilterroomtreemodel.cpp" diff --git a/src/models/sortfilterroomtreemodel.h b/src/models/sortfilterroomtreemodel.h index 827c5993b..c47195f27 100644 --- a/src/models/sortfilterroomtreemodel.h +++ b/src/models/sortfilterroomtreemodel.h @@ -76,6 +76,8 @@ public: Mode mode() const; void setMode(Mode mode); + Q_INVOKABLE QModelIndex currentRoomIndex() const; + protected: /** * @brief Returns true if the value of source_left is less than source_right. diff --git a/src/qml/RoomListPage.qml b/src/qml/RoomListPage.qml index ff85d65cf..e373d2235 100644 --- a/src/qml/RoomListPage.qml +++ b/src/qml/RoomListPage.qml @@ -40,41 +40,41 @@ Kirigami.Page { } function goToNextRoomFiltered(condition) { - let index = treeView.currentIndex; - while (index++ !== treeView.count - 1) { - if (condition(treeView.itemAtIndex(index))) { - treeView.currentIndex = index; - treeView.currentItem.clicked(); + let index = treeView.rowAtIndex(RoomManager.sortFilterRoomTreeModel.currentRoomIndex()); + while (index++ < treeView.rows) { + let item = treeView.itemAtIndex(treeView.index(index, 0)) + if (condition(item)) { + RoomManager.resolveResource(item.currentRoom.id) return; } } } function goToPreviousRoomFiltered(condition) { - let index = treeView.currentIndex; - while (index-- !== 0) { - if (condition(treeView.itemAtIndex(index))) { - treeView.currentIndex = index; - treeView.currentItem.clicked(); + let index = treeView.rowAtIndex(RoomManager.sortFilterRoomTreeModel.currentRoomIndex()); + while (index-- > 0) { + let item = treeView.itemAtIndex(treeView.index(index, 0)) + if (condition(item)) { + RoomManager.resolveResource(item.currentRoom.id) return; } } } function goToNextRoom() { - goToNextRoomFiltered(item => item.visible); + goToNextRoomFiltered(item => (item && item instanceof RoomDelegate)); } function goToPreviousRoom() { - goToPreviousRoomFiltered(item => item.visible); + goToPreviousRoomFiltered(item => (item && item instanceof RoomDelegate)); } function goToNextUnreadRoom() { - goToNextRoomFiltered(item => (item.visible && item.hasUnread)); + goToNextRoomFiltered(item => (item && item instanceof RoomDelegate && item.hasUnread)); } function goToPreviousUnreadRoom() { - goToPreviousRoomFiltered(item => (item.visible && item.hasUnread)); + goToPreviousRoomFiltered(item => (item && item instanceof RoomDelegate && item.hasUnread)); } titleDelegate: Loader { @@ -89,6 +89,10 @@ Kirigami.Page { function onCurrentSpaceChanged() { treeView.expandRecursively(); } + + function onCurrentRoomChanged() { + treeView.positionViewAtIndex(RoomManager.sortFilterRoomTreeModel.currentRoomIndex(), TableView.AlignVCenter) + } } RowLayout {