Add keys to jump to latest/oldest unread (#214)
* Key to jump to latest/oldest unread #186 Latest/oldest unread/highlight. Default bindings match the bindings for previous/next unread/highlight. Allows the user to read messages in the order of receiving them. Or the opposite order, to stay on top of things. * Clean up code Use let instead of var, and proper indentation * Fix case for some variables in RoomList.qml Some variables were using snake_case instead of camelCase like usually done in QML code (note that the model items come from python) Co-authored-by: miruka <miruka@disroot.org>
This commit is contained in:
parent
888b8b32c1
commit
884d22938b
|
@ -357,6 +357,10 @@ class Keys:
|
||||||
previous_unread = ["Alt+Shift+U"]
|
previous_unread = ["Alt+Shift+U"]
|
||||||
next_unread = ["Alt+U"]
|
next_unread = ["Alt+U"]
|
||||||
|
|
||||||
|
# Switch to the room with the oldest/latest unread message.
|
||||||
|
oldest_unread = ["Ctrl+Shift+U"]
|
||||||
|
latest_unread = ["Ctrl+U"]
|
||||||
|
|
||||||
# Switch to the previous/next room with highlighted messages in the
|
# Switch to the previous/next room with highlighted messages in the
|
||||||
# list. What causes a highlight is controlled by push rules
|
# list. What causes a highlight is controlled by push rules
|
||||||
# (editable in GUI account settings): by default, this includes
|
# (editable in GUI account settings): by default, this includes
|
||||||
|
@ -364,6 +368,11 @@ class Keys:
|
||||||
previous_highlight = ["Alt+Shift+M"]
|
previous_highlight = ["Alt+Shift+M"]
|
||||||
next_highlight = ["Alt+M"]
|
next_highlight = ["Alt+M"]
|
||||||
|
|
||||||
|
# Switch to the room with the oldest/latest unread message,
|
||||||
|
# but only rooms with highlights are considered.
|
||||||
|
oldest_highlight = ["Ctrl+Shift+M"]
|
||||||
|
latest_highlight = ["Ctrl+M"]
|
||||||
|
|
||||||
class AtIndex:
|
class AtIndex:
|
||||||
# Switch to room number X in the current account.
|
# Switch to room number X in the current account.
|
||||||
# Each property is a list of keybinds for the room number X:
|
# Each property is a list of keybinds for the room number X:
|
||||||
|
|
|
@ -104,10 +104,10 @@ HListView {
|
||||||
}
|
}
|
||||||
|
|
||||||
function cycleUnreadRooms(forward=true, highlights=false) {
|
function cycleUnreadRooms(forward=true, highlights=false) {
|
||||||
const prop = highlights ? "highlights" : "unreads"
|
const prop = highlights ? "highlights": "unreads"
|
||||||
const local_prop = highlights ? "highlights" : "local_unreads"
|
const localProp = highlights ? "highlights": "local_unreads"
|
||||||
const start = currentIndex === -1 ? 0 : currentIndex
|
const start = currentIndex === -1 ? 0: currentIndex
|
||||||
let index = start
|
let index = start
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
index += forward ? 1 : -1
|
index += forward ? 1 : -1
|
||||||
|
@ -122,13 +122,43 @@ HListView {
|
||||||
|
|
||||||
const item = model.get(index)
|
const item = model.get(index)
|
||||||
|
|
||||||
if (item.type === "Room" && (item[prop] || item[local_prop])) {
|
if (item.type === "Room" && (item[prop] || item[localProp])) {
|
||||||
currentIndex = index
|
currentIndex = index
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find latest highlight or unread. If oldest=true, find oldest instead.
|
||||||
|
function latestUnreadRoom(oldest=false, highlights=false) {
|
||||||
|
const prop = highlights ? "highlights": "unreads"
|
||||||
|
const localProp = highlights ? "highlights": "local_unreads"
|
||||||
|
|
||||||
|
// When highlights=true, we don't actually find the latest highlight,
|
||||||
|
// but instead, the latest unread among all the highlighted rooms.
|
||||||
|
|
||||||
|
let max = null
|
||||||
|
let maxEvent = null
|
||||||
|
|
||||||
|
for (let i = 0; i < model.count; i++) {
|
||||||
|
const item = model.get(i)
|
||||||
|
|
||||||
|
if (
|
||||||
|
item.type === "Room" &&
|
||||||
|
(item[prop] || item[localProp]) &&
|
||||||
|
(max === null || item.last_event_date < maxEvent === oldest)
|
||||||
|
) {
|
||||||
|
max = i
|
||||||
|
maxEvent = item.last_event_date
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max === null) return false // No unreads found
|
||||||
|
|
||||||
|
currentIndex = max
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
function startCorrectItemSearch() {
|
function startCorrectItemSearch() {
|
||||||
correctTimer.start()
|
correctTimer.start()
|
||||||
}
|
}
|
||||||
|
@ -285,6 +315,26 @@ HListView {
|
||||||
onActivated: cycleUnreadRooms(true, true) && showItemLimiter.restart()
|
onActivated: cycleUnreadRooms(true, true) && showItemLimiter.restart()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.Keys.Rooms.latest_unread
|
||||||
|
onActivated: latestUnreadRoom(false) && showItemLimiter.restart()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.Keys.Rooms.oldest_unread
|
||||||
|
onActivated: latestUnreadRoom(true) && showItemLimiter.restart()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.Keys.Rooms.latest_highlight
|
||||||
|
onActivated: latestUnreadRoom(false, true) && showItemLimiter.restart()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.Keys.Rooms.oldest_highlight
|
||||||
|
onActivated: latestUnreadRoom(true, true) && showItemLimiter.restart()
|
||||||
|
}
|
||||||
|
|
||||||
Instantiator {
|
Instantiator {
|
||||||
model: Object.keys(window.settings.Keys.Accounts.AtIndex)
|
model: Object.keys(window.settings.Keys.Accounts.AtIndex)
|
||||||
delegate: Loader {
|
delegate: Loader {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user