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−"
width: Theme.itemSizeSmall
height: Theme.itemSizeMedium
onClicked: page.changeFontScale(-0.15)
onClicked: page.changeFontScale(-0.1)
}
Button {
text: "A+"
width: Theme.itemSizeSmall
height: Theme.itemSizeMedium
onClicked: page.changeFontScale(0.15)
onClicked: page.changeFontScale(0.1)
}
IconButton {
icon.source: "image://theme/icon-m-right"
@@ -208,11 +208,13 @@ Page {
onTriggered: pageStack.pop(null)
}
// rete di sicurezza per il restore: se il reflow non ha ancora cambiato
// contentHeight (capitoli con altezza identica), applica comunque
// rete di sicurezza per il restore: il caso normale è applicato da
// 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 {
id: restoreTimer
interval: 80
interval: 500
onTriggered: {
if (page.pendingRestore) {
page.pendingRestore = false
@@ -314,11 +316,13 @@ Page {
}
function changeFontScale(delta) {
page.fontScale = Math.max(0.7, Math.min(2.5, page.fontScale + delta))
// il binding aggiorna il font; ripristina la posizione alla frazione
// corrente (l'offset in caratteri è stabile col reflow)
// limite ampio e passo 0.1: tanti ingrandimenti prima del limite
page.fontScale = Math.max(0.7, Math.min(3.5, page.fontScale + delta))
// 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.restoreFrac = page.chapterFraction
restoreTimer.start()
}
@@ -380,9 +384,9 @@ Page {
function previewMargins(lr, tb) {
page.previewMarginL = lr
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.restoreFrac = page.chapterFraction
restoreTimer.start()
}