// Copyright (C) 2026 Danilo M. // // 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." } }