diff --git a/docs/PIANO.md b/docs/PIANO.md index 5680b15..b50e7a2 100644 --- a/docs/PIANO.md +++ b/docs/PIANO.md @@ -521,7 +521,34 @@ coordinate arrivano nel registro del bridge, e l'agente le legge. Verificato prima di consegnarlo: POST con token → 200 e riga nel registro, senza token → 401. -## 17. Conseguenze dell'uso reale (0.7.0) +## 17. Il banner del remorse sui tasti rapidi — v0.7.6 + +Carlo: *"Il problema c'e' quando premo un pulsante"*. Meta' della diagnosi stava +in quella frase, e nessuno l'aveva ancora detta: succede **alla pressione**. + +In Silica `RemorseItem` eredita da `RemorseBase`, che e' uno **`SwipeItem`** e +alla `execute()` fa `parent = item.parent`: **si ri-parenta dentro il contenitore +dell'oggetto premuto**. I tasti rapidi della Home stanno in una `Row` di tre, e +il riquadro del remorse non ha la larghezza del tasto: il suo `BannerBackground` +(il messaggio piu' il conto alla rovescia) viene disegnato a margini fissi e +finisce **sopra i tasti vicini**. Ecco il "copre i pulsanti": non la fila che si +sposta, ma un banner disegnato sopra. + +- `MainPage.qml`: tolti i tre `remorse.execute(...)` (boost, assenza-off). Il + messaggio lo mostra gia' la `NoticeBar` in fondo: era un doppione *e* il danno. +- `NoticeBar.qml`: altezza **fissa** a una riga (`elide`, non `wrap`) e proprieta' + `banda`, cosi' le pagine possono riservarle lo spazio; +- le cinque pagine con la barra (`MainPage`, `CommandsPage`, `DataPage`, + `PlantPage`, `SetpointsPage`): `anchors.bottomMargin: notice.banda` sulla + `SilicaFlickable` — il messaggio non copre piu' il contenuto e non lo sposta + quando compare. + +Lezione di metodo: il comportamento vero dei componenti Silica sta nel loro +sorgente (`/usr/lib64/qt5/qml/Sailfish/Silica/…`), non in quello che +sembra leggendo il proprio QML. `RemorseBase.qml` ha dato la risposta in un +minuto, dopo tre diagnosi dedotte e sbagliate. + +## 18. Conseguenze dell'uso reale (0.7.0) Deciso con l'uso, non in anticipo: diff --git a/qml/components/NoticeBar.qml b/qml/components/NoticeBar.qml index 73e43f1..ebdfe69 100644 --- a/qml/components/NoticeBar.qml +++ b/qml/components/NoticeBar.qml @@ -17,7 +17,11 @@ Rectangle { right: parent.right bottom: parent.bottom } - height: message.height + 2 * Theme.paddingMedium + // Altezza FISSA, una riga sola: le pagine riservano questo spazio sotto la + // zona che scorre (`anchors.bottomMargin: notice.banda`), cosi' il messaggio + // non copre mai il contenuto e non sposta niente quando compare. + readonly property real banda: Theme.fontSizeSmall * 2.2 + 2 * Theme.paddingMedium + height: banda color: Qt.rgba(0, 0, 0, 0.78) opacity: api.notice.length > 0 ? 1 : 0 visible: opacity > 0 @@ -37,6 +41,7 @@ Rectangle { text: api.notice color: api.noticeIsError ? Theme.errorColor : Theme.highlightColor font.pixelSize: Theme.fontSizeSmall - wrapMode: Text.Wrap + maximumLineCount: 1 + elide: Text.ElideRight } } diff --git a/qml/pages/CommandsPage.qml b/qml/pages/CommandsPage.qml index e6486d9..611a929 100644 --- a/qml/pages/CommandsPage.qml +++ b/qml/pages/CommandsPage.qml @@ -38,6 +38,8 @@ Page { SilicaFlickable { anchors.fill: parent + // Banda riservata al messaggio in fondo: cosi' non copre il contenuto. + anchors.bottomMargin: notice.banda contentHeight: col.height + Theme.paddingLarge PullDownMenu { @@ -167,5 +169,5 @@ Page { } } - NoticeBar { } + NoticeBar { id: notice } } diff --git a/qml/pages/DataPage.qml b/qml/pages/DataPage.qml index 8cef821..2009dfc 100644 --- a/qml/pages/DataPage.qml +++ b/qml/pages/DataPage.qml @@ -73,6 +73,8 @@ Page { SilicaFlickable { anchors.fill: parent + // Banda riservata al messaggio in fondo: cosi' non copre il contenuto. + anchors.bottomMargin: notice.banda contentHeight: col.height + Theme.paddingLarge PullDownMenu { @@ -235,7 +237,7 @@ Page { } } - NoticeBar { } + NoticeBar { id: notice } Component.onCompleted: { if (api.configured) { diff --git a/qml/pages/MainPage.qml b/qml/pages/MainPage.qml index 5bf3a06..ea5f957 100644 --- a/qml/pages/MainPage.qml +++ b/qml/pages/MainPage.qml @@ -92,12 +92,17 @@ Page { misura.start() } - // Fuori dal pulsante: dentro il pulsante i figli finiscono nel contentItem. - RemorseItem { id: remorse } + // Niente RemorseItem sui tasti rapidi: Silica se lo ri-parenta dentro la + // fila dei tre tasti e ci disegna sopra il suo banner (il riquadro del + // remorse non ha la larghezza del tasto), coprendo i tasti vicini. Il + // messaggio lo dice la NoticeBar in fondo: la stessa cosa, senza rompere + // la fila. Segnalato da Carlo: "il problema c'e' quando premo un pulsante". SilicaFlickable { id: flick anchors.fill: parent + // Banda riservata al messaggio in fondo: cosi' non copre il contenuto. + anchors.bottomMargin: notice.banda contentHeight: col.height + Theme.paddingLarge // I menu pulley stanno DENTRO la vista: come figli diretti della Page @@ -291,14 +296,10 @@ Page { : "../icons/quick-boost.png" icon.width: Theme.iconSizeExtraSmall icon.height: Theme.iconSizeExtraSmall - onClicked: remorse.execute( - boostBtn, - api.boostActive ? qsTr("Stopping DHW boost") - : qsTr("Starting DHW boost"), - function() { - api.sendCommand(api.boostActive ? "hot_water_boost_off" - : "hot_water_boost_on") - }) + // Comando diretto: il messaggio lo mostra la NoticeBar in + // fondo, senza il banner del remorse sulla fila dei tasti. + onClicked: api.sendCommand(api.boostActive ? "hot_water_boost_off" + : "hot_water_boost_on") } Button { @@ -314,8 +315,7 @@ Page { icon.height: Theme.iconSizeExtraSmall onClicked: { if (page.raw("away_mode")) { - remorse.execute(assenzaBtn, qsTr("Away mode off"), - function() { api.sendCommand("away_mode_off") }) + api.sendCommand("away_mode_off") } else { // L'assenza si imposta da un popup con le date // (richiesta dell'utente): si apre qui e il comando @@ -373,7 +373,7 @@ Page { } } - NoticeBar { } + NoticeBar { id: notice } // La disposizione non e' definitiva subito: si misura un secondo dopo. // Questa e' la riga da leggere alla prima build sul telefono: la Home deve diff --git a/qml/pages/PlantPage.qml b/qml/pages/PlantPage.qml index 6599745..61f5bb4 100644 --- a/qml/pages/PlantPage.qml +++ b/qml/pages/PlantPage.qml @@ -47,6 +47,8 @@ Page { SilicaFlickable { anchors.fill: parent + // Banda riservata al messaggio in fondo: cosi' non copre il contenuto. + anchors.bottomMargin: notice.banda contentHeight: col.height + Theme.paddingLarge PullDownMenu { @@ -206,7 +208,7 @@ Page { } } - NoticeBar { } + NoticeBar { id: notice } Component.onCompleted: { if (api.configured) diff --git a/qml/pages/SetpointsPage.qml b/qml/pages/SetpointsPage.qml index bc92752..304f9c2 100644 --- a/qml/pages/SetpointsPage.qml +++ b/qml/pages/SetpointsPage.qml @@ -76,6 +76,8 @@ Page { SilicaFlickable { anchors.fill: parent + // Banda riservata al messaggio in fondo: cosi' non copre il contenuto. + anchors.bottomMargin: notice.banda contentHeight: col.height + Theme.paddingLarge PullDownMenu { @@ -260,5 +262,5 @@ Page { } } - NoticeBar { } + NoticeBar { id: notice } } diff --git a/rpm/harbour-aira.spec b/rpm/harbour-aira.spec index ec005cc..2c7d095 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.7.5 +Version: 0.7.6 Release: 1 Group: Qt/Qt License: MIT @@ -37,6 +37,11 @@ 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.7.6-1 +- via il RemorseItem dai tasti rapidi: Silica se lo ri-parenta dentro la fila + dei tre tasti e ci disegna sopra il banner, coprendoli (succedeva premendo); +- la barra messaggi ha altezza fissa e una banda riservata sotto il contenuto, + cosi' non copre piu' niente e non sposta niente quando compare. * Sun Oct 11 2026 Carlo - 0.7.5-1 - La Home manda le sue misure al bridge (rotta /layout): cosi' la disposizione si corregge guardando i numeri veri del telefono, non deducendoli. diff --git a/src/main.cpp b/src/main.cpp index 114519e..ec1e4b7 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.7.5")); + app->setApplicationVersion(QStringLiteral("0.7.6")); 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.7.5 build" << __DATE__ << __TIME__; + qDebug() << "harbour-aira v0.7.6 build" << __DATE__ << __TIME__; view->rootContext()->setContextProperty(QStringLiteral("appSettings"), &settings); view->rootContext()->setContextProperty(QStringLiteral("api"), &api); diff --git a/translations/harbour-aira-it.ts b/translations/harbour-aira-it.ts index fb54bcc..2b6a30d 100644 --- a/translations/harbour-aira-it.ts +++ b/translations/harbour-aira-it.ts @@ -247,117 +247,117 @@ CommandsPage - + Away mode Assenza - + Forced heating Riscaldamento forzato - + Hot water active Acqua calda attiva - + Noise Rumore - + Night mode for one hour Night mode per un'ora - + Heating Riscaldamento - + Refresh Aggiorna - + Data Dati - + Plant Impianto - + Settings Impostazioni - + Plant commands Comandi impianto - + Modes Modalità - + Lowers the house and stops the hot water Abbassa la casa e spegne l'acqua calda - + Heats at full power until you stop it Scalda a pieno regime finché non lo fermi - + The heating can turn on Il riscaldamento può accendersi - + Heating will be disabled Il riscaldamento verrà disabilitato - + Domestic hot water Acqua calda sanitaria - + The heat pump keeps the water in temperature Mantiene l'acqua in temperatura - + Legionella cycle Ciclo antilegionella - + Starting the legionella cycle: it takes a while Avvio del ciclo antilegionella: richiede tempo - + The switches show the current state of the plant: the Status section is not needed any more. Gli interruttori mostrano lo stato attuale: la sezione Stato non serve più. - + Domestic hot water will stop being heated L'acqua calda smetterà di essere riscaldata - + Commands go through the bridge and may take a few seconds. The status refreshes by itself afterwards. I comandi passano dal bridge e possono richiedere qualche secondo. Dopo l'invio lo stato si aggiorna da solo. @@ -398,122 +398,122 @@ nessun dato - + Refresh Aggiorna - + Plant Impianto - + Settings Impostazioni - + Data Dati - + Numbers calculated by Aira in the cloud: the app only reads them from your own bridge. Numeri calcolati da Aira nel cloud: l'app li legge soltanto dal tuo bridge. - + Reading the data... Lettura dei dati in corso... - + Month of %1 Mese di %1 - + This month Questo mese - + Heat produced Calore prodotto - + What the heat pump gave the house Quanto la pompa ha dato alla casa - + Electricity used Elettricità usata - + What the heat pump took from the grid Quanta ne ha presa dalla rete - + Efficiency, domestic hot water Efficienza, acqua calda - + Efficiency, heating Efficienza, riscaldamento - + Efficiency (COP) is how much heat the pump delivers for each unit of electricity: higher is better. L'efficienza (COP) è quanto calore la pompa produce per ogni unità di elettricità: più alta è, meglio è. - + Your savings, last %1 days I tuoi risparmi, ultimi %1 giorni - + Saved on the bill Risparmiati in bolletta - + Compared with a gas boiler Rispetto a una caldaia a gas - + CO₂ avoided CO₂ evitata - + Not released into the air Non immessa nell'aria - + Smart Tariff Control Smart Tariff Control - + Saving from heating when energy is cheaper Risparmio scaldando quando l'energia costa meno - + Efficiency month by month Efficienza mese per mese - + Savings month by month Risparmi mese per mese @@ -536,77 +536,67 @@ Aggiornato alle %1 - + Refresh Aggiorna - - + + Settings Impostazioni - + House Casa - - + + target %1 °C obiettivo %1 °C - + Hot water Acqua calda - + Boost · %1 Boost · %1 - + Tap a value to adjust it Tocca un valore per regolarlo - + Quick actions Azioni rapide - + Boost Boost - + Stop Stop - - Stopping DHW boost - Fermo il boost - - - + Home Torna - + Away Assenza - - - Away mode off - Assenza disattivata - More @@ -618,22 +608,17 @@ Esterno %1 °C · Termostato %2 °C · Zone %3 - + Data Dati - + Bridge not configured. Open the settings and enter the server address and the token. Bridge non configurato. Apri le impostazioni e inserisci l'indirizzo del server e il token. - - Starting DHW boost - Avvio del boost ACS - - - + Plant Impianto @@ -651,217 +636,217 @@ no - + Refresh Aggiorna - + Data Dati - + Settings Impostazioni - + Plant Impianto - + Status Stato - + Connection Connessione - + Mode Modalità - + Away mode Modalità assenza - + Night mode Modalità notte - + Forced heating Riscaldamento forzato - + Inline heater Resistenza interna - + Manual mode Modalità manuale - + Defrost Sbrinamento - + Signature lights Luci di firma - + Pump Pompa - + Allowed modes Modi consentiti - + Outdoor temperature Temperatura esterna - + Indoor temperature (pump) Temperatura interna (pompa) - + Zones Zone - + Last reading Ultima lettura - + Accessories Accessori - + No wall thermostat Nessun termostato a parete - + Aira wall thermostat Termostato a parete Aira - + Zone %1 · Connected Zona %1 · Connesso - + Measured temperature Temperatura misurata - + Humidity Umidità - + Signal Segnale - + Battery Batteria - + low scarica - + ok ok - + Article Articolo - + Versions Versioni - + Device ID ID dispositivo - + Platform Piattaforma - + Connectivity Connettività - + Climate control Controllo climatico - + Outdoor unit Unità esterna - + Outdoor unit EEPROM EEPROM unità esterna - + Errors Errori - + No errors reported by the plant. Nessun errore segnalato dall'impianto. - + Errors reported Errori segnalati - + Diagnostics Diagnostica - + Plant check Verifica impianto @@ -869,117 +854,117 @@ SetpointsPage - + Refresh Aggiorna - + Data Dati - + Plant Impianto - + Settings Impostazioni - + Setpoints Regolazioni - + Heating the house Riscaldamento della casa - + Current target Obiettivo attuale - + What the plant is keeping now Quello che l'impianto mantiene adesso - + New house target Nuovo obiettivo casa - + Set house to %1 °C Imposta casa a %1 °C - + House temperature to %1 °C Temperatura della casa a %1 °C - + Domestic hot water Acqua calda sanitaria - + DHW target Obiettivo acqua calda - + Water now %1 °C Acqua ora %1 °C - + New target Nuovo obiettivo - + Set target %1 °C Imposta obiettivo %1 °C - + DHW target to %1 °C Obiettivo ACS a %1 °C - + Hot water boost Boost acqua calda - + Start DHW boost Avvia boost ACS - + Starting DHW boost Avvio del boost ACS - + Stop DHW boost Ferma boost ACS - + Stopping DHW boost Arresto del boost ACS - + Commands go through the bridge and may take a few seconds. The status refreshes by itself afterwards. I comandi passano dal bridge e possono richiedere qualche secondo. Dopo l'invio lo stato si aggiorna da solo.