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
This commit is contained in:
James Graham
2023-10-22 11:57:27 +00:00
parent c97d276b36
commit c2d82750b1
3 changed files with 96 additions and 35 deletions

View File

@@ -21,6 +21,45 @@ Kirigami.Page {
property NeoChatRoom currentRoom: RoomManager.currentRoom property NeoChatRoom currentRoom: RoomManager.currentRoom
required property NeoChatConnection connection 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) 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. /// Disable cancel shortcut. Used by the separate window since it provides its own cancel implementation.
@@ -73,6 +112,8 @@ Kirigami.Page {
sourceComponent: TimelineView { sourceComponent: TimelineView {
id: timelineView id: timelineView
currentRoom: root.currentRoom currentRoom: root.currentRoom
messageEventModel: root.messageEventModel
messageFilterModel: root.messageFilterModel
onFocusChatBox: { onFocusChatBox: {
if (chatBoxLoader.item) { if (chatBoxLoader.item) {
chatBoxLoader.item.forceActiveFocus() chatBoxLoader.item.forceActiveFocus()
@@ -234,6 +275,17 @@ Kirigami.Page {
}); });
contextMenu.open(); 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) { function showUserDetail(user) {
@@ -261,4 +313,12 @@ Kirigami.Page {
connection: root.connection connection: root.connection
} }
} }
Component {
id: maximizeComponent
NeochatMaximizeComponent {
currentRoom: root.currentRoom
model: root.mediaMessageFilterModel
}
}
} }

View File

@@ -23,10 +23,21 @@ Kirigami.ApplicationWindow {
onActivated: root.close() onActivated: root.close()
} }
pageStack.initialPage: RoomPage { pageStack.initialPage: RoomPage {
id: roomPage
visible: true visible: true
currentRoom: root.currentRoom currentRoom: root.currentRoom
disableCancelShortcut: true disableCancelShortcut: true
connection: root.connection connection: root.connection
messageEventModel: MessageEventModel {
room: currentRoom
}
messageFilterModel: MessageFilterModel {
sourceModel: roomPage.messageEventModel
}
mediaMessageFilterModel: MediaMessageFilterModel {
sourceModel: roomPage.messageFilterModel
}
} }
onCurrentRoomChanged: if (!currentRoom) { onCurrentRoomChanged: if (!currentRoom) {

View File

@@ -25,6 +25,22 @@ QQC2.ScrollView {
hasScrolledUpBefore = false; hasScrolledUpBefore = false;
} }
property bool roomChanging: 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 readonly property bool atYEnd: messageListView.atYEnd
/// Used to determine if scrolling to the bottom should mark the message as unread /// Used to determine if scrolling to the bottom should mark the message as unread
@@ -49,23 +65,23 @@ QQC2.ScrollView {
interactive: Kirigami.Settings.isMobile interactive: Kirigami.Settings.isMobile
bottomMargin: Kirigami.Units.largeSpacing + Math.round(Kirigami.Theme.defaultFont.pointSize * 2) bottomMargin: Kirigami.Units.largeSpacing + Math.round(Kirigami.Theme.defaultFont.pointSize * 2)
model: RoomManager.messageFilterModel model: root.messageFilterModel
Timer { Timer {
interval: 1000 interval: 1000
running: messageListView.atYBeginning running: messageListView.atYBeginning
triggeredOnStart: true triggeredOnStart: true
onTriggered: { onTriggered: {
if (messageListView.atYBeginning && RoomManager.messageEventModel.canFetchMore(RoomManager.messageEventModel.index(0, 0))) { if (messageListView.atYBeginning && root.messageEventModel.canFetchMore(root.messageEventModel.index(0, 0))) {
RoomManager.messageEventModel.fetchMore(RoomManager.messageEventModel.index(0, 0)); root.messageEventModel.fetchMore(root.messageEventModel.index(0, 0));
} }
} }
repeat: true repeat: true
} }
// HACK: The view should do this automatically but doesn't. // HACK: The view should do this automatically but doesn't.
onAtYBeginningChanged: if (atYBeginning && RoomManager.messageEventModel.canFetchMore(RoomManager.messageEventModel.index(0, 0))) { onAtYBeginningChanged: if (atYBeginning && root.messageEventModel.canFetchMore(root.messageEventModel.index(0, 0))) {
RoomManager.messageEventModel.fetchMore(RoomManager.messageEventModel.index(0, 0)); root.messageEventModel.fetchMore(root.messageEventModel.index(0, 0));
} }
Timer { Timer {
@@ -242,7 +258,7 @@ QQC2.ScrollView {
} }
Connections { Connections {
target: RoomManager.messageEventModel target: root.messageEventModel
function onRowsInserted() { function onRowsInserted() {
markReadIfVisibleTimer.restart() markReadIfVisibleTimer.restart()
@@ -283,7 +299,7 @@ QQC2.ScrollView {
Connections { Connections {
//enabled: Config.showFancyEffects //enabled: Config.showFancyEffects
target: RoomManager.messageEventModel target: root.messageEventModel
function onFancyEffectsReasonFound(fancyEffect) { function onFancyEffectsReasonFound(fancyEffect) {
fancyEffectsContainer.processFancyEffectsReason(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() { function goToLastMessage() {
root.currentRoom.markAllMessagesAsRead() root.currentRoom.markAllMessagesAsRead()
// scroll to the very end, i.e to messageListView.YEnd // scroll to the very end, i.e to messageListView.YEnd
@@ -334,10 +324,10 @@ QQC2.ScrollView {
} }
function eventToIndex(eventID) { function eventToIndex(eventID) {
const index = RoomManager.messageEventModel.eventIdToRow(eventID) const index = root.messageEventModel.eventIdToRow(eventID)
if (index === -1) if (index === -1)
return -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() { function firstVisibleIndex() {