From d8431223d34476a17835a05d9508e92447f22479 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sat, 15 Aug 2015 16:06:00 +0200 Subject: 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. --- src/command/CommandInput.qml | 146 +++++++++++++++++++++++++++++++++++++++++++ src/command/commands.js | 55 ++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 src/command/CommandInput.qml create mode 100644 src/command/commands.js (limited to 'src/command') diff --git a/src/command/CommandInput.qml b/src/command/CommandInput.qml new file mode 100644 index 0000000..99f5d0e --- /dev/null +++ b/src/command/CommandInput.qml @@ -0,0 +1,146 @@ +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 += '
' + msg; + } + } + + function error(msg) { + text = '' + + msg + + ''; + } + + onTextChanged: { + if ( isInitial() ) { + Layout.preferredHeight = 0; + } else { + Layout.preferredHeight = contentHeight; + } + } + } + } + } +} diff --git a/src/command/commands.js b/src/command/commands.js new file mode 100644 index 0000000..f76af01 --- /dev/null +++ b/src/command/commands.js @@ -0,0 +1,55 @@ +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); + } + }); +} -- cgit v1.2.3