Add visited pages history back/forward keys (#204)
* Add keys for back and forward through history Move through history of visited rooms without altering it. Ctrl+H and Ctrl+Y by default. Deviating from history while in the middle of it causes a part of history to be discarded. * Change default history binding to Ctrl+H and Ctrl+Shift+H * Rename functions and settings `earlier_page` and `later_page` is consistent naming with `last_page` * Add option to wrap history If you press `later_page` while at index 0 (newest), you loop to the end of recorded history (oldest). If you press `earlier_page` while at at the end of history (oldest), you loop back to the top (newest). This can be disabled. * Add showNthFromHistory Grouped duplicated code into a new funcion. * Minor formatting changes * Move wrap_history setting from to General section The Keys section is purely for keybindings; this setting should also be able to control history navigation not done by keyboard such as extra mouse button bindings. * Change default bind for later_page and clear_all Ctrl+H and Ctrl+L are a more intuitive pair than Ctrl+H and Ctrl+Shift+H. Meanwhile, clear_all does not need the accessible binding Ctrl+L. Co-authored-by: miruka <miruka@disroot.org>
This commit is contained in:
		| @@ -17,6 +17,10 @@ class General: | |||||||
|     # right room pane is visible at a time. |     # right room pane is visible at a time. | ||||||
|     hide_side_panes_under: int = 450 |     hide_side_panes_under: int = 450 | ||||||
|  |  | ||||||
|  |     # Whether to wrap around or do nothing when using the earlier_page or | ||||||
|  |     # later_page keybinds and reaching the start or end of the history. | ||||||
|  |     wrap_history: bool = True | ||||||
|  |  | ||||||
|     # How many seconds the cursor must hover on buttons and other elements |     # How many seconds the cursor must hover on buttons and other elements | ||||||
|     # to show tooltips. |     # to show tooltips. | ||||||
|     tooltips_delay: float = 0.5 |     tooltips_delay: float = 0.5 | ||||||
| @@ -253,6 +257,11 @@ class Keys: | |||||||
|     # Switch to the last opened page/chat, similar to Alt+Tab on most desktops. |     # Switch to the last opened page/chat, similar to Alt+Tab on most desktops. | ||||||
|     last_page = ["Ctrl+Tab"] |     last_page = ["Ctrl+Tab"] | ||||||
|  |  | ||||||
|  |     # Go throgh history of opened chats, | ||||||
|  |     # similar to the "page back" and "page forward" keys in web browsers | ||||||
|  |     earlier_page = ["Ctrl+H"] | ||||||
|  |     later_page   = ["Ctrl+L"] | ||||||
|  |  | ||||||
|     # Toggle muting all notifications in the running client, |     # Toggle muting all notifications in the running client, | ||||||
|     # except highlights (e.g. replies or keywords) |     # except highlights (e.g. replies or keywords) | ||||||
|     notifications_highlights_only = ["Ctrl+Alt+H"] |     notifications_highlights_only = ["Ctrl+Alt+H"] | ||||||
| @@ -453,7 +462,7 @@ class Keys: | |||||||
|  |  | ||||||
|         # Clear all messages from the chat. |         # Clear all messages from the chat. | ||||||
|         # This does not remove anything for other users. |         # This does not remove anything for other users. | ||||||
|         clear_all = ["Ctrl+L"] |         clear_all = ["Ctrl+Shift+L"] | ||||||
|  |  | ||||||
|     class ImageViewer: |     class ImageViewer: | ||||||
|         # Close the image viewer. Escape can also be used. |         # Close the image viewer. Escape can also be used. | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ HLoader { | |||||||
|     // List of previously loaded [componentUrl, {properties}] |     // List of previously loaded [componentUrl, {properties}] | ||||||
|     property var history: [] |     property var history: [] | ||||||
|     property int historyLength: 20 |     property int historyLength: 20 | ||||||
|  |     property int historyPosition: 0 | ||||||
|  |  | ||||||
|     readonly property alias appearAnimation: appearAnimation |     readonly property alias appearAnimation: appearAnimation | ||||||
|  |  | ||||||
| @@ -22,9 +23,18 @@ HLoader { | |||||||
|     signal recycled() |     signal recycled() | ||||||
|     signal previousShown(string componentUrl, var properties) |     signal previousShown(string componentUrl, var properties) | ||||||
|  |  | ||||||
|     function show(componentUrl, properties={}) { |     function show(componentUrl, properties={}, alterHistory=true) { | ||||||
|         history.unshift([componentUrl, properties]) |         if (alterHistory) { | ||||||
|         if (history.length > historyLength) history.pop() |             // A new branch of history will be added. | ||||||
|  |             // The new branch replaces everything after the current point. | ||||||
|  |             while (historyPosition > 0) { | ||||||
|  |                 history.shift() | ||||||
|  |                 historyPosition-- | ||||||
|  |             } | ||||||
|  |             // Add entry to history | ||||||
|  |             history.unshift([componentUrl, properties]) | ||||||
|  |             if (history.length > historyLength) history.pop() | ||||||
|  |         } | ||||||
|  |  | ||||||
|         const recycle = |         const recycle = | ||||||
|             window.uiState.page === componentUrl && |             window.uiState.page === componentUrl && | ||||||
| @@ -51,13 +61,37 @@ HLoader { | |||||||
|         show("Pages/Chat/Chat.qml", {userRoomId: [userId, roomId]}) |         show("Pages/Chat/Chat.qml", {userRoomId: [userId, roomId]}) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     function showNthFromHistory(n, alterHistory=true) { | ||||||
|  |         const [componentUrl, properties] = history[n] | ||||||
|  |         show(componentUrl, properties, alterHistory) | ||||||
|  |         previousShown(componentUrl, properties) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     function showPrevious(timesBack=1) { |     function showPrevious(timesBack=1) { | ||||||
|         timesBack = Math.min(timesBack, history.length - 1) |         timesBack = Math.min(timesBack, history.length - 1) | ||||||
|         if (timesBack < 1) return false |         if (timesBack < 1) return false | ||||||
|  |  | ||||||
|         const [componentUrl, properties] = history[timesBack] |         showNthFromHistory(timesBack) | ||||||
|         show(componentUrl, properties) |         return true | ||||||
|         previousShown(componentUrl, properties) |     } | ||||||
|  |  | ||||||
|  |     function moveThroughHistory(relativeMovement=1) { | ||||||
|  |         if (history.length === 0) return false | ||||||
|  |  | ||||||
|  |         // Going beyond oldest entry in history | ||||||
|  |         if (historyPosition + relativeMovement >= history.length) { | ||||||
|  |             if (! window.settings.General.wrap_history) return false | ||||||
|  |             relativeMovement -= history.length | ||||||
|  |  | ||||||
|  |         // Going beyond newest entry in history | ||||||
|  |         } else if (historyPosition + relativeMovement < 0){ | ||||||
|  |             if (! window.settings.General.wrap_history) return false | ||||||
|  |             relativeMovement += history.length | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         historyPosition += relativeMovement | ||||||
|  |  | ||||||
|  |         showNthFromHistory(historyPosition, false) | ||||||
|         return true |         return true | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -94,4 +128,14 @@ HLoader { | |||||||
|         sequences: window.settings.Keys.last_page |         sequences: window.settings.Keys.last_page | ||||||
|         onActivated: showPrevious() |         onActivated: showPrevious() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     HShortcut { | ||||||
|  |         sequences: window.settings.Keys.earlier_page | ||||||
|  |         onActivated: moveThroughHistory(1) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     HShortcut { | ||||||
|  |         sequences: window.settings.Keys.later_page | ||||||
|  |         onActivated: moveThroughHistory(-1) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	