Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2577333
D219.1750682137.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
6 KB
Referenced Files
None
Subscribers
None
D219.1750682137.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D219: Add a "scroll to end" button in RoomTimelineView
Attached
Detach File
Event Timeline
Log In to Comment