Refactor global shortcuts, simplify debug consoles
- Move out all shortcuts from their central file to the component they actually belong to - Get rid of DebugConsoleLoader and the multiple consoles handling mess, have only one global console
This commit is contained in:
parent
af2d5f8cba
commit
1038678a2f
5
TODO.md
5
TODO.md
|
@ -2,9 +2,6 @@
|
||||||
|
|
||||||
## Refactoring
|
## Refactoring
|
||||||
|
|
||||||
- Put keybindings in the components they belong to instead of shoving them
|
|
||||||
all in one central file
|
|
||||||
|
|
||||||
- Rewrite account settings using `HTabbedContainer`
|
- Rewrite account settings using `HTabbedContainer`
|
||||||
- Get rid of all `currentSpacing` stuff
|
- Get rid of all `currentSpacing` stuff
|
||||||
- Use new default/reset controls system
|
- Use new default/reset controls system
|
||||||
|
@ -13,8 +10,6 @@
|
||||||
- Split `HScrollableTextArea` into `HTextArea` and `HScrollView` components
|
- Split `HScrollableTextArea` into `HTextArea` and `HScrollView` components
|
||||||
- Refactor `Composer`
|
- Refactor `Composer`
|
||||||
|
|
||||||
- Make sure we don't store any state in delegates
|
|
||||||
|
|
||||||
- Drop the `HBox` `buttonModel`/`buttonCallbacks` `HBox` approach,
|
- Drop the `HBox` `buttonModel`/`buttonCallbacks` `HBox` approach,
|
||||||
be more declarative
|
be more declarative
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
|
|
||||||
HPage {
|
HPage {
|
||||||
focusTarget: column
|
|
||||||
|
|
||||||
|
|
||||||
default property alias columnData: column.data
|
default property alias columnData: column.data
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
|
import "../ShortcutBundles"
|
||||||
|
|
||||||
HPage {
|
HPage {
|
||||||
focusTarget: column
|
|
||||||
|
|
||||||
|
|
||||||
property alias flickable: flickable
|
property alias flickable: flickable
|
||||||
default property alias columnData: column.data
|
default property alias columnData: column.data
|
||||||
|
|
||||||
|
@ -17,6 +15,10 @@ HPage {
|
||||||
contentWidth: parent.width
|
contentWidth: parent.width
|
||||||
contentHeight: column.childrenRect.height
|
contentHeight: column.childrenRect.height
|
||||||
|
|
||||||
|
FlickShortcuts {
|
||||||
|
flickable: flickable
|
||||||
|
}
|
||||||
|
|
||||||
HColumnLayout {
|
HColumnLayout {
|
||||||
id: column
|
id: column
|
||||||
width: flickable.width
|
width: flickable.width
|
||||||
|
|
|
@ -8,16 +8,10 @@ Page {
|
||||||
rightPadding: leftPadding
|
rightPadding: leftPadding
|
||||||
background: null
|
background: null
|
||||||
|
|
||||||
Component.onCompleted:
|
|
||||||
if (becomeKeyboardFlickableTarget) shortcuts.flickTarget = focusTarget
|
|
||||||
|
|
||||||
|
|
||||||
property int currentSpacing:
|
property int currentSpacing:
|
||||||
Math.min(theme.spacing * width / 400, theme.spacing)
|
Math.min(theme.spacing * width / 400, theme.spacing)
|
||||||
|
|
||||||
property Item focusTarget: this
|
|
||||||
property bool becomeKeyboardFlickableTarget: true
|
|
||||||
|
|
||||||
|
|
||||||
Behavior on leftPadding { HNumberAnimation {} }
|
Behavior on leftPadding { HNumberAnimation {} }
|
||||||
}
|
}
|
||||||
|
|
7
src/gui/Base/HQtObject.qml
Normal file
7
src/gui/Base/HQtObject.qml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick 2.12
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
default property list<QtObject> data
|
||||||
|
}
|
|
@ -2,10 +2,12 @@
|
||||||
|
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
import "../ShortcutBundles"
|
||||||
|
|
||||||
SwipeView {
|
SwipeView {
|
||||||
|
id: swipeView
|
||||||
|
|
||||||
Component.onCompleted: if (! changed) {
|
Component.onCompleted: if (! changed) {
|
||||||
if (becomeKeyboardTabsTarget) shortcuts.tabsTarget = this
|
|
||||||
setCurrentIndex(window.getState(this, "currentIndex", defaultIndex))
|
setCurrentIndex(window.getState(this, "currentIndex", defaultIndex))
|
||||||
saveEnabled = true
|
saveEnabled = true
|
||||||
}
|
}
|
||||||
|
@ -20,10 +22,14 @@ SwipeView {
|
||||||
// Prevent onCurrentIndexChanged from running before Component.onCompleted
|
// Prevent onCurrentIndexChanged from running before Component.onCompleted
|
||||||
property bool saveEnabled: false
|
property bool saveEnabled: false
|
||||||
|
|
||||||
property bool becomeKeyboardTabsTarget: true
|
|
||||||
property int defaultIndex: 0
|
property int defaultIndex: 0
|
||||||
property bool changed: currentIndex !== defaultIndex
|
property bool changed: currentIndex !== defaultIndex
|
||||||
|
|
||||||
|
|
||||||
function reset() { setCurrentIndex(defaultIndex) }
|
function reset() { setCurrentIndex(defaultIndex) }
|
||||||
|
|
||||||
|
|
||||||
|
TabShortcuts {
|
||||||
|
container: swipeView
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
import QtQuick 2.12
|
import QtQuick 2.12
|
||||||
import QtQuick.Controls 2.12
|
import QtQuick.Controls 2.12
|
||||||
|
import "../ShortcutBundles"
|
||||||
|
|
||||||
TabBar {
|
TabBar {
|
||||||
|
id: tabBar
|
||||||
spacing: 0
|
spacing: 0
|
||||||
position: TabBar.Header
|
position: TabBar.Header
|
||||||
|
|
||||||
|
@ -15,4 +17,9 @@ TabBar {
|
||||||
color: theme.controls.tab.bottomLine
|
color: theme.controls.tab.bottomLine
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TabShortcuts {
|
||||||
|
container: tabBar
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ HColumnLayout {
|
||||||
|
|
||||||
HTabBar {
|
HTabBar {
|
||||||
id: tabBar
|
id: tabBar
|
||||||
Component.onCompleted: shortcuts.tabsTarget = this
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
|
|
@ -17,41 +17,7 @@ HDrawer {
|
||||||
z: 9999
|
z: 9999
|
||||||
position: 0
|
position: 0
|
||||||
|
|
||||||
property Item previouslyFocused: null
|
onTargetChanged: {
|
||||||
|
|
||||||
property QtObject target: null
|
|
||||||
property alias t: debugConsole.target
|
|
||||||
|
|
||||||
property var history: window.history.console
|
|
||||||
property alias his: debugConsole.history
|
|
||||||
property int historyEntry: -1
|
|
||||||
property int maxHistoryLength: 4096
|
|
||||||
|
|
||||||
property string help: qsTr(
|
|
||||||
`Javascript debugging console
|
|
||||||
|
|
||||||
Useful variables:
|
|
||||||
window, theme, settings, shortcuts, utils, mainUI, pageLoader
|
|
||||||
py Python interpreter
|
|
||||||
this The console itself
|
|
||||||
t Target item to debug for which this console was opened
|
|
||||||
his History, list of commands entered
|
|
||||||
|
|
||||||
Special commands:
|
|
||||||
.j OBJECT, .json OBJECT Print OBJECT as human-readable JSON
|
|
||||||
|
|
||||||
.t, .top Attach the console to the parent window's top
|
|
||||||
.b, .bottom Attach the console to the parent window's bottom
|
|
||||||
.l, .left Attach the console to the parent window's left
|
|
||||||
.r, .right Attach the console to the parent window's right
|
|
||||||
.h, .help Show this help`.replace(/^ {8}/gm, "")
|
|
||||||
)
|
|
||||||
|
|
||||||
readonly property alias commandsView: commandsView
|
|
||||||
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
position = 1
|
|
||||||
commandsView.model.insert(0, {
|
commandsView.model.insert(0, {
|
||||||
input: "t = " + String(target),
|
input: "t = " + String(target),
|
||||||
output: "",
|
output: "",
|
||||||
|
@ -73,8 +39,41 @@ HDrawer {
|
||||||
historyEntry === -1 ? "" : history.slice(-historyEntry - 1)[0]
|
historyEntry === -1 ? "" : history.slice(-historyEntry - 1)[0]
|
||||||
|
|
||||||
|
|
||||||
function runJS(input) {
|
property Item previouslyFocused: null
|
||||||
if (history.slice(-1)[0] !== input) {
|
|
||||||
|
property QtObject target: null
|
||||||
|
property alias t: debugConsole.target
|
||||||
|
|
||||||
|
property var history: window.history.console
|
||||||
|
property alias his: debugConsole.history
|
||||||
|
property int historyEntry: -1
|
||||||
|
property int maxHistoryLength: 4096
|
||||||
|
|
||||||
|
property string help: qsTr(
|
||||||
|
`Javascript debugging console
|
||||||
|
|
||||||
|
Useful variables:
|
||||||
|
window, theme, settings, utils, mainUI, pageLoader
|
||||||
|
py Python interpreter
|
||||||
|
this The console itself
|
||||||
|
t Target item to debug for which this console was opened
|
||||||
|
his History, list of commands entered
|
||||||
|
|
||||||
|
Special commands:
|
||||||
|
.j OBJECT, .json OBJECT Print OBJECT as human-readable JSON
|
||||||
|
|
||||||
|
.t, .top Attach the console to the parent window's top
|
||||||
|
.b, .bottom Attach the console to the parent window's bottom
|
||||||
|
.l, .left Attach the console to the parent window's left
|
||||||
|
.r, .right Attach the console to the parent window's right
|
||||||
|
.h, .help Show this help`.replace(/^ {8}/gm, "")
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly property alias commandsView: commandsView
|
||||||
|
|
||||||
|
|
||||||
|
function runJS(input, addToHistory=true) {
|
||||||
|
if (addToHistory && history.slice(-1)[0] !== input) {
|
||||||
history.push(input)
|
history.push(input)
|
||||||
while (history.length > maxHistoryLength) history.shift()
|
while (history.length > maxHistoryLength) history.shift()
|
||||||
window.historyChanged()
|
window.historyChanged()
|
||||||
|
@ -117,11 +116,14 @@ HDrawer {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: settings.keys.toggleDebugConsole
|
||||||
|
onActivated: debugConsole.visible = ! debugConsole.visible
|
||||||
|
}
|
||||||
|
|
||||||
HColumnLayout {
|
HColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
Keys.onEscapePressed: debugConsole.visible = false
|
|
||||||
|
|
||||||
HListView {
|
HListView {
|
||||||
id: commandsView
|
id: commandsView
|
||||||
spacing: theme.spacing
|
spacing: theme.spacing
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
import QtQuick 2.12
|
|
||||||
import "Base"
|
|
||||||
|
|
||||||
HLoader {
|
|
||||||
id: loader
|
|
||||||
|
|
||||||
onLoaded: {
|
|
||||||
if (! isDefault)
|
|
||||||
shortcuts.defaultDebugConsoleLoader.active = false
|
|
||||||
|
|
||||||
if (shortcuts.debugConsoleLoader)
|
|
||||||
shortcuts.debugConsoleLoader.active = false
|
|
||||||
|
|
||||||
shortcuts.debugConsoleLoader = this
|
|
||||||
}
|
|
||||||
|
|
||||||
onActiveChanged: if (! active) shortcuts.debugConsoleLoader = null
|
|
||||||
|
|
||||||
Component.onDestruction: shortcuts.debugConsoleLoader = null
|
|
||||||
|
|
||||||
sourceComponent: DebugConsole {
|
|
||||||
target: loader.target
|
|
||||||
|
|
||||||
property HLoader parentLoader: loader
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
property QtObject target: parent
|
|
||||||
|
|
||||||
readonly property bool isDefault:
|
|
||||||
shortcuts.defaultDebugConsoleLoader &&
|
|
||||||
shortcuts.defaultDebugConsoleLoader === this
|
|
||||||
|
|
||||||
|
|
||||||
function toggle() {
|
|
||||||
if (! loader.active) {
|
|
||||||
loader.active = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
loader.item.visible = ! loader.item.visible
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,278 +0,0 @@
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
||||||
|
|
||||||
import QtQuick 2.12
|
|
||||||
import QtQuick.Controls 2.12
|
|
||||||
import Clipboard 0.1
|
|
||||||
import "Base"
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: false
|
|
||||||
|
|
||||||
// Flickable or ListView that should be affected by scroll shortcuts
|
|
||||||
property Item flickTarget
|
|
||||||
|
|
||||||
// A QQC Container that should be affected by tab navigation shortcuts
|
|
||||||
property Container tabsTarget
|
|
||||||
|
|
||||||
// DebugConsoleLoader that should be affected by console shortcuts
|
|
||||||
property DebugConsoleLoader debugConsoleLoader
|
|
||||||
|
|
||||||
// DebugConsoleLoader to activate if no other loader is active and the
|
|
||||||
// shortcut to bring up a console is pressed
|
|
||||||
property DebugConsoleLoader defaultDebugConsoleLoader
|
|
||||||
|
|
||||||
readonly property DebugConsole debugConsole:
|
|
||||||
debugConsoleLoader ? debugConsoleLoader.item : null
|
|
||||||
|
|
||||||
readonly property DebugConsole defaultDebugConsole:
|
|
||||||
defaultDebugConsoleLoader ? defaultDebugConsoleLoader.item : null
|
|
||||||
|
|
||||||
readonly property Item toFlick:
|
|
||||||
debugConsole && debugConsole.activeFocus ?
|
|
||||||
debugConsole.commandsView :
|
|
||||||
flickTarget
|
|
||||||
|
|
||||||
|
|
||||||
function toggleConsole() {
|
|
||||||
if (debugConsole) {
|
|
||||||
debugConsole.visible = ! debugConsole.visible
|
|
||||||
|
|
||||||
} else if (! defaultDebugConsoleLoader.active) {
|
|
||||||
defaultDebugConsoleLoader.active = true
|
|
||||||
|
|
||||||
} else {
|
|
||||||
defaultDebugConsole.visible = ! defaultDebugConsole.visible
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// App
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.startPythonDebugger
|
|
||||||
onActivated: py.call("BRIDGE.pdb")
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.toggleDebugConsole
|
|
||||||
onActivated: toggleConsole()
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.reloadConfig
|
|
||||||
onActivated: mainUI.reloadSettings()
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.zoomIn
|
|
||||||
onActivated: theme.uiScale += 0.1
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.zoomOut
|
|
||||||
onActivated: theme.uiScale = Math.max(0.1, theme.uiScale - 0.1)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.zoomReset
|
|
||||||
onActivated: theme.uiScale = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.toggleCompactMode
|
|
||||||
onActivated: {
|
|
||||||
settings.compactMode = ! settings.compactMode
|
|
||||||
settingsChanged()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pages
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
sequences: settings.keys.goToLastPage
|
|
||||||
onActivated: mainUI.pageLoader.showPrevious()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Page scrolling
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollUp
|
|
||||||
onActivated: utils.flickPages(toFlick, -1 / 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollDown
|
|
||||||
onActivated: utils.flickPages(toFlick, 1 / 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollPageUp
|
|
||||||
onActivated: utils.flickPages(toFlick, -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollPageDown
|
|
||||||
onActivated: utils.flickPages(toFlick, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollToTop
|
|
||||||
onActivated: utils.flickToTop(toFlick)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: toFlick
|
|
||||||
sequences: settings.keys.scrollToBottom
|
|
||||||
onActivated: utils.flickToBottom(toFlick)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Tab navigation
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: tabsTarget
|
|
||||||
sequences: settings.keys.previousTab
|
|
||||||
onActivated: tabsTarget.setCurrentIndex(
|
|
||||||
utils.numberWrapAt(tabsTarget.currentIndex - 1, tabsTarget.count),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: tabsTarget
|
|
||||||
sequences: settings.keys.nextTab
|
|
||||||
onActivated: tabsTarget.setCurrentIndex(
|
|
||||||
utils.numberWrapAt(tabsTarget.currentIndex + 1, tabsTarget.count),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MainPane
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.toggleFocusMainPane
|
|
||||||
onActivated: mainUI.mainPane.toggleFocus()
|
|
||||||
context: Qt.ApplicationShortcut
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.clearRoomFilter
|
|
||||||
onActivated: mainUI.mainPane.bottomBar.roomFilter = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.addNewAccount
|
|
||||||
onActivated: mainUI.mainPane.bottomBar.addAccountButton.clicked()
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.addNewChat
|
|
||||||
onActivated: mainUI.mainPane.mainPaneList.addNewChat()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.accountSettings
|
|
||||||
onActivated: mainUI.mainPane.mainPaneList.accountSettings()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.toggleCollapseAccount
|
|
||||||
onActivated: mainUI.mainPane.mainPaneList.toggleCollapseAccount()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.goToPreviousRoom
|
|
||||||
onActivated: {
|
|
||||||
mainUI.mainPane.mainPaneList.previous()
|
|
||||||
mainUI.mainPane.mainPaneList.requestActivate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequences: settings.keys.goToNextRoom
|
|
||||||
onActivated: {
|
|
||||||
mainUI.mainPane.mainPaneList.next()
|
|
||||||
mainUI.mainPane.mainPaneList.requestActivate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: Object.keys(settings.keys.focusRoomAtIndex)
|
|
||||||
|
|
||||||
Item {
|
|
||||||
HShortcut {
|
|
||||||
enabled: mainUI.accountsPresent
|
|
||||||
sequence: settings.keys.focusRoomAtIndex[modelData]
|
|
||||||
onActivated: mainUI.mainPane.mainPaneList.goToRoom(
|
|
||||||
parseInt(modelData - 1, 10),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Chat
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: window.uiState.page === "Pages/Chat/Chat.qml"
|
|
||||||
sequences: settings.keys.clearRoomMessages
|
|
||||||
onActivated: utils.makePopup(
|
|
||||||
"Popups/ClearMessagesPopup.qml",
|
|
||||||
mainUI,
|
|
||||||
{
|
|
||||||
userId: window.uiState.pageProperties.userId,
|
|
||||||
roomId: window.uiState.pageProperties.roomId,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: window.uiState.page === "Pages/Chat/Chat.qml"
|
|
||||||
sequences: settings.keys.sendFile
|
|
||||||
onActivated: utils.makeObject(
|
|
||||||
"Dialogs/SendFilePicker.qml",
|
|
||||||
mainUI,
|
|
||||||
{
|
|
||||||
userId: window.uiState.pageProperties.userId,
|
|
||||||
roomId: window.uiState.pageProperties.roomId,
|
|
||||||
destroyWhenDone: true,
|
|
||||||
},
|
|
||||||
picker => { picker.dialog.open() }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: window.uiState.page === "Pages/Chat/Chat.qml"
|
|
||||||
sequences: settings.keys.sendFileFromPathInClipboard
|
|
||||||
onActivated: utils.sendFile(
|
|
||||||
window.uiState.pageProperties.userId,
|
|
||||||
window.uiState.pageProperties.roomId,
|
|
||||||
Clipboard.text.trim(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// RoomPane
|
|
||||||
|
|
||||||
HShortcut {
|
|
||||||
enabled: window.uiState.page === "Pages/Chat/Chat.qml"
|
|
||||||
sequences: settings.keys.toggleFocusRoomPane
|
|
||||||
onActivated: mainUI.pageLoader.item.roomPane.toggleFocus()
|
|
||||||
context: Qt.ApplicationShortcut
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -184,6 +184,8 @@ HListView {
|
||||||
|
|
||||||
function goToRoom(index) {
|
function goToRoom(index) {
|
||||||
if (! currentItem) next()
|
if (! currentItem) next()
|
||||||
|
if (! currentItem) return
|
||||||
|
|
||||||
const room = currentItem.roomList.contentItem.children[index]
|
const room = currentItem.roomList.contentItem.children[index]
|
||||||
if (room && room.activated) room.activated()
|
if (room && room.activated) room.activated()
|
||||||
}
|
}
|
||||||
|
@ -194,6 +196,7 @@ HListView {
|
||||||
|
|
||||||
function activate() {
|
function activate() {
|
||||||
if (! currentItem) next()
|
if (! currentItem) next()
|
||||||
|
if (! currentItem) return
|
||||||
|
|
||||||
selectedRoom ?
|
selectedRoom ?
|
||||||
currentItem.roomList.currentItem.activated() :
|
currentItem.roomList.currentItem.activated() :
|
||||||
|
@ -204,6 +207,7 @@ HListView {
|
||||||
|
|
||||||
function accountSettings() {
|
function accountSettings() {
|
||||||
if (! currentItem) next()
|
if (! currentItem) next()
|
||||||
|
if (! currentItem) return
|
||||||
currentItem.account.activated()
|
currentItem.account.activated()
|
||||||
|
|
||||||
detachedCurrentIndex = false
|
detachedCurrentIndex = false
|
||||||
|
@ -211,6 +215,7 @@ HListView {
|
||||||
|
|
||||||
function addNewChat() {
|
function addNewChat() {
|
||||||
if (! currentItem) next()
|
if (! currentItem) next()
|
||||||
|
if (! currentItem) return
|
||||||
currentItem.account.addChat.clicked()
|
currentItem.account.addChat.clicked()
|
||||||
|
|
||||||
detachedCurrentIndex = false
|
detachedCurrentIndex = false
|
||||||
|
@ -237,6 +242,42 @@ HListView {
|
||||||
when: ! detachedCurrentIndex
|
when: ! detachedCurrentIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.addNewChat
|
||||||
|
onActivated: addNewChat()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.accountSettings
|
||||||
|
onActivated: accountSettings()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.toggleCollapseAccount
|
||||||
|
onActivated: toggleCollapseAccount()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.goToPreviousRoom
|
||||||
|
onActivated: { previous(); requestActivate() }
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.goToNextRoom
|
||||||
|
onActivated: { next(); requestActivate() }
|
||||||
|
}
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: Object.keys(window.settings.keys.focusRoomAtIndex)
|
||||||
|
|
||||||
|
Item {
|
||||||
|
HShortcut {
|
||||||
|
sequence: window.settings.keys.focusRoomAtIndex[modelData]
|
||||||
|
onActivated: goToRoom(parseInt(modelData - 1, 10))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
id: activateLimiter
|
id: activateLimiter
|
||||||
interval: 200
|
interval: 200
|
||||||
|
|
|
@ -27,6 +27,11 @@ Rectangle {
|
||||||
onClicked: pageLoader.showPage("AddAccount/AddAccount")
|
onClicked: pageLoader.showPage("AddAccount/AddAccount")
|
||||||
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.addNewAccount
|
||||||
|
onActivated: addAccountButton.clicked()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HTextField {
|
HTextField {
|
||||||
|
@ -65,6 +70,11 @@ Rectangle {
|
||||||
}
|
}
|
||||||
|
|
||||||
Behavior on opacity { HNumberAnimation {} }
|
Behavior on opacity { HNumberAnimation {} }
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.clearRoomFilter
|
||||||
|
onActivated: filterField.text = ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,12 @@ HDrawer {
|
||||||
when: ! mainUI.accountsPresent
|
when: ! mainUI.accountsPresent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
enabled: mainUI.accountsPresent
|
||||||
|
sequences: window.settings.keys.toggleFocusMainPane
|
||||||
|
onActivated: toggleFocus()
|
||||||
|
}
|
||||||
|
|
||||||
HColumnLayout {
|
HColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
|
|
@ -95,4 +95,9 @@ HLoader {
|
||||||
easing.type: Easing.OutBack
|
easing.type: Easing.OutBack
|
||||||
duration: theme.animationDuration * 1.5
|
duration: theme.animationDuration * 1.5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.goToLastPage
|
||||||
|
onActivated: showPrevious()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,6 @@ HColumnPage {
|
||||||
leftPadding: 0
|
leftPadding: 0
|
||||||
rightPadding: 0
|
rightPadding: 0
|
||||||
|
|
||||||
// The target will be our EventList, not the page itself
|
|
||||||
becomeKeyboardFlickableTarget: false
|
|
||||||
|
|
||||||
onLoadEventListChanged: if (loadEventList) loadedOnce = true
|
onLoadEventListChanged: if (loadEventList) loadedOnce = true
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -243,10 +243,22 @@ Rectangle {
|
||||||
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.sendFileFromPathInClipboard
|
||||||
|
onActivated: utils.sendFile(
|
||||||
|
chat.userId, chat.roomId, Clipboard.text.trim(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
SendFilePicker {
|
SendFilePicker {
|
||||||
id: sendFilePicker
|
id: sendFilePicker
|
||||||
userId: chat.userId
|
userId: chat.userId
|
||||||
roomId: chat.roomId
|
roomId: chat.roomId
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.sendFile
|
||||||
|
onActivated: sendFilePicker.dialog.open()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,4 +77,9 @@ MultiviewPane {
|
||||||
|
|
||||||
MemberView {}
|
MemberView {}
|
||||||
SettingsView { fillAvailableHeight: true }
|
SettingsView { fillAvailableHeight: true }
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.toggleFocusRoomPane
|
||||||
|
onActivated: toggleFocus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,17 +65,9 @@ HRowLayout {
|
||||||
// ~600px max with a 16px font
|
// ~600px max with a 16px font
|
||||||
readonly property int maxMessageWidth: theme.fontSize.normal * 0.5 * 75
|
readonly property int maxMessageWidth: theme.fontSize.normal * 0.5 * 75
|
||||||
|
|
||||||
readonly property alias debugConsoleLoader: debugConsoleLoader
|
|
||||||
|
|
||||||
readonly property alias selectedText: contentLabel.selectedText
|
readonly property alias selectedText: contentLabel.selectedText
|
||||||
|
|
||||||
|
|
||||||
DebugConsoleLoader {
|
|
||||||
id: debugConsoleLoader
|
|
||||||
active: false
|
|
||||||
onLoaded: item.runJS("json()")
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: avatarWrapper
|
id: avatarWrapper
|
||||||
opacity: collapseAvatar ? 0 : 1
|
opacity: collapseAvatar ? 0 : 1
|
||||||
|
|
|
@ -221,7 +221,11 @@ HColumnLayout {
|
||||||
HMenuItem {
|
HMenuItem {
|
||||||
icon.name: "debug"
|
icon.name: "debug"
|
||||||
text: qsTr("Debug this event")
|
text: qsTr("Debug this event")
|
||||||
onTriggered: eventContent.debugConsoleLoader.toggle()
|
onTriggered: {
|
||||||
|
mainUI.debugConsole.visible = true
|
||||||
|
mainUI.debugConsole.target = eventContent
|
||||||
|
mainUI.debugConsole.runJS("t.parent.json()", false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HMenuItemPopupSpawner {
|
HMenuItemPopupSpawner {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import QtQuick.Window 2.12
|
||||||
import Clipboard 0.1
|
import Clipboard 0.1
|
||||||
import "../../.."
|
import "../../.."
|
||||||
import "../../../Base"
|
import "../../../Base"
|
||||||
|
import "../../../ShortcutBundles"
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
color: theme.chat.eventList.background
|
color: theme.chat.eventList.background
|
||||||
|
@ -56,6 +57,23 @@ Rectangle {
|
||||||
eventList.currentItem.eventContent.debugConsoleLoader.toggle()
|
eventList.currentItem.eventContent.debugConsoleLoader.toggle()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.clearRoomMessages
|
||||||
|
onActivated: utils.makePopup(
|
||||||
|
"Popups/ClearMessagesPopup.qml",
|
||||||
|
mainUI,
|
||||||
|
{
|
||||||
|
userId: window.uiState.pageProperties.userId,
|
||||||
|
roomId: window.uiState.pageProperties.roomId,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
FlickShortcuts {
|
||||||
|
flickable: eventList
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
HListView {
|
HListView {
|
||||||
id: eventList
|
id: eventList
|
||||||
clip: true
|
clip: true
|
||||||
|
@ -109,8 +127,6 @@ Rectangle {
|
||||||
// fetch past events.
|
// fetch past events.
|
||||||
onInviterChanged: canLoad = true
|
onInviterChanged: canLoad = true
|
||||||
|
|
||||||
Component.onCompleted: shortcuts.flickTarget = eventList
|
|
||||||
|
|
||||||
|
|
||||||
property string inviter: chat.roomInfo.inviter || ""
|
property string inviter: chat.roomInfo.inviter || ""
|
||||||
property real yPos: visibleArea.yPosition
|
property real yPos: visibleArea.yPosition
|
||||||
|
|
39
src/gui/ShortcutBundles/FlickShortcuts.qml
Normal file
39
src/gui/ShortcutBundles/FlickShortcuts.qml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick 2.12
|
||||||
|
import "../Base"
|
||||||
|
|
||||||
|
HQtObject {
|
||||||
|
property Item flickable: parent
|
||||||
|
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollUp
|
||||||
|
onActivated: utils.flickPages(flickable, -1 / 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollDown
|
||||||
|
onActivated: utils.flickPages(flickable, 1 / 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollPageUp
|
||||||
|
onActivated: utils.flickPages(flickable, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollPageDown
|
||||||
|
onActivated: utils.flickPages(flickable, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollToTop
|
||||||
|
onActivated: utils.flickToTop(flickable)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.scrollToBottom
|
||||||
|
onActivated: utils.flickToBottom(flickable)
|
||||||
|
}
|
||||||
|
}
|
23
src/gui/ShortcutBundles/TabShortcuts.qml
Normal file
23
src/gui/ShortcutBundles/TabShortcuts.qml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick 2.12
|
||||||
|
import "../Base"
|
||||||
|
|
||||||
|
HQtObject {
|
||||||
|
property Item container: parent
|
||||||
|
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.previousTab
|
||||||
|
onActivated: container.setCurrentIndex(
|
||||||
|
utils.numberWrapAt(container.currentIndex - 1, container.count),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.nextTab
|
||||||
|
onActivated: container.setCurrentIndex(
|
||||||
|
utils.numberWrapAt(container.currentIndex + 1, container.count),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,7 +18,7 @@ Item {
|
||||||
property bool accountsPresent:
|
property bool accountsPresent:
|
||||||
ModelStore.get("accounts").count > 0 || py.startupAnyAccountsSaved
|
ModelStore.get("accounts").count > 0 || py.startupAnyAccountsSaved
|
||||||
|
|
||||||
readonly property alias shortcuts: shortcuts
|
readonly property alias debugConsole: debugConsole
|
||||||
readonly property alias mainPane: mainPane
|
readonly property alias mainPane: mainPane
|
||||||
readonly property alias pageLoader: pageLoader
|
readonly property alias pageLoader: pageLoader
|
||||||
readonly property alias pressAnimation: pressAnimation
|
readonly property alias pressAnimation: pressAnimation
|
||||||
|
@ -39,14 +39,43 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalShortcuts {
|
HShortcut {
|
||||||
id: shortcuts
|
sequences: window.settings.keys.startPythonDebugger
|
||||||
defaultDebugConsoleLoader: debugConsoleLoader
|
onActivated: py.call("BRIDGE.pdb")
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugConsoleLoader {
|
HShortcut {
|
||||||
id: debugConsoleLoader
|
sequences: window.settings.keys.reloadConfig
|
||||||
active: false
|
onActivated: reloadSettings()
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.zoomIn
|
||||||
|
onActivated: theme.uiScale += 0.1
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.zoomOut
|
||||||
|
onActivated: theme.uiScale = Math.max(0.1, theme.uiScale - 0.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.zoomReset
|
||||||
|
onActivated: theme.uiScale = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
HShortcut {
|
||||||
|
sequences: window.settings.keys.toggleCompactMode
|
||||||
|
onActivated: {
|
||||||
|
settings.compactMode = ! settings.compactMode
|
||||||
|
settingsChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugConsole {
|
||||||
|
id: debugConsole
|
||||||
|
target: mainUI
|
||||||
|
visible: false
|
||||||
}
|
}
|
||||||
|
|
||||||
LinearGradient {
|
LinearGradient {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user