From 1cbd32e9f9cd48e75cc8d6892f3c510558ce7091 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Wed, 8 Aug 2012 14:53:04 +0200 Subject: [PATCH] use a single js engine implementation between row and stack --- .../plasmacomponents/qml/private/PageStack.js | 13 +- .../plasmaextracomponents/qml/PageRow.qml | 28 +- .../qml/private/PageRow.js | 240 ------------------ 3 files changed, 21 insertions(+), 260 deletions(-) delete mode 100644 declarativeimports/plasmaextracomponents/qml/private/PageRow.js diff --git a/declarativeimports/plasmacomponents/qml/private/PageStack.js b/declarativeimports/plasmacomponents/qml/private/PageStack.js index 827e2e204..607e258bf 100644 --- a/declarativeimports/plasmacomponents/qml/private/PageStack.js +++ b/declarativeimports/plasmacomponents/qml/private/PageStack.js @@ -101,7 +101,8 @@ function push(page, properties, replace, immediate) { currentPage = container.page; // perform page transition - immediate = immediate || !oldContainer; + //FIXME: this should be in for PageStack, out for PageRow? + //immediate = immediate || !oldContainer; var orientationChange = false; if (oldContainer) { orientationChange = orientationChanges(oldContainer.page, container.page); @@ -138,7 +139,7 @@ function initPage(page, properties) { throw new Error("Error while loading page: " + pageComp.errorString()); } else { // instantiate page from component - page = pageComp.createObject(container, properties || {}); + page = pageComp.createObject(container.pageParent, properties || {}); } } else { // copy properties to the page @@ -157,15 +158,15 @@ function initPage(page, properties) { } // the page has to be reparented if - if (page.parent != container) { - page.parent = container; + if (page.parent != container.pageParent) { + page.parent = container.pageParent; } if (page.pageStack !== undefined) { page.pageStack = root; } - page.anchors.fill = container + page.anchors.fill = container.pageParent return container; } @@ -184,8 +185,8 @@ function pop(page, immediate) { if (page !== undefined) { // an unwind target has been specified - pop until we find it while (page != container.page && pageStack.length > 1) { - container.cleanup(); pageStack.pop(); + container.popExit(immediate, false); container = pageStack[pageStack.length - 1]; } } diff --git a/declarativeimports/plasmaextracomponents/qml/PageRow.qml b/declarativeimports/plasmaextracomponents/qml/PageRow.qml index 65bc1960d..71202b6ea 100644 --- a/declarativeimports/plasmaextracomponents/qml/PageRow.qml +++ b/declarativeimports/plasmaextracomponents/qml/PageRow.qml @@ -44,10 +44,10 @@ import QtQuick 1.1 import org.kde.plasma.components 0.1 import org.kde.plasma.core 0.1 as PlasmaCore -import "private/PageRow.js" as Engine +import "../components/private/PageStack.js" as Engine Item { - id: root + id: actualRoot width: parent ? parent.width : 0 height: parent ? parent.height : 0 @@ -119,7 +119,7 @@ Item { // Scroll the view to have the page of the given level as first item function scrollToLevel(level) { - if (level < 0 || level > depth || mainItem.width < width) { + if (level < 0 || level > depth || root.width < width) { return } @@ -194,12 +194,12 @@ Item { Flickable { id: mainFlickable anchors.fill: parent - interactive: mainItem.width > width + interactive: root.width > width boundsBehavior: Flickable.StopAtBounds - contentWidth: mainItem.width + contentWidth: root.width contentHeight: height Row { - id: mainItem + id: root spacing: -100 width: columnWidth*depth height: parent.height @@ -245,7 +245,7 @@ Item { property Item owner: null // The width of the longer stack dimension - property int stackWidth: Math.max(root.width, root.height) + property int stackWidth: Math.max(actualRoot.width, actualRoot.height) // Duration of transition animation (in ms) property int transitionDuration: 250 @@ -284,7 +284,7 @@ Item { z: 800 source: "image://appbackgrounds/shadow-right" fillMode: Image.TileVertically - opacity: container.pageDepth == root.depth ? 1 : 0.7 + opacity: container.pageDepth == actualRoot.depth ? 1 : 0.7 anchors { left: actualContainer.right top: actualContainer.top @@ -323,14 +323,14 @@ Item { } setState(""); page.visible = true; - if (root.visible && immediate) + if (actualRoot.visible && immediate) internal.setPageStatus(page, PageStatus.Active); } // Performs a push exit transition. function pushExit(replace, immediate, orientationChanges) { - if (root.visible && immediate) + if (actualRoot.visible && immediate) internal.setPageStatus(page, PageStatus.Inactive); if (replace) { if (immediate) @@ -345,7 +345,7 @@ Item { { setState(""); page.visible = true; - if (root.visible && immediate) + if (actualRoot.visible && immediate) internal.setPageStatus(page, PageStatus.Active); } @@ -354,7 +354,7 @@ Item { { setState(immediate ? "Hidden" : "Left"); - if (root.visible && immediate) + if (actualRoot.visible && immediate) internal.setPageStatus(page, PageStatus.Inactive); if (immediate) cleanup(); @@ -367,7 +367,7 @@ Item { { transitionAnimationRunning = true; internal.ongoingTransitionCount++; - if (root.visible) { + if (actualRoot.visible) { internal.setPageStatus(page, (state == "") ? PageStatus.Activating : PageStatus.Deactivating); } } @@ -377,7 +377,7 @@ Item { { if (state != "") state = "Hidden"; - if (root.visible) + if (actualRoot.visible) internal.setPageStatus(page, (state == "") ? PageStatus.Active : PageStatus.Inactive); internal.ongoingTransitionCount--; diff --git a/declarativeimports/plasmaextracomponents/qml/private/PageRow.js b/declarativeimports/plasmaextracomponents/qml/private/PageRow.js deleted file mode 100644 index d3c8eae0a..000000000 --- a/declarativeimports/plasmaextracomponents/qml/private/PageRow.js +++ /dev/null @@ -1,240 +0,0 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ - -// Page stack. Items are page containers. -var pageStack = []; - -// Page component cache map. Key is page url, value is page component. -var componentCache = {}; - -// Returns the page stack depth. -function getDepth() { - return pageStack.length; -} - -// Pushes a page on the stack. -function push(page, properties, replace, immediate) { - // page order sanity check - if ((!replace && page == currentPage) - || (replace && pageStack.length > 1 - && page == pageStack[pageStack.length - 2].page)) { - throw new Error("Cannot navigate so that the resulting page stack has two consecutive entries of the same page instance."); - } - - // figure out if more than one page is being pushed - var pages; - if (page instanceof Array) { - pages = page; - page = pages.pop(); - if (page.createObject === undefined && page.parent === undefined && typeof page != "string") { - properties = properties || page.properties; - page = page.page; - } - } - - // get the current container - var oldContainer = pageStack[pageStack.length - 1]; - - // pop the old container off the stack if this is a replace - if (oldContainer && replace) { - pageStack.pop(); - } - - // push any extra defined pages onto the stack - if (pages) { - var i; - for (i = 0; i < pages.length; i++) { - var tPage = pages[i]; - var tProps; - if (tPage.createObject === undefined && tPage.parent === undefined && typeof tPage != "string") { - tProps = tPage.properties; - tPage = tPage.page; - } - pageStack.push(initPage(tPage, tProps)); - } - } - - // initialize the page - var container = initPage(page, properties); - - // push the page container onto the stack - pageStack.push(container); - - depth = pageStack.length; - currentPage = container.page; - - // perform page transition - //FIXME: this should be in for PageStack, out for PageRow - //immediate = immediate || !oldContainer; - var orientationChange = false; - if (oldContainer) { - orientationChange = orientationChanges(oldContainer.page, container.page); - oldContainer.pushExit(replace, immediate, orientationChange); - } - - // sync tool bar - var tools = container.page.tools || null; - if (toolBar) { - toolBar.setTools(tools, immediate ? "set" : replace ? "replace" : "push"); - } - - container.pushEnter(immediate, orientationChange); - return container.page; -} - -// Initializes a page and its container. -function initPage(page, properties) { - var container = containerComponent.createObject(mainItem); - - var pageComp; - if (page.createObject) { - // page defined as component - pageComp = page; - } else if (typeof page == "string") { - // page defined as string (a url) - pageComp = componentCache[page]; - if (!pageComp) { - pageComp = componentCache[page] = Qt.createComponent(page); - } - } - if (pageComp) { - if (pageComp.status == Component.Error) { - throw new Error("Error while loading page: " + pageComp.errorString()); - } else { - // instantiate page from component - page = pageComp.createObject(container.pageParent, properties || {}); - } - } else { - // copy properties to the page - for (var prop in properties) { - if (properties.hasOwnProperty(prop)) { - page[prop] = properties[prop]; - } - } - } - - container.page = page; - if (page.parent == null) { - container.owner = container; - } else { - container.owner = page.parent; - } - - // the page has to be reparented if - if (page.parent != container.pageParent) { - page.parent = container.pageParent; - } - - if (page.pageStack !== undefined) { - page.pageStack = root; - } - - page.anchors.fill = container.pageParent - - return container; -} - -// Pops a page off the stack. -function pop(page, immediate) { - // make sure there are enough pages in the stack to pop - if (pageStack.length > 1) { - //unwind to itself means no pop - if (page !== undefined && page == pageStack[pageStack.length - 1].page) { - return - } - // pop the current container off the stack and get the next container - var oldContainer = pageStack.pop(); - var container = pageStack[pageStack.length - 1]; - if (page !== undefined) { - // an unwind target has been specified - pop until we find it - while (page != container.page && pageStack.length > 1) { - pageStack.pop(); - container.popExit(immediate, false); - container = pageStack[pageStack.length - 1]; - } - } - - depth = pageStack.length; - currentPage = container.page; - - // perform page transition - var orientationChange = orientationChanges(oldContainer.page, container.page); - oldContainer.popExit(immediate, orientationChange); - container.popEnter(immediate, orientationChange); - - // sync tool bar - var tools = container.page.tools || null; - if (toolBar) { - toolBar.setTools(tools, immediate ? "set" : "pop"); - } - return oldContainer.page; - } else { - return null; - } -} - -// Checks if the orientation changes between oldPage and newPage -function orientationChanges(oldPage, newPage) { - return newPage.orientationLock != PageOrientation.Automatic - && newPage.orientationLock != PageOrientation.LockPrevious - && newPage.orientationLock != oldPage.orientationLock -} - -// Clears the page stack. -function clear() { - var container; - while (container = pageStack.pop()) { - container.cleanup(); - } - depth = 0; - currentPage = null; -} - -// Iterates through all pages in the stack (top to bottom) to find a page. -function find(func) { - for (var i = pageStack.length - 1; i >= 0; i--) { - var page = pageStack[i].page; - if (func(page)) { - return page; - } - } - return null; -} -