Lettore 0.4.7: margini rispettati su ogni pagina

Il passo di pagina era la viewport intera: il testo scorreva a filo dei
bordi e i margini verticali si vedevano solo all'inizio del capitolo. Ora
il passo e' viewport - 2*margine verticale: ogni pagina (e l'ultima) ha il
testo dentro i margini. Simulazione geometrica verificata (9 test).
This commit is contained in:
2026-08-21 13:04:04 +02:00
parent 545ca0d74a
commit 7fca7fbfcd
3 changed files with 29 additions and 14 deletions
+20 -11
View File
@@ -270,18 +270,25 @@ Page {
function readScrollPosition() { function readScrollPosition() {
if (!page.ready) if (!page.ready)
return return
var vh = Math.max(1, innerFlick.height) // passo di pagina = viewport - 2*margine verticale: ogni pagina mostra
var max = Math.max(0, innerFlick.contentHeight - vh) // il testo DENTRO i margini (niente righe a filo del bordo)
var step = Math.max(1, innerFlick.height - 2 * page.marginV())
var max = Math.max(0, innerFlick.contentHeight - innerFlick.height)
var y = Math.max(0, Math.min(max, innerFlick.contentY)) var y = Math.max(0, Math.min(max, innerFlick.contentY))
var len = book.chapterTextLength(page.currentChapter) var len = book.chapterTextLength(page.currentChapter)
page.chapterFraction = max > 0 ? y / max : 0 page.chapterFraction = max > 0 ? y / max : 0
// posizione per caratteri (stima dalla frazione: stabile col reflow) // posizione per caratteri (stima dalla frazione: stabile col reflow)
page.charOffset = Math.round(page.chapterFraction * len) page.charOffset = Math.round(page.chapterFraction * len)
page.pageIndex = Math.floor(y / vh) + 1 page.pageIndex = Math.floor(y / step) + 1
page.pageCount = Math.max(1, Math.ceil(max / vh) + 1) page.pageCount = Math.max(1, Math.ceil(max / step) + 1)
maybeSave(false) maybeSave(false)
} }
// margine verticale effettivo (anteprima dialog oppure impostazioni)
function marginV() {
return page.previewMarginT >= 0 ? page.previewMarginT : appSettings.readerMarginV
}
function maybeSave(force) { function maybeSave(force) {
if (bookId <= 0) if (bookId <= 0)
return return
@@ -328,13 +335,14 @@ Page {
restoreTimer.start() restoreTimer.start()
} }
// pagina successiva: una viewport avanti (contentY programmatico, il dito // pagina successiva: una pagina di testo = viewport meno i margini verticali
// non può scrollare); a fine capitolo passa al successivo // (così ogni pagina ha il testo dentro i margini, non a filo del bordo);
// a fine capitolo passa al successivo
function nextPage() { function nextPage() {
if (!page.ready) if (!page.ready)
return return
var vh = innerFlick.height var step = Math.max(1, innerFlick.height - 2 * page.marginV())
var max = Math.max(0, innerFlick.contentHeight - vh) var max = Math.max(0, innerFlick.contentHeight - innerFlick.height)
var y = innerFlick.contentY var y = innerFlick.contentY
if (y >= max - 2) { if (y >= max - 2) {
// fine capitolo (o capitolo non scrollabile): segna la coda e passa // fine capitolo (o capitolo non scrollabile): segna la coda e passa
@@ -342,19 +350,20 @@ Page {
maybeSave(true) maybeSave(true)
gotoChapter(page.currentChapter + 1) gotoChapter(page.currentChapter + 1)
} else { } else {
innerFlick.contentY = Math.min(max, y + vh) innerFlick.contentY = Math.min(max, y + step)
readScrollPosition() readScrollPosition()
} }
} }
// pagina precedente: una viewport indietro; dall'inizio del capitolo va al // pagina precedente: una pagina indietro; dall'inizio del capitolo va al
// capitolo prima SULL'ULTIMA PAGINA (non salta la coda del capitolo) // capitolo prima SULL'ULTIMA PAGINA (non salta la coda del capitolo)
function prevPage() { function prevPage() {
if (!page.ready) if (!page.ready)
return return
var step = Math.max(1, innerFlick.height - 2 * page.marginV())
var y = innerFlick.contentY var y = innerFlick.contentY
if (y > 1) { if (y > 1) {
innerFlick.contentY = Math.max(0, y - innerFlick.height) innerFlick.contentY = Math.max(0, y - step)
readScrollPosition() readScrollPosition()
} else if (page.currentChapter > 0) { } else if (page.currentChapter > 0) {
maybeSave(true) maybeSave(true)
+7 -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.6 Version: 0.4.7
Release: 1 Release: 1
Group: Qt/Qt Group: Qt/Qt
License: MIT License: MIT
@@ -24,6 +24,12 @@ 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.7-1
- Fix margini lettore: il passo di pagina era la viewport intera, quindi il
testo scorreva a filo dei bordi e i margini verticali si vedevano solo
all'inizio del capitolo. Ora il passo e' viewport - 2*margine verticale:
ogni pagina mostra il testo DENTRO i margini (prima riga e ultima riga
distanziate dai bordi), anche l'ultima pagina del capitolo
* Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.6-1 * Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.6-1
- Fix impostazioni lettore non salvate: la scala del font era una proprieta' - Fix impostazioni lettore non salvate: la scala del font era una proprieta'
QML di pagina (mai persistita) -> l'ingrandimento spariva alla chiusura del QML di pagina (mai persistita) -> l'ingrandimento spariva alla chiusura del
+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.6")); app->setApplicationVersion(QStringLiteral("0.4.7"));
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.6 build" << __DATE__ << __TIME__; qDebug() << "harbour-calibreweb v0.4.7 build" << __DATE__ << __TIME__;
qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook"); qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook");