diff --git a/examples/pdf/multipage/viewer.qml b/examples/pdf/multipage/viewer.qml index 8f102a3c112d25af5792ae67999aa6e345588c5b..3a6347f5a3d05ebe015f9892cb35da157ed01ea7 100644 --- a/examples/pdf/multipage/viewer.qml +++ b/examples/pdf/multipage/viewer.qml @@ -299,8 +299,8 @@ ApplicationWindow { } ListView { id: searchResultsList - ColumnLayout.fillWidth: true - ColumnLayout.fillHeight: true + Layout.fillWidth: true + Layout.fillHeight: true clip: true model: view.searchModel ScrollBar.vertical: ScrollBar { } diff --git a/examples/pdf/pdfviewer/viewer.qml b/examples/pdf/pdfviewer/viewer.qml index e94642c5eadce8807a2e158cb8ed81077125d5a8..c63485dd38ecfd3d595789318ac16cc3093fff54 100644 --- a/examples/pdf/pdfviewer/viewer.qml +++ b/examples/pdf/pdfviewer/viewer.qml @@ -271,8 +271,8 @@ ApplicationWindow { } ListView { id: searchResultsList - ColumnLayout.fillWidth: true - ColumnLayout.fillHeight: true + Layout.fillWidth: true + Layout.fillHeight: true clip: true model: pageView.searchModel ScrollBar.vertical: ScrollBar { } @@ -292,10 +292,9 @@ ApplicationWindow { footer: Label { property size implicitPointSize: document.pagePointSize(pageView.currentPage) - text: "page " + (pageView.currentPage + 1) + " of " + pageView.pageCount + + text: "page " + (pageView.currentPage + 1) + " of " + document.pageCount + " scale " + pageView.renderScale.toFixed(2) + - " sourceSize " + pageView.sourceSize.width.toFixed(1) + "x" + pageView.sourceSize.height.toFixed(1) + - " original " + implicitPointSize.width.toFixed(1) + "x" + implicitPointSize.height.toFixed(1) - visible: pageView.pageCount > 0 + " original " + implicitPointSize.width.toFixed(1) + "x" + implicitPointSize.height.toFixed(1) + "pts" + visible: document.status === PdfDocument.Ready } } diff --git a/src/pdf/quick/qml/PdfPageView.qml b/src/pdf/quick/qml/PdfPageView.qml index f4d7da0af9b9ad517eb86611ad4edfd8230f37e3..ec3cd78e03522283b516292f2e473e99a3ded3e5 100644 --- a/src/pdf/quick/qml/PdfPageView.qml +++ b/src/pdf/quick/qml/PdfPageView.qml @@ -39,19 +39,18 @@ import QtQuick.Pdf 5.15 import QtQuick.Shapes 1.14 Rectangle { - id: paper - width: image.width - height: image.height - // public API // TODO 5.15: required property - property var document: null - property real renderScale: 1 - property alias sourceSize: image.sourceSize - property alias currentPage: navigationStack.currentPage - property alias pageCount: image.frameCount - property alias selectedText: selection.text + property var document: undefined property alias status: image.status + + property alias selectedText: selection.text + function copySelectionToClipboard() { + selection.copyToClipboard() + } + + // page navigation + property alias currentPage: navigationStack.currentPage property alias backEnabled: navigationStack.backAvailable property alias forwardEnabled: navigationStack.forwardAvailable function back() { navigationStack.back() } @@ -59,34 +58,33 @@ Rectangle { function goToPage(page) { goToLocation(page, Qt.point(0, 0), 0) } function goToLocation(page, location, zoom) { if (zoom > 0) - paper.renderScale = zoom + root.renderScale = zoom navigationStack.push(page, location, zoom) } - property real __pageScale: image.paintedWidth / document.pagePointSize(navigationStack.currentPage).width - + // page scaling + property real renderScale: 1 + property alias sourceSize: image.sourceSize function resetScale() { image.sourceSize.width = 0 image.sourceSize.height = 0 - paper.x = 0 - paper.y = 0 - paper.scale = 1 + root.x = 0 + root.y = 0 + root.scale = 1 } - function scaleToWidth(width, height) { - var halfRotation = Math.abs(paper.rotation % 180) + var halfRotation = Math.abs(root.rotation % 180) image.sourceSize = Qt.size((halfRotation > 45 && halfRotation < 135) ? height : width, 0) - paper.x = 0 - paper.y = 0 + root.x = 0 + root.y = 0 image.centerInSize = Qt.size(width, height) image.centerOnLoad = true image.vCenterOnLoad = (halfRotation > 45 && halfRotation < 135) - paper.scale = 1 + root.scale = 1 } - function scaleToPage(width, height) { var windowAspect = width / height - var halfRotation = Math.abs(paper.rotation % 180) + var halfRotation = Math.abs(root.rotation % 180) var pagePointSize = document.pagePointSize(navigationStack.currentPage) if (halfRotation > 45 && halfRotation < 135) { // rotated 90 or 270º @@ -107,7 +105,7 @@ Rectangle { image.centerInSize = Qt.size(width, height) image.centerOnLoad = true image.vCenterOnLoad = true - paper.scale = 1 + root.scale = 1 } // text search @@ -116,29 +114,31 @@ Rectangle { function searchBack() { --searchModel.currentResult } function searchForward() { ++searchModel.currentResult } + // implementation + id: root + width: image.width + height: image.height + PdfSelection { id: selection - document: paper.document + document: root.document page: navigationStack.currentPage - fromPoint: Qt.point(textSelectionDrag.centroid.pressPosition.x / paper.__pageScale, textSelectionDrag.centroid.pressPosition.y / paper.__pageScale) - toPoint: Qt.point(textSelectionDrag.centroid.position.x / paper.__pageScale, textSelectionDrag.centroid.position.y / paper.__pageScale) + fromPoint: Qt.point(textSelectionDrag.centroid.pressPosition.x / image.pageScale, textSelectionDrag.centroid.pressPosition.y / image.pageScale) + toPoint: Qt.point(textSelectionDrag.centroid.position.x / image.pageScale, textSelectionDrag.centroid.position.y / image.pageScale) hold: !textSelectionDrag.active && !tapHandler.pressed } - function copySelectionToClipboard() { - selection.copyToClipboard() - } PdfSearchModel { id: searchModel - document: paper.document === undefined ? null : paper.document - currentPage: navigationStack.currentPage - onCurrentPageChanged: paper.goToPage(currentPage) + document: root.document === undefined ? null : root.document + onCurrentPageChanged: root.goToPage(currentPage) } PdfNavigationStack { id: navigationStack + onCurrentPageChanged: searchModel.currentPage = currentPage // TODO onCurrentLocationChanged: position currentLocation.x and .y in middle // currentPageChanged() MUST occur first! - onCurrentZoomChanged: paper.renderScale = currentZoom + onCurrentZoomChanged: root.renderScale = currentZoom // TODO deal with horizontal location (need WheelHandler or Flickable probably) } @@ -151,27 +151,28 @@ Rectangle { property bool centerOnLoad: false property bool vCenterOnLoad: false property size centerInSize + property real pageScale: image.paintedWidth / document.pagePointSize(navigationStack.currentPage).width + function reRenderIfNecessary() { + var newSourceWidth = image.sourceSize.width * root.scale + var ratio = newSourceWidth / image.sourceSize.width + if (ratio > 1.1 || ratio < 0.9) { + image.sourceSize.width = newSourceWidth + image.sourceSize.height = 0 + root.scale = 1 + } + } onStatusChanged: if (status == Image.Ready && centerOnLoad) { - paper.x = (centerInSize.width - image.implicitWidth) / 2 - paper.y = vCenterOnLoad ? (centerInSize.height - image.implicitHeight) / 2 : 0 + root.x = (centerInSize.width - image.implicitWidth) / 2 + root.y = vCenterOnLoad ? (centerInSize.height - image.implicitHeight) / 2 : 0 centerOnLoad = false vCenterOnLoad = false } } - function reRenderIfNecessary() { - var newSourceWidth = image.sourceSize.width * paper.scale - var ratio = newSourceWidth / image.sourceSize.width - if (ratio > 1.1 || ratio < 0.9) { - image.sourceSize.width = newSourceWidth - image.sourceSize.height = 0 - paper.scale = 1 - } - } onRenderScaleChanged: { image.sourceSize.width = document.pagePointSize(navigationStack.currentPage).width * renderScale image.sourceSize.height = 0 - paper.scale = 1 + root.scale = 1 } Shape { @@ -182,7 +183,7 @@ Rectangle { strokeWidth: 1 strokeColor: "cyan" fillColor: "steelblue" - scale: Qt.size(paper.__pageScale, paper.__pageScale) + scale: Qt.size(image.pageScale, image.pageScale) PathMultiline { paths: searchModel.currentPageBoundingPolygons } @@ -191,14 +192,14 @@ Rectangle { strokeWidth: 1 strokeColor: "orange" fillColor: "cyan" - scale: Qt.size(paper.__pageScale, paper.__pageScale) + scale: Qt.size(image.pageScale, image.pageScale) PathMultiline { paths: searchModel.currentResultBoundingPolygons } } ShapePath { fillColor: "orange" - scale: Qt.size(paper.__pageScale, paper.__pageScale) + scale: Qt.size(image.pageScale, image.pageScale) PathMultiline { paths: selection.geometry } @@ -208,22 +209,22 @@ Rectangle { Repeater { model: PdfLinkModel { id: linkModel - document: paper.document + document: root.document page: navigationStack.currentPage } delegate: Rectangle { color: "transparent" border.color: "lightgrey" - x: rect.x * paper.__pageScale - y: rect.y * paper.__pageScale - width: rect.width * paper.__pageScale - height: rect.height * paper.__pageScale + x: rect.x * image.pageScale + y: rect.y * image.pageScale + width: rect.width * image.pageScale + height: rect.height * image.pageScale MouseArea { // TODO switch to TapHandler / HoverHandler in 5.15 anchors.fill: parent cursorShape: Qt.PointingHandCursor onClicked: { if (page >= 0) - navigationStack.push(page, Qt.point(0, 0), paper.renderScale) + navigationStack.push(page, Qt.point(0, 0), root.renderScale) else Qt.openUrlExternally(url) } @@ -237,7 +238,7 @@ Rectangle { maximumScale: 10 minimumRotation: 0 maximumRotation: 0 - onActiveChanged: if (!active) paper.reRenderIfNecessary() + onActiveChanged: if (!active) image.reRenderIfNecessary() grabPermissions: PinchHandler.TakeOverForbidden // don't allow takeover if pinch has started } DragHandler {