diff options
-rw-r--r-- | qml/CommandInput.qml | 63 | ||||
-rw-r--r-- | qml/EmbeddedTerminal.qml | 2 | ||||
-rw-r--r-- | qml/StateHandler.qml | 45 | ||||
-rw-r--r-- | qml/main.qml | 166 | ||||
-rw-r--r-- | qml/ui.qrc | 1 |
5 files changed, 192 insertions, 85 deletions
diff --git a/qml/CommandInput.qml b/qml/CommandInput.qml new file mode 100644 index 0000000..835ccae --- /dev/null +++ b/qml/CommandInput.qml @@ -0,0 +1,63 @@ +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import Qt.labs.settings 1.0 + +Item { + id: item + + visible: false + + Settings { + id: settings + category: "command" + + property color background : "black" + property int fontSize : 12 + property string fontFamily : "Monospace" + property color fontColor : "white" + } + + function focus() { + visible = true; + command.forceActiveFocus(); + } + + function unfocus() { + visible = false; + } + + Rectangle { + anchors.fill: parent + color: settings.background + + TextInput { + id: command + + font { + family: settings.fontFamily + pointSize: settings.fontSize + } + + color: settings.fontColor + selectionColor: settings.fontColor + selectedTextColor: settings.background + text: ":" + + selectByMouse: true + + onAccepted: { + const prefix = String(text).charAt(0); + const cmd = String(text).substring(1, String(text).length); + + switch ( prefix ) { + case ':': { + eval(cmd); + text = ':'; + break; + } + default: { } + } + } + } + } +} diff --git a/qml/EmbeddedTerminal.qml b/qml/EmbeddedTerminal.qml index 4e13131..d2cab9e 100644 --- a/qml/EmbeddedTerminal.qml +++ b/qml/EmbeddedTerminal.qml @@ -69,7 +69,7 @@ Item { } shellProgramArgs: { - var elements = (item.program).split(" "); + const elements = (item.program).split(" "); elements.shift(); return elements; diff --git a/qml/StateHandler.qml b/qml/StateHandler.qml index 4d226c9..8c78e2f 100644 --- a/qml/StateHandler.qml +++ b/qml/StateHandler.qml @@ -5,7 +5,8 @@ import Qt.labs.settings 1.0 Item { id: item - property Item terminalList : null + property Item terminalList : null + property CommandInput commandInput : null Settings { id: settings @@ -13,6 +14,7 @@ Item { property string insertMode : "i" property string normalMode : "Shift+ESC" + property string commandMode : ":" property string nextItem : "j" property string prevItem : "k" property string firstItem : "g" @@ -32,8 +34,9 @@ Item { State { name: "NORMAL" - PropertyChanges { target: escapeInsertAction; enabled: false } + PropertyChanges { target: enterNormalAction; enabled: false } PropertyChanges { target: enterInsertAction; enabled: true } + PropertyChanges { target: enterCommandAction; enabled: true } PropertyChanges { target: nextTerminalAction; enabled: true } PropertyChanges { target: heightenTerminalAction; enabled: true } PropertyChanges { target: shortenTerminalAction; enabled: true } @@ -45,8 +48,23 @@ Item { State { name: "INSERT" - PropertyChanges { target: escapeInsertAction; enabled: true } + PropertyChanges { target: enterNormalAction; enabled: true } PropertyChanges { target: enterInsertAction; enabled: false } + PropertyChanges { target: enterCommandAction; enabled: false } + PropertyChanges { target: nextTerminalAction; enabled: false } + PropertyChanges { target: heightenTerminalAction; enabled: false } + PropertyChanges { target: shortenTerminalAction; enabled: false } + PropertyChanges { target: prevTerminalAction; enabled: false } + PropertyChanges { target: lastTerminalAction; enabled: false } + PropertyChanges { target: firstTerminalAction; enabled: false } + PropertyChanges { target: resetTerminalAction; enabled: false } + }, + State { + name: "COMMAND" + + PropertyChanges { target: enterNormalAction; enabled: true } + PropertyChanges { target: enterInsertAction; enabled: false } + PropertyChanges { target: enterCommandAction; enabled: false } PropertyChanges { target: nextTerminalAction; enabled: false } PropertyChanges { target: heightenTerminalAction; enabled: false } PropertyChanges { target: shortenTerminalAction; enabled: false } @@ -58,6 +76,18 @@ Item { ] Action { + id: enterNormalAction + shortcut: settings.normalMode + onTriggered: { + item.state = "NORMAL"; + + terminalList.forceActiveFocus(); + terminalList.unfocusCurrent(); + commandInput.unfocus(); + } + } + + Action { id: enterInsertAction shortcut: settings.insertMode onTriggered: { @@ -68,13 +98,12 @@ Item { } Action { - id: escapeInsertAction - shortcut: settings.normalMode + id: enterCommandAction + shortcut: settings.commandMode onTriggered: { - item.state = "NORMAL"; + item.state = "COMMAND"; - terminalList.forceActiveFocus(); - terminalList.unfocusCurrent(); + commandInput.focus(); } } diff --git a/qml/main.qml b/qml/main.qml index 19d19fc..2b81fe2 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -1,6 +1,7 @@ import QtQuick 2.0 import QtQuick.Window 2.0 import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 import Qt.labs.settings 1.0 ApplicationWindow { @@ -12,7 +13,7 @@ ApplicationWindow { id: settings category: "window" - property color background : "#161616" + property color background : "#161616" } color: settings.background @@ -22,115 +23,128 @@ ApplicationWindow { terminalList.focusCurrent(); } - Flickable { - id: terminalListFlickable - + ColumnLayout { anchors.fill: parent - boundsBehavior: Flickable.StopAtBounds - contentHeight: terminalList.height - contentWidth: parent.width - pixelAligned: true - - Column { - id: terminalList + Flickable { + id: terminalListFlickable - property int activeItem : 0 - property int itemIndex : 0 + Layout.fillHeight: true + Layout.fillWidth: true - anchors { - left: parent.left - right: parent.right - } + boundsBehavior: Flickable.StopAtBounds + contentHeight: terminalList.height + contentWidth: parent.width + pixelAligned: true - spacing: 10 + Column { + id: terminalList - onHeightChanged: scrollTo(activeItem) + property int activeItem : 0 + property int itemIndex : 0 - function onItemExecuted(index) { - if ( index === (children.length - 1) ) { - createItem(); + anchors { + left: parent.left + right: parent.right } - } - function createItem() { - var terminalItem = Qt.createComponent("qrc:/TerminalItem.qml"); - var instantiateTerminal = function() { - var instance = terminalItem.createObject(terminalList, { - "index": itemIndex, - "width": terminalListFlickable.width - }); - instance.onExecuted.connect(onItemExecuted); + spacing: 10 - ++itemIndex; - } + onHeightChanged: scrollTo(activeItem) - if ( terminalItem.status === Component.Ready ) { - instantiateTerminal(); - } else { - terminalItem.statusChanged.connect(instantiateTerminal); + function onItemExecuted(index) { + if ( index === (children.length - 1) ) { + createItem(); + } } - } - function scrollTo(index) { - if ( terminalList.height >= terminalListFlickable.height ) { - var offset = children[index].y - + (children[index].height / 2) - - (terminalListFlickable.height / 2); + function createItem() { + var terminalItem = Qt.createComponent("qrc:/TerminalItem.qml"); + var instantiateTerminal = function() { + var instance = terminalItem.createObject(terminalList, { + "index": itemIndex, + "width": terminalListFlickable.width + }); + instance.onExecuted.connect(onItemExecuted); - var bound = terminalList.height - - terminalListFlickable.height; + ++itemIndex; + } - if ( offset < 0 ) { - terminalListFlickable.contentY = 0; - } else if ( offset >= bound ) { - terminalListFlickable.contentY = bound; + if ( terminalItem.status === Component.Ready ) { + instantiateTerminal(); } else { - terminalListFlickable.contentY = offset; + terminalItem.statusChanged.connect(instantiateTerminal); } } - } - function selectItem(index) { - children[activeItem].deselect(); - children[index ].select(); + function scrollTo(index) { + if ( terminalList.height >= terminalListFlickable.height ) { + var offset = children[index].y + + (children[index].height / 2) + - (terminalListFlickable.height / 2); + + var bound = terminalList.height + - terminalListFlickable.height; + + if ( offset < 0 ) { + terminalListFlickable.contentY = 0; + } else if ( offset >= bound ) { + terminalListFlickable.contentY = bound; + } else { + terminalListFlickable.contentY = offset; + } + } + } - activeItem = index; + function selectItem(index) { + children[activeItem].deselect(); + children[index ].select(); - scrollTo(index); - } + activeItem = index; - function selectNext() { - if ( activeItem < (children.length - 1) ) { - selectItem(activeItem + 1); - } else { - state.enterInsertMode(); + scrollTo(index); } - } - function selectPrev() { - if ( activeItem > 0 ) { - selectItem(activeItem - 1); + function selectNext() { + if ( activeItem < (children.length - 1) ) { + selectItem(activeItem + 1); + } else { + state.enterInsertMode(); + } } - } - function focusCurrent() { - children[activeItem].forceActiveFocus(); - } + function selectPrev() { + if ( activeItem > 0 ) { + selectItem(activeItem - 1); + } + } - function unfocusCurrent() { - children[activeItem].unfocus(); - } + function focusCurrent() { + children[activeItem].forceActiveFocus(); + } + + function unfocusCurrent() { + children[activeItem].unfocus(); + } - function getCurrent() { - return children[activeItem]; + function getCurrent() { + return children[activeItem]; + } } - } + } + + CommandInput { + id: command + + Layout.fillWidth: true + height: 20 + } } StateHandler { id: state terminalList: terminalList + commandInput: command } } @@ -5,5 +5,6 @@ <file>TerminalItem.qml</file> <file>EmbeddedTerminal.qml</file> <file>Highlighter.qml</file> + <file>CommandInput.qml</file> </qresource> </RCC> |