Коммит 23246ee4 создал по автору OMP Education's avatar OMP Education Зафиксировано автором Alexey Andreyev
Просмотр файлов

[PdfView] Implement QML item

Contributes to:

https://gitlab.com/omprussia/libraries/amberpdf-qml-plugin/-/issues/8
владелец 91b2d308
......@@ -41,6 +41,211 @@ import QtQuick 2.0
import Sailfish.Silica 1.0
import ru.omp.amberpdf 1.0
Item {
Rectangle {
id: root
property alias count: pdfView.count
property alias documentProvider: pdfView.documentProvider
property alias currentIndex: pdfView.currentIndex
property alias catchBound: pdfView.catchBound
property alias orientation: pdfView.orientation
property alias annotationsPaint: pdfView.annotationsPaint
property alias notesPaint: pdfView.notesPaint
property alias zoom: pdfView.itemScale
property alias contentTopMargin: pdfView.contentTopMargin
property alias pdfPath: pdfView.pdfPath
property alias status: pdfView.status
property alias contentX: viewFlick.contentX
property alias contentY: viewFlick.contentY
signal clicked()
signal clickedUrl(string url)
signal noteActivate(string noteText, string author)
signal contentChanged()
function correctPosition() {
viewFlick.contentY = pdfView.contentY
viewFlick.contentX = pdfView.contentX
viewFlick.returnToBounds()
}
function goToPage(pageIndex) {
viewPositionBlocker.start()
pdfView.positionViewAtIndex(pageIndex)
}
color: "transparent"
data: [
PdfViewPrivate {
id: pdfView
parent: viewFlick
height: parent.height
width: parent.width
anchors.top: parent.top
onWidthChanged: {
viewPositionBlocker.start()
root.correctPosition()
}
onHeightChanged: {
viewPositionBlocker.start()
root.correctPosition()
}
onContentChanged: {
root.correctPosition()
root.contentChanged()
}
onOrientationChanged: root.correctPosition()
onItemScaleChanged: root.correctPosition()
onClickedUrl: root.clickedUrl(url)
onClickedGoToPage: root.correctPosition()
onNoteActivated: root.noteActivate(noteText, author)
},
SilicaFlickable {
id: viewFlick
property var fixedScaleValues: [0.5, 1.0, 1.5, 2]
property real maximumItemScale: fixedScaleValues[fixedScaleValues.length - 1]
property real minimumItemScale: fixedScaleValues[0]
property real maximumPinchScale: 6.0
property real storedRootContentPosition: 0
function scaleAroundPoint(center, newScale) {
pdfView.scaleAroundPoint(center, newScale)
root.correctPosition()
}
function clicked(mouse) {
var screenX = mouse.x - contentX
var screenY = mouse.y - contentY
root.clicked()
}
function doubleClicked(mouse) {
var currentScale = fixedScaleValues.indexOf(Math.round(pdfView.itemScale * 100) / 100)
if (currentScale === -1) {
scaleAroundPoint(Qt.point(mouse.x, mouse.y), 1.0)
return
}
var newScale = fixedScaleValues[Math.max(1, (++currentScale) % fixedScaleValues.length)]
scaleAroundPoint(Qt.point(mouse.x, mouse.y), newScale)
}
contentHeight: Math.max(height, (pdfView.orientation === Qt.Vertical
? pdfView.contentHeight * pdfView.itemScale + pdfView.lastPageIndent
: pdfView.contentHeight))
contentWidth: Math.max(width, (pdfView.orientation === Qt.Vertical
? pdfView.contentWidth
: pdfView.contentWidth * pdfView.itemScale + pdfView.lastPageIndent))
flickableDirection: Flickable.AutoFlickDirection
anchors.fill: parent
onContentYChanged: {
if (viewPositionBlocker.running)
return
pdfView.contentY = contentY
}
onContentXChanged: {
if (viewPositionBlocker.running)
return
pdfView.contentX = contentX
}
onQuickScrollAnimatingChanged: {
if (quickScrollAnimating) {
switch (root.orientation) {
case Qt.Horizontal:
viewFlick.storedRootContentPosition = contentX
break
case Qt.Vertical:
viewFlick.storedRootContentPosition = contentY
break
}
} else {
switch (root.orientation) {
case Qt.Horizontal:
if (contentX < viewFlick.storedRootContentPosition) {
root.goToPage(0)
} else if (contentX > viewFlick.storedRootContentPosition) {
root.goToPage(root.count - 1)
}
break
case Qt.Vertical:
if (contentY < viewFlick.storedRootContentPosition) {
root.goToPage(0)
} else if (contentY > viewFlick.storedRootContentPosition) {
root.goToPage(root.count - 1)
}
break
}
}
}
Timer {
id: viewPositionBlocker
interval: 100
repeat: false
onTriggered: root.correctPosition()
}
ScrollDecorator { }
PinchArea {
id: pinchArea
property real startScale
property bool moving: false
anchors.fill: parent
enabled: pdfView.status === PdfDocument.Ready
onMovingChanged: if (moving) root.moving()
onPinchStarted: {
if (viewFlick.moving)
viewFlick.cancelFlick()
startScale = pdfView.itemScale
}
onPinchUpdated: {
viewFlick.scaleAroundPoint(pinch.center,
Math.max(viewFlick.minimumItemScale,
Math.min(viewFlick.maximumPinchScale, startScale * pinch.scale)))
}
onPinchFinished: viewFlick.returnToBounds()
MouseArea {
id: mouseArea
anchors.fill: parent
enabled: parent.enabled
onReleased: {
if (doubleClickTimer.running) {
doubleClickTimer.stop()
viewFlick.doubleClicked(Qt.point(mouseX, mouseY))
return
}
doubleClickTimer.lastMouse = Qt.point(mouseX, mouseY)
doubleClickTimer.start()
}
Timer {
id: doubleClickTimer
property var lastMouse
interval: 350
onTriggered: viewFlick.clicked(lastMouse)
}
}
}
}
]
}
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать