/* Card per gruppo di modelli Antigravity (Gemini, Claude, GPT-OSS) */ import QtQuick import QtQuick.Layouts import org.kde.plasma.components 3.0 as PC3 import org.kde.kirigami as Kirigami Rectangle { id: root property string tag: "" property string title: "" property string models: "" property real remaining: 1.0 property real usedPercent: 0.0 property int resetAt: 0 property int clockTick: 0 property color accentColor: "#818cf8" function formatResetMoment() { if (!resetAt || resetAt <= 0) return "—" const d = new Date(resetAt * 1000) const now = new Date() if (d.toDateString() === now.toDateString()) { return d.toLocaleTimeString(Qt.locale(), "HH:mm") } return d.toLocaleDateString(Qt.locale(), "dd/MM") + " " + d.toLocaleTimeString(Qt.locale(), "HH:mm") } function countdown() { const tick = root.clockTick if (!resetAt || resetAt <= 0) return "—" let mins = Math.max(0, Math.floor((resetAt * 1000 - Date.now()) / 60000)) if (mins === 0) return i18n("ora") const days = Math.floor(mins / 1440) mins -= days * 1440 const hours = Math.floor(mins / 60) mins -= hours * 60 return days > 0 ? i18n("%1g %2h", days, hours) : i18n("%1h %2m", hours, mins) } Layout.fillWidth: true Layout.preferredHeight: 46 radius: 5 color: Qt.rgba(0, 0, 0, 0.28) border.width: 1 border.color: root.accentColor ColumnLayout { anchors.fill: parent anchors.margins: 4 spacing: 2 // Riga 1: Tag + Titolo + Modelli + % Residuo RowLayout { Layout.fillWidth: true spacing: 4 Rectangle { Layout.preferredWidth: 38 Layout.preferredHeight: 14 radius: 7 color: root.accentColor PC3.Label { anchors.centerIn: parent text: root.tag color: "#101012" font.bold: true font.pointSize: Kirigami.Theme.defaultFont.pointSize - 3 } } PC3.Label { text: root.title font.bold: true font.pointSize: Kirigami.Theme.defaultFont.pointSize - 1 } PC3.Label { text: "· " + root.models color: Kirigami.Theme.disabledTextColor font.pointSize: Kirigami.Theme.defaultFont.pointSize - 3 Layout.fillWidth: true elide: Text.ElideRight } PC3.Label { text: Math.round(root.remaining * 100) + "%" color: root.accentColor font.bold: true font.pointSize: Kirigami.Theme.defaultFont.pointSize } } // Riga 2: Barra di avanzamento Item { Layout.fillWidth: true Layout.preferredHeight: 5 Rectangle { id: track anchors.fill: parent radius: 2.5 color: Qt.rgba(0, 0, 0, 0.5) } Rectangle { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter width: track.width * Math.max(0, Math.min(1, root.remaining)) height: parent.height radius: 2.5 color: root.accentColor } } // Riga 3: Dettaglio usato + Orario esatto + Countdown RowLayout { Layout.fillWidth: true spacing: 4 PC3.Label { text: i18n("%1% usato", root.usedPercent.toFixed(1)) color: Kirigami.Theme.disabledTextColor font.pointSize: Kirigami.Theme.defaultFont.pointSize - 3 } Item { Layout.fillWidth: true } PC3.Label { text: i18n("reset %1 (%2)", root.formatResetMoment(), root.countdown()) color: root.accentColor font.pointSize: Kirigami.Theme.defaultFont.pointSize - 3 } } } }