From c2d82750b1097e94415d2c4fd348c066a1525d73 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sun, 22 Oct 2023 11:57:27 +0000 Subject: [PATCH] Fix opening a room in a new window. Fix opening a room in a new window. This is done by makeing the model top level parameters in RoomPage set from RoomManager but overwritten by RoomWindow --- src/qml/RoomPage.qml | 60 ++++++++++++++++++++++++++++++++++++++++ src/qml/RoomWindow.qml | 11 ++++++++ src/qml/TimelineView.qml | 60 +++++++++++++++++----------------------- 3 files changed, 96 insertions(+), 35 deletions(-) diff --git a/src/qml/RoomPage.qml b/src/qml/RoomPage.qml index 7b7077650..4564ecfa9 100644 --- a/src/qml/RoomPage.qml +++ b/src/qml/RoomPage.qml @@ -21,6 +21,45 @@ Kirigami.Page { property NeoChatRoom currentRoom: RoomManager.currentRoom required property NeoChatConnection connection + + /** + * @brief The MessageEventModel to use. + * + * Required so that new events can be requested when the end of the current + * local timeline is reached. + * + * @note For loading a room in a different window, override this with a new + * MessageEventModel set with the room to be shown. + * + * @sa MessageEventModel + */ + property MessageEventModel messageEventModel: RoomManager.messageEventModel + + /** + * @brief The MessageFilterModel to use. + * + * This model has the filtered list of events that should be shown in the timeline. + * + * @note For loading a room in a different window, override this with a new + * MessageFilterModel with the new MessageEventModel as the source model. + * + * @sa MessageEventModel, MessageFilterModel + */ + property MessageFilterModel messageFilterModel: RoomManager.messageFilterModel + + /** + * @brief The MediaMessageFilterModel to use. + * + * This model has the filtered list of media events that should be shown in + * the timeline. + * + * @note For loading a room in a different window, override this with a new + * MediaMessageFilterModel with the new MessageFilterModel as the source model. + * + * @sa MessageEventModel, MessageFilterModel + */ + property MediaMessageFilterModel mediaMessageFilterModel: RoomManager.mediaMessageFilterModel + property bool loading: !root.currentRoom || (root.currentRoom.timelineSize === 0 && !root.currentRoom.allHistoryLoaded) /// Disable cancel shortcut. Used by the separate window since it provides its own cancel implementation. @@ -73,6 +112,8 @@ Kirigami.Page { sourceComponent: TimelineView { id: timelineView currentRoom: root.currentRoom + messageEventModel: root.messageEventModel + messageFilterModel: root.messageFilterModel onFocusChatBox: { if (chatBoxLoader.item) { chatBoxLoader.item.forceActiveFocus() @@ -234,6 +275,17 @@ Kirigami.Page { }); contextMenu.open(); } + + function onShowMaximizedMedia(index) { + var popup = maximizeComponent.createObject(QQC2.ApplicationWindow.overlay, { + initialIndex: index + }) + popup.closed.connect(() => { + messageListView.interactive = true + popup.destroy() + }) + popup.open() + } } function showUserDetail(user) { @@ -261,4 +313,12 @@ Kirigami.Page { connection: root.connection } } + + Component { + id: maximizeComponent + NeochatMaximizeComponent { + currentRoom: root.currentRoom + model: root.mediaMessageFilterModel + } + } } diff --git a/src/qml/RoomWindow.qml b/src/qml/RoomWindow.qml index cb0bc3af7..974da13b0 100644 --- a/src/qml/RoomWindow.qml +++ b/src/qml/RoomWindow.qml @@ -23,10 +23,21 @@ Kirigami.ApplicationWindow { onActivated: root.close() } pageStack.initialPage: RoomPage { + id: roomPage visible: true currentRoom: root.currentRoom disableCancelShortcut: true connection: root.connection + + messageEventModel: MessageEventModel { + room: currentRoom + } + messageFilterModel: MessageFilterModel { + sourceModel: roomPage.messageEventModel + } + mediaMessageFilterModel: MediaMessageFilterModel { + sourceModel: roomPage.messageFilterModel + } } onCurrentRoomChanged: if (!currentRoom) { diff --git a/src/qml/TimelineView.qml b/src/qml/TimelineView.qml index 34bbe4ff7..c7734edb9 100644 --- a/src/qml/TimelineView.qml +++ b/src/qml/TimelineView.qml @@ -25,6 +25,22 @@ QQC2.ScrollView { hasScrolledUpBefore = false; } property bool roomChanging: false + + /** + * @brief The MessageEventModel to use. + * + * Required so that new events can be requested when the end of the current + * local timeline is reached. + */ + required property MessageEventModel messageEventModel + + /** + * @brief The MessageFilterModel to use. + * + * This model has the filtered list of events that should be shown in the timeline. + */ + required property MessageFilterModel messageFilterModel + readonly property bool atYEnd: messageListView.atYEnd /// Used to determine if scrolling to the bottom should mark the message as unread @@ -49,23 +65,23 @@ QQC2.ScrollView { interactive: Kirigami.Settings.isMobile bottomMargin: Kirigami.Units.largeSpacing + Math.round(Kirigami.Theme.defaultFont.pointSize * 2) - model: RoomManager.messageFilterModel + model: root.messageFilterModel Timer { interval: 1000 running: messageListView.atYBeginning triggeredOnStart: true onTriggered: { - if (messageListView.atYBeginning && RoomManager.messageEventModel.canFetchMore(RoomManager.messageEventModel.index(0, 0))) { - RoomManager.messageEventModel.fetchMore(RoomManager.messageEventModel.index(0, 0)); + if (messageListView.atYBeginning && root.messageEventModel.canFetchMore(root.messageEventModel.index(0, 0))) { + root.messageEventModel.fetchMore(root.messageEventModel.index(0, 0)); } } repeat: true } // HACK: The view should do this automatically but doesn't. - onAtYBeginningChanged: if (atYBeginning && RoomManager.messageEventModel.canFetchMore(RoomManager.messageEventModel.index(0, 0))) { - RoomManager.messageEventModel.fetchMore(RoomManager.messageEventModel.index(0, 0)); + onAtYBeginningChanged: if (atYBeginning && root.messageEventModel.canFetchMore(root.messageEventModel.index(0, 0))) { + root.messageEventModel.fetchMore(root.messageEventModel.index(0, 0)); } Timer { @@ -242,7 +258,7 @@ QQC2.ScrollView { } Connections { - target: RoomManager.messageEventModel + target: root.messageEventModel function onRowsInserted() { markReadIfVisibleTimer.restart() @@ -283,7 +299,7 @@ QQC2.ScrollView { Connections { //enabled: Config.showFancyEffects - target: RoomManager.messageEventModel + target: root.messageEventModel function onFancyEffectsReasonFound(fancyEffect) { fancyEffectsContainer.processFancyEffectsReason(fancyEffect) @@ -301,32 +317,6 @@ QQC2.ScrollView { } } - Component { - id: maximizeComponent - NeochatMaximizeComponent { - currentRoom: root.currentRoom - model: RoomManager.mediaMessageFilterModel - } - } - - Connections { - target: RoomManager - function onShowMaximizedMedia(index) { - messageListView.showMaximizedMedia(index) - } - } - - function showMaximizedMedia(index) { - var popup = maximizeComponent.createObject(QQC2.ApplicationWindow.overlay, { - initialIndex: index - }) - popup.closed.connect(() => { - messageListView.interactive = true - popup.destroy() - }) - popup.open() - } - function goToLastMessage() { root.currentRoom.markAllMessagesAsRead() // scroll to the very end, i.e to messageListView.YEnd @@ -334,10 +324,10 @@ QQC2.ScrollView { } function eventToIndex(eventID) { - const index = RoomManager.messageEventModel.eventIdToRow(eventID) + const index = root.messageEventModel.eventIdToRow(eventID) if (index === -1) return -1 - return RoomManager.messageFilterModel.mapFromSource(RoomManager.messageEventModel.index(index, 0)).row + return root.messageFilterModel.mapFromSource(root.messageEventModel.index(index, 0)).row } function firstVisibleIndex() {