Warning, /plasma-mobile/qmlkonsole/src/contents/ui/TerminalKeyToolBar.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2019-2020 Jonah Brüchert <jbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2021 Devin Lin <espidev@gmail.com>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005
0006 import QtQuick 2.15
0007 import QtQuick.Layouts 1.1
0008 import QtQuick.Controls 2.15
0009
0010 import QMLTermWidget 1.0
0011 import org.kde.kirigami 2.7 as Kirigami
0012
0013 import org.kde.qmlkonsole 1.0
0014
0015 ToolBar {
0016 id: root
0017
0018 property var terminal
0019
0020 height: visible ? implicitHeight : 0
0021
0022 function pressKeyWithModifier(key, modifier) {
0023 terminal.pressKey(key, modifier, true);
0024 modifierHolder.forceActiveFocus();
0025 }
0026
0027 function pressModifierButton(modifier) {
0028 modifierHolder.text = "";
0029 modifierHolder.forceActiveFocus();
0030 }
0031
0032 function pressKey(key, keyString) {
0033 if (ctrlButton.checked) {
0034 pressKeyWithModifier(key, Qt.ControlModifier);
0035 } else if (altButton.checked) {
0036 pressKeyWithModifier(key, Qt.AltModifier);
0037 } else {
0038 terminal.pressKey(key, 0, true, 0, keyString);
0039 }
0040 }
0041
0042 contentItem: RowLayout {
0043 spacing: Kirigami.Units.smallSpacing
0044
0045 // HACK: in order to add ctrl and alt button functionality, we have the keyboard enter the character into this invisible
0046 // textfield, and then once a character is entered, send it to the terminal as a keypress.
0047 TextField {
0048 id: modifierHolder
0049 visible: false
0050 inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase
0051
0052 onTextChanged: {
0053 if (text.length == 1) {
0054 root.pressKey(Util.getKeyFromString(text), text);
0055 }
0056 text = "";
0057 }
0058 }
0059
0060 // modifier buttons row
0061 ScrollView {
0062 Layout.fillWidth: true
0063 clip: true
0064
0065 RowLayout {
0066 property real delegateWidth: root.width
0067
0068 TerminalKeyButton {
0069 id: ctrlButton
0070 Layout.preferredWidth: Math.max(implicitWidth + Kirigami.Units.smallSpacing * 2, Math.round(Kirigami.Units.gridUnit * 2))
0071 Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0072 text: i18nc("Control Key (should match the key on the keyboard of the locale)", "Ctrl")
0073 checkable: true
0074
0075 onClicked: {
0076 if (checked) {
0077 altButton.checked = false;
0078 root.pressModifierButton(Qt.ControlModifier);
0079 } else {
0080 terminal.forceActiveFocus();
0081 }
0082 Qt.inputMethod.show();
0083 }
0084 }
0085
0086 TerminalKeyButton {
0087 id: altButton
0088 Layout.preferredWidth: Math.max(implicitWidth + Kirigami.Units.smallSpacing * 2, Math.round(Kirigami.Units.gridUnit * 1.75))
0089 Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0090 text: i18nc("Alt Key (should match the key on the keyboard of the locale)", "Alt")
0091 checkable: true
0092
0093 onClicked: {
0094 if (checked) {
0095 ctrlButton.checked = false;
0096 root.pressModifierButton(Qt.AltModifier);
0097 } else {
0098 terminal.forceActiveFocus();
0099 }
0100 Qt.inputMethod.show();
0101 }
0102 }
0103
0104 TerminalKeyButton {
0105 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0106 text: i18nc("Escape key (should match the key on the keyboard of the locale)", "Esc")
0107 onClicked: {
0108 terminal.pressKey(Qt.Key_Escape, 0, true)
0109 }
0110 }
0111 TerminalKeyButton {
0112 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0113 text: i18nc("Tab character key (should match the key on the keyboard of the locale)", "Tab")
0114 onClicked: terminal.pressKey(Qt.Key_Tab, 0, true, 0, "")
0115 }
0116
0117 TerminalKeyButton {
0118 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0119 text: "↑"
0120 onClicked: root.pressKey(Qt.Key_Up, "")
0121 autoRepeat: true
0122 }
0123 TerminalKeyButton {
0124 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0125 text: "↓"
0126 onClicked: root.pressKey(Qt.Key_Down, "")
0127 autoRepeat: true
0128 }
0129 TerminalKeyButton {
0130 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0131 text: "←"
0132 onClicked: root.pressKey(Qt.Key_Left, "")
0133 autoRepeat: true
0134 }
0135 TerminalKeyButton {
0136 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0137 text: "→"
0138 onClicked: root.pressKey(Qt.Key_Right, "")
0139 autoRepeat: true
0140 }
0141
0142 TerminalKeyButton {
0143 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0144 text: "|"
0145 onClicked: root.pressKey(Qt.Key_Bar, "|")
0146 }
0147 TerminalKeyButton {
0148 Layout.preferredWidth: Kirigami.Units.gridUnit * 2
0149 text: "~"
0150 onClicked: root.pressKey(Qt.Key_AsciiTilde, "~")
0151 }
0152 }
0153 }
0154
0155 Kirigami.Separator { Layout.fillHeight: true }
0156
0157 // control vkbd visibility
0158 ToolButton {
0159 Layout.preferredWidth: height
0160 Layout.preferredHeight: Kirigami.Units.gridUnit * 2
0161 icon.name: "input-keyboard-virtual"
0162 text: i18n("Toggle Virtual Keyboard")
0163 display: AbstractButton.IconOnly
0164 onClicked: {
0165 if (Qt.inputMethod.visible) {
0166 Qt.inputMethod.hide();
0167 } else {
0168 terminal.forceActiveFocus();
0169 Qt.inputMethod.show();
0170 }
0171 }
0172 }
0173 }
0174 }