Page MenuHomePhorge

D219.1750682137.diff
No OneTemporary

Size
6 KB
Referenced Files
None
Subscribers
None

D219.1750682137.diff

diff --git a/src/contents/ui/RoomPage.qml b/src/contents/ui/RoomPage.qml
--- a/src/contents/ui/RoomPage.qml
+++ b/src/contents/ui/RoomPage.qml
@@ -34,6 +34,7 @@
signal viewEventHistoryRequested(string eventId)
title: roomNameProvider.name
+ padding: 0
property var isInvite: room.membership === MK.MatrixRoom.Invite
property var isJoin: room.membership === MK.MatrixRoom.Join
@@ -77,6 +78,16 @@
text: l10n.get('room-pinned-events-action', { count: roomPage.pinnedEvents.count })
onTriggered: activateRoomPinnedEventsPage(room)
},
+ Kirigami.Action {
+ id: scrollToLatestAction
+ objectName: 'scrollToLatestAction'
+ icon.name: "go-down"
+ enabled: !roomTimelineView.atYEnd
+ text: l10n.get("room-timeline-scroll-to-latest-action")
+ onTriggered: {
+ roomTimelineView.positionViewAtBeginning();
+ }
+ },
Kirigami.Action {
id: roomSettingsAction
icon.name: 'settings-configure'
@@ -125,6 +136,8 @@
}
RoomTimelineView {
+ id: roomTimelineView
+ objectName: 'roomTimelineView'
timeline: roomPage.roomTimeline
}
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -159,6 +159,7 @@
sticker-picker-room-default-sticker-pack-name = {$room} 中的默认包
room-timeline-load-more-action = 加载更多
+room-timeline-scroll-to-latest-action = 滚动到最新的消息
room-invite-accept-action = 接受邀请
room-invite-reject-action = 拒绝邀请
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -163,6 +163,7 @@
sticker-picker-room-default-sticker-pack-name = Default pack in {$room}
room-timeline-load-more-action = Load more
+room-timeline-scroll-to-latest-action = Scroll to latest message
room-invite-accept-action = Accept invite
room-invite-reject-action = Reject invite
diff --git a/src/tests/quick-tests/tst_RoomPage.qml b/src/tests/quick-tests/tst_RoomPage.qml
--- a/src/tests/quick-tests/tst_RoomPage.qml
+++ b/src/tests/quick-tests/tst_RoomPage.qml
@@ -65,28 +65,55 @@
}),
})
- ColumnLayout {
+ property var roomScrollToLatest: JsHelpers.factory.room({
+ timeline: () => Qt.createComponent("QtQml.Models", "ListModel").createObject()
+ })
+
+ Component {
+ id: pageInviteComp
Kazv.RoomPage {
id: pageInvite
room: roomInvite
}
+ }
+ Component {
+ id: pageJoinComp
Kazv.RoomPage {
id: pageJoin
room: roomJoin
}
+ }
+ Component {
+ id: pageLeaveComp
Kazv.RoomPage {
id: pageLeave
room: roomLeave
}
+ }
+ Component {
+ id: pageWithPinnedComp
Kazv.RoomPage {
id: pageWithPinned
room: roomWithPinned
}
}
+ Component {
+ id: pageScrollToLatestComp
+ Kazv.RoomPage {
+ id: pageScrollToLatest
+ room: roomScrollToLatest
+ }
+ }
+
+ Loader {
+ id: pageLoader
+ anchors.fill: item
+ }
+
TestCase {
id: roomPageTest
name: 'RoomPageTest'
@@ -98,50 +125,76 @@
}
function test_inviteRoom() {
- const sendMessageBox = findChild(pageInvite, 'sendMessageBox');
+ pageLoader.sourceComponent = pageInviteComp;
+ const sendMessageBox = findChild(pageLoader.item, 'sendMessageBox');
verify(sendMessageBox);
verify(!sendMessageBox.enabled);
}
function test_joinRoom() {
- const sendMessageBox = findChild(pageJoin, 'sendMessageBox');
+ pageLoader.sourceComponent = pageJoinComp;
+ const sendMessageBox = findChild(pageLoader.item, 'sendMessageBox');
verify(sendMessageBox);
verify(sendMessageBox.enabled);
}
function test_leaveRoom() {
- const sendMessageBox = findChild(pageLeave, 'sendMessageBox');
+ pageLoader.sourceComponent = pageLeaveComp;
+ const sendMessageBox = findChild(pageLoader.item, 'sendMessageBox');
verify(sendMessageBox);
verify(!sendMessageBox.enabled);
}
function test_receiptableEventId() {
- verify(pageJoin.getLastReceiptableEventId(item.roomTimeline, item.roomTimeline.count) === '$event3');
+ pageLoader.sourceComponent = pageJoinComp;
+ verify(pageLoader.item.getLastReceiptableEventId(item.roomTimeline, item.roomTimeline.count) === '$event3');
}
function test_paginateBack() {
- pageJoin.paginateBackRequested('$1');
+ pageLoader.sourceComponent = pageJoinComp;
+ pageLoader.item.paginateBackRequested('$1');
tryVerify(() => roomJoin.paginateBackFrom.calledTimes() === 1);
verify(roomJoin.paginateBackFrom.lastArgs()[0] === '$1');
// one pagination under way, do not call it twice
- pageJoin.paginateBackRequested('$1');
+ pageLoader.item.paginateBackRequested('$1');
verify(roomJoin.paginateBackFrom.calledTimes() === 1);
// paginating from another event is not affected
- pageJoin.paginateBackRequested('$2');
+ pageLoader.item.paginateBackRequested('$2');
tryVerify(() => roomJoin.paginateBackFrom.calledTimes() === 2);
verify(roomJoin.paginateBackFrom.lastArgs()[0] === '$2');
// after the promise resolves, we can paginate from this id again
roomJoin.paginateBackFrom.retVals[0].resolve(true);
- pageJoin.paginateBackRequested('$1');
+ pageLoader.item.paginateBackRequested('$1');
tryVerify(() => roomJoin.paginateBackFrom.calledTimes() === 3);
verify(roomJoin.paginateBackFrom.lastArgs()[0] === '$1');
}
function test_pinnedAction() {
- verify(!findChild(pageJoin, 'pinnedEventsAction').visible);
- verify(!findChild(pageJoin, 'pinnedEventsAction').enabled);
- verify(findChild(pageWithPinned, 'pinnedEventsAction').visible);
- verify(findChild(pageWithPinned, 'pinnedEventsAction').enabled);
+ pageLoader.sourceComponent = pageJoinComp;
+ verify(!findChild(pageLoader.item, 'pinnedEventsAction').visible);
+ verify(!findChild(pageLoader.item, 'pinnedEventsAction').enabled);
+ pageLoader.sourceComponent = pageWithPinnedComp;
+ verify(findChild(pageLoader.item, 'pinnedEventsAction').visible);
+ verify(findChild(pageLoader.item, 'pinnedEventsAction').enabled);
+ }
+
+ function test_scrollToLatest() {
+ pageLoader.sourceComponent = pageScrollToLatestComp;
+ const action = findChild(pageLoader.item, 'scrollToLatestAction');
+ const roomTimelineView = findChild(pageLoader.item, 'roomTimelineView');
+
+ verify(action.visible);
+ verify(!action.enabled);
+
+ while (item.height >= roomTimelineView.contentHeight) {
+ roomTimelineView.model.append({});
+ roomTimelineView.forceLayout();
+ }
+ roomTimelineView.positionViewAtEnd();
+ verify(action.enabled);
+ action.triggered();
+ verify(!action.enabled);
+ verify(roomTimelineView.atYEnd);
}
}
}

File Metadata

Mime Type
text/plain
Expires
Mon, Jun 23, 5:35 AM (16 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234702
Default Alt Text
D219.1750682137.diff (6 KB)

Event Timeline