Lettore 0.4.9: margini verticali su ogni schermata — fasce opache fisse sopra/sotto la viewport (colore di sfondo per tema) + padding deficit dell'ultima pagina (max-scroll multiplo esatto del passo: ultima pagina allineata, niente righe ripetute)

This commit is contained in:
2026-09-07 17:31:07 +02:00
parent 041b9b9567
commit aef3cc3409
3 changed files with 52 additions and 6 deletions
+41 -3
View File
@@ -153,10 +153,11 @@ 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.previewMarginT >= 0
? page.previewMarginT
: appSettings.readerMarginV))
textItem.height + 2 * page.marginV() + page.lastPagePad())
Text {
id: textItem
@@ -175,6 +176,31 @@ 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: Theme.colorScheme === Theme.LightOnDark ? "#FF000000" : "#FFFFFFFF"
}
Rectangle {
id: bottomBand
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: page.marginV()
visible: height > 0
z: 5
color: Theme.colorScheme === Theme.LightOnDark ? "#FF000000" : "#FFFFFFFF"
}
// 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:
@@ -288,6 +314,18 @@ Page {
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