diff options
author | Adrian Kummerlaender | 2015-08-15 16:06:00 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2015-08-15 16:06:00 +0200 |
commit | d8431223d34476a17835a05d9508e92447f22479 (patch) | |
tree | 91b42009fc464be238f9afab569f62cfdf355179 /qml | |
parent | 566e635cd798ef558f4d57fc319f0ee857869378 (diff) | |
download | MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar.gz MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar.bz2 MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar.lz MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar.xz MetaTerm-d8431223d34476a17835a05d9508e92447f22479.tar.zst MetaTerm-d8431223d34476a17835a05d9508e92447f22479.zip |
Restructure QML and JS sources
`list` holds the components of the central list UI element.
`command` holds the UI and implementation parts of the command mode.
`widget` holds more or less general purpose elements that may also be of use in other circumstances.
Diffstat (limited to 'qml')
-rw-r--r-- | qml/CommandInput.qml | 146 | ||||
-rw-r--r-- | qml/EmbeddedTerminal.qml | 153 | ||||
-rw-r--r-- | qml/Highlighter.qml | 33 | ||||
-rw-r--r-- | qml/StateHandler.qml | 158 | ||||
-rw-r--r-- | qml/TerminalItem.qml | 176 | ||||
-rw-r--r-- | qml/TerminalList.qml | 125 | ||||
-rw-r--r-- | qml/commands.js | 55 | ||||
-rw-r--r-- | qml/main.qml | 53 | ||||
-rw-r--r-- | qml/ui.qrc | 12 |
9 files changed, 0 insertions, 911 deletions
diff --git a/qml/CommandInput.qml b/qml/CommandInput.qml deleted file mode 100644 index 99f5d0e..0000000 --- a/qml/CommandInput.qml +++ /dev/null @@ -1,146 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Layouts 1.1 -import Qt.labs.settings 1.0 - -import "commands.js" as Commands - -Item { - id: item - - signal executed - - visible: false - - Layout.preferredHeight: container.height - - Settings { - id: settings - category: "command" - - property string background : "black" - property int fontSize : 12 - property string fontFamily : "Monospace" - property string fontColor : "white" - property string errorColor : "red" - } - - onVisibleChanged: container.reset() - - function focus(prefix) { - visible = true; - command.text = prefix; - command.forceActiveFocus(); - } - - function unfocus() { - visible = false; - } - - Rectangle { - anchors { - top: parent.top - left: parent.left - right: parent.right - } - - height: container.height - - color: settings.background - - ColumnLayout { - id: container - - function reset() { - command.initialize(); - output.initialize(); - } - - TextInput { - id: command - - Layout.fillWidth: true - - font { - family: settings.fontFamily - pointSize: settings.fontSize - } - - color: settings.fontColor - selectionColor: settings.fontColor - selectedTextColor: settings.background - selectByMouse: true - - function initialize() { - text = ''; - } - - onAccepted: { - output.initialize(); - - const prefix = String(text).charAt(0); - const cmd = String(text).substring(1, String(text).length); - - switch ( prefix ) { - case ':': { - Commands.execute(output, cmd); - break; - } - default: { - output.error('"' + prefix + '"' + ' is not a command prefix.'); - } - } - - if ( output.isInitial() ) { - item.executed(); - } - } - } - - Text { - id: output - - Layout.fillWidth: true - Layout.preferredHeight: 0 - - font { - family: settings.fontFamily - pointSize: settings.fontSize - } - - color: settings.fontColor - - function isInitial() { - return text === ''; - } - - function initialize() { - text = ''; - } - - function log(msg) { - if ( isInitial() ) { - text = msg; - } else { - text += '<br/>' + msg; - } - } - - function error(msg) { - text = '<i><font color="' - + settings.errorColor - + '">' - + msg - + '</font></i>'; - } - - onTextChanged: { - if ( isInitial() ) { - Layout.preferredHeight = 0; - } else { - Layout.preferredHeight = contentHeight; - } - } - } - } - } -} diff --git a/qml/EmbeddedTerminal.qml b/qml/EmbeddedTerminal.qml deleted file mode 100644 index 6d0dc6e..0000000 --- a/qml/EmbeddedTerminal.qml +++ /dev/null @@ -1,153 +0,0 @@ -import QtQuick 2.0 -import QMLTermWidget 1.0 -import QtQuick.Layouts 1.1 -import Qt.labs.settings 1.0 - -Item { - id: item - - property string program - property string workingDirectory - - Settings { - id: settings - category: "terminal" - - property int initialLines : 20 - property int frameWidth : 10 - property int fontSize : 8 - property string fontFamily : "Monospace" - property string colorScheme : "cool-retro-term" - property string overlayBackground : "black" - property string overlayFontColor : "white" - } - - property int lines : settings.initialLines - - height: terminal.height - width: parent.width - settings.frameWidth - - function select() { highlighter.select() } - function deselect() { highlighter.deselect() } - function displayOverlay() { overlay.displayBriefly() } - - RowLayout { - id: container - - anchors { - left: parent.left - right: parent.right - } - - spacing: 0 - - Highlighter { - id: highlighter - - width: settings.frameWidth - Layout.fillHeight: true - } - - QMLTermWidget { - id: terminal - - font { - family: settings.fontFamily - pointSize: settings.fontSize - } - - Layout.fillWidth: true - Layout.preferredHeight: fontMetrics.height * item.lines - - colorScheme: settings.colorScheme - - session: QMLTermSession { - initialWorkingDirectory: item.workingDirectory - - shellProgram: { - return (item.program).split(" ")[0]; - } - - shellProgramArgs: { - const elements = (item.program).split(" "); - elements.shift(); - - return elements; - } - } - - Component.onCompleted: { - forceActiveFocus(); - highlighter.select(); - session.startShellProgram(); - overlay.enabled = true; - } - - onTermGetFocus: highlighter.focus() - onTermLostFocus: highlighter.unfocus() - onHeightChanged: overlay.displayBriefly(); - onWidthChanged: overlay.displayBriefly(); - - Rectangle { - id: overlay - - property bool enabled : false - - function displayBriefly() { - if ( enabled ) { animation.restart() } - } - - anchors.fill: parent - opacity: 0 - color: settings.overlayBackground - - SequentialAnimation { - id: animation - - ScriptAction { - script: overlay.opacity = 0.8 - } - - PauseAnimation { - duration: 500 - } - - NumberAnimation { - target: overlay - property: "opacity" - - easing.type: Easing.InSine - duration: 300 - from: 0.8 - to: 0 - } - } - - Text { - anchors { - horizontalCenter: overlay.horizontalCenter - verticalCenter: overlay.verticalCenter - } - - font { - family: settings.fontFamily - pointSize: settings.fontSize * 2 - } - color: settings.overlayFontColor - - text: { - return item.lines - + 'x' - + Math.floor(terminal.width / terminal.fontMetrics.width); - } - } - } - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.NoButton - onWheel: { } - } - } - } -} diff --git a/qml/Highlighter.qml b/qml/Highlighter.qml deleted file mode 100644 index e42aeb1..0000000 --- a/qml/Highlighter.qml +++ /dev/null @@ -1,33 +0,0 @@ -import QtQuick 2.0 -import Qt.labs.settings 1.0 - -Item { - Settings { - id: settings - category: "highlighter" - - property string defaultColor : "#909636" - property string focusColor : "#352F6A" - } - - function select() { bar.opacity = 1 } - function deselect() { bar.opacity = 0 } - function focus() { bar.color = settings.focusColor } - function unfocus() { bar.color = settings.defaultColor } - - Rectangle { - id: bar - - anchors.fill: parent - - opacity: 0 - color: settings.defaultColor - - Behavior on opacity { - NumberAnimation { - duration: 300 - easing.type: Easing.OutCubic - } - } - } -} diff --git a/qml/StateHandler.qml b/qml/StateHandler.qml deleted file mode 100644 index d9f5f5a..0000000 --- a/qml/StateHandler.qml +++ /dev/null @@ -1,158 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.2 -import Qt.labs.settings 1.0 - -Item { - id: item - - property Item terminalList : null - property CommandInput commandInput : null - - Settings { - id: settings - category: "keybinding" - - property string insertMode : "i" - property string normalMode : "Shift+ESC" - property string commandMode : ":" - property string nextItem : "j" - property string prevItem : "k" - property string firstItem : "g" - property string resetItem : "d" - property string lastItem : "Shift+G" - property string heightenItem : "Shift+J" - property string shortenItem : "Shift+K" - } - - state: "INSERT" - - function enterInsertMode() { - enterInsertAction.trigger(); - } - - function enterNormalMode() { - enterNormalAction.trigger(); - } - - states: [ - State { - name: "NORMAL" - - 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 } - PropertyChanges { target: prevTerminalAction; enabled: true } - PropertyChanges { target: lastTerminalAction; enabled: true } - PropertyChanges { target: firstTerminalAction; enabled: true } - PropertyChanges { target: resetTerminalAction; enabled: true } - }, - State { - name: "INSERT" - - 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 } - PropertyChanges { target: prevTerminalAction; enabled: false } - PropertyChanges { target: lastTerminalAction; enabled: false } - PropertyChanges { target: firstTerminalAction; enabled: false } - PropertyChanges { target: resetTerminalAction; enabled: false } - } - ] - - Action { - id: enterNormalAction - shortcut: settings.normalMode - onTriggered: { - item.state = "NORMAL"; - - terminalList.forceActiveFocus(); - terminalList.unfocusCurrent(); - commandInput.unfocus(); - } - } - - Action { - id: enterInsertAction - shortcut: settings.insertMode - onTriggered: { - item.state = "INSERT"; - - terminalList.focusCurrent(); - } - } - - Action { - id: enterCommandAction - shortcut: settings.commandMode - onTriggered: { - item.state = "COMMAND"; - - commandInput.focus(shortcut); - } - } - - Action { - id: nextTerminalAction - shortcut: settings.nextItem - onTriggered: terminalList.selectNext() - } - - Action { - id: heightenTerminalAction - shortcut: settings.heightenItem - onTriggered: terminalList.getCurrent().heighten() - } - - Action { - id: shortenTerminalAction - shortcut: settings.shortenItem - onTriggered: terminalList.getCurrent().shorten() - } - - Action { - id: prevTerminalAction - shortcut: settings.prevItem - onTriggered: terminalList.selectPrev() - } - - Action { - id: lastTerminalAction - shortcut: settings.lastItem - onTriggered: terminalList.selectItem(terminalList.children.length - 1) - } - - Action { - id: firstTerminalAction - shortcut: settings.firstItem - onTriggered: terminalList.selectItem(0) - } - - Action { - id: resetTerminalAction - shortcut: settings.resetItem - onTriggered: { - terminalList.getCurrent().reset(); - terminalList.getCurrent().select(); - } - } -} diff --git a/qml/TerminalItem.qml b/qml/TerminalItem.qml deleted file mode 100644 index 57197bd..0000000 --- a/qml/TerminalItem.qml +++ /dev/null @@ -1,176 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import Qt.labs.settings 1.0 - -Item { - id: item - - property int index : 0 - property EmbeddedTerminal terminal : null - - signal executed (int index) - - Settings { - id: settings - category: "item" - - property int fontSize : 18 - property string fontFamily : "Monospace" - property string fontColor : "white" - } - - anchors { - left: parent.left - right: parent.right - } - - height: elementList.height - - function select() { - if ( terminal === null ) { - highlighter.select(); - } else { - terminal.select(); - } - } - - function deselect() { - if ( terminal === null ) { - highlighter.deselect(); - } else { - terminal.deselect(); - } - } - - function forceActiveFocus() { - scope.forceActiveFocus(); - - if ( terminal === null ) { - scope.forceActiveFocus(); - highlighter.select(); - highlighter.focus(); - } - } - - function unfocus() { - if ( terminal === null ) { - highlighter.unfocus(); - } - } - - function heighten() { - if ( terminal !== null ) { - terminal.lines += 1; - } - } - - function shorten() { - if ( terminal !== null ) { - if ( terminal.lines > 10 ) { - terminal.lines -= 1; - } else { - terminal.displayOverlay(); - } - } - } - - function reset() { - if ( terminal !== null ) { - terminal.destroy(); - - terminal = null; - command.readOnly = false; - command.focus = true; - - unfocus(); - } - } - - FocusScope { - id: scope - - anchors { - left: parent.left - right: parent.right - } - - Column { - id: elementList - - anchors { - left: parent.left - right: parent.right - } - - function createTerminal(program) { - var terminalComponent = Qt.createComponent("qrc:/EmbeddedTerminal.qml"); - var instantiateTerminal = function() { - item.terminal = terminalComponent.createObject(elementList, { - "program" : program, - "workingDirectory" : "$HOME", - "focus" : true - }); - } - - if ( terminalComponent.status === Component.Ready ) { - instantiateTerminal(); - } else { - terminalComponent.statusChanged.connect(instantiateTerminal); - } - } - - RowLayout { - anchors { - left: parent.left - right: parent.right - } - - Highlighter { - id: highlighter - - width: 10 - height: command.height - } - - TextInput { - id: command - - font { - family: settings.fontFamily - pointSize: settings.fontSize - } - - color: settings.fontColor - selectionColor: settings.fontColor - selectedTextColor: "#161616" - - selectByMouse: true - focus: true - Layout.fillWidth: true - - onAccepted: { - if ( item.terminal === null ) { - readOnly = true; - focus = false; - - elementList.createTerminal(text); - item.executed(item.index); - highlighter.deselect(); - } - } - } - - Text { - font { - family: settings.fontFamily - pointSize: settings.fontSize / 1.5 - } - color: settings.fontColor - - text: item.index - } - } - } - } -} diff --git a/qml/TerminalList.qml b/qml/TerminalList.qml deleted file mode 100644 index 6c6465b..0000000 --- a/qml/TerminalList.qml +++ /dev/null @@ -1,125 +0,0 @@ -import QtQuick 2.0 -import QtQuick.Layouts 1.1 - -Item { - id: item - - property StateHandler state : null - property int activeItem : 0 - property int itemIndex : 0 - - property alias children : column.children - - function onItemExecuted(index) { - if ( index === (children.length - 1) ) { - createItem(); - } - } - - function createItem() { - var terminalItem = Qt.createComponent("qrc:/TerminalItem.qml"); - var instantiateTerminal = function() { - var instance = terminalItem.createObject(column, { - "index": itemIndex, - "width": flickable.width - }); - instance.onExecuted.connect(onItemExecuted); - - ++itemIndex; - } - - if ( terminalItem.status === Component.Ready ) { - instantiateTerminal(); - } else { - terminalItem.statusChanged.connect(instantiateTerminal); - } - } - - function scrollTo(index) { - if ( column.height >= flickable.height ) { - var offset = children[index].y - + (children[index].height / 2) - - (flickable.height / 2); - - var bound = column.height - - flickable.height; - - if ( offset < 0 ) { - flickable.contentY = 0; - } else if ( offset >= bound ) { - flickable.contentY = bound; - } else { - flickable.contentY = offset; - } - } - } - - function selectItem(index) { - children[activeItem].deselect(); - children[index ].select(); - - activeItem = typeof index === "number" ? index : parseInt(index); - - scrollTo(index); - } - - function selectNext() { - if ( activeItem < (children.length - 1) ) { - selectItem(activeItem + 1); - } else { - state.enterInsertMode(); - } - } - - function selectPrev() { - if ( activeItem > 0 ) { - selectItem(activeItem - 1); - } - } - - function focusCurrent() { - children[activeItem].forceActiveFocus(); - } - - function unfocusCurrent() { - children[activeItem].unfocus(); - } - - function getCurrent() { - return children[activeItem]; - } - - function get(index) { - return children[index]; - } - - function iterate(func) { - for ( var i = 0; i < children.length; i++ ) { - func(children[i]); - } - } - - Flickable { - id: flickable - - anchors.fill: parent - - boundsBehavior: Flickable.StopAtBounds - contentHeight: column.height - contentWidth: parent.width - pixelAligned: true - - Column { - id: column - - anchors { - left: parent.left - right: parent.right - } - - spacing: 10 - - onHeightChanged: scrollTo(activeItem) - } - } -} diff --git a/qml/commands.js b/qml/commands.js deleted file mode 100644 index f76af01..0000000 --- a/qml/commands.js +++ /dev/null @@ -1,55 +0,0 @@ -function execute(output, command) { - var notImplemented = function(name) { - output.error('"' + name + '"' + ' is not implemented.'); - }; - var args = command.split(' '); - - try { - var closure = eval(args[0]); - - if ( typeof closure === 'function' ) { - args.shift(); - closure(output, args); - } else { - notImplemented(args[0]); - } - } catch (exception) { - notImplemented(args[0]); - } -} - -function exec(output, args) { - try { - var result = eval(args.join(' ')); - - if ( typeof result !== 'undefined' ) { - output.log(result); - } - } catch (exception) { - output.error(exception); - } -} - -function jump(output, index) { - terminalList.selectItem(index); -} - -function kill(output, index) { - terminalList.get(index).reset(); -} - -function next() { - terminalList.selectNext(); -} - -function prev() { - terminalList.selectPrev(); -} - -function ls(output) { - terminalList.iterate(function(item) { - if ( item.terminal !== null ) { - output.log(item.index + ': ' + item.terminal.program); - } - }); -} diff --git a/qml/main.qml b/qml/main.qml deleted file mode 100644 index f7673dc..0000000 --- a/qml/main.qml +++ /dev/null @@ -1,53 +0,0 @@ -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 { - id: root - - visible: true - - Settings { - id: settings - category: "window" - - property string background : "#161616" - } - - color: settings.background - - Component.onCompleted: { - terminalList.createItem(); - terminalList.focusCurrent(); - } - - ColumnLayout { - anchors.fill: parent - - TerminalList { - id: terminalList - - state: state - - Layout.fillHeight: true - Layout.fillWidth: true - } - - CommandInput { - id: command - - Layout.fillWidth: true - - onExecuted: state.enterNormalMode() - } - } - - StateHandler { - id: state - - terminalList: terminalList - commandInput: command - } -} diff --git a/qml/ui.qrc b/qml/ui.qrc deleted file mode 100644 index c8bd040..0000000 --- a/qml/ui.qrc +++ /dev/null @@ -1,12 +0,0 @@ -<RCC> - <qresource prefix="/"> - <file>main.qml</file> - <file>StateHandler.qml</file> - <file>TerminalItem.qml</file> - <file>EmbeddedTerminal.qml</file> - <file>CommandInput.qml</file> - <file>TerminalList.qml</file> - <file>Highlighter.qml</file> - <file>commands.js</file> - </qresource> -</RCC> |