Lettore 0.4.1: snap alle pagine, niente preventStealing (menu pulley ok)
preventStealing sulla MouseArea rubava il drag al PushUpMenu (il gesto si bloccava appena il dito entrava nella zona centrale) e senza di esso il contenuto scrollava libero. Ora: il drag e' permesso ma lo snap (250ms dopo l'ultimo movimento) riallinea contentY alla pagina piu' vicina (soglia 70%, zona finale parziale -> fondo). I pulley menu funzionano normalmente.
This commit is contained in:
@@ -48,9 +48,13 @@ Page {
|
|||||||
id: readerFlick
|
id: readerFlick
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
contentHeight: readerContent.height
|
contentHeight: readerContent.height
|
||||||
|
// ogni movimento del contenuto (drag/flick) riavvia lo snap: il testo
|
||||||
|
// può essere trascinato ma torna sempre alla pagina (paginazione a tap)
|
||||||
|
onContentYChanged: snapTimer.restart()
|
||||||
|
|
||||||
// il PullDownMenu va DENTRO una vista Silica, non a livello di Page
|
// il PullDownMenu va DENTRO una vista Silica, non a livello di Page
|
||||||
PullDownMenu {
|
PullDownMenu {
|
||||||
|
id: pullMenu
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("Table of contents")
|
text: qsTr("Table of contents")
|
||||||
onClicked: showChapterList()
|
onClicked: showChapterList()
|
||||||
@@ -165,17 +169,16 @@ Page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paginazione a tap: niente scroll libero. La meta' destra va avanti di
|
// Paginazione a tap: la meta' destra va avanti di una pagina, la
|
||||||
// una pagina, la sinistra indietro. Le fasce superiore e inferiore sono
|
// sinistra indietro. Le fasce superiore e inferiore sono lasciate ai
|
||||||
// lasciate ai menu (PullDown in alto, PushUp in basso).
|
// menu (PullDown in alto, PushUp in basso). NIENTE preventStealing:
|
||||||
// preventStealing: i drag nella zona centrale NON scrollano (paginazione
|
// ruba il gesto ai pulley menu. Lo scroll libero è neutralizzato dallo
|
||||||
// a tap come richiesto), i pulley menu restano raggiungibili dai bordi.
|
// snap alle pagine (snapTimer), non bloccando i gesti.
|
||||||
MouseArea {
|
MouseArea {
|
||||||
id: tapZone
|
id: tapZone
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.topMargin: Theme.itemSizeLarge
|
anchors.topMargin: Theme.itemSizeLarge
|
||||||
anchors.bottomMargin: Theme.itemSizeLarge + Theme.paddingLarge
|
anchors.bottomMargin: Theme.itemSizeLarge + Theme.paddingLarge
|
||||||
preventStealing: true
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (mouse.x > width / 2)
|
if (mouse.x > width / 2)
|
||||||
page.nextPage()
|
page.nextPage()
|
||||||
@@ -221,6 +224,41 @@ Page {
|
|||||||
onTriggered: readScrollPosition()
|
onTriggered: readScrollPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// snap alle pagine: 250 ms dopo l'ultimo movimento, riallinea contentY al
|
||||||
|
// multiplo di viewport più vicino (neutralizza lo scroll libero senza
|
||||||
|
// bloccare i gesti dei pulley menu)
|
||||||
|
Timer {
|
||||||
|
id: snapTimer
|
||||||
|
interval: 250
|
||||||
|
onTriggered: snapToPage()
|
||||||
|
}
|
||||||
|
|
||||||
|
function snapToPage() {
|
||||||
|
if (!page.ready || page.pendingRestore)
|
||||||
|
return
|
||||||
|
// menu aperti: il contenuto è spostato apposta, niente snap
|
||||||
|
if (pullMenu.open || readerMenu.open)
|
||||||
|
return
|
||||||
|
var vh = Math.max(1, readerFlick.height)
|
||||||
|
var max = Math.max(0, readerFlick.contentHeight - vh)
|
||||||
|
var y = readerFlick.contentY
|
||||||
|
var target
|
||||||
|
// ultima pagina "piena" allineata alla viewport
|
||||||
|
var last = Math.floor(max / vh) * vh
|
||||||
|
if (y > last + 2) {
|
||||||
|
// zona finale parziale: snap al fondo (evita il loop round->indietro)
|
||||||
|
target = max
|
||||||
|
} else {
|
||||||
|
// soglia al 70% della pagina: trascinamenti piccoli tornano alla
|
||||||
|
// pagina corrente, oltre metà vanno alla pagina dopo
|
||||||
|
target = Math.round(y / vh - 0.2) * vh
|
||||||
|
}
|
||||||
|
target = Math.max(0, Math.min(max, target))
|
||||||
|
if (Math.abs(target - y) > 2)
|
||||||
|
readerFlick.contentY = target
|
||||||
|
readScrollPosition()
|
||||||
|
}
|
||||||
|
|
||||||
function overallProgress() {
|
function overallProgress() {
|
||||||
if (book.chapterCount <= 0)
|
if (book.chapterCount <= 0)
|
||||||
return 0
|
return 0
|
||||||
@@ -314,7 +352,7 @@ Page {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pagina successiva: una viewport avanti (contentY nativo, affidabile);
|
// pagina successiva: una viewport avanti (contentY nativo, affidabile);
|
||||||
// a fine capitolo (o capitolo non scrollabile) passa al successivo
|
// a fine capitolo (y a fondo, con lo snap allineato) passa al successivo
|
||||||
function nextPage() {
|
function nextPage() {
|
||||||
if (!page.ready)
|
if (!page.ready)
|
||||||
return
|
return
|
||||||
@@ -322,7 +360,7 @@ Page {
|
|||||||
var max = Math.max(0, readerFlick.contentHeight - vh)
|
var max = Math.max(0, readerFlick.contentHeight - vh)
|
||||||
var y = readerFlick.contentY
|
var y = readerFlick.contentY
|
||||||
if (y >= max - 2) {
|
if (y >= max - 2) {
|
||||||
// fine capitolo: segna la coda come letta e passa avanti
|
// fine capitolo (o capitolo non scrollabile): segna la coda e passa
|
||||||
page.charOffset = Math.max(0, book.chapterTextLength(page.currentChapter) - 1)
|
page.charOffset = Math.max(0, book.chapterTextLength(page.currentChapter) - 1)
|
||||||
maybeSave(true)
|
maybeSave(true)
|
||||||
gotoChapter(page.currentChapter + 1)
|
gotoChapter(page.currentChapter + 1)
|
||||||
|
|||||||
@@ -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.0
|
Version: 0.4.1
|
||||||
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.1-1
|
||||||
|
- Fix scroll libero e pulley menu: rimosso preventStealing dalla MouseArea
|
||||||
|
(ruba il gesto al PushUpMenu appena il dito entra nella zona centrale).
|
||||||
|
Lo scroll libero e' ora neutralizzato dallo SNAP alle pagine: dopo ogni
|
||||||
|
movimento il contenuto torna alla pagina piu' vicina (soglia 70%, zona
|
||||||
|
finale parziale -> fondo), i menu pulley funzionano normalmente
|
||||||
* Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.0-1
|
* Fri Aug 21 2026 Carlo Baratto <carlo@carlobaratto.it> - 0.4.0-1
|
||||||
- LETTORE RIFATTO senza WebView: i capitoli sono rich text Qt in un Text QML
|
- LETTORE RIFATTO senza WebView: i capitoli sono rich text Qt in un Text QML
|
||||||
dentro un SilicaFlickable. Lo scroll (contentY/contentHeight) e' nativo QML
|
dentro un SilicaFlickable. Lo scroll (contentY/contentHeight) e' nativo QML
|
||||||
|
|||||||
+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.0"));
|
app->setApplicationVersion(QStringLiteral("0.4.1"));
|
||||||
|
|
||||||
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.0 build" << __DATE__ << __TIME__;
|
qDebug() << "harbour-calibreweb v0.4.1 build" << __DATE__ << __TIME__;
|
||||||
|
|
||||||
qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook");
|
qmlRegisterType<EpubBook>("harbour.calibreweb", 1, 0, "EpubBook");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user