use a single js engine implementation between row and stack

This commit is contained in:
Marco Martin 2012-08-08 14:53:04 +02:00
parent 4d2d32db58
commit 1cbd32e9f9
3 changed files with 21 additions and 260 deletions

View File

@ -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];
}
}

View File

@ -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--;

View File

@ -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;
}