// 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, at most one // button, and a Restart before it when restartable. 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 property bool restartable: false signal triggered signal restart 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: restartBtn.visible ? restartBtn.left : 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: restartBtn anchors { right: btn.left; rightMargin: 6; verticalCenter: parent.verticalCenter } visible: row.restartable text: "Restart" onClicked: row.restart() } Button { id: btn anchors { right: parent.right; rightMargin: 10; verticalCenter: parent.verticalCenter } visible: row.action !== "" text: row.action danger: row.danger onClicked: row.triggered() } }