1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
import QtQuick
import "../.."
import "../qtmaildir"
import "Modules.js" as Modules
// deck-it's Dashboard page: its panels, its action icons, the hardware it reads.
Column {
id: col
spacing: 6
readonly property var st: DeckIt.store
function def(section, key) { return col.st.fallback(section, key); }
// The dashboard's action icons: every id deck-it knows is in the
// defaults' list; the file keeps the ones switched on, in that order.
readonly property var allActions: col.def("dashboard", "actions") ?? []
readonly property var actions: col.st.value("dashboard", "actions") ?? col.allActions
function setAction(id, on) {
col.st.put("dashboard", "actions",
col.allActions.filter(a => a === id ? on : col.actions.includes(a)));
}
Small { visible: DeckIt.defaultsError !== ""; color: Theme.red; text: DeckIt.defaultsError }
Heading { objectName: "modules/"; text: "Dashboard parts" }
Small { text: "What the Dashboard shows. The OBS and K1C tabs, on the Server page, also feed its running row." }
Repeater {
model: Modules.parts(Object.keys(col.def("modules") ?? {}))
BoolSetting {
required property string modelData
store: col.st; section: "modules"; key: modelData; label: Modules.name(modelData)
fallback: col.def("modules", modelData) ?? true
}
}
Heading { objectName: "dashboard/actions"; text: "Dashboard actions" }
Small { text: "Icon buttons at the bottom of the tablet's dashboard." }
Repeater {
model: col.allActions
Item {
id: act
required property string modelData
width: col.width
height: 34
Text {
id: actLabel
anchors { left: parent.left; verticalCenter: parent.verticalCenter }
width: 160
text: act.modelData
color: Theme.subtext
font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 3 }
}
Switch {
anchors { left: actLabel.right; leftMargin: 8; verticalCenter: parent.verticalCenter }
checked: col.actions.includes(act.modelData)
onToggled: on => col.setAction(act.modelData, on)
}
}
}
Heading { text: "Hardware" }
Small { text: "Each is auto, or a fixed value such as wlan0, BAT1 or coretemp." }
Setting { store: col.st; section: "hardware"; key: "net"; label: "Network interface"
placeholder: col.st.placeholder("hardware", "net") }
Setting { store: col.st; section: "hardware"; key: "battery"; label: "Battery"
placeholder: col.st.placeholder("hardware", "battery") }
Setting { store: col.st; section: "hardware"; key: "cpu_sensor"; label: "CPU sensor"
placeholder: col.st.placeholder("hardware", "cpu_sensor") }
Setting { store: col.st; section: "hardware"; key: "gpu"; label: "GPU"
placeholder: col.st.placeholder("hardware", "gpu"); hint: "auto (Intel xe) or none." }
Setting { store: col.st; section: "hardware"; key: "gpu_mem_total"; label: "GPU memory"
placeholder: col.st.placeholder("hardware", "gpu_mem_total"); hint: "The xe driver reports no VRAM size: the card's total, like 12G." }
}
|