aboutsummaryrefslogtreecommitdiff
path: root/src/command
diff options
context:
space:
mode:
Diffstat (limited to 'src/command')
-rw-r--r--src/command/CommandInput.qml146
-rw-r--r--src/command/commands.js55
2 files changed, 201 insertions, 0 deletions
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 += '<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/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);
+ }
+ });
+}