aboutsummaryrefslogtreecommitdiffstats
path: root/qt-mobile/qml/mobilecomponents/PageRow.qml
diff options
context:
space:
mode:
Diffstat (limited to 'qt-mobile/qml/mobilecomponents/PageRow.qml')
-rw-r--r--qt-mobile/qml/mobilecomponents/PageRow.qml513
1 files changed, 0 insertions, 513 deletions
diff --git a/qt-mobile/qml/mobilecomponents/PageRow.qml b/qt-mobile/qml/mobilecomponents/PageRow.qml
deleted file mode 100644
index b69b39c8f..000000000
--- a/qt-mobile/qml/mobilecomponents/PageRow.qml
+++ /dev/null
@@ -1,513 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Marco Martin <mart@kde.org>
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Components project.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
-** the names of its contributors may be used to endorse or promote
-** products derived from this software without specific prior written
-** permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.0
-import QtQuick.Controls 1.0
-import QtQuick.Layouts 1.2
-import org.kde.plasma.mobilecomponents 0.2
-
-import "private/PageStack.js" as Engine
-
-Item {
- id: actualRoot
-
- width: parent ? parent.width : 0
- height: parent ? parent.height : 0
-
-
- property int depth: Engine.getDepth()
- property Item currentPage: null
- property Item lastVisiblePage: currentPage
- property ToolBar toolBar
- property variant initialPage
- //A column is wide enough for 30 characters
- property int columnWidth: Math.round(parent.width/(Units.gridUnit*30)) > 0 ? parent.width/Math.round(parent.width/(Units.gridUnit*30)) : width
- property alias clip: scrollArea.clip
-
- // Indicates whether there is an ongoing page transition.
- property bool busy: internal.ongoingTransitionCount > 0
-
- // Pushes a page on the stack.
- // The page can be defined as a component, item or string.
- // If an item is used then the page will get re-parented.
- // If a string is used then it is interpreted as a url that is used to load a page component.
- //
- // The page can also be given as an array of pages. In this case all those pages will be pushed
- // onto the stack. The items in the stack can be components, items or strings just like for single
- // pages. Additionally an object can be used, which specifies a page and an optional properties
- // property. This can be used to push multiple pages while still giving each of them properties.
- // When an array is used the transition animation will only be to the last page.
- //
- // The properties argument is optional and allows defining a map of properties to set on the page.
- // If the immediate argument is true then no transition animation is performed.
- // Returns the page instance.
- function push(page, properties, immediate)
- {
- pop(lastVisiblePage, true);
- scrollAnimation.running = false;
- var item = Engine.push(page, properties, false, immediate)
- scrollToLevel(depth)
- return item
- }
-
- // Pops a page off the stack.
- // If page is specified then the stack is unwound to that page, to unwind to the first page specify
- // page as null. If the immediate argument is true then no transition animation is performed.
- // Returns the page instance that was popped off the stack.
- function pop(page, immediate)
- {
- scrollToLevel(depth-1);
- return Engine.pop(page, immediate);
- }
-
- // Replaces a page on the stack.
- // See push() for details.
- function replace(page, properties, immediate)
- {
- pop(lastVisiblePage, true);
- scrollAnimation.running = false;
- var item = Engine.push(page, properties, true, immediate);
- scrollToLevel(depth)
- return item
- }
-
- // Clears the page stack.
- function clear()
- {
- return Engine.clear();
- }
-
- // Iterates through all pages (top to bottom) and invokes the specified function.
- // If the specified function returns true the search stops and the find function
- // returns the page that the iteration stopped at. If the search doesn't result
- // in any page being found then null is returned.
- function find(func)
- {
- return Engine.find(func);
- }
-
- // Scroll the view to have the page of the given level as first item
- function scrollToLevel(level)
- {
- if (level < 0 || level > depth || root.width < width) {
- return
- }
-
- var firstLevel = Math.max(0, level - mainFlickable.width/columnWidth + 1);
- scrollAnimation.to = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth));
- scrollAnimation.running = true;
- }
-
- SequentialAnimation {
- id: scrollAnimation
- property alias to: actualScrollAnimation.to
- NumberAnimation {
- id: actualScrollAnimation
- target: mainFlickable
- properties: "contentX"
- duration: internal.transitionDuration
- easing.type: Easing.InOutQuad
- }
- ScriptAction {
- script: {
- //At startup sometimes the contentX is NaN for an instant
- if (isNaN(mainFlickable.contentX)) {
- return;
- }
-
- actualRoot.lastVisiblePage = root.children[Math.floor((mainFlickable.contentX + mainFlickable.width - 1)/columnWidth)].page;
- if (!actualRoot.lastVisiblePage) {
- actualRoot.lastVisiblePage = actualRoot.currentPage;
- }
- }
- }
- }
-
- // Called when the page stack visibility changes.
- onVisibleChanged: {
- if (currentPage) {
- if (visible)
- currentPage.visible = currentPage.parent.visible = true;
- }
- }
-
- onInitialPageChanged: {
- if (!internal.completed) {
- return
- }
-
- if (initialPage) {
- if (depth == 0) {
- push(initialPage, null, true)
- } else if (depth == 1) {
- replace(initialPage, null, true)
- } else {
- console.log("Cannot update PageStack.initialPage")
- }
- }
- }
-
- onWidthChanged: {
- var firstLevel = Math.max(0, depth - mainFlickable.width/columnWidth + 1);
- mainFlickable.contentX = Math.max(0, Math.min(Math.max(0, columnWidth * (firstLevel - 1)), mainFlickable.contentWidth));
- }
- Component.onCompleted: {
- internal.completed = true
- if (initialPage && depth == 0)
- push(initialPage, null, true)
- }
-
- QtObject {
- id: internal
-
- // The number of ongoing transitions.
- property int ongoingTransitionCount: 0
-
- //FIXME: there should be a way to access to theh without storing it in an ugly way
- property bool completed: false
-
- // Duration of transition animation (in ms)
- property int transitionDuration: Units.longDuration
- }
-
- ScrollView {
- id: scrollArea
- anchors.fill: parent
- Flickable {
- id: mainFlickable
- anchors.fill: parent
- interactive: root.width > width
- boundsBehavior: Flickable.StopAtBounds
- contentWidth: root.width
- contentHeight: height
- Row {
- id: root
- spacing: -Units.gridUnit * 8
- width: Math.max((depth-1+children[children.length-1].takenColumns) * columnWidth, childrenRect.width - Units.gridUnit * 8)
-
- height: parent.height
- Behavior on width {
- NumberAnimation {
- duration: internal.transitionDuration
- easing.type: Easing.InOutQuad
- }
- }
- }
- onMovementEnded: {
- scrollToLevel(Math.round(contentX/columnWidth)+1)
- }
- onFlickEnded: {
- movementEnded();
- }
- }
- }
-
- // Component for page containers.
- Component {
- id: containerComponent
-
- Item {
- id: container
-
- implicitWidth: actualContainer.width + Units.gridUnit * 8
- width: implicitWidth
- height: parent ? parent.height : 0
-
- x: 0
-
- // The actual parent of page: page will anchor to that
- property Item pageParent: actualContainer
-
- property int pageDepth: 0
- Component.onCompleted: {
- pageDepth = Engine.getDepth() + 1
- container.z = -Engine.getDepth()
- }
-
- // The states correspond to the different possible positions of the container.
- state: "Hidden"
-
- // The page held by this container.
- property Item page: null
-
- // The owner of the page.
- property Item owner: null
-
- // The width of the longer stack dimension
- property int stackWidth: Math.max(actualRoot.width, actualRoot.height)
-
-
- // Flag that indicates the container should be cleaned up after the transition has ended.
- property bool cleanupAfterTransition: false
-
- // Flag that indicates if page transition animation is running
- property bool transitionAnimationRunning: false
-
- // State to be set after previous state change animation has finished
- property string pendingState: "none"
-
- //how many columns take the page?
- property alias takenColumns: actualContainer.takenColumns
-
- // Ensures that transition finish actions are executed
- // in case the object is destroyed before reaching the
- // end state of an ongoing transition
- Component.onDestruction: {
- if (transitionAnimationRunning)
- transitionEnded();
- }
-
- Item {
- id: actualContainer
-
- anchors {
- top: parent.top
- bottom: parent.bottom
- right: parent.right
- rightMargin: Units.gridUnit * 8
- }
-
- property int takenColumns: {
- if (container.page && container.page.Layout && container.page.Layout.fillWidth) {
- return Math.max(1, Math.round(actualRoot.width/columnWidth)-(container.x > 0 ? 1: 0));
- } else {
- return Math.max(1, Math.round(container.page ? container.page.implicitWidth/columnWidth : 1));
- }
- }
-
- width: (container.pageDepth >= actualRoot.depth ? Math.min(actualRoot.width, takenColumns*columnWidth) : columnWidth)
- }
-
- Rectangle {
- anchors {
- top: parent.top
- bottom: parent.bottom
- right: actualContainer.right
- }
- width: 1
- color: Theme.textColor
- opacity: 0.3
- visible: container.pageDepth < actualRoot.depth
- }
-
- // Sets pending state as current if state change is delayed
- onTransitionAnimationRunningChanged: {
- if (!transitionAnimationRunning && pendingState != "none") {
- state = pendingState;
- pendingState = "none";
- }
- }
-
- // Handles state change depening on transition animation status
- function setState(newState)
- {
- if (transitionAnimationRunning)
- pendingState = newState;
- else
- state = newState;
- }
-
- // Performs a push enter transition.
- function pushEnter(immediate, orientationChanges)
- {
- if (!immediate) {
- setState("Right");
- }
- setState("");
- page.visible = true;
- }
-
- // Performs a push exit transition.
- function pushExit(replace, immediate, orientationChanges)
- {
- if (replace) {
- setState(immediate ? "Hidden" : "Left");
- }
-
- if (replace) {
- if (immediate)
- cleanup();
- else
- cleanupAfterTransition = true;
- }
- }
-
- // Performs a pop enter transition.
- function popEnter(immediate, orientationChanges)
- {
- setState("");
- page.visible = true;
- }
-
- // Performs a pop exit transition.
- function popExit(immediate, orientationChanges)
- {
- setState(immediate ? "Hidden" : "Left");
-
- if (immediate)
- cleanup();
- else
- cleanupAfterTransition = true;
- }
-
- // Called when a transition has started.
- function transitionStarted()
- {
- container.clip = true
- transitionAnimationRunning = true;
- internal.ongoingTransitionCount++;
- }
-
- // Called when a transition has ended.
- function transitionEnded()
- {
- container.clip = false
- if (state != "")
- state = "Hidden";
-
- internal.ongoingTransitionCount--;
- transitionAnimationRunning = false;
-
- if (cleanupAfterTransition) {
- cleanup();
- }
- }
-
- states: [
- // Explicit properties for default state.
- State {
- name: ""
- PropertyChanges { target: container; visible: true; opacity: 1 }
- PropertyChanges { target: container; width: container.implicitWidth}
- },
- // Start state for pop entry, end state for push exit.
- State {
- name: "Left"
- PropertyChanges { target: container; opacity: 0 }
- PropertyChanges { target: container; width: Units.gridUnit * 8}
- },
- // Start state for push entry, end state for pop exit.
- State {
- name: "Right"
- PropertyChanges { target: container; opacity: 0 }
- PropertyChanges { target: container; width: Units.gridUnit * 8}
- },
- // Inactive state.
- State {
- name: "Hidden"
- PropertyChanges { target: container; visible: false }
- PropertyChanges { target: container; width: container.implicitWidth}
- }
- ]
-
- transitions: [
- // Push exit transition
- Transition {
- from: ""; to: "Left"
- SequentialAnimation {
- ScriptAction { script: transitionStarted() }
- ParallelAnimation {
- PropertyAnimation { properties: "width"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- }
- ScriptAction { script: transitionEnded() }
- }
- },
- // Pop entry transition
- Transition {
- from: "Left"; to: ""
- SequentialAnimation {
- ScriptAction { script: transitionStarted() }
- ParallelAnimation {
- PropertyAnimation { properties: "width"; easing.type: Easing.OutQuad; duration: internal.transitionDuration }
- PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- }
- ScriptAction { script: transitionEnded() }
- }
- },
- // Pop exit transition
- Transition {
- from: ""; to: "Right"
- SequentialAnimation {
- ScriptAction { script: transitionStarted() }
- ParallelAnimation {
- PropertyAnimation { properties: "width"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- }
- // Workaround for transition animation bug causing ghost view with page pop transition animation
- // TODO: Root cause still unknown
- PropertyAnimation {}
- ScriptAction { script: transitionEnded() }
- }
- },
- // Push entry transition
- Transition {
- from: "Right"; to: ""
- SequentialAnimation {
- ScriptAction { script: transitionStarted() }
- ParallelAnimation {
- PropertyAnimation { properties: "width"; easing.type: Easing.OutQuad; duration: internal.transitionDuration }
- PropertyAnimation { properties: "opacity"; easing.type: Easing.InQuad; duration: internal.transitionDuration }
- }
- ScriptAction { script: transitionEnded() }
- }
- }
- ]
-
- // Cleans up the container and then destroys it.
- function cleanup()
- {
- if (page != null) {
- if (owner != container) {
- // container is not the owner of the page - re-parent back to original owner
- page.visible = false;
- page.anchors.fill = undefined
- page.parent = owner;
- }
- }
- container.parent = null;
- container.visible = false;
- destroy();
- }
- }
- }
-}