From 7bb4aa845ae38b80fe14638c1f335bc7332719ae Mon Sep 17 00:00:00 2001 From: Carlo Baratto Date: Fri, 21 Aug 2026 08:16:25 +0200 Subject: [PATCH] Lettore 0.3.1: cambio capitolo affidabile con scrollBy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Il confronto con max calcolato (scrollHeight-innerHeight) falliva sul WebView di Sailfish quando max è sovrastimato: scrollY non lo raggiungeva mai, ok restava true e atEnd veniva ignorato -> si restava dentro il capitolo. Ora: scrollBy(0,vh) + verifica 'lo scroll si è mosso'; se bloccato, unlock CSS e riprova; se ancora fermo -> capitolo successivo (o precedente). --- qml/pages/ReaderPage.qml | 38 +++++++++++++++++++------------------ rpm/harbour-calibreweb.spec | 9 ++++++++- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/qml/pages/ReaderPage.qml b/qml/pages/ReaderPage.qml index 07a2c51..b07fed1 100644 --- a/qml/pages/ReaderPage.qml +++ b/qml/pages/ReaderPage.qml @@ -349,27 +349,30 @@ Page { loadChapter() } - // pagina successiva: una viewport avanti; all'ultima pagina passa al capitolo - // dopo. max è calcolato su documentElement E body (alcuni libri scrollano il body). + // pagina successiva: una viewport avanti. Lo scroll avviene con scrollBy e + // la verifica è "lo scroll si è MOSSO?" — non un confronto con max calcolato + // (innerHeight/scrollHeight del WebView non sempre corrispondono allo scroll + // reale: con max sovrastimato scrollY non lo raggiungeva mai e il passaggio + // al capitolo successivo non scattava). Se non si muove: unlock CSS e riprova; + // se ancora fermo, siamo a fine capitolo (o capitolo non scrollabile) -> avanti. function nextPage() { if (!web.loaded || !page.ready) return web.runJavaScript( "(function(){" + "var de=document.documentElement,b=document.body;" - + "var max=Math.max(de.scrollHeight,b.scrollHeight)-window.innerHeight;" - + "if(max<=1){" + + "var vh=window.innerHeight;" + + "var before=window.scrollY;" + + "window.scrollBy(0,vh);" + + "if(window.scrollY>before+1)" + + "return JSON.stringify({ok:true,atEnd:false});" + "de.style.setProperty('overflow','visible','important');" + "b.style.setProperty('overflow','visible','important');" + "de.style.setProperty('height','auto','important');" + "b.style.setProperty('height','auto','important');" - + "max=Math.max(de.scrollHeight,b.scrollHeight)-window.innerHeight;}" - + "if(max<=1)return JSON.stringify({ok:false,atEnd:true});" - + "var vh=window.innerHeight;" - + "var cur=Math.max(0,Math.min(max,window.scrollY));" - + "var target=Math.min(max,cur+vh);" - + "if(target>cur+1){window.scrollTo(0,target);" - + "return JSON.stringify({ok:true,atEnd:target>=max-1});}" + + "window.scrollBy(0,vh);" + + "if(window.scrollY>before+1)" + + "return JSON.stringify({ok:true,atEnd:false});" + "return JSON.stringify({ok:false,atEnd:true});})()", function(res) { var r = JSON.parse(res) @@ -381,19 +384,18 @@ Page { }) } - // pagina precedente: una viewport indietro; dalla prima pagina torna al - // capitolo prima SULL'ULTIMA PAGINA (non salta la coda del capitolo) + // pagina precedente: una viewport indietro; se lo scroll non si muove siamo + // all'inizio -> capitolo prima SULL'ULTIMA PAGINA (non salta la coda) function prevPage() { if (!web.loaded || !page.ready) return web.runJavaScript( "(function(){" - + "var de=document.documentElement,b=document.body;" - + "var max=Math.max(de.scrollHeight,b.scrollHeight)-window.innerHeight;" + "var vh=window.innerHeight;" - + "var cur=Math.max(0,Math.min(max,window.scrollY));" - + "if(cur>1){window.scrollTo(0,Math.max(0,cur-vh));" - + "return JSON.stringify({ok:true,atStart:false});}" + + "var before=window.scrollY;" + + "window.scrollBy(0,-vh);" + + "if(window.scrollY - 0.3.1-1 +- Fix passaggio di capitolo: il tap avanti/indietro usava un confronto con max + calcolato (scrollHeight - innerHeight), che sul WebView di Sailfish può essere + sovrastimato: scrollY non raggiungeva mai max e il cambio capitolo non + scattava (si restava dentro il capitolo). Ora lo scroll avviene con scrollBy + e la condizione è "lo scroll si è MOSSO?" — infallibile anche con max errato; + se il documento è bloccato (overflow hidden), unlock CSS e riprova * Fri Aug 21 2026 Carlo Baratto - 0.3.0-1 - Lettore: bookmark per POSIZIONE (numero di carattere, chiave cw:v2:) invece di capitolo+frazione: la posizione è stabile cambiando font e margini;