// 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 Rectangle { id: tile property string icon: "" property string label: "" property Component content: null property bool active: false signal clicked implicitHeight: 96 radius: 12 color: area.containsMouse ? Qt.alpha(Theme.accent, 0.22) : Qt.alpha(Theme.surface, active ? 0.7 : 0.35) border.width: 1 border.color: active ? Qt.alpha(Theme.accent, 0.5) : Qt.alpha(Theme.text, 0.08) Behavior on color { ColorAnimation { duration: 120 } } Column { anchors { left: parent.left; right: parent.right verticalCenter: parent.verticalCenter leftMargin: 14; rightMargin: 14 } spacing: 6 Text { text: tile.icon font { family: Theme.fontFamily; pixelSize: 22 } color: tile.active ? Theme.accent : Theme.text } Text { width: parent.width elide: Text.ElideRight text: tile.label font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2; bold: true } color: Theme.text } // The state line. A module with nothing to say leaves this null and // the tile is icon and label only. Loader { width: parent.width active: tile.content !== null sourceComponent: tile.content } } MouseArea { id: area anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: tile.clicked() } }