diff options
Diffstat (limited to 'qml')
-rw-r--r-- | qml/TerminalList.qml | 115 | ||||
-rw-r--r-- | qml/main.qml | 106 | ||||
-rw-r--r-- | qml/ui.qrc | 3 |
3 files changed, 121 insertions, 103 deletions
diff --git a/qml/TerminalList.qml b/qml/TerminalList.qml new file mode 100644 index 0000000..249193d --- /dev/null +++ b/qml/TerminalList.qml @@ -0,0 +1,115 @@ +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 = 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]; + } + + 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/main.qml b/qml/main.qml index 2b81fe2..3f3b5a9 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -26,111 +26,13 @@ ApplicationWindow { ColumnLayout { anchors.fill: parent - Flickable { - id: terminalListFlickable + TerminalList { + id: terminalList + + state: state Layout.fillHeight: true Layout.fillWidth: true - - boundsBehavior: Flickable.StopAtBounds - contentHeight: terminalList.height - contentWidth: parent.width - pixelAligned: true - - Column { - id: terminalList - - property int activeItem : 0 - property int itemIndex : 0 - - anchors { - left: parent.left - right: parent.right - } - - spacing: 10 - - onHeightChanged: scrollTo(activeItem) - - 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(terminalList, { - "index": itemIndex, - "width": terminalListFlickable.width - }); - instance.onExecuted.connect(onItemExecuted); - - ++itemIndex; - } - - if ( terminalItem.status === Component.Ready ) { - instantiateTerminal(); - } else { - terminalItem.statusChanged.connect(instantiateTerminal); - } - } - - function scrollTo(index) { - if ( terminalList.height >= terminalListFlickable.height ) { - var offset = children[index].y - + (children[index].height / 2) - - (terminalListFlickable.height / 2); - - var bound = terminalList.height - - terminalListFlickable.height; - - if ( offset < 0 ) { - terminalListFlickable.contentY = 0; - } else if ( offset >= bound ) { - terminalListFlickable.contentY = bound; - } else { - terminalListFlickable.contentY = offset; - } - } - } - - function selectItem(index) { - children[activeItem].deselect(); - children[index ].select(); - - activeItem = 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]; - } - } } CommandInput { @@ -4,7 +4,8 @@ <file>StateHandler.qml</file> <file>TerminalItem.qml</file> <file>EmbeddedTerminal.qml</file> - <file>Highlighter.qml</file> <file>CommandInput.qml</file> + <file>TerminalList.qml</file> + <file>Highlighter.qml</file> </qresource> </RCC> |