f8632e40e7
Add a native Qt "Bigscreen" shell: CMakeLists, C++ entry (main.cpp, InputRouter), QML module (Theme, ShellWindow, views and components) and a Bigscreen/.gitignore; update top-level .gitignore and README with Qt build/run instructions. Remove the legacy Tauri/web prototype files (package.json, package-lock.json, src-tauri and many web assets) as part of the migration to the Qt/CMake-based shell.
100 lines
2.6 KiB
QML
100 lines
2.6 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import Nebula.Bigscreen
|
|
|
|
ColumnLayout {
|
|
id: root
|
|
|
|
signal goBack()
|
|
|
|
readonly property var entries: [
|
|
{ title: "Nebula Demo", meta: "Local • Ready", icon: "🎮" },
|
|
{ title: "Retro Runner", meta: "Wine • Installed", icon: "👾" },
|
|
{ title: "Media Hub", meta: "App • Installed", icon: "🎬" }
|
|
]
|
|
|
|
property int focusIndex: 0
|
|
|
|
spacing: 20
|
|
|
|
Text {
|
|
text: "Library"
|
|
font: Theme.brandFont
|
|
color: Theme.textPrimary
|
|
Layout.leftMargin: 40
|
|
}
|
|
|
|
Text {
|
|
text: "Mock entries for v0 — scanners and launchers come later."
|
|
font: Theme.metaFont
|
|
color: Theme.textMuted
|
|
Layout.leftMargin: 40
|
|
Layout.bottomMargin: 8
|
|
}
|
|
|
|
ListView {
|
|
id: list
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
Layout.leftMargin: 40
|
|
Layout.rightMargin: 40
|
|
clip: true
|
|
spacing: 12
|
|
model: root.entries
|
|
|
|
delegate: Rectangle {
|
|
width: list.width
|
|
height: 72
|
|
radius: 12
|
|
color: index === root.focusIndex ? "#22304A66" : Theme.backgroundPanel
|
|
border.color: index === root.focusIndex ? Theme.accentCyan : Theme.accentLine
|
|
border.width: index === root.focusIndex ? 2 : 1
|
|
|
|
RowLayout {
|
|
anchors.fill: parent
|
|
anchors.margins: 16
|
|
spacing: 16
|
|
|
|
Text {
|
|
text: modelData.icon
|
|
font.pixelSize: 28
|
|
}
|
|
|
|
ColumnLayout {
|
|
spacing: 2
|
|
Text {
|
|
text: modelData.title
|
|
font: Theme.titleFont
|
|
color: Theme.textPrimary
|
|
}
|
|
Text {
|
|
text: modelData.meta
|
|
font: Theme.metaFont
|
|
color: Theme.textMuted
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function handleInput(action) {
|
|
switch (action) {
|
|
case InputRouter.Up:
|
|
focusIndex = Math.max(0, focusIndex - 1)
|
|
list.currentIndex = focusIndex
|
|
break
|
|
case InputRouter.Down:
|
|
focusIndex = Math.min(entries.length - 1, focusIndex + 1)
|
|
list.currentIndex = focusIndex
|
|
break
|
|
case InputRouter.Back:
|
|
root.goBack()
|
|
break
|
|
case InputRouter.Accept:
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|