From 6fcf05a2891321f6e84e74728458d173f300f4e6 Mon Sep 17 00:00:00 2001 From: Carlo Baratto Date: Mon, 7 Sep 2026 17:47:57 +0200 Subject: [PATCH] =?UTF-8?q?0.4.11:=20slider=20margini=20rimossi=20dalle=20?= =?UTF-8?q?Impostazioni=20(resta=20il=20dialog=20nel=20lettore);=20margini?= =?UTF-8?q?=20alto/basso=20strutturali=20=E2=80=94=20finestra=20di=20lettu?= =?UTF-8?q?ra=20dentro=20i=20margini,=20identici=20su=20ogni=20pagina?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qml/pages/ReaderPage.qml | 102 ++++++------------ qml/pages/SettingsPage.qml | 26 ----- rpm/harbour-calibreweb.spec | 9 +- src/main.cpp | 4 +- translations/harbour-calibreweb_it.ts | 144 +++++++++++--------------- 5 files changed, 101 insertions(+), 184 deletions(-) diff --git a/qml/pages/ReaderPage.qml b/qml/pages/ReaderPage.qml index d62ddcb..dbd9401 100644 --- a/qml/pages/ReaderPage.qml +++ b/qml/pages/ReaderPage.qml @@ -41,24 +41,10 @@ Page { allowedOrientations: Orientation.All - // Sfondo di lettura UNIFORME (invece del gradiente di sistema): le fasce - // dei margini usano questo stesso colore, quindi margine e sfondo sono - // indistinguibili su ogni pagina (niente bande visibili, niente testo - // "coperto" percepibile: le righe spariscono nel margine). - property color readerBgColor: Theme.colorScheme === Theme.LightOnDark - ? "#FF0E0E0E" : "#FFFFFFFF" - EpubBook { id: book } - // sfondo pieno del lettore, dietro tutto il resto - Rectangle { - anchors.fill: parent - z: -1 - color: page.readerBgColor - } - SilicaFlickable { id: outerFlick anchors.fill: parent @@ -156,10 +142,18 @@ Page { } } - // contenuto: Flickable NON interattivo (lo scroll è solo programmatico) + // contenuto: Flickable NON interattivo (lo scroll è solo programmatico). + // La finestra di lettura VIVE DENTRO i margini verticali (top/bottom + // margin): il testo non puo' fisicamente uscire dai bordi, quindi i + // margini alto/basso sono identici su OGNI pagina (non solo a inizio + // capitolo) e si aggiornano live con l'anteprima del dialog. Flickable { id: innerFlick anchors.fill: parent + anchors.topMargin: page.previewMarginT >= 0 + ? page.previewMarginT : appSettings.readerMarginV + anchors.bottomMargin: page.previewMarginT >= 0 + ? page.previewMarginT : appSettings.readerMarginV contentHeight: readerContent.height interactive: false clip: true @@ -167,16 +161,25 @@ Page { Item { id: readerContent width: parent.width - // Il contenitore ha il padding verticale (margine) + il "deficit" - // dell'ultima pagina: cosi' max-scroll = k*step e l'ultima pagina - // e' allineata (niente testo ripetuto tra penultima e ultima). - height: Math.max(parent.height, - textItem.height + 2 * page.marginV() + page.lastPagePad()) + // Altezza = testo + "deficit" dell'ultima pagina: max-scroll + // diventa k*step esatto e l'ultima pagina e' allineata (niente + // testo ripetuto tra penultima e ultima). Calcolo INLINE nel + // binding: si rivaluta quando cambia la finestra (rotazione, + // anteprima margini) o l'altezza del testo (reflow). + height: { + var step = Math.max(1, parent.height) + var t = textItem.height + var pad = 0 + if (t > 0) { + var r = t % step + pad = r === 0 ? 0 : step - r + } + return Math.max(parent.height, t + pad) + } Text { id: textItem x: page.previewMarginL >= 0 ? page.previewMarginL : appSettings.readerMargin - y: page.previewMarginT >= 0 ? page.previewMarginT : appSettings.readerMarginV width: parent.width - 2 * (page.previewMarginL >= 0 ? page.previewMarginL : appSettings.readerMargin) @@ -190,31 +193,6 @@ Page { } } - // Margini verticali VISTI su ogni schermata: due fasce opache (colore di - // sfondo) coprono il testo a cavallo dei bordi della viewport. Il testo - // scorre tra le fasce con passo = viewport - 2*margine: ogni pagina - // mostra esattamente un blocco di testo con margine sopra e sotto. - Rectangle { - id: topBand - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - height: page.marginV() - visible: height > 0 - z: 5 - color: page.readerBgColor - } - Rectangle { - id: bottomBand - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - height: page.marginV() - visible: height > 0 - z: 5 - color: page.readerBgColor - } - // Paginazione a tap: la meta' destra va avanti di una pagina, la // sinistra indietro. Le fasce superiore e inferiore sono lasciate ai // menu (PullDown in alto, PushUp in basso). NIENTE preventStealing: @@ -309,9 +287,9 @@ Page { function readScrollPosition() { if (!page.ready) return - // passo di pagina = viewport - 2*margine verticale: ogni pagina mostra - // il testo DENTRO i margini (niente righe a filo del bordo) - var step = Math.max(1, innerFlick.height - 2 * page.marginV()) + // passo di pagina = altezza della finestra di lettura (i margini + // alto/basso sono FUORI dal Flickable: nessun testo li attraversa) + var step = Math.max(1, innerFlick.height) var max = Math.max(0, innerFlick.contentHeight - innerFlick.height) var y = Math.max(0, Math.min(max, innerFlick.contentY)) var len = book.chapterTextLength(page.currentChapter) @@ -323,23 +301,6 @@ Page { maybeSave(false) } - // margine verticale effettivo (anteprima dialog oppure impostazioni) - function marginV() { - return page.previewMarginT >= 0 ? page.previewMarginT : appSettings.readerMarginV - } - - // deficit dell'ultima pagina: porta max-scroll a un multiplo esatto del - // passo, cosi' l'ultima pagina mostra il testo residuo SENZA sovrapporsi - // alla penultima (niente righe ripetute) e con il margine sotto - function lastPagePad() { - var step = Math.max(1, innerFlick.height - 2 * page.marginV()) - var t = textItem.height - if (t <= 0) - return 0 - var r = t % step - return r === 0 ? 0 : step - r - } - function maybeSave(force) { if (bookId <= 0) return @@ -385,13 +346,12 @@ Page { restoreTimer.start() } - // pagina successiva: una pagina di testo = viewport meno i margini verticali - // (così ogni pagina ha il testo dentro i margini, non a filo del bordo); - // a fine capitolo passa al successivo + // pagina successiva: una pagina di testo = altezza della finestra di + // lettura; a fine capitolo passa al successivo function nextPage() { if (!page.ready) return - var step = Math.max(1, innerFlick.height - 2 * page.marginV()) + var step = Math.max(1, innerFlick.height) var max = Math.max(0, innerFlick.contentHeight - innerFlick.height) var y = innerFlick.contentY if (y >= max - 2) { @@ -410,7 +370,7 @@ Page { function prevPage() { if (!page.ready) return - var step = Math.max(1, innerFlick.height - 2 * page.marginV()) + var step = Math.max(1, innerFlick.height) var y = innerFlick.contentY if (y > 1) { innerFlick.contentY = Math.max(0, y - step) diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml index c0eef69..df34a7b 100644 --- a/qml/pages/SettingsPage.qml +++ b/qml/pages/SettingsPage.qml @@ -60,32 +60,6 @@ Page { onCheckedChanged: appSettings.ignoreSslErrors = checked } - SectionHeader { text: qsTr("Reader") } - - Slider { - id: marginSlider - width: parent.width - label: qsTr("Side margins") - minimumValue: 0 - maximumValue: 80 - stepSize: 4 - value: appSettings.readerMargin - valueText: value + " px" - onValueChanged: appSettings.readerMargin = value - } - - Slider { - id: marginVSlider - width: parent.width - label: qsTr("Top and bottom margin") - minimumValue: 0 - maximumValue: 80 - stepSize: 4 - value: appSettings.readerMarginV - valueText: value + " px" - onValueChanged: appSettings.readerMarginV = value - } - SectionHeader { text: qsTr("Connection") } Button { diff --git a/rpm/harbour-calibreweb.spec b/rpm/harbour-calibreweb.spec index 6932eb7..5550e3b 100644 --- a/rpm/harbour-calibreweb.spec +++ b/rpm/harbour-calibreweb.spec @@ -1,6 +1,6 @@ Name: harbour-calibreweb Summary: Client OPDS per Calibre Web -Version: 0.4.10 +Version: 0.4.11 Release: 1 Group: Qt/Qt License: MIT @@ -24,6 +24,13 @@ reflow del testo, margini configurabili e posizione salvata in locale. %changelog +* Fri Aug 21 2026 Carlo Baratto - 0.4.11-1 +- Rimossi gli slider margini dalle Impostazioni: i margini si regolano solo dal + lettore (Margini del testo nel PullDownMenu) +- Margini alto/basso STRUTTURALI: la finestra di lettura vive dentro i margini + (top/bottom margin del Flickable): il testo non puo' uscire dai bordi e i + margini sono identici su ogni pagina (via le fasce colorate della 0.4.9/0.4.10) + * Fri Aug 21 2026 Carlo Baratto - 0.4.10-1 - Fix margini lettore (0.4.9): sfondo di lettura UNIFORME nel lettore (colore pieno per tema, niente gradiente di sistema). Le fasce dei margini usano lo diff --git a/src/main.cpp b/src/main.cpp index 44f27ee..dc2f6a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) app->setOrganizationName(QStringLiteral("harbour")); app->setApplicationName(QStringLiteral("calibreweb")); // versione mostrata nelle impostazioni (tenere allineata allo spec) - app->setApplicationVersion(QStringLiteral("0.4.10")); + app->setApplicationVersion(QStringLiteral("0.4.11")); Settings settings; @@ -57,7 +57,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) QQuickView *view = SailfishApp::createView(); - qDebug() << "harbour-calibreweb v0.4.10 build" << __DATE__ << __TIME__; + qDebug() << "harbour-calibreweb v0.4.11 build" << __DATE__ << __TIME__; qmlRegisterType("harbour.calibreweb", 1, 0, "EpubBook"); diff --git a/translations/harbour-calibreweb_it.ts b/translations/harbour-calibreweb_it.ts index d7f449d..548ab8b 100644 --- a/translations/harbour-calibreweb_it.ts +++ b/translations/harbour-calibreweb_it.ts @@ -1,29 +1,30 @@ - + + BookDetailPage - + Read (EPUB) Leggi (EPUB) - + Formats Formati - + Downloading… Download in corso… - + Saved to Salvato in - + Error: Errore: @@ -31,12 +32,12 @@ ChapterListDialog - + Table of contents Indice capitoli - + No chapters Nessun capitolo @@ -44,7 +45,7 @@ CoverPage - + Calibre Web Calibre Web @@ -52,18 +53,18 @@ FeedPage - + Refresh Aggiorna - + Settings Impostazioni - - + + No results Nessun risultato @@ -71,37 +72,37 @@ MainPage - + Calibre Web Calibre Web - + Search Cerca - + Settings Impostazioni - + Refresh Aggiorna - + Open the settings and enter your Calibre Web address - Apri le impostazioni e inserisci l'indirizzo del tuo Calibre Web + Apri le impostazioni e inserisci l'indirizzo del tuo Calibre Web - + Server not configured Server non configurato - + No sections found in the OPDS feed Nessuna sezione trovata nel feed OPDS @@ -109,27 +110,27 @@ MarginDialog - + Text margins Margini del testo - + Apply Applica - + Side margins Margini laterali - + Top and bottom Alto e basso - + Changes apply immediately. Confirm to save them for all books. Le modifiche si applicano subito al testo. Conferma per salvarle per tutti i libri. @@ -137,37 +138,27 @@ ReaderPage - + Table of contents Indice capitoli - + Text margins Margini del testo - + Settings Impostazioni - + Close book Chiudi libro - - The reader is not responding (WebView). The EPUB file may be damaged. - Il lettore non risponde (WebView). Il file EPUB potrebbe essere danneggiato. - - - - Chapter unreadable - Capitolo non leggibile - - - + Unable to open the EPUB file Impossibile aprire il libro EPUB @@ -175,23 +166,23 @@ SearchPage - - + + Search Cerca - + Title or author… Titolo o autore… - + Search uses the server engine (OPDS search). La ricerca usa il motore del server (OPDS search). - + Results: Risultati: @@ -199,100 +190,85 @@ SettingsPage - + Settings Impostazioni - + Server Server - + Calibre Web address Indirizzo Calibre Web - + User (empty = anonymous access) Utente (vuoto = accesso anonimo) - + Password Password - + Ignore SSL certificate errors Ignora errori certificato SSL - + Enable if the server uses a self-signed certificate Da attivare se il server usa un certificato autofirmato - - Reader - Lettore - - - - Side margins - Margini laterali - - - - Top and bottom margin - Margine alto e basso - - - + Connection Connessione - + Test connection Prova connessione - - + + Language - Lingua + Lingua - + System (default) - Sistema (predefinita) + Sistema (predefinita) - + Language will be applied after restarting the app - La lingua verrà applicata al riavvio dell'app + La lingua verrà applicata al riavvio dell'app - + Enter the server address - Inserisci l'indirizzo del server + Inserisci l'indirizzo del server - + Version - Versione + Versione - + Testing… Verifica in corso… - + Connection OK: %1 sections found Connessione OK: %1 sezioni trovate - \ No newline at end of file +