diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index bf336dfb..202c3e3d 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -22,6 +22,8 @@ Item {
property int availableWidth: width
+ property string searchString: ""
+
ScrollBar {
id: scrollbar
parent: chat.parent
@@ -43,9 +45,10 @@ Item {
id: filteredTimeline
source: room
filterByThread: room ? room.thread : ""
+ filterByContent: chatRoot.searchString
}
- model: filteredTimeline.filterByThread ? filteredTimeline : room
+ model: (filteredTimeline.filterByThread || filteredTimeline.filterByContent) ? filteredTimeline : room
// reuseItems still has a few bugs, see https://bugreports.qt.io/browse/QTBUG-95105 https://bugreports.qt.io/browse/QTBUG-95107
//onModelChanged: if (room) room.sendReset()
//reuseItems: true
@@ -403,7 +406,7 @@ Item {
required property bool isEditable
required property bool isEdited
required property bool isStateEvent
- required property bool previousMessageIsStateEvent
+ property bool previousMessageIsStateEvent: chat.model.dataByIndex(index+1, Room.IsStateEvent)
required property string replyTo
required property string threadId
required property string userId
@@ -417,9 +420,9 @@ Item {
required property int status
required property int index
required property int relatedEventCacheBuster
- required property string previousMessageUserId
required property string day
- required property string previousMessageDay
+ property string previousMessageUserId: chat.model.dataByIndex(index+1, Room.UserId)
+ property string previousMessageDay: chat.model.dataByIndex(index+1, Room.Day)
required property string userName
property bool scrolledToThis: eventId === room.scrollTarget && (y + height > chat.y + chat.contentY && y < chat.y + chat.height + chat.contentY)
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 7722411e..ab1bbc28 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -66,6 +66,8 @@ Item {
spacing: 0
TopBar {
+ id: topBar
+
showBackButton: timelineView.showBackButton
}
@@ -102,6 +104,7 @@ Item {
MessageView {
implicitHeight: msgView.height - typingIndicator.height
+ searchString: topBar.searchString
Layout.fillWidth: true
}
diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index 39365cd1..716a5e10 100644
--- a/resources/qml/TopBar.qml
+++ b/resources/qml/TopBar.qml
@@ -25,6 +25,14 @@ Pane {
property bool isDirect: room ? room.isDirect : false
property string directChatOtherUserId: room ? room.directChatOtherUserId : ""
+ property string searchString: ""
+
+ onRoomIdChanged: {
+ searchString = "";
+ searchButton.searchActive = false;
+ searchField.text = ""
+ }
+
Layout.fillWidth: true
implicitHeight: topLayout.height + Nheko.paddingMedium * 2
z: 3
@@ -177,12 +185,42 @@ Pane {
text: roomTopic
}
- AbstractButton {
+ ImageButton {
+ id: pinButton
+
+ property bool pinsShown: !Settings.hiddenPins.includes(roomId)
+
+ visible: !!room && room.pinnedMessages.length > 0
Layout.column: 3
Layout.row: 1
Layout.rowSpan: 2
+ Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
+ image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
+ ToolTip.visible: hovered
+ ToolTip.text: qsTr("Show or hide pinned messages")
+ onClicked: {
+ var ps = Settings.hiddenPins;
+ if (pinsShown) {
+ ps.push(roomId);
+ } else {
+ const index = ps.indexOf(roomId);
+ if (index > -1) {
+ ps.splice(index, 1);
+ }
+ }
+ Settings.hiddenPins = ps;
+ }
+
+ }
+
+ AbstractButton {
+ Layout.column: 4
+ Layout.row: 1
+ Layout.rowSpan: 2
+ Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
+ Layout.maximumWidth: Nheko.avatarSize - Nheko.paddingMedium
contentItem: EncryptionIndicator {
sourceSize.height: parent.Layout.preferredHeight * Screen.devicePixelRatio
@@ -216,40 +254,37 @@ Pane {
}
ImageButton {
- id: pinButton
+ id: searchButton
- property bool pinsShown: !Settings.hiddenPins.includes(roomId)
+ property bool searchActive: false
- visible: !!room && room.pinnedMessages.length > 0
- Layout.column: 4
+ visible: !!room
+ Layout.column: 5
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: Nheko.avatarSize - Nheko.paddingMedium
Layout.preferredWidth: Nheko.avatarSize - Nheko.paddingMedium
- image: pinsShown ? ":/icons/icons/ui/pin.svg" : ":/icons/icons/ui/pin-off.svg"
+ image: ":/icons/icons/ui/search.svg"
ToolTip.visible: hovered
- ToolTip.text: qsTr("Show or hide pinned messages")
+ ToolTip.text: qsTr("Search this room")
onClicked: {
- var ps = Settings.hiddenPins;
- if (pinsShown) {
- ps.push(roomId);
- } else {
- const index = ps.indexOf(roomId);
- if (index > -1) {
- ps.splice(index, 1);
- }
+ searchActive = !searchActive
+ if (searchActive) {
+ searchField.forceActiveFocus();
+ }
+ else {
+ searchField.clear();
+ topBar.searchString = "";
}
- Settings.hiddenPins = ps;
}
-
}
ImageButton {
id: roomOptionsButton
visible: !!room
- Layout.column: 5
+ Layout.column: 6
Layout.row: 1
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
@@ -293,7 +328,7 @@ Pane {
Layout.row: 3
Layout.column: 2
- Layout.columnSpan: 3
+ Layout.columnSpan: 4
Layout.fillWidth: true
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 4)
@@ -374,7 +409,7 @@ Pane {
Layout.row: 4
Layout.column: 2
- Layout.columnSpan: 1
+ Layout.columnSpan: 4
Layout.fillWidth: true
Layout.preferredHeight: Math.min(contentHeight, Nheko.avatarSize * 1.5)
@@ -404,6 +439,20 @@ Pane {
}
}
}
+
+ MatrixTextField {
+ id: searchField
+ visible: searchButton.searchActive
+
+ Layout.row: 5
+ Layout.column: 2
+ Layout.columnSpan: 4
+
+ Layout.fillWidth: true
+
+ placeholderText: qsTr("Enter search query")
+ onAccepted: topBar.searchString = text
+ }
}
CursorShape {
|