From 4cb435f2a7bbeafb53f067d95ec83e0b3a1a17f8 Mon Sep 17 00:00:00 2001
From: Adrian Kummerlaender
Date: Wed, 19 Aug 2015 11:13:35 +0200
Subject: Extract all settings into `SettingsHandler` object
This enables the user to straight forwardly change all application settings via command mode.
During the implementation of this change I discovered that the way I was passing around `StateHandler` and `SettingsHandler` instances using properties was unnecessary. If all object instances are created in a common hierarchy they can access each other by their `id` property - i.e. `settings` and `mode` are available to the whole application without property trickery.
---
src/SettingsHandler.qml | 62 +++++++++++++++++++++++++++++++++++++++++
src/StateHandler.qml | 42 ++++++++--------------------
src/command/CommandInput.qml | 31 +++++++--------------
src/list/TerminalItem.qml | 25 ++++++-----------
src/list/TerminalList.qml | 14 +++++-----
src/main.qml | 29 +++++++------------
src/ui.qrc | 1 +
src/widget/EmbeddedTerminal.qml | 38 ++++++++-----------------
src/widget/Highlighter.qml | 18 ++++--------
9 files changed, 128 insertions(+), 132 deletions(-)
create mode 100644 src/SettingsHandler.qml
diff --git a/src/SettingsHandler.qml b/src/SettingsHandler.qml
new file mode 100644
index 0000000..8a9a862
--- /dev/null
+++ b/src/SettingsHandler.qml
@@ -0,0 +1,62 @@
+import QtQuick 2.0
+import Qt.labs.settings 1.0
+
+QtObject {
+ property Settings window : Settings {
+ category: "window"
+
+ property string background : "#161616"
+ }
+
+ property Settings keybinding : 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"
+ }
+
+ property Settings item : Settings {
+ category: "item"
+
+ property int fontSize : 18
+ property string fontFamily : "Monospace"
+ property string fontColor : "white"
+ }
+
+ property Settings highlighter : Settings {
+ category: "highlighter"
+
+ property string defaultColor : "#909636"
+ property string focusColor : "#352F6A"
+ }
+
+ property Settings terminal : 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 Settings command : Settings {
+ category: "command"
+
+ property string background : "black"
+ property int fontSize : 12
+ property string fontFamily : "Monospace"
+ property string fontColor : "white"
+ property string errorColor : "red"
+ }
+}
diff --git a/src/StateHandler.qml b/src/StateHandler.qml
index 8de1091..7f8ef96 100644
--- a/src/StateHandler.qml
+++ b/src/StateHandler.qml
@@ -5,24 +5,6 @@ import Qt.labs.settings 1.0
Item {
id: item
- property Item terminalList : null
- property CommandInput commandInput : null
-
- property Settings settings : 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() {
@@ -80,19 +62,19 @@ Item {
Action {
id: enterNormalAction
- shortcut: settings.normalMode
+ shortcut: settings.keybinding.normalMode
onTriggered: {
item.state = "NORMAL";
terminalList.forceActiveFocus();
terminalList.unfocusCurrent();
- commandInput.unfocus();
+ command.unfocus();
}
}
Action {
id: enterInsertAction
- shortcut: settings.insertMode
+ shortcut: settings.keybinding.insertMode
onTriggered: {
item.state = "INSERT";
@@ -102,53 +84,53 @@ Item {
Action {
id: enterCommandAction
- shortcut: settings.commandMode
+ shortcut: settings.keybinding.commandMode
onTriggered: {
item.state = "COMMAND";
- commandInput.focus(shortcut);
+ command.focus(shortcut);
}
}
Action {
id: nextTerminalAction
- shortcut: settings.nextItem
+ shortcut: settings.keybinding.nextItem
onTriggered: terminalList.selectNext()
}
Action {
id: heightenTerminalAction
- shortcut: settings.heightenItem
+ shortcut: settings.keybinding.heightenItem
onTriggered: terminalList.getCurrent().heighten()
}
Action {
id: shortenTerminalAction
- shortcut: settings.shortenItem
+ shortcut: settings.keybinding.shortenItem
onTriggered: terminalList.getCurrent().shorten()
}
Action {
id: prevTerminalAction
- shortcut: settings.prevItem
+ shortcut: settings.keybinding.prevItem
onTriggered: terminalList.selectPrev()
}
Action {
id: lastTerminalAction
- shortcut: settings.lastItem
+ shortcut: settings.keybinding.lastItem
onTriggered: terminalList.selectItem(terminalList.children.length - 1)
}
Action {
id: firstTerminalAction
- shortcut: settings.firstItem
+ shortcut: settings.keybinding.firstItem
onTriggered: terminalList.selectItem(0)
}
Action {
id: resetTerminalAction
- shortcut: settings.resetItem
+ shortcut: settings.keybinding.resetItem
onTriggered: {
terminalList.getCurrent().reset();
terminalList.getCurrent().select();
diff --git a/src/command/CommandInput.qml b/src/command/CommandInput.qml
index e980c80..dbc1d54 100644
--- a/src/command/CommandInput.qml
+++ b/src/command/CommandInput.qml
@@ -1,6 +1,5 @@
import QtQuick 2.0
import QtQuick.Layouts 1.1
-import Qt.labs.settings 1.0
import "commands.js" as Commands
@@ -13,16 +12,6 @@ Item {
Layout.preferredHeight: container.height
- property Settings settings : 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) {
@@ -44,7 +33,7 @@ Item {
height: container.height
- color: settings.background
+ color: settings.command.background
ColumnLayout {
id: container
@@ -60,13 +49,13 @@ Item {
Layout.fillWidth: true
font {
- family: settings.fontFamily
- pointSize: settings.fontSize
+ family: settings.command.fontFamily
+ pointSize: settings.command.fontSize
}
- color: settings.fontColor
- selectionColor: settings.fontColor
- selectedTextColor: settings.background
+ color: settings.command.fontColor
+ selectionColor: settings.command.fontColor
+ selectedTextColor: settings.command.background
selectByMouse: true
function initialize() {
@@ -102,11 +91,11 @@ Item {
Layout.preferredHeight: 0
font {
- family: settings.fontFamily
- pointSize: settings.fontSize
+ family: settings.command.fontFamily
+ pointSize: settings.command.fontSize
}
- color: settings.fontColor
+ color: settings.command.fontColor
function isInitial() {
return text === '';
@@ -126,7 +115,7 @@ Item {
function error(msg) {
text = ''
+ msg
+ '';
diff --git a/src/list/TerminalItem.qml b/src/list/TerminalItem.qml
index 4c71be4..06b60b9 100644
--- a/src/list/TerminalItem.qml
+++ b/src/list/TerminalItem.qml
@@ -6,19 +6,11 @@ import Qt.labs.settings 1.0
Item {
id: item
- property int index : 0
property EmbeddedTerminal terminal : null
+ property int index : 0
signal executed (int index)
- property Settings settings : Settings {
- category: "item"
-
- property int fontSize : 18
- property string fontFamily : "Monospace"
- property string fontColor : "white"
- }
-
anchors {
left: parent.left
right: parent.right
@@ -106,6 +98,7 @@ Item {
var terminalComponent = Qt.createComponent("qrc:/EmbeddedTerminal.qml");
var instantiateTerminal = function() {
item.terminal = terminalComponent.createObject(elementList, {
+ "settings" : settings,
"program" : program,
"workingDirectory" : "$HOME",
"focus" : true
@@ -136,12 +129,12 @@ Item {
id: command
font {
- family: settings.fontFamily
- pointSize: settings.fontSize
+ family: settings.item.fontFamily
+ pointSize: settings.item.fontSize
}
- color: settings.fontColor
- selectionColor: settings.fontColor
+ color: settings.item.fontColor
+ selectionColor: settings.item.fontColor
selectedTextColor: "#161616"
selectByMouse: true
@@ -162,10 +155,10 @@ Item {
Text {
font {
- family: settings.fontFamily
- pointSize: settings.fontSize / 1.5
+ family: settings.item.fontFamily
+ pointSize: settings.item.fontSize / 1.5
}
- color: settings.fontColor
+ color: settings.item.fontColor
text: item.index
}
diff --git a/src/list/TerminalList.qml b/src/list/TerminalList.qml
index 6c6465b..9c1636f 100644
--- a/src/list/TerminalList.qml
+++ b/src/list/TerminalList.qml
@@ -4,12 +4,13 @@ import QtQuick.Layouts 1.1
Item {
id: item
- property StateHandler state : null
- property int activeItem : 0
- property int itemIndex : 0
+ property int activeItem : 0
+ property int itemIndex : 0
property alias children : column.children
+ property Component terminalItem : Component { TerminalItem { } }
+
function onItemExecuted(index) {
if ( index === (children.length - 1) ) {
createItem();
@@ -17,11 +18,10 @@ Item {
}
function createItem() {
- var terminalItem = Qt.createComponent("qrc:/TerminalItem.qml");
var instantiateTerminal = function() {
var instance = terminalItem.createObject(column, {
- "index": itemIndex,
- "width": flickable.width
+ "index" : itemIndex,
+ "width" : flickable.width
});
instance.onExecuted.connect(onItemExecuted);
@@ -67,7 +67,7 @@ Item {
if ( activeItem < (children.length - 1) ) {
selectItem(activeItem + 1);
} else {
- state.enterInsertMode();
+ mode.enterInsertMode();
}
}
diff --git a/src/main.qml b/src/main.qml
index 2965fa1..db17cda 100644
--- a/src/main.qml
+++ b/src/main.qml
@@ -2,34 +2,32 @@ 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
-
- property Settings settings : Settings {
- category: "window"
-
- property string background : "#161616"
- }
-
- color: settings.background
+ color: settings.window.background
Component.onCompleted: {
terminalList.createItem();
terminalList.focusCurrent();
}
+ SettingsHandler {
+ id: settings
+ }
+
+ StateHandler {
+ id: mode
+ }
+
ColumnLayout {
anchors.fill: parent
TerminalList {
id: terminalList
- state: state
-
Layout.fillHeight: true
Layout.fillWidth: true
}
@@ -39,14 +37,7 @@ ApplicationWindow {
Layout.fillWidth: true
- onExecuted: state.enterNormalMode()
+ onExecuted: mode.enterNormalMode()
}
}
-
- StateHandler {
- id: state
-
- terminalList: terminalList
- commandInput: command
- }
}
diff --git a/src/ui.qrc b/src/ui.qrc
index 48554f7..916fb43 100644
--- a/src/ui.qrc
+++ b/src/ui.qrc
@@ -2,6 +2,7 @@
main.qml
StateHandler.qml
+ SettingsHandler.qml
list/TerminalItem.qml
list/TerminalList.qml
command/CommandInput.qml
diff --git a/src/widget/EmbeddedTerminal.qml b/src/widget/EmbeddedTerminal.qml
index 6d0dc6e..54dad75 100644
--- a/src/widget/EmbeddedTerminal.qml
+++ b/src/widget/EmbeddedTerminal.qml
@@ -1,31 +1,17 @@
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
+ 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
+ property int lines : settings.terminal.initialLines
height: terminal.height
- width: parent.width - settings.frameWidth
+ width: parent.width - settings.terminal.frameWidth
function select() { highlighter.select() }
function deselect() { highlighter.deselect() }
@@ -44,7 +30,7 @@ Item {
Highlighter {
id: highlighter
- width: settings.frameWidth
+ width: settings.terminal.frameWidth
Layout.fillHeight: true
}
@@ -52,14 +38,14 @@ Item {
id: terminal
font {
- family: settings.fontFamily
- pointSize: settings.fontSize
+ family: settings.terminal.fontFamily
+ pointSize: settings.terminal.fontSize
}
Layout.fillWidth: true
Layout.preferredHeight: fontMetrics.height * item.lines
- colorScheme: settings.colorScheme
+ colorScheme: settings.terminal.colorScheme
session: QMLTermSession {
initialWorkingDirectory: item.workingDirectory
@@ -99,7 +85,7 @@ Item {
anchors.fill: parent
opacity: 0
- color: settings.overlayBackground
+ color: settings.terminal.overlayBackground
SequentialAnimation {
id: animation
@@ -130,10 +116,10 @@ Item {
}
font {
- family: settings.fontFamily
- pointSize: settings.fontSize * 2
+ family: settings.terminal.fontFamily
+ pointSize: settings.terminal.fontSize * 2
}
- color: settings.overlayFontColor
+ color: settings.terminal.overlayFontColor
text: {
return item.lines
diff --git a/src/widget/Highlighter.qml b/src/widget/Highlighter.qml
index b2db7f6..53f308c 100644
--- a/src/widget/Highlighter.qml
+++ b/src/widget/Highlighter.qml
@@ -1,18 +1,10 @@
import QtQuick 2.0
-import Qt.labs.settings 1.0
Item {
- property Settings settings : 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 }
+ function select() { bar.opacity = 1 }
+ function deselect() { bar.opacity = 0 }
+ function focus() { bar.color = settings.highlighter.focusColor }
+ function unfocus() { bar.color = settings.highlighter.defaultColor }
Rectangle {
id: bar
@@ -20,7 +12,7 @@ Item {
anchors.fill: parent
opacity: 0
- color: settings.defaultColor
+ color: settings.highlighter.defaultColor
Behavior on opacity {
NumberAnimation {
--
cgit v1.2.3