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:
+20
-11
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user