diff --git a/qml/XmbRoot.qml b/qml/XmbRoot.qml new file mode 100644 index 0000000..a7b0ac7 --- /dev/null +++ b/qml/XmbRoot.qml @@ -0,0 +1,118 @@ +import QtQuick +import QtQuick.Controls +import XMB 1.0 + +Item { + id: root + focus: true + + property int catIndex: 0 + property int itemIndex: 0 + + Sounds { id: sounds } + + Rectangle { + anchors.fill: parent + color: "#071022" + } + + // Hintergrund-Glow (dezent) + Rectangle { + width: parent.width + height: parent.height + opacity: 0.20 + gradient: Gradient { + GradientStop { position: 0.0; color: "#10284a" } + GradientStop { position: 1.0; color: "#071022" } + } + } + + CategoryStrip { + id: strip + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.topMargin: 80 + height: 130 + + model: XmbModel.categories + currentIndex: root.catIndex + onActivated: (idx) => { + root.catIndex = idx + root.itemIndex = 0 + sounds.move() + } + } + + VerticalList { + id: vlist + anchors.left: parent.left + anchors.right: parent.right + anchors.top: strip.bottom + anchors.bottom: parent.bottom + anchors.topMargin: 20 + anchors.bottomMargin: 40 + + itemsModel: XmbModel.itemsForCategory(root.catIndex) + currentIndex: root.itemIndex + + onActivated: (idx) => { + root.itemIndex = idx + sounds.move() + } + + onTriggered: (entryObj) => { + sounds.select() + Launcher.launch(entryObj) + } + } + + // Controller / Keyboard input + Keys.onPressed: (e) => { + if (e.isAutoRepeat) return + + switch (e.key) { + case Qt.Key_Left: + root.catIndex = Math.max(0, root.catIndex - 1) + root.itemIndex = 0 + strip.positionViewAtIndex(root.catIndex, ListView.Visible) + sounds.move() + e.accepted = true + break + case Qt.Key_Right: + root.catIndex = Math.min(XmbModel.categoryCount - 1, root.catIndex + 1) + root.itemIndex = 0 + strip.positionViewAtIndex(root.catIndex, ListView.Visible) + sounds.move() + e.accepted = true + break + case Qt.Key_Up: + root.itemIndex = Math.max(0, root.itemIndex - 1) + vlist.positionViewAtIndex(root.itemIndex, ListView.Visible) + sounds.move() + e.accepted = true + break + case Qt.Key_Down: + root.itemIndex = Math.min(vlist.count - 1, root.itemIndex + 1) + vlist.positionViewAtIndex(root.itemIndex, ListView.Visible) + sounds.move() + e.accepted = true + break + case Qt.Key_Return: + case Qt.Key_Enter: + case Qt.Key_Space: + vlist.triggerCurrent() + e.accepted = true + break + case Qt.Key_Escape: + case Qt.Key_Backspace: + sounds.back() + // optional: zurück in Kategorie-Root + root.itemIndex = 0 + e.accepted = true + break + default: + break + } + } +}