aboutsummaryrefslogtreecommitdiff
path: root/qml/TerminalItem.qml
blob: 6c19c4534b4f0266899845fd92d05a7fe1c95712 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import QtQuick 2.0
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

Item {
	id: terminalItem
	signal executed

	height: elementList.height

	function select() {
		if ( command.readOnly ) {
			elementList.children[1].select();
		} else {
			highlighter.select();
		}
	}

	function deselect() {
		if ( command.readOnly ) {
			elementList.children[1].deselect();
		} else {
			highlighter.deselect();
		}
	}

	function forceActiveFocus() {
		if ( command.readOnly ) {
			scope.forceActiveFocus();
		} else {
			scope.forceActiveFocus();
			highlighter.select();
			highlighter.focus();
		}
	}

	function unfocus() {
		if ( !command.readOnly ) {
			highlighter.unfocus();
		}
	}

	FocusScope {
		id: scope

		Column {
			id: elementList

			function createTerminal(program) {
                var terminal = Qt.createComponent("qrc:/EmbeddedTerminal.qml");
				var instantiateTerminal = function() {
					terminal.createObject(elementList, {
						"columns": 90,
						"lines": 20,
						"program": program,
						"workingDirectory": "$HOME",
						"focus": true
					});
				}

				if ( terminal.status === Component.Ready ) {
					instantiateTerminal();
				} else {
					terminal.statusChanged.connect(instantiateTerminal);
                }
			}

			RowLayout {
				width: terminalItem.width

				Rectangle {
					id: highlighter

					width: 10
					height: command.height
					opacity: 0

					color: "#909636"

					Behavior on opacity {
						NumberAnimation {
							duration: 300
							easing.type: Easing.OutCubic
						}
					}

					function select()   { opacity = 1         }
					function deselect() { opacity = 0         }
					function focus()    { color   = "#352F6A" }
					function unfocus()  { color   = "#909636" }
				}

				TextInput {
					id: command

					font.pointSize: 18
					color: "white"
					selectedTextColor: "#161616"
					selectionColor: "white"
					selectByMouse: true
					focus: true

					Layout.fillWidth: true

					onAccepted: {
						if ( !readOnly ) {
							readOnly = true;
							focus    = false;
							elementList.createTerminal(text);
							terminalItem.executed();
							highlighter.deselect();
						}
					}
				}
			}
		}
	}
}