Lettore 0.4.5: fix ingrandimento testo (restore per caratteri, reflow atteso)

Il restore dopo il cambio font usava la frazione di scroll (instabile col
reflow) e il timer 80ms scattava prima del ricalcolo rich text: posizione
persa, ingrandimenti che sembravano bloccarsi. Ora: restore per offset in
CARATTERI, applicazione via onContentHeightChanged, timer sicurezza 500ms,
limite font 3.5x con passo 0.1.
This commit is contained in:
2026-08-21 12:37:25 +02:00
parent 50af721323
commit 30b8e1ebaa
3 changed files with 26 additions and 14 deletions
+15 -11
View File
@@ -120,13 +120,13 @@ Page {
text: "A−" text: "A−"
width: Theme.itemSizeSmall width: Theme.itemSizeSmall
height: Theme.itemSizeMedium height: Theme.itemSizeMedium
onClicked: page.changeFontScale(-0.15) onClicked: page.changeFontScale(-0.1)
} }
Button { Button {
text: "A+" text: "A+"
width: Theme.itemSizeSmall width: Theme.itemSizeSmall
height: Theme.itemSizeMedium height: Theme.itemSizeMedium
onClicked: page.changeFontScale(0.15) onClicked: page.changeFontScale(0.1)
} }
IconButton { IconButton {
icon.source: "image://theme/icon-m-right" icon.source: "image://theme/icon-m-right"
@@ -208,11 +208,13 @@ Page {
onTriggered: pageStack.pop(null) onTriggered: pageStack.pop(null)
} }
// rete di sicurezza per il restore: se il reflow non ha ancora cambiato // rete di sicurezza per il restore: il caso normale è applicato da
// contentHeight (capitoli con altezza identica), applica comunque // onTextReflowed appena il reflow cambia contentHeight; questo timer
// copre i rari casi in cui l'altezza non cambia (capitoli identici).
// Ritardo lungo: il reflow rich text può richiedere qualche centinaio di ms.
Timer { Timer {
id: restoreTimer id: restoreTimer
interval: 80 interval: 500
onTriggered: { onTriggered: {
if (page.pendingRestore) { if (page.pendingRestore) {
page.pendingRestore = false page.pendingRestore = false
@@ -314,11 +316,13 @@ Page {
} }
function changeFontScale(delta) { function changeFontScale(delta) {
page.fontScale = Math.max(0.7, Math.min(2.5, page.fontScale + delta)) // limite ampio e passo 0.1: tanti ingrandimenti prima del limite
// il binding aggiorna il font; ripristina la posizione alla frazione page.fontScale = Math.max(0.7, Math.min(3.5, page.fontScale + delta))
// corrente (l'offset in caratteri è stabile col reflow) // il binding aggiorna il font; ripristina la posizione per CARATTERI
// (stabile col reflow, a differenza della frazione di scroll: con il
// testo più alto la stessa frazione mostrerebbe un punto diverso)
page.restoreFrac = offsetToFrac(page.charOffset, page.currentChapter)
page.pendingRestore = true page.pendingRestore = true
page.restoreFrac = page.chapterFraction
restoreTimer.start() restoreTimer.start()
} }
@@ -380,9 +384,9 @@ Page {
function previewMargins(lr, tb) { function previewMargins(lr, tb) {
page.previewMarginL = lr page.previewMarginL = lr
page.previewMarginT = tb page.previewMarginT = tb
// il reflow è immediato (binding); mantieni la frazione di lettura // il reflow è immediato (binding); mantieni la posizione per caratteri
page.restoreFrac = offsetToFrac(page.charOffset, page.currentChapter)
page.pendingRestore = true page.pendingRestore = true
page.restoreFrac = page.chapterFraction
restoreTimer.start() restoreTimer.start()
} }
+9 -1
View File
@@ -1,6 +1,6 @@
Name: harbour-calibreweb Name: harbour-calibreweb
Summary: Client OPDS per Calibre Web Summary: Client OPDS per Calibre Web
Version: 0.4.4 Version: 0.4.5
Release: 1 Release: 1
Group: Qt/Qt Group: Qt/Qt
License: MIT License: MIT
@@ -24,6 +24,14 @@ reflow del testo, margini configurabili e posizione salvata
in locale. in locale.
%changelog %changelog
* Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.5-1
- Fix ingrandimento testo: il restore dopo il reflow usava la frazione di
scroll (instabile col cambio font) e il timer di 80ms poteva scattare prima
del ricalcolo rich text -> posizione persa e ingrandimenti che sembravano
bloccarsi. Ora il restore usa l'offset in CARATTERI (stabile col reflow),
il reflow applica via onContentHeightChanged, il timer di sicurezza e'
passato a 500ms; limite font portato a 3.5x e passo a 0.1 (molti piu'
ingrandimenti prima del limite)
* Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.4-1 * Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.4-1
- LETTORE A PAGINE RIGIDE: eliminato del tutto lo scroll libero. Struttura a - LETTORE A PAGINE RIGIDE: eliminato del tutto lo scroll libero. Struttura a
due livelli: SilicaFlickable esterno NON scrollabile (contentHeight=height, due livelli: SilicaFlickable esterno NON scrollabile (contentHeight=height,
+2 -2
View File
@@ -22,7 +22,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
app->setOrganizationName(QStringLiteral("harbour")); app->setOrganizationName(QStringLiteral("harbour"));
app->setApplicationName(QStringLiteral("calibreweb")); app->setApplicationName(QStringLiteral("calibreweb"));
// versione mostrata nelle impostazioni (tenere allineata allo spec) // versione mostrata nelle impostazioni (tenere allineata allo spec)
app->setApplicationVersion(QStringLiteral("0.4.4")); app->setApplicationVersion(QStringLiteral("0.4.5"));
Settings settings; Settings settings;
@@ -56,7 +56,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
QQuickView *view = SailfishApp::createView(); QQuickView *view = SailfishApp::createView();
qDebug() << "harbour-calibreweb v0.4.4 build" << __DATE__ << __TIME__; qDebug() << "harbour-calibreweb v0.4.5 build" << __DATE__ << __TIME__;
qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook"); qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook");