diff options
author | Adrian Kummerlaender | 2015-08-07 16:29:35 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2015-08-07 16:29:35 +0200 |
commit | 3d618159831b6379f2aefc27d8f744fd46a9f3d2 (patch) | |
tree | 822278bc639ee62f09121880db14bca9692dbda8 /qml/TerminalList.qml | |
parent | 359c878cbfe97dafad328c748ae744b38a7dbd5b (diff) | |
download | MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar.gz MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar.bz2 MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar.lz MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar.xz MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.tar.zst MetaTerm-3d618159831b6379f2aefc27d8f744fd46a9f3d2.zip |
Extracted terminal list into separate component
Diffstat (limited to 'qml/TerminalList.qml')
-rw-r--r-- | qml/TerminalList.qml | 115 |
1 files changed, 115 insertions, 0 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) + } + } +} |