From be805e906ea9dae6c31af65e57618d1c8f694b70 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 24 Sep 2015 20:34:00 +0200 Subject: [PATCH] port to Documentview --- mobile/app/package/contents/ui/Browser.qml | 130 +--------- .../contents/ui/FullScreenDelegate.qml | 240 ------------------ .../package/contents/ui/ThumbnailsBase.qml | 1 - mobile/components/DocumentView.qml | 53 ++-- mobile/components/private/PageView.qml | 5 +- mobile/components/testDocumentView.qml | 2 +- 6 files changed, 48 insertions(+), 383 deletions(-) delete mode 100644 mobile/app/package/contents/ui/FullScreenDelegate.qml diff --git a/mobile/app/package/contents/ui/Browser.qml b/mobile/app/package/contents/ui/Browser.qml index 1ea470f32..2f74350ea 100644 --- a/mobile/app/package/contents/ui/Browser.qml +++ b/mobile/app/package/contents/ui/Browser.qml @@ -33,10 +33,11 @@ MobileComponents.SplitDrawer { property alias splitDrawerOpen: splitDrawer.open property alias overlayDrawerOpen: resourceBrowser.open + //An alias doesn't work - property bool bookmarked: pageArea.delegate.bookmarked + property bool bookmarked: false onBookmarkedChanged: { - pageArea.delegate.bookmarked = bookmarked + pageArea.page.bookmarked = bookmarked } drawer: Documents { @@ -48,126 +49,21 @@ MobileComponents.SplitDrawer { anchors.fill: parent visible: true - MouseEventListener { + Okular.DocumentView { id: pageArea + document: documentItem anchors.fill: parent - clip: true - //enabled: !delegate.interactive - property Item delegate: delegate1 - property Item oldDelegate: delegate2 - property bool incrementing: delegate.delta > 0 - - property bool bookmarked: delegate.bookmarked - onBookmarkedChanged: { - splitDrawer.bookmarked = delegate.bookmarked; - } - - Connections { - target: pageArea.delegate - onDeltaChanged: { - pageArea.oldDelegate.delta = pageArea.delegate.delta - if (pageArea.delegate.delta > 0) { - pageArea.oldDelegate.visible = true - pageArea.oldDelegate.pageNumber = pageArea.delegate.pageNumber + 1 - documentItem.currentPage = pageArea.oldDelegate.pageNumber - pageArea.oldDelegate.visible = !(pageArea.delegate.pageNumber == documentItem.pageCount-1) - } else if (pageArea.delegate.delta < 0) { - pageArea.oldDelegate.pageNumber = pageArea.delegate.pageNumber - 1 - documentItem.currentPage = pageArea.oldDelegate.pageNumber - - pageArea.oldDelegate.visible = pageArea.delegate.pageNumber != 0 - } - } - } - property int startMouseScreenX - property int startMouseScreenY - onPressed: { - startMouseScreenX = mouse.screenX - startMouseScreenY = mouse.screenY - } - onPositionChanged: { - if (Math.abs(mouse.screenX - startMouseScreenX) > width/5) { - delegate.pageSwitchEnabled = true - } - } - onReleased: { - delegate.pageSwitchEnabled = false - if (Math.abs(mouse.screenX - startMouseScreenX) < 20 && - Math.abs(mouse.screenY - startMouseScreenY) < 20) { - - - } else if (oldDelegate.visible && delegate.delta != 0 && - (Math.abs(mouse.screenX - startMouseScreenX) > width/5) && - Math.abs(mouse.screenX - startMouseScreenX) > Math.abs(mouse.screenY - startMouseScreenY)) { - oldDelegate = delegate - delegate = (delegate == delegate1) ? delegate2 : delegate1 - switchAnimation.running = true - } - } - FullScreenDelegate { - id: delegate2 - width: parent.width - height: parent.height - } - FullScreenDelegate { - id: delegate1 - width: parent.width - height: parent.height - Component.onCompleted: pageNumber = documentItem.currentPage - } - - SequentialAnimation { - id: switchAnimation - NumberAnimation { - target: pageArea.oldDelegate - properties: "x" - to: pageArea.incrementing ? -pageArea.oldDelegate.width : pageArea.oldDelegate.width - easing.type: Easing.InQuad - duration: units.longDuration - } - ScriptAction { - script: { - pageArea.oldDelegate.z = 0 - pageArea.delegate.z = 10 - } - } - NumberAnimation { - target: pageArea.oldDelegate - properties: "x" - to: 0 - easing.type: Easing.InQuad - duration: units.longDuration - } - ScriptAction { - script: { - pageArea.oldDelegate.x = 0 - pageArea.delegate.x = 0 - delegate1.delta = delegate2.delta = 0 - } - } + onPageChanged: { + bookmarkConnection.target = page + splitDrawer.bookmarked = page.bookmarked } } - PlasmaComponents.ScrollBar { - flickableItem: pageArea.delegate.flickable - orientation: Qt.Vertical - anchors { - right: pageArea.right - top: pageArea.top - bottom: pageArea.bottom - left: undefined - } - } - PlasmaComponents.ScrollBar { - flickableItem: pageArea.delegate.flickable - orientation: Qt.Horizontal - visible: pageArea.delegate.width > pageArea.width - anchors { - left: pageArea.left - right: pageArea.right - bottom: pageArea.bottom - top: undefined - } + //HACK + Connections { + id: bookmarkConnection + target: pageArea.page + onBookmarkedChanged: splitDrawer.bookmarked = pageArea.page.bookmarked } drawer: Item { diff --git a/mobile/app/package/contents/ui/FullScreenDelegate.qml b/mobile/app/package/contents/ui/FullScreenDelegate.qml deleted file mode 100644 index 2ca1a1031..000000000 --- a/mobile/app/package/contents/ui/FullScreenDelegate.qml +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2011 Marco Martin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, - * or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -import QtQuick 2.1 -import QtGraphicalEffects 1.0 -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.extras 2.0 as PlasmaExtra -import org.kde.plasma.components 2.0 as PlasmaComponents -import org.kde.plasma.mobilecomponents 0.2 as MobileComponents -import org.kde.kquickcontrolsaddons 2.0 -import org.kde.okular 2.0 as Okular - -MouseEventListener { - id: root - //+1: switch to next image on mouse release - //-1: switch to previous image on mouse release - //0: do nothing - property int delta - - - property Item flickable: mainFlickable - property bool pageSwitchEnabled: false - property alias document: mainPage.document - property alias pageNumber: mainPage.pageNumber - property Item pageItem: mainPage - property alias bookmarked: mainPage.bookmarked - - onWheelMoved: { - if (wheel.modifiers == Qt.ControlModifier) { - var factor = wheel.delta > 0 ? 1.1 : 0.9 - if (scale(factor)) { - pageArea.oldDelegate.scale(mainPage.width / mainPage.implicitWidth, true) - } - } - } - - function scale(zoom, absolute) { - var newScale = absolute ? zoom : (mainPage.width / mainPage.implicitWidth) * zoom; - if (newScale < 0.3 || newScale > 3) { - return false - } - - if (imageMargin.zooming) { - // pinch is happening! - mainPage.width = imageMargin.startWidth * zoom - mainPage.height = imageMargin.startHeight * zoom - } else if (absolute) { - // we were given an absolute, not a relative, scale - mainPage.width = mainPage.implicitWidth * zoom - mainPage.height = mainPage.implicitHeight * zoom - } else { - mainPage.width *= zoom - mainPage.height *= zoom - } - - pageArea.oldDelegate.pageItem.width = mainPage.width; - pageArea.oldDelegate.pageItem.height = mainPage.height; - - return true - } - - Rectangle { - id: backgroundRectangle - x: -mainFlickable.contentX + mainPage.x - y: 0 - anchors { - top: parent.top - bottom: parent.bottom - } - width: mainPage.width - color: "white" - - LinearGradient { - width: units.gridUnit/2 - anchors { - right: parent.left - top: parent.top - bottom: parent.bottom - } - start: Qt.point(0, 0) - end: Qt.point(units.gridUnit/2, 0) - gradient: Gradient { - GradientStop { - position: 0.0 - color: "transparent" - } - GradientStop { - position: 0.7 - color: Qt.rgba(0, 0, 0, 0.08) - } - GradientStop { - position: 1.0 - color: Qt.rgba(0, 0, 0, 0.2) - } - } - } - - LinearGradient { - width: units.gridUnit/2 - anchors { - left: parent.right - top: parent.top - bottom: parent.bottom - } - start: Qt.point(0, 0) - end: Qt.point(units.gridUnit/2, 0) - gradient: Gradient { - GradientStop { - position: 0.0 - color: Qt.rgba(0, 0, 0, 0.2) - } - GradientStop { - position: 0.3 - color: Qt.rgba(0, 0, 0, 0.08) - } - GradientStop { - position: 1.0 - color: "transparent" - } - } - } - Image { - source: "image://appbackgrounds/shadow-right" - fillMode: Image.TileVertically - opacity: 0.5 - anchors { - left: parent.right - top: parent.top - bottom: parent.bottom - } - } - } - - Flickable { - id: mainFlickable - property real ratio : width / height - anchors.fill: parent - width: parent.width - height: parent.height - contentWidth: imageMargin.width - contentHeight: imageMargin.height - boundsBehavior: Flickable.DragAndOvershootBounds - flickableDirection: Flickable.HorizontalAndVerticalFlick - - onContentXChanged: { - if (atXBeginning && contentX < 0) { - root.delta = -1 - } else if (atXEnd) { - root.delta = +1 - } else { - root.delta = 0 - } - } - - PinchArea { - id: imageMargin - width: Math.max(mainFlickable.width+1, mainPage.width) - height: Math.max(mainFlickable.height, mainPage.height) - - property real startWidth - property real startHeight - property real startY - property real startX - property bool zooming: false - onPinchStarted: { - startWidth = mainPage.width - startHeight = mainPage.height - zooming = true - startY = pinch.center.y - startX = pinch.center.x - pageArea.oldDelegate.visible = false - } - onPinchUpdated: { - var deltaWidth = mainPage.width < imageMargin.width ? ((startWidth * pinch.scale) - mainPage.width) : 0 - var deltaHeight = mainPage.height < imageMargin.height ? ((startHeight * pinch.scale) - mainPage.height) : 0 - if (root.scale(pinch.scale)) { - mainFlickable.contentY += pinch.previousCenter.y - pinch.center.y + startY * (pinch.scale - pinch.previousScale) - deltaHeight - mainFlickable.contentX += pinch.previousCenter.x - pinch.center.x + startX * (pinch.scale - pinch.previousScale) - deltaWidth - } - } - onPinchFinished: { - mainFlickable.returnToBounds() - pageArea.oldDelegate.scale(mainPage.width / mainPage.implicitWidth) - pageArea.oldDelegate.visible = true - zooming = false - } - - Okular.PageItem { - id: mainPage - document: documentItem - flickable: mainFlickable - property real ratio: implicitWidth / implicitHeight - - x: Math.round((parent.width - width) / 2) - y: Math.round((parent.height - height) / 2) - width: root.width - height: width / ratio - } - - } - } - Image { - source: "bookmark.png" - anchors { - top: parent.top - right: backgroundRectangle.right - rightMargin: -5 - topMargin: mainPage.bookmarked ? -30 : -120 - } - Behavior on anchors.topMargin { - NumberAnimation { - duration: 250 - } - } - - MouseArea { - anchors { - fill: parent - margins: -8 - } - onClicked: mainPage.bookmarked = !mainPage.bookmarked - } - } -} diff --git a/mobile/app/package/contents/ui/ThumbnailsBase.qml b/mobile/app/package/contents/ui/ThumbnailsBase.qml index 06fb2ae0c..0c0f738f4 100644 --- a/mobile/app/package/contents/ui/ThumbnailsBase.qml +++ b/mobile/app/package/contents/ui/ThumbnailsBase.qml @@ -89,7 +89,6 @@ PlasmaComponents.Page { anchors.fill: parent onClicked: { resultsGrid.currentIndex = index - pageArea.delegate.pageNumber = modelData documentItem.currentPage = modelData resourceBrowser.open = false diff --git a/mobile/components/DocumentView.qml b/mobile/components/DocumentView.qml index 569c1ef31..c953892e5 100644 --- a/mobile/components/DocumentView.qml +++ b/mobile/components/DocumentView.qml @@ -18,6 +18,7 @@ */ import QtQuick 2.2 +import QtQuick.Controls 1.2 as QtControls import org.kde.okular 2.0 import "./private" @@ -27,24 +28,32 @@ import "./private" * It supports changing pages by a swipe gesture, pinch zoom * and flicking to scroll around */ -Item { +QtControls.ScrollView { id: root - width: 500 - height: 600 - - property DocumentItem documentItem - + property DocumentItem document + property PageItem page: mouseArea.currPageDelegate.pageItem Flickable { id: flick - anchors.fill: parent + + clip: true Component.onCompleted: { flick.contentWidth = flick.width flick.contentHeight = flick.width / mouseArea.currPageDelegate.pageRatio } - onWidthChanged: { - flick.contentWidth = flick.width - flick.contentHeight = flick.width / mouseArea.currPageDelegate.pageRatio + onWidthChanged: resizeTimer.restart() + onHeightChanged: resizeTimer.restart() + Connections { + target: root.document + onPathChanged: resizeTimer.restart() + } + Timer { + id: resizeTimer + interval: 250 + onTriggered: { + flick.contentWidth = flick.width + flick.contentHeight = flick.width / mouseArea.currPageDelegate.pageRatio + } } PinchArea { @@ -98,10 +107,10 @@ Item { oldMouseY = pos.y; } onReleased: { - if (root.documentItem.currentPage > 0 && + if (root.document.currentPage > 0 && currPageDelegate.x > width/6) { switchAnimation.running = true; - } else if (root.documentItem.currentPage < documentItem.pageCount-1 && + } else if (root.document.currentPage < document.pageCount-1 && currPageDelegate.x < -width/6) { switchAnimation.running = true; } else { @@ -120,17 +129,17 @@ Item { PageView { id: page1 - document: root.documentItem + document: root.document z: 2 } PageView { id: page2 - document: root.documentItem + document: root.document z: 1 } PageView { id: page3 - document: root.documentItem + document: root.document z: 0 } @@ -138,7 +147,7 @@ Item { Binding { target: mouseArea.currPageDelegate property: "pageNumber" - value: root.documentItem.currentPage + value: root.document.currentPage } Binding { target: mouseArea.currPageDelegate @@ -149,23 +158,23 @@ Item { Binding { target: mouseArea.prevPageDelegate property: "pageNumber" - value: root.documentItem.currentPage - 1 + value: root.document.currentPage - 1 } Binding { target: mouseArea.prevPageDelegate property: "visible" - value: !mouseArea.incrementing && root.documentItem.currentPage > 0 + value: !mouseArea.incrementing && root.document.currentPage > 0 } Binding { target: mouseArea.nextPageDelegate property: "pageNumber" - value: root.documentItem.currentPage + 1 + value: root.document.currentPage + 1 } Binding { target: mouseArea.nextPageDelegate property: "visible" - value: mouseArea.incrementing && root.documentItem.currentPage < documentItem.pageCount-1 + value: mouseArea.incrementing && root.document.currentPage < document.pageCount-1 } SequentialAnimation { @@ -194,12 +203,12 @@ Item { var oldNext = mouseArea.nextPageDelegate; if (mouseArea.incrementing) { - root.documentItem.currentPage++; + root.document.currentPage++; mouseArea.currPageDelegate = oldNext; mouseArea.prevPageDelegate = oldCur; mouseArea. nextPageDelegate = oldPrev; } else { - root.documentItem.currentPage--; + root.document.currentPage--; mouseArea.currPageDelegate = oldPrev; mouseArea.prevPageDelegate = oldCur; mouseArea. nextPageDelegate = oldNext; diff --git a/mobile/components/private/PageView.qml b/mobile/components/private/PageView.qml index dc4e4d670..7aaa739c8 100644 --- a/mobile/components/private/PageView.qml +++ b/mobile/components/private/PageView.qml @@ -19,11 +19,12 @@ import QtQuick 2.2 import QtGraphicalEffects 1.0 -import org.kde.okular 2.0 as Okular +import org.kde.okular 2.0 Item { width: parent.width height: parent.height + property PageItem pageItem: page property alias document: page.document property alias pageNumber: page.pageNumber implicitWidth: page.implicitWidth @@ -31,7 +32,7 @@ Item { property real pageRatio: page.implicitWidth / page.implicitHeight property real scaleFactor: page.width / page.implicitWidth - Okular.PageItem { + PageItem { id: page property bool sameOrientation: parent.width / parent.height > pageRatio anchors.centerIn: parent diff --git a/mobile/components/testDocumentView.qml b/mobile/components/testDocumentView.qml index c913810b5..79abaf165 100644 --- a/mobile/components/testDocumentView.qml +++ b/mobile/components/testDocumentView.qml @@ -30,6 +30,6 @@ Item { } Okular.DocumentView { anchors.fill: parent - documentItem: docItem + document: docItem } } \ No newline at end of file