From 2136122398839b0be3e295085b641c9fcef24bf7 Mon Sep 17 00:00:00 2001 From: Carlo Date: Sun, 11 Oct 2026 11:35:49 +0200 Subject: [PATCH] =?UTF-8?q?0.6.9:=20azione=20sulla=20copertina=20(P8)=20?= =?UTF-8?q?=E2=80=94=20il=20boost=20senza=20aprire=20l'app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sulla copertina compare l'icona del boost (CoverAction). Una sola azione: la documentazione Silica ammette piu' di una azione ma dice che lo stile delle app di sistema ne mostra una. CoverBackground eredita da Cover, quindi l'elenco dichiarato li' si attacca; l'icona e' iconSource (non icon.source del Button: sbagliarlo non da' errore, l'icona semplicemente non compare). La riga in fondo si ancora a Cover.coverActionArea, cosi' l'icona non la copre. Nuovo controllo statico tests/cover_action_check.py: elenco figlio diretto del Cover, una sola azione, icona che esiste, id del comando presente nella tabella del bridge. Il componente e' nominato nella guida Silica dell'SDK di Carlo. --- README.it.md | 2 + README.md | 2 + docs/PIANO.md | 17 +++++- docs/UX-STUDIO.md | 17 +++--- docs/anteprima/copertina.png | Bin 23556 -> 25350 bytes docs/anteprima/it/copertina.png | Bin 23584 -> 25378 bytes qml/cover/CoverPage.qml | 18 +++++- rpm/harbour-aira.spec | 13 ++++- scripts/render_mockups.py | 8 ++- src/main.cpp | 4 +- tests/cover_action_check.py | 97 ++++++++++++++++++++++++++++++++ 11 files changed, 164 insertions(+), 14 deletions(-) create mode 100644 tests/cover_action_check.py diff --git a/README.it.md b/README.it.md index a091524..9ea1be3 100644 --- a/README.it.md +++ b/README.it.md @@ -166,6 +166,7 @@ nessuno. Impiegano millisecondi e dicono il file di cui non sono contenti: python3 tests/qml_check_bindings.py qml # nessuna proprietà assegnata due volte python3 tests/qml_focus_check.py # un tocco apre solo quello che ha toccato python3 tests/label_fit_check.py # le etichette dei tasti ci stanno +python3 tests/cover_action_check.py # l'azione di copertina c'e' ed e' collegata ``` ## Stato @@ -236,6 +237,7 @@ tests/ui_contract_check.py chiavi dei QML contro quelle del bridge (bridge atti tests/qml_check_bindings.py assegnazioni duplicate di proprieta' nei QML tests/qml_focus_check.py un tocco apre solo le regolazioni di quell'oggetto tests/label_fit_check.py le etichette dei tasti ci stanno accanto all'icona +tests/cover_action_check.py azione di copertina: figlia diretta del Cover, icona e comando esistono bridge/aira_bridge.py servizio HTTP/1.1 + JSON verso il cloud (gRPC) bridge/setup_creds.py salva le credenziali Aira (file 600) bridge/aira_probe.py sonda di sola lettura: login + stato impianto diff --git a/README.md b/README.md index 4fce3e7..67d0858 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ milliseconds and name the file they are unhappy about: python3 tests/qml_check_bindings.py qml # no property assigned twice in one object python3 tests/qml_focus_check.py # a tap opens only the object it touched python3 tests/label_fit_check.py # quick-action labels fit the button +python3 tests/cover_action_check.py # the cover action is declared and wired ``` ## Status @@ -250,6 +251,7 @@ tests/ui_contract_check.py QML keys vs bridge keys (bridge must be running) tests/qml_check_bindings.py duplicate property assignments in the QML tests/qml_focus_check.py a tap opens only that object's settings tests/label_fit_check.py quick-action labels fit next to the icon (measured on a phone) +tests/cover_action_check.py cover action: direct child of Cover, icon exists, command exists bridge/ local HTTP bridge -> see bridge/README.md translations/ harbour-aira-it.ts (English is the source language) docs/PIANO.md project plan and decisions (Italian) diff --git a/docs/PIANO.md b/docs/PIANO.md index 48543cd..9fbef6f 100644 --- a/docs/PIANO.md +++ b/docs/PIANO.md @@ -367,6 +367,21 @@ una si allunga il controllo lo segnala) e `docs/icona/tasti-alla-misura-vera.png per l'occhio. Il pulsante Silica non espone il carattere, quindi non si può rimpicciolire il testo: l'unica leva è l'icona. -**Stato attuale (0.6.8).** 85/85 verifiche del nucleo, 48/48 del bridge, +**0.6.9 — l'azione sulla copertina (P8).** Sulla copertina c'è l'icona del +boost: si avvia il boost dell'acqua calda senza aprire l'app. Una sola azione, +perché la documentazione Silica dice che due si possono avere ma che lo stile +delle app di sistema ne mostra una. Il componente esiste: `CoverActionList` e +`CoverAction` sono nominati nella guida Silica che sta nell'SDK, e +`CoverBackground` eredita da `Cover`, quindi l'elenco dichiarato lì si attacca +(non serve avvolgere la copertina in un `Cover`). L'icona si dichiara con +`iconSource`, non con `icon.source` del pulsante `Button`: sbagliarlo non dà +errore, semplicemente l'icona non compare. La riga in fondo (esterna o «non +aggiornato») si ancora a `Cover.coverActionArea`, così l'icona dell'azione non +la copre; se l'area non c'è la riga resta dov'era. Nuovo controllo statico +`tests/cover_action_check.py`: elenco figlio diretto, una sola azione, icona che +esiste, e l'id del comando confrontato con la tabella del bridge — un id +sbagliato sarebbe un 400 scoperto solo sul telefono. + +**Stato attuale (0.6.9).** 85/85 verifiche del nucleo, 48/48 del bridge, 191/191 stringhe tradotte, `qmllint` pulito, contratto UI↔bridge rispettato. Nessun comando è stato inviato all'impianto: tutto quanto sopra è a sola lettura. diff --git a/docs/UX-STUDIO.md b/docs/UX-STUDIO.md index 6917f61..6a0da83 100644 --- a/docs/UX-STUDIO.md +++ b/docs/UX-STUDIO.md @@ -24,14 +24,14 @@ Le quattro scelte, applicate: compatta con il pallino colorato. 2. "Altri comandi" è diventata **"Comandi impianto"**. 3. Le azioni rapide sono **pulsanti visibili** in Home. -4. Azioni sulla copertina: **rimandate** a dopo la prova di `CoverAction` sul kit. +4. Azioni sulla copertina: **fatte** in 0.6.9 (il boost). Il componente c'è: la guida Silica dell'SDK nomina `CoverActionList` e `CoverAction`. Problemi risolti: P1 (Home di consultazione), P2 (feedback ancorato), P3 (interruttori), P4 (un solo percorso per pagina), P5 (un blocco per grandezza, valori rapidi), P6 (numeri vecchi spenti + ora), P7 ("esterna"), P9, P10 (diagnostica in Impianto), P11. -Rimandato: P8 (azioni sulla copertina), in attesa della prova sul telefono. +Fatto in 0.6.9: P8 (azione boost sulla copertina), con `tests/cover_action_check.py`. Verifiche fatte qui: **85 verifiche del nucleo** (erano 79), `qmllint` pulito su tutti i file QML, 191/191 stringhe tradotte, anteprime rigenerate in inglese e @@ -242,9 +242,10 @@ Resta com'è nelle letture (casa grande, ACS, esterna), con due migliorie basse: - Dicitura chiara: "esterna" invece di "est." (P7). - **Azioni sulla copertina**: Silica ha `CoverAction`/`CoverActionList` - documentati ("un'azione per una copertina"). Una o due icone — boost e - assenza — permettono di agire senza aprire l'app (P8). È rifinitura: da - provare sul kit prima di contarla, come ultimo passo. + documentati ("un'azione per una copertina"). Fatto in 0.6.9 con **una** icona — + il boost — perché la documentazione dice che due si possono avere ma che lo + stile delle app di sistema ne mostra una. Si può aggiungere l'assenza quando + serve. Attenzione: qui l'icona è `iconSource`, non `icon.source` del `Button`. ### 4.6 Feedback e stato non aggiornato (P2, P6) @@ -336,7 +337,7 @@ davvero: **quanti tocchi per T2 e T3**, prima e dopo. | Rischio | Come si governa | |---|---| | `TextSwitch` documentato ma non istanziabile sul kit 5.1 | Provarlo in una pagina di prova alla prima build; ripiego: si resta sui pulsanti (già funzionanti) | -| `CoverAction` idem | È l'ultimo passo; se non c'è, la copertina resta com'è | +| `CoverAction` | C'è: nominato nella guida Silica dell'SDK. Usato in 0.6.9, con `tests/cover_action_check.py` | | Le anteprime non rappresentano lo scroll reale | La riga di log con `contentHeight` dà la misura vera | | Un interruttore che anticipa lo stato (bug classico) | `checked` legato ai dati del bridge, non al tocco (§4.4) | | Il cambio lingua ricarica la radice (Qt 5.6) | Nessun impatto: già così | @@ -363,5 +364,5 @@ una build e un controllo tuo sul telefono. 2. **"Altri comandi" → "Comandi impianto"**: rinominare? 3. **Azioni rapide**: pulsanti visibili sulla Home (proposta) o menù dal basso all'altezza del pollice? -4. **Copertina con le azioni**: la facciamo (dopo aver verificato `CoverAction` - sul kit) o resta di sola lettura? +4. **Copertina con le azioni**: fatto in 0.6.9 — il boost sulla copertina. Se + serve, si aggiunge l'assenza (una sola per lo stile di sistema). diff --git a/docs/anteprima/copertina.png b/docs/anteprima/copertina.png index 28cbfb2435d621c581aa16536776f6877162ccb0..96548cda75f47a5f1750ca55a205c1654654cbcb 100644 GIT binary patch literal 25350 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 literal 23556 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 literal 23584 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

