// 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 "../.." // One engine or app: a state dot, a name, a detail line, and at most one // button. An empty action means no button, which is every engine row. Rectangle { id: row property string title property string detail property bool on: false property bool busy: false property string action: "" property bool danger: false signal triggered implicitHeight: Math.max(texts.implicitHeight, btn.visible ? btn.implicitHeight : 0) + 16 radius: 8 color: row.on ? Qt.alpha(Theme.accent, 0.10) : Qt.alpha(Theme.surface, 0.35) Rectangle { id: dot width: 8; height: 8; radius: 4 anchors { left: parent.left; leftMargin: 10; verticalCenter: parent.verticalCenter } color: row.busy ? Theme.yellow : row.on ? Theme.green : Theme.subtext } Column { id: texts anchors { left: dot.right; leftMargin: 10 right: btn.visible ? btn.left : parent.right; rightMargin: 10 verticalCenter: parent.verticalCenter } spacing: 2 Text { width: parent.width elide: Text.ElideRight text: row.title font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2; bold: row.on } color: row.on ? Theme.text : Theme.subtext } Text { width: parent.width elide: Text.ElideRight text: row.detail font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 4 } color: Theme.subtext } } Button { id: btn anchors { right: parent.right; rightMargin: 10; verticalCenter: parent.verticalCenter } visible: row.action !== "" text: row.action danger: row.danger onClicked: row.triggered() } }