From 27ccf493488baf231fadaca57462247e46497b99 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 29 Oct 2025 16:59:45 +0300 Subject: [PATCH 01/16] [Source] Make paged and orientation settings independent --- application/qml/pages/ContentPage.qml | 31 +++++++++------------------ 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index 3d857fc..f375548 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -101,7 +101,8 @@ Page { annotationsPaint: true notesPaint: true anchors.horizontalCenter: parent.horizontalCenter - deviceOrientation: DocumentSettings.verticalScroll(splitDocumentName()) ? Qt.Vertical : Qt.Horizontal + deviceOrientation: root.orientation + orientation: DocumentSettings.verticalScroll(splitDocumentName()) ? Qt.Vertical : Qt.Horizontal onClickedUrl: Qt.openUrlExternally(url) @@ -654,35 +655,23 @@ Page { PopupMenuCheckableItem { id: horizontalOption + checked: pdfPagesView.orientation === Qt.Horizontal + text: qsTr("Scroll pages horizontally") + onCheckedChanged: { - if (checked) { - pdfPagesView.orientation = Qt.Horizontal; - } else { - pdfPagesView.orientation = Qt.Vertical; - } - DocumentSettings.setVerticalScroll(splitDocumentName(), pdfPagesView.orientation === Qt.Vertical); + DocumentSettings.setVerticalScroll(splitDocumentName(), !checked); + pdfPagesView.orientation = checked ? Qt.Horizontal : Qt.Vertical; } - - enabled: !pdfPagesView.isPagedView - - checked: false - text: qsTr("Scroll pages horizontally") } PopupMenuCheckableItem { + checked: pdfPagesView.isPagedView + text: qsTr("Paged view") + onCheckedChanged: { - if (checked) { - pdfPagesView.orientation = Qt.Horizontal; - } else { - pdfPagesView.orientation = horizontalOption.checked ? Qt.Horizontal : Qt.Vertical; - } DocumentSettings.setIsPagedView(splitDocumentName(), checked); pdfPagesView.isPagedView = checked; - DocumentSettings.setVerticalScroll(splitDocumentName(), pdfPagesView.orientation === Qt.Vertical); } - - checked: pdfPagesView.isPagedView - text: qsTr("Paged view") } PopupMenuDividerItem {} -- GitLab From 665ce5b6816f43e9d37907e36b4349555fc768f9 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 29 Oct 2025 17:55:37 +0300 Subject: [PATCH 02/16] [Source] Add vertical paged scrolling --- amberpdfqmlplugin/PdfView.qml | 66 +++++++++++++++++++++++-------- amberpdfqmlplugin/src/pdfview.cpp | 24 +++++++---- 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 5463381..895b146 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -439,27 +439,59 @@ Rectangle { var overscrollLeft = pageStartX - leftEdgeX; var overscrollRight = rightEdgeX - pageEndX; - var threshold = 0.3 * viewWidth; - if (root.deviceOrientation !== Orientation.Portrait) { - threshold = 0.15 * viewWidth; - } + var viewHeigth = height; + var scaledPageHeigth = pdfView.getActualPageHeight(currentIndex) * itemScale; - if (overscrollRight > threshold) { - scrollToPage(previousPageIndex + 1); - return; - } + var pageStartY = previousPageIndex * (scaledPageHeigth + scaledSpacing); + var pageEndY = pageStartY + scaledPageHeigth; - if (overscrollLeft > threshold) { - scrollToPage(previousPageIndex - 1); - return; + var topEdgeY = contentY; + var bottomEdgeY = contentY + viewHeigth; + + var overscrollDown = pageStartY - topEdgeY; + var overscrollUp = bottomEdgeY - pageEndY; + + var thresholdWidth = 0.3 * viewWidth; + var thresholdHeigth = 0.3 * viewHeigth; + if (root.deviceOrientation !== Orientation.Portrait) { + thresholdWidth = 0.15 * viewWidth; + } + if (root.deviceOrientation !== Orientation.Landscape) { + thresholdHeigth = 0.15 * viewHeigth; } - if (overscrollRight > 0) { - scrollAnimation.to = pageEndX - viewWidth; - scrollAnimation.start(); - } else if (overscrollLeft > 0) { - scrollAnimation.to = pageStartX; - scrollAnimation.start(); + if (orientation == Qt.Horizontal) { + if (overscrollRight > thresholdWidth) { + scrollToPage(previousPageIndex + 1); + return; + } + if (overscrollLeft > thresholdWidth) { + scrollToPage(previousPageIndex - 1); + return; + } + if (overscrollRight > 0) { + scrollAnimation.to = pageEndX - viewWidth; + scrollAnimation.start(); + } else if (overscrollLeft > 0) { + scrollAnimation.to = pageStartX; + scrollAnimation.start(); + } + } else { + if (overscrollUp > thresholdHeigth) { + scrollToPage(previousPageIndex + 1); + return; + } + if (overscrollDown > thresholdHeigth) { + scrollToPage(previousPageIndex - 1); + return; + } + if (overscrollUp > 0) { + scrollAnimation.to = pageEndY - viewHeigth; + scrollAnimation.start(); + } else if (overscrollDown > 0) { + scrollAnimation.to = pageStartY; + scrollAnimation.start(); + } } } diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 06783a1..9c3be7c 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -901,17 +901,25 @@ void PdfView::scrollViewToIndex(int index) } auto pagePosition = m_mapper->actualPagePosition(index); - - QPropertyAnimation *anim = new QPropertyAnimation(this, "contentX"); + QPropertyAnimation *anim; + if (m_orientation == Qt::Horizontal) { + anim = new QPropertyAnimation(this, "contentX"); + anim->setStartValue(this->contentX()); + if (this->contentX() > pagePosition.start * m_itemScale) + anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - width()); + else + anim->setEndValue(pagePosition.start * m_itemScale); + } else { + anim = new QPropertyAnimation(this, "contentY"); + anim->setStartValue(this->contentY()); + if (this->contentY() > pagePosition.start * m_itemScale) + anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - height()); + else + anim->setEndValue(pagePosition.start * m_itemScale); + } anim->setDuration(200); - anim->setStartValue(this->contentX()); - if (this->contentX() > pagePosition.start * m_itemScale) - anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - width()); - else - anim->setEndValue(pagePosition.start * m_itemScale); anim->start(QAbstractAnimation::DeleteWhenStopped); connect(anim, &QVariantAnimation::finished, this, &PdfView::pageSwapAnimationEnded); - m_timer->start(1300); } -- GitLab From 421bd40986bdc54d9f854ec4128e95903424ead3 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Sat, 1 Nov 2025 18:22:56 +0300 Subject: [PATCH 03/16] [Source] Fix view position when isPaged enables --- application/qml/pages/ContentPage.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index f375548..e215a5d 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -671,6 +671,8 @@ Page { onCheckedChanged: { DocumentSettings.setIsPagedView(splitDocumentName(), checked); pdfPagesView.isPagedView = checked; + if (checked) + pdfPagesView.scrollToPage(pdfPagesView.currentIndex) } } -- GitLab From 270275cae10048856ce341fd2d71a91bfc341075 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Mon, 24 Nov 2025 18:03:35 +0300 Subject: [PATCH 04/16] [Source] Fix vertical scrolled pages positions --- amberpdfqmlplugin/PdfView.qml | 7 ++++--- amberpdfqmlplugin/src/pdfview.cpp | 9 ++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 895b146..3328d6b 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -165,7 +165,10 @@ Rectangle { function goToNextPage() { if (isScrolling) return - scrollToPage(currentIndex + 1) + if (currentIndex === maxPageIndex) + scrollToPage(minPageIndex) + else + scrollToPage(currentIndex + 1) } function goToPreviousPage() { @@ -341,7 +344,6 @@ Rectangle { property real minimumItemScale: fixedScaleValues[0] property real maximumPinchScale: root.drawMode ? 3.5 : 6.0 property real storedRootContentPosition: 0 - property real previousContentX: 0 property int previousPageIndex: 0 property real standartMaxVelocity: 1 @@ -419,7 +421,6 @@ Rectangle { return; previousPageIndex = currentIndex; - previousContentX = contentX; } onMovementEnded: { if (!isPagedView) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 9c3be7c..ed2f00f 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -34,7 +34,7 @@ PdfView::PdfView(QQuickItem *parent) , m_contentX(-1) , m_moveDirection(-1) , m_paintedItemsSize(-1) - , m_currentIndex(-1) + , m_currentIndex(0) , m_catchBound(0) , m_orientation(Qt::Vertical) , m_itemScale(1.0) @@ -913,7 +913,7 @@ void PdfView::scrollViewToIndex(int index) anim = new QPropertyAnimation(this, "contentY"); anim->setStartValue(this->contentY()); if (this->contentY() > pagePosition.start * m_itemScale) - anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - height()); + anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - std::min((pagePosition.end - pagePosition.start) * m_itemScale, height())); else anim->setEndValue(pagePosition.start * m_itemScale); } @@ -1355,11 +1355,14 @@ void PdfView::_positionPages() if (!page->isVisible()) page->setVisible(true); +// if (m_isPagedView && pageIndex != m_currentIndex) +// page->setVisible(false); auto pagePosition = m_mapper->actualPagePosition(pageIndex); if (m_orientation == Qt::Vertical) { - page->setY(paintStart - (qMax(0.0f, float(m_contentY)) - pagePosition.start * m_itemScale)); + page->setY(paintStart - (qMax(0.0f, float(m_contentY)) - pagePosition.start * m_itemScale) + + (m_isPagedView ? (std::max(height() - page->height() * m_itemScale, 0.0f)) / 2.0f : 0)); if (page->width() <= width()) page->setX((width() - page->width()) / 2.0f); -- GitLab From 49ab340caff4f72f623953e1e9ef930822f6d541 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 26 Nov 2025 15:16:34 +0300 Subject: [PATCH 05/16] [Source] Fix vertical scroll animation --- amberpdfqmlplugin/PdfView.qml | 100 ++++++++++++++-------------------- 1 file changed, 40 insertions(+), 60 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 3328d6b..0fc6c22 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -426,73 +426,53 @@ Rectangle { if (!isPagedView) return; - var itemScale = pdfView.itemScale; - var scaledPageWidth = pdfView.getActualPageWidth(currentIndex) * itemScale; - var scaledSpacing = pageSpacing * itemScale; - var viewWidth = width; - - var pageStartX = previousPageIndex * (scaledPageWidth + scaledSpacing); - var pageEndX = pageStartX + scaledPageWidth; - - var leftEdgeX = contentX; - var rightEdgeX = contentX + viewWidth; - var overscrollLeft = pageStartX - leftEdgeX; - var overscrollRight = rightEdgeX - pageEndX; + var itemScale = pdfView.itemScale; - var viewHeigth = height; - var scaledPageHeigth = pdfView.getActualPageHeight(currentIndex) * itemScale; + var scaledPageSize = (orientation == Qt.Horizontal ? pdfView.getActualPageWidth(currentIndex) : pdfView.getActualPageHeight(currentIndex)) * itemScale; + var scaledSpacing = pageSpacing * itemScale; + var viewSize = orientation == Qt.Horizontal ? width : height; + var verticalGap = (orientation == Qt.Vertical ? Math.max((viewSize - scaledPageSize) / 2, 0) : 0) - var pageStartY = previousPageIndex * (scaledPageHeigth + scaledSpacing); - var pageEndY = pageStartY + scaledPageHeigth; + var pageStart = previousPageIndex * (scaledPageSize + scaledSpacing); + var pageEnd = pageStart + scaledPageSize; - var topEdgeY = contentY; - var bottomEdgeY = contentY + viewHeigth; + var backEdge = orientation == Qt.Horizontal ? contentX : contentY; + var frontEdge = backEdge + viewSize; - var overscrollDown = pageStartY - topEdgeY; - var overscrollUp = bottomEdgeY - pageEndY; + var overscrollBack = pageStart - backEdge; + var overscrollFront = frontEdge - pageEnd - verticalGap; - var thresholdWidth = 0.3 * viewWidth; - var thresholdHeigth = 0.3 * viewHeigth; - if (root.deviceOrientation !== Orientation.Portrait) { - thresholdWidth = 0.15 * viewWidth; + var threshold = viewSize * 0.3; + if (root.deviceOrientation !== Orientation.Portrait && orientation == Qt.Horizontal + || root.deviceOrientation !== Orientation.Landscape && orientation == Qt.Vertical) { + threshold /= 2; + } + console.log("verticalGap", verticalGap) + console.log("scaledPageSize", scaledPageSize) + console.log("viewSize", viewSize) + console.log("pageStart", pageStart) + console.log("pageEnd", pageEnd) + console.log("backEdge", backEdge) + console.log("frontEdge", frontEdge) + console.log("overscrollBack", overscrollBack) + console.log("overscrollFront", overscrollFront) + console.log("threshold", threshold) + + if (overscrollFront > threshold) { + scrollToPage(previousPageIndex + 1); + return; } - if (root.deviceOrientation !== Orientation.Landscape) { - thresholdHeigth = 0.15 * viewHeigth; + if (overscrollBack > threshold) { + scrollToPage(previousPageIndex - 1); + return; } - - if (orientation == Qt.Horizontal) { - if (overscrollRight > thresholdWidth) { - scrollToPage(previousPageIndex + 1); - return; - } - if (overscrollLeft > thresholdWidth) { - scrollToPage(previousPageIndex - 1); - return; - } - if (overscrollRight > 0) { - scrollAnimation.to = pageEndX - viewWidth; - scrollAnimation.start(); - } else if (overscrollLeft > 0) { - scrollAnimation.to = pageStartX; - scrollAnimation.start(); - } - } else { - if (overscrollUp > thresholdHeigth) { - scrollToPage(previousPageIndex + 1); - return; - } - if (overscrollDown > thresholdHeigth) { - scrollToPage(previousPageIndex - 1); - return; - } - if (overscrollUp > 0) { - scrollAnimation.to = pageEndY - viewHeigth; - scrollAnimation.start(); - } else if (overscrollDown > 0) { - scrollAnimation.to = pageStartY; - scrollAnimation.start(); - } + if (overscrollFront > 0) { + scrollAnimation.to = pageEnd - Math.min(viewSize, scaledPageSize); + scrollAnimation.start(); + } else if (overscrollBack > 0) { + scrollAnimation.to = pageStart; + scrollAnimation.start(); } } @@ -531,7 +511,7 @@ Rectangle { target: viewFlick duration: 100 - property: "contentX" + property: orientation == Qt.Horizontal ? "contentX" : "contentY" } Timer { -- GitLab From c982da7685cda7fae8b1d53653ca961827afa664 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 26 Nov 2025 21:01:24 +0300 Subject: [PATCH 06/16] [Source] Change pages spacing in paged mode --- amberpdfqmlplugin/PdfView.qml | 10 ------ amberpdfqmlplugin/src/pdfview.cpp | 46 +++++++++++++++++---------- application/qml/pages/ContentPage.qml | 2 -- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 0fc6c22..9fec14b 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -448,16 +448,6 @@ Rectangle { || root.deviceOrientation !== Orientation.Landscape && orientation == Qt.Vertical) { threshold /= 2; } - console.log("verticalGap", verticalGap) - console.log("scaledPageSize", scaledPageSize) - console.log("viewSize", viewSize) - console.log("pageStart", pageStart) - console.log("pageEnd", pageEnd) - console.log("backEdge", backEdge) - console.log("frontEdge", frontEdge) - console.log("overscrollBack", overscrollBack) - console.log("overscrollFront", overscrollFront) - console.log("threshold", threshold) if (overscrollFront > threshold) { scrollToPage(previousPageIndex + 1); diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index ed2f00f..853fb80 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -912,10 +912,15 @@ void PdfView::scrollViewToIndex(int index) } else { anim = new QPropertyAnimation(this, "contentY"); anim->setStartValue(this->contentY()); - if (this->contentY() > pagePosition.start * m_itemScale) - anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - std::min((pagePosition.end - pagePosition.start) * m_itemScale, height())); - else + if (this->contentY() > pagePosition.start * m_itemScale) { + if ((pagePosition.end - pagePosition.start - m_pageSpacing) * m_itemScale > height()) { + anim->setEndValue((pagePosition.end - m_pageSpacing) * m_itemScale - height()); + } else { + anim->setEndValue(pagePosition.start * m_itemScale); + } + } else { anim->setEndValue(pagePosition.start * m_itemScale); + } } anim->setDuration(200); anim->start(QAbstractAnimation::DeleteWhenStopped); @@ -934,7 +939,7 @@ void PdfView::setOrientation(Qt::Orientation orientation) positionViewAtIndex(currentIndex); emit orientationChanged(m_orientation); - if (orientation == Qt::Horizontal && m_itemScale < 1) { + if (m_itemScale < 1) { setItemScale(1); } else { _positionPages(); @@ -1290,6 +1295,7 @@ void PdfView::setPageSpacing(qreal pageSpacing) return; m_pageSpacing = pageSpacing; + m_mapper->setSpacing(m_pageSpacing); emit pageSpacingChanged(m_pageSpacing); } @@ -1332,6 +1338,16 @@ void PdfView::_updateContentSize() void PdfView::_positionPages() { + if (m_isPagedView) { + if (m_orientation == Qt::Horizontal) { + setPageSpacing(width()); + } else { + setPageSpacing(height()); + } + } else { + setPageSpacing(SPACING_DEFAULT_VALUE); + } + auto paintStart = m_mapper->spacing(); if (m_isPagedView) @@ -1614,16 +1630,11 @@ void PdfView::_updateCurrentIndex() if (page == nullptr) continue; - if (m_orientation == Qt::Vertical) { - if (m_catchBound >= page->y() && m_catchBound < page->y() + page->height()) { - if (m_currentIndex != pageIndex) { - newCurrentIndex = pageIndex; - } - } - } else { - if (m_catchBound >= page->x() && m_catchBound < page->x() + page->width()) { - if (m_currentIndex != pageIndex) - newCurrentIndex = pageIndex; + if ((m_orientation == Qt::Vertical && m_catchBound >= page->y() && m_catchBound < page->y() + page->height()) || + (m_orientation == Qt::Horizontal && m_catchBound >= page->x() && m_catchBound < page->x() + page->width())) { + if (m_currentIndex != pageIndex) { + newCurrentIndex = pageIndex; + break; } } } @@ -1768,9 +1779,11 @@ void PdfView::setIsPagedView(bool newIsPagedView) if (m_isPagedView == newIsPagedView) return; m_isPagedView = newIsPagedView; - + auto currentIndex = m_currentIndex; m_mapper->setIsPagedView(newIsPagedView); emit isPagedViewChanged(newIsPagedView); + _positionPages(); + scrollViewToIndex(currentIndex); } void PdfView::_preparePages() @@ -1872,8 +1885,9 @@ void PdfView::_preparePages() needPositioning = true; } - if (needPositioning) + if (needPositioning) { _positionPages(); + } } void PdfView::_preparePageChecker(PdfPageContainer *page, int pageIndex) diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index e215a5d..f375548 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -671,8 +671,6 @@ Page { onCheckedChanged: { DocumentSettings.setIsPagedView(splitDocumentName(), checked); pdfPagesView.isPagedView = checked; - if (checked) - pdfPagesView.scrollToPage(pdfPagesView.currentIndex) } } -- GitLab From fc8e2573baf48bba939bf954c1fd4326b158caa1 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 26 Nov 2025 21:44:22 +0300 Subject: [PATCH 07/16] [Source] Fix page spacing size --- amberpdfqmlplugin/src/pdfview.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 853fb80..1b621ed 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -1340,9 +1340,9 @@ void PdfView::_positionPages() { if (m_isPagedView) { if (m_orientation == Qt::Horizontal) { - setPageSpacing(width()); + setPageSpacing(width() * 1.3); } else { - setPageSpacing(height()); + setPageSpacing(height() * 1.3); } } else { setPageSpacing(SPACING_DEFAULT_VALUE); @@ -1371,8 +1371,6 @@ void PdfView::_positionPages() if (!page->isVisible()) page->setVisible(true); -// if (m_isPagedView && pageIndex != m_currentIndex) -// page->setVisible(false); auto pagePosition = m_mapper->actualPagePosition(pageIndex); -- GitLab From 0063cf6e8b60f251d793aa84d9fd2afd4a714d96 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Tue, 2 Dec 2025 17:25:34 +0300 Subject: [PATCH 08/16] [Source] Fix type mismatch in max function --- amberpdfqmlplugin/src/pdfview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 1b621ed..675f6a8 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -1376,7 +1376,7 @@ void PdfView::_positionPages() if (m_orientation == Qt::Vertical) { page->setY(paintStart - (qMax(0.0f, float(m_contentY)) - pagePosition.start * m_itemScale) - + (m_isPagedView ? (std::max(height() - page->height() * m_itemScale, 0.0f)) / 2.0f : 0)); + + (m_isPagedView ? (qMax(float(height() - page->height() * m_itemScale), 0.0f)) / 2.0f : 0)); if (page->width() <= width()) page->setX((width() - page->width()) / 2.0f); -- GitLab From 55333ba2460fde0c22a0e9ddb2fd5e45fcedd229 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 3 Dec 2025 17:42:49 +0300 Subject: [PATCH 09/16] [Source] Fix vertical mode scaling --- amberpdfqmlplugin/PdfView.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 9fec14b..6f7d8a7 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -411,6 +411,10 @@ Rectangle { pdfView.contentY = contentY } onContentXChanged: { + if (orientation == Qt.Vertical && contentX > viewFlick.width) { + contentX = pdfView.contentX; + return; + } if (viewPositionBlocker.running) return @@ -546,8 +550,10 @@ Rectangle { paintArea.scale = pdfView.itemScale / startScale; updateBoundRectPosition(); viewFlick.returnToBounds(); - viewFlick.returnToBounds() afterPinchDelayTimer.start(); + if (pdfView.orientation == Qt.Vertical && pdfView.itemScale == 1) { + pdfView.scrollViewToIndex(pdfView.currentIndex) + } } Timer { -- GitLab From ebb3245871a4754b7e5e69370c5eed27b2a8d13e Mon Sep 17 00:00:00 2001 From: OMP Education Date: Fri, 5 Dec 2025 01:47:48 +0300 Subject: [PATCH 10/16] [Source] Fix scaling center in vertical paged mode --- amberpdfqmlplugin/PdfView.qml | 12 +++++++----- amberpdfqmlplugin/src/pdfview.cpp | 5 +++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 6f7d8a7..3b79201 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -423,10 +423,11 @@ Rectangle { onMovementStarted: { if (!isPagedView) return; - previousPageIndex = currentIndex; } - onMovementEnded: { + onMovementEnded: scrollToPageIfOverscrolled() + + function scrollToPageIfOverscrolled() { if (!isPagedView) return; @@ -452,7 +453,6 @@ Rectangle { || root.deviceOrientation !== Orientation.Landscape && orientation == Qt.Vertical) { threshold /= 2; } - if (overscrollFront > threshold) { scrollToPage(previousPageIndex + 1); return; @@ -539,6 +539,8 @@ Rectangle { viewFlick.cancelFlick() pinching = true startScale = pdfView.itemScale + + viewFlick.previousPageIndex = root.currentIndex; } onPinchUpdated: { viewFlick.scaleAroundPoint(pinch.center, @@ -551,8 +553,8 @@ Rectangle { updateBoundRectPosition(); viewFlick.returnToBounds(); afterPinchDelayTimer.start(); - if (pdfView.orientation == Qt.Vertical && pdfView.itemScale == 1) { - pdfView.scrollViewToIndex(pdfView.currentIndex) + if (pdfView.itemScale == 1) { + viewFlick.scrollToPageIfOverscrolled(); } } diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 675f6a8..f6895ee 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -962,8 +962,9 @@ void PdfView::setItemScale(qreal itemScale) void PdfView::scaleAroundPoint(const QPointF ¢er, qreal newScale) { - m_contentX -= center.x() - (center.x() / (m_contentWidth * m_itemScale)) * (m_contentWidth * newScale); - m_contentY -= center.y() - (center.y() / (m_contentHeight * m_itemScale)) * (m_contentHeight * newScale); + qreal verticalGap = m_isPagedView && m_orientation == Qt::Vertical ? qMax(float(height() - getActualPageHeight(m_currentIndex) * qMax(m_itemScale, newScale)), 0.0f) : 0; + m_contentX -= center.x() * ( 1 - newScale / m_itemScale); + m_contentY -= (center.y() - 6 * verticalGap) * ( 1 - newScale / m_itemScale); m_itemScale = newScale; _positionPages(); -- GitLab From b9d0a54cc9e2fed05e79a8611a173736c7200027 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 10 Dec 2025 22:10:11 +0300 Subject: [PATCH 11/16] [Source] Fix page reset when orientation changes --- amberpdfqmlplugin/src/pdfview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index f6895ee..c3917d2 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -937,13 +937,13 @@ void PdfView::setOrientation(Qt::Orientation orientation) m_orientation = orientation; m_mapper->setOrientation(m_orientation); - positionViewAtIndex(currentIndex); emit orientationChanged(m_orientation); if (m_itemScale < 1) { setItemScale(1); } else { _positionPages(); } + positionViewAtIndex(currentIndex); } void PdfView::setItemScale(qreal itemScale) -- GitLab From 418eac29159d61328fddc12f966f9de8c715b807 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Thu, 11 Dec 2025 19:49:49 +0300 Subject: [PATCH 12/16] [Source] Fix vertical scrolling when popup menu opened --- amberpdfqmlplugin/PdfView.qml | 1 + application/qml/pages/ContentPage.qml | 5 ++++- application/qml/pages/NavigationPage.qml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 3b79201..70b2f1c 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -43,6 +43,7 @@ Rectangle { property alias flickable: viewFlick property bool pinchingActive: false property int lastSavedPdfViewZCoordinate: 0 + property alias scroll: viewFlick.quickScroll property var painter: paintArea property string lineColor: "red" diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index f375548..ed602c6 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -648,7 +648,10 @@ Page { open(d) } - onOpenedChanged: delegate.selected = opened + onOpenedChanged: { + pdfPagesView.scroll = !opened; + delegate.selected = opened; + } preferredWidth: applicationWindow.preferredWidthPopup diff --git a/application/qml/pages/NavigationPage.qml b/application/qml/pages/NavigationPage.qml index 993060a..560e5e1 100644 --- a/application/qml/pages/NavigationPage.qml +++ b/application/qml/pages/NavigationPage.qml @@ -188,7 +188,7 @@ Page { color: palette.primaryColor } onClicked: { - sectionSelected(pageIndex) + sectionSelected(pageIndex - 1) pageStack.pop() } } -- GitLab From c3c0cadb99019a410aff0d219388e2a732b0a543 Mon Sep 17 00:00:00 2001 From: OMP Education Date: Fri, 12 Dec 2025 00:24:49 +0300 Subject: [PATCH 13/16] [Source] Fix scaling in vertical mode --- amberpdfqmlplugin/PdfView.qml | 17 +++++++++++++++-- amberpdfqmlplugin/src/pdfview.cpp | 9 ++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 70b2f1c..3303bef 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -378,20 +378,33 @@ Rectangle { function holdViewAtPage() { var itemScale = pdfView.itemScale; var scaledPageWidth = pdfView.getActualPageWidth(currentIndex) * itemScale; + var scaledPageHeight = pdfView.getActualPageHeight(currentIndex) * itemScale; var scaledSpacing = pageSpacing * itemScale; var viewWidth = width; + var viewHeight = height; - var pageStartX = currentIndex * (scaledPageWidth + scaledSpacing); + var pageStartX = pdfView.orientation == Qt.Horizontal ? currentIndex * (scaledPageWidth + scaledSpacing) : 0; var pageEndX = pageStartX + scaledPageWidth; + var pageStartY = pdfView.orientation == Qt.Vertical ? currentIndex * (scaledPageHeight + scaledSpacing) : 0; + var pageEndY = pageStartY + scaledPageHeight; + + var verticalGap = pdfView.orientation == Qt.Vertical ? Math.max(viewHeight * itemScale - scaledPageHeight, 0): 0 var newLeftEdge = contentX; var newRightEdge = contentX + viewWidth; + var newTopEdge = contentY; + var newBottomEdge = contentY + viewHeight; if (newLeftEdge < pageStartX) { contentX = pageStartX; } else if (newRightEdge > pageEndX) { contentX = pageEndX - viewWidth; } + if (newTopEdge < pageStartY - verticalGap - 1) { + contentY = pageStartY - verticalGap; + } else if (newBottomEdge > pageEndY + verticalGap + 1) { + contentY = pageEndY - viewHeight + verticalGap; + } } contentHeight: Math.max(height, (pdfView.orientation === Qt.Vertical @@ -449,7 +462,7 @@ Rectangle { var overscrollBack = pageStart - backEdge; var overscrollFront = frontEdge - pageEnd - verticalGap; - var threshold = viewSize * 0.3; + var threshold = (viewSize + verticalGap) * 0.3; if (root.deviceOrientation !== Orientation.Portrait && orientation == Qt.Horizontal || root.deviceOrientation !== Orientation.Landscape && orientation == Qt.Vertical) { threshold /= 2; diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index c3917d2..711c64c 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -760,7 +760,7 @@ void PdfView::setContentX(qreal contentX) if (qFuzzyCompare(double(m_contentX), double(contentX))) return; - if (m_orientation == Qt::Vertical) + if (m_orientation == Qt::Horizontal) m_moveDirection = m_contentX - contentX; m_contentX = contentX; @@ -963,15 +963,14 @@ void PdfView::setItemScale(qreal itemScale) void PdfView::scaleAroundPoint(const QPointF ¢er, qreal newScale) { qreal verticalGap = m_isPagedView && m_orientation == Qt::Vertical ? qMax(float(height() - getActualPageHeight(m_currentIndex) * qMax(m_itemScale, newScale)), 0.0f) : 0; + qreal coef = qMax(float(height() / (height() - getActualPageHeight(m_currentIndex))), 0.0f) / qMin(m_itemScale, newScale); m_contentX -= center.x() * ( 1 - newScale / m_itemScale); - m_contentY -= (center.y() - 6 * verticalGap) * ( 1 - newScale / m_itemScale); - m_itemScale = newScale; + m_contentY -= (center.y() - coef * verticalGap) * ( 1 - newScale / m_itemScale); - _positionPages(); + setItemScale(newScale); emit contentXChanged(m_contentX); emit contentYChanged(m_contentY); - emit itemScaleChanged(m_itemScale); } void PdfView::clicked(const QPointF &point) -- GitLab From 664c652c11f3fb77c605ee32de2f8566e12a7f7e Mon Sep 17 00:00:00 2001 From: OMP Education Date: Tue, 16 Dec 2025 15:33:23 +0300 Subject: [PATCH 14/16] [Source] Fix current page number determining --- amberpdfqmlplugin/src/pdfview.cpp | 5 ++--- application/qml/pages/ContentPage.qml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 711c64c..b6755d2 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -1627,9 +1627,8 @@ void PdfView::_updateCurrentIndex() auto page = m_pages.value(pageIndex); if (page == nullptr) continue; - - if ((m_orientation == Qt::Vertical && m_catchBound >= page->y() && m_catchBound < page->y() + page->height()) || - (m_orientation == Qt::Horizontal && m_catchBound >= page->x() && m_catchBound < page->x() + page->width())) { + if ((m_orientation == Qt::Vertical && m_catchBound >= page->y() - m_pageSpacing / 2 && m_catchBound < page->y() + page->height() + m_pageSpacing / 2) || + (m_orientation == Qt::Horizontal && m_catchBound >= page->x() - m_pageSpacing / 2 && m_catchBound < page->x() + page->width() + m_pageSpacing / 2)) { if (m_currentIndex != pageIndex) { newCurrentIndex = pageIndex; break; diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index ed602c6..0537068 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -97,7 +97,7 @@ Page { documentProvider: pdfiumProvider clip: true width: parent.width - catchBound: appBar.height + catchBound: orientation == Qt.Vertical ? height / 2 : width / 2 annotationsPaint: true notesPaint: true anchors.horizontalCenter: parent.horizontalCenter -- GitLab From f0af527ec5003823be60eb7ca3cdf34c067088fe Mon Sep 17 00:00:00 2001 From: OMP Education Date: Tue, 16 Dec 2025 22:24:33 +0300 Subject: [PATCH 15/16] [Source] Fix annotation scrolling --- amberpdfqmlplugin/PdfView.qml | 7 +++++-- amberpdfqmlplugin/src/pdfview.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/amberpdfqmlplugin/PdfView.qml b/amberpdfqmlplugin/PdfView.qml index 3303bef..0f06020 100644 --- a/amberpdfqmlplugin/PdfView.qml +++ b/amberpdfqmlplugin/PdfView.qml @@ -326,7 +326,10 @@ Rectangle { } onItemScaleChanged: root.correctPosition() onClickedUrl: root.clickedUrl(url) - onClickedGoToPage: root.correctPosition() + onClickedGoToPage: { + root.correctPosition(); + viewFlick.holdViewAtPage(); + } onNoteActivated: root.noteActivate(noteText, author, pageIndex, annotationId, color, noteType) onDocumentSaved: root.documentSaved(saveStatus) onNoteRemoved: root.noteRemoved(pageIndex, noteId, result) @@ -425,7 +428,7 @@ Rectangle { pdfView.contentY = contentY } onContentXChanged: { - if (orientation == Qt.Vertical && contentX > viewFlick.width) { + if (orientation == Qt.Vertical && contentX > viewFlick.contentWidth) { contentX = pdfView.contentX; return; } diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index b6755d2..3ae3105 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -1673,16 +1673,16 @@ void PdfView::_processActivatedAnnotation(QSharedPointer annotat {width(), height()}, m_orientation, m_itemScale); - auto pageRate = targetPageSize.width() / pageGeometry.width(); - QPointF linkOnPagePosition(pageCoordinate.x() * pageRate, - (pageGeometry.height() - pageCoordinate.y()) * pageRate); + m_currentIndex = pageIndex; + emit currentIndexChanged(m_currentIndex); auto pagePosition = m_mapper->actualPagePosition(pageIndex); if (m_orientation == Qt::Vertical) { if (pageCoordinate.y() <= 0) { positionViewAtIndex(pageIndex); } else { - setContentY((pagePosition.start + (pageGeometry.height() - pageCoordinate.y()) * pageRate) * m_itemScale); + auto pageRate = targetPageSize.width() / pageGeometry.width(); + setContentY(pagePosition.start * m_itemScale + (pageGeometry.height() - pageCoordinate.y()) * pageRate); } } else { setContentX(pagePosition.start * m_itemScale); -- GitLab From dbcf47144248e8d0d27732a43cfc011906c8880c Mon Sep 17 00:00:00 2001 From: OMP Education Date: Wed, 17 Dec 2025 19:08:28 +0300 Subject: [PATCH 16/16] [Source] Fix catchBound --- amberpdfqmlplugin/src/pdfview.cpp | 4 ++-- application/qml/pages/ContentPage.qml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/amberpdfqmlplugin/src/pdfview.cpp b/amberpdfqmlplugin/src/pdfview.cpp index 3ae3105..67c94b3 100644 --- a/amberpdfqmlplugin/src/pdfview.cpp +++ b/amberpdfqmlplugin/src/pdfview.cpp @@ -1627,8 +1627,8 @@ void PdfView::_updateCurrentIndex() auto page = m_pages.value(pageIndex); if (page == nullptr) continue; - if ((m_orientation == Qt::Vertical && m_catchBound >= page->y() - m_pageSpacing / 2 && m_catchBound < page->y() + page->height() + m_pageSpacing / 2) || - (m_orientation == Qt::Horizontal && m_catchBound >= page->x() - m_pageSpacing / 2 && m_catchBound < page->x() + page->width() + m_pageSpacing / 2)) { + if ((m_orientation == Qt::Vertical && height() / 2 >= page->y() - m_pageSpacing / 2 && height() / 2 < page->y() + page->height() + m_pageSpacing / 2) || + (m_orientation == Qt::Horizontal && width() / 2 >= page->x() - m_pageSpacing / 2 && width() / 2 < page->x() + page->width() + m_pageSpacing / 2)) { if (m_currentIndex != pageIndex) { newCurrentIndex = pageIndex; break; diff --git a/application/qml/pages/ContentPage.qml b/application/qml/pages/ContentPage.qml index 0537068..ed602c6 100644 --- a/application/qml/pages/ContentPage.qml +++ b/application/qml/pages/ContentPage.qml @@ -97,7 +97,7 @@ Page { documentProvider: pdfiumProvider clip: true width: parent.width - catchBound: orientation == Qt.Vertical ? height / 2 : width / 2 + catchBound: appBar.height annotationsPaint: true notesPaint: true anchors.horizontalCenter: parent.horizontalCenter -- GitLab