D2rwmw%%*k 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 diff --git a/qml/cover/CoverPage.qml b/qml/cover/CoverPage.qml index 0bfb7e6..550b7f6 100644 --- a/qml/cover/CoverPage.qml +++ b/qml/cover/CoverPage.qml @@ -149,7 +149,10 @@ CoverBackground { Label { anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom + // Sopra l'area delle azioni: quando l'azione c'e', Silica disegna li' + // l'icona del boost, che non deve coprire questa riga. Se l'area non + // c'e' la riga resta attaccata al fondo, come prima. + anchors.bottom: cover.coverActionArea ? cover.coverActionArea.top : parent.bottom anchors.bottomMargin: Theme.paddingMedium // Qui c'e' posto per dire che i numeri non sono freschi. text: api.stale @@ -160,4 +163,17 @@ CoverBackground { truncationMode: TruncationMode.Fade width: parent.width - 2 * Theme.paddingMedium } + + // ---- azione sulla copertina (P8) --------------------------------------- // + // Agire senza aprire l'app: il boost dell'acqua calda. Una sola, perche' la + // documentazione Silica dice che due azioni si possono avere ma che lo stile + // delle app di sistema ne mostra una. CoverBackground eredita da Cover, + // quindi l'elenco si attacca: e' il posto documentato dove dichiararlo. + // Il componente e' in Sailfish.Silica 1.0 (verificato nella guida dell'SDK). + CoverActionList { + CoverAction { + iconSource: "../icons/quick-boost.png" + onTriggered: api.sendCommand("hot_water_boost_on") + } + } } diff --git a/rpm/harbour-aira.spec b/rpm/harbour-aira.spec index f7303a3..e20f136 100644 --- a/rpm/harbour-aira.spec +++ b/rpm/harbour-aira.spec @@ -1,6 +1,6 @@ Name: harbour-aira Summary: Control your Aira heat pump through a local bridge -Version: 0.6.8 +Version: 0.6.9 Release: 1 Group: Qt/Qt License: MIT @@ -37,6 +37,17 @@ Address and token of the bridge live in the app settings (AppConfigLocation); no personal data is stored in the binary. %changelog +* Sun Oct 11 2026 Carlo - 0.6.9-1 +- copertina: azione rapida (P8 del piano). Sulla copertina compare l'icona del + boost: si avvia il boost dell'acqua calda senza aprire l'app. Una sola azione, + perche' la documentazione Silica dice che due si possono avere ma che lo stile + delle app di sistema ne mostra una. La riga dei dati non freschi si sposta + sopra l'area delle azioni (Cover.coverActionArea), cosi' l'icona non la copre. + Componente e nomi verificati nella guida dell'SDK (CoverActionList, CoverAction, + iconSource, onTriggered: attenzione, e' iconSource, non icon.source del Button) +- nuovo controllo statico tests/cover_action_check.py: elenco figlio diretto del + Cover, una sola azione, icona che esiste, comando presente nella tabella del + bridge (un id sbagliato sarebbe un 400 scoperto solo sul telefono) * Sun Oct 11 2026 Carlo - 0.6.8-1 - Home: le icone dei tasti rimpicciolite. Il pulsante Silica, se non si dice altro, disegna l'icona a Theme.iconSizeMedium (64 px): in un tasto largo un diff --git a/scripts/render_mockups.py b/scripts/render_mockups.py index 39d4db3..d0cb086 100644 --- a/scripts/render_mockups.py +++ b/scripts/render_mockups.py @@ -586,8 +586,14 @@ def cover_screen() -> Image.Image: d.text((card[0] + colonna + d.textlength(ora, font=font(30, bold=True)), y + 4), "/" + obiettivo + " °C", font=font(24), fill=SECONDARY) y += 72 - d.text((card[0] + 34, card[3] - 62), + d.text((card[0] + 34, card[3] - 118), T("cover_outdoor") + " " + dec(18.0) + " °C", font=font(22), fill=SECONDARY) + # l'azione sulla copertina (P8): il boost, nell'area in basso. Dove la + # disegni Silica lo decide lei; qui si mostra che c'e'. + icona = Image.open(OUT.parent.parent / "qml" / "icons" / "quick-boost.png").convert("RGBA") + lato = 64 + icona = icona.resize((lato, lato), Image.LANCZOS) + img.paste(icona, (int(card[0] + (card[2] - card[0] - lato) / 2), card[3] - 96), icona) return img diff --git a/src/main.cpp b/src/main.cpp index c576d1f..1a03981 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,7 +21,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) app->setOrganizationName(QStringLiteral("harbour")); app->setApplicationName(QStringLiteral("aira")); - app->setApplicationVersion(QStringLiteral("0.6.8")); + app->setApplicationVersion(QStringLiteral("0.6.9")); Settings settings; ApiClient api(&settings); @@ -36,7 +36,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) // Prima riga del log: dice subito se il device sta girando la build nuova // o una stale (trappola nota del build engine). - qDebug() << "harbour-aira v0.6.8 build" << __DATE__ << __TIME__; + qDebug() << "harbour-aira v0.6.9 build" << __DATE__ << __TIME__; view->rootContext()->setContextProperty(QStringLiteral("appSettings"), &settings); view->rootContext()->setContextProperty(QStringLiteral("api"), &api); diff --git a/tests/cover_action_check.py b/tests/cover_action_check.py new file mode 100644 index 0000000..fb69e96 --- /dev/null +++ b/tests/cover_action_check.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Controllo statico dell'azione sulla copertina (P8 del piano). + +Verifica le regole che la documentazione Silica pone sulle azioni di copertina, +e che il componente sia usato come va usato: + + - il `CoverActionList` sta come figlio diretto della copertina (qui la radice + e' `CoverBackground`, che eredita da `Cover`: e' li' che va dichiarato). + Un elenco annidato dentro un altro elemento non si attaccherebbe; + - al massimo una azione: la documentazione dice che due si possono avere, ma + che lo stile delle app di sistema ne mostra una; + - l'icona si dichiara con `iconSource` (non `icon.source`, che e' del + pulsante Button: sbagliarlo qui non da' errore, l'icona semplicemente non + compare); + - l'icona esiste davvero, risolta rispetto al file QML che definisce la + copertina; + - il comando che l'azione invia esiste nella tabella dei comandi del bridge + (un id sbagliato lo scoprirebbe solo il telefono, con un 400). + +Non serve il kit Silica: legge i file. Uscita 0 = tutto a posto. +""" +import pathlib +import re +import sys + +RADICE = pathlib.Path(__file__).resolve().parent.parent +COPERTINA = RADICE / "qml" / "cover" / "CoverPage.qml" +BRIDGE = RADICE / "bridge" / "aira_bridge.py" + + +def main(): + if not COPERTINA.exists(): + print("ESITO: manca %s" % COPERTINA) + return 1 + testo = COPERTINA.read_text(encoding="utf-8") + righe = testo.splitlines() + problemi = [] + + radice = next((r.strip() for r in righe + if re.match(r"^[A-Z][A-Za-z]*\s*\{", r)), "") + if not re.match(r"CoverBackground|Cover\s*\{", radice): + problemi.append("la radice della copertina e' %r: le azioni vanno dentro " + "un Cover (CoverBackground eredita da Cover)" % radice[:40]) + + # il CoverActionList deve stare al primo livello dentro la radice + elenchi = [(i, r) for i, r in enumerate(righe) if re.match(r"^\s*CoverActionList\s*\{", r)] + if not elenchi: + print("nessuna azione sulla copertina: niente da controllare (0.6.8 e prima)") + return 0 + for i, r in elenchi: + rientro = len(r) - len(r.lstrip()) + if rientro != 4: + problemi.append("riga %d: il CoverActionList e' rientrato di %d spazi, " + "deve essere figlio diretto della copertina" % (i + 1, rientro)) + + azioni = [r for r in righe if re.match(r"^\s*CoverAction\s*\{", r)] + if len(azioni) > 1: + problemi.append("%d azioni: la documentazione Silica ne ammette piu' di una " + "ma lo stile delle app di sistema ne mostra una" % len(azioni)) + + if re.search(r"^\s*icon\.source\s*:", testo, re.M): + problemi.append("usa `iconSource`, non `icon.source`: `icon.source` e' del " + "pulsante Button e qui non darebbe errore, solo nessuna icona") + + for m in re.finditer(r'iconSource\s*:\s*"([^"]+)"', testo): + icona = (COPERTINA.parent / m.group(1)).resolve() + if not icona.exists(): + problemi.append("l'icona %s non esiste (risolta da %s)" + % (m.group(1), COPERTINA.name)) + else: + print("icona: %s -> %s" % (m.group(1), icona.relative_to(RADICE))) + + comandi = re.findall(r'sendCommand\("([^"]+)"', testo) + if not comandi: + problemi.append("l'azione non invia nessun comando: a che serve?") + for c in comandi: + if not BRIDGE.exists(): + print("salto il controllo del comando %r: manca %s" % (c, BRIDGE)) + continue + ponte = BRIDGE.read_text(encoding="utf-8") + if not re.search(r'"%s"\s*:' % re.escape(c), ponte): + problemi.append("il comando %r non e' nella tabella del bridge: " + "il telefono riceverebbe un 400" % c) + else: + print("comando: %s -> presente nel bridge" % c) + + if problemi: + for p in problemi: + print("PROBLEMA: %s" % p) + print("ESITO: %d problemi sull'azione di copertina" % len(problemi)) + return 1 + print("ESITO: azione di copertina a posto") + return 0 + + +if __name__ == "__main__": + sys.exit(main())