Florian Boucault has proposed merging 
lp:~fboucault/ubuntu-calculator-app/startup_time into lp:ubuntu-calculator-app.

Commit message:
Improved startup time (2.9s saved on krillin):
- Load Icons and Images asynchronously.
- Prevent multiple resize of keyboard due to window size bug.
- Make sure the keyboard model is built only once.
- Faster KeyboardButton using a MouseArea instead of AbstractButton
- Asynchronous loading of: individual keyboard keys, screenDelegateComponent.
- Asynchronous compilation of FavouritePage.
- Asynchronous import of math.js.
- Use new ListItem API instead of ListItemWithActions: faster to instantiate 
and less code to maintain.
- Saving resources by making formula.js a library.

Requested reviews:
  Ubuntu Calculator Developers (ubuntu-calculator-dev)
Related bugs:
  Bug #1520554 in Ubuntu Calculator App: "Startup of calculator should be 
optimized"
  https://bugs.launchpad.net/ubuntu-calculator-app/+bug/1520554

For more details, see:
https://code.launchpad.net/~fboucault/ubuntu-calculator-app/startup_time/+merge/302403

Improved startup time (2.9s saved on krillin):
- Load Icons and Images asynchronously.
- Prevent multiple resize of keyboard due to window size bug.
- Make sure the keyboard model is built only once.
- Faster KeyboardButton using a MouseArea instead of AbstractButton
- Asynchronous loading of: individual keyboard keys, screenDelegateComponent.
- Asynchronous compilation of FavouritePage.
- Asynchronous import of math.js.
- Use new ListItem API instead of ListItemWithActions: faster to instantiate 
and less code to maintain.
- Saving resources by making formula.js a library.
-- 
Your team Ubuntu Calculator Developers is requested to review the proposed 
merge of lp:~fboucault/ubuntu-calculator-app/startup_time into 
lp:ubuntu-calculator-app.
=== added file 'app/engine/MathJs.qml'
--- app/engine/MathJs.qml	1970-01-01 00:00:00 +0000
+++ app/engine/MathJs.qml	2016-08-09 12:38:05 +0000
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2014-2015 Canonical, Ltd.
+ *
+ * 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; version 3.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+import QtQml 2.0
+import "math.js" as MathJs
+
+QtObject {
+    property var mathJs: MathJs.mathJs;
+}

=== modified file 'app/engine/formula.js'
--- app/engine/formula.js	2015-11-19 21:55:04 +0000
+++ app/engine/formula.js	2016-08-09 12:38:05 +0000
@@ -16,6 +16,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+.pragma library
+
 /**
  * Function which will delete last element in the formula
  * It could be literal, operator, const (eg. "pi") or function (eg. "sin(" )
@@ -165,7 +167,7 @@
  * @param string engineFormulaToConvert: the string where we have to replace chars
  * @return a string based on param with changes in chars
  */
-function returnFormulaToDisplay(engineFormulaToConvert) {
+function returnFormulaToDisplay(engineFormulaToConvert, i18n, decimalPoint) {
     // The deletion of " is necessary for MathJs.format function - it returns a
     // string surrounded by ", and they're useless, so we remove them
     var engineToVisualMap = {

=== modified file 'app/ubuntu-calculator-app.qml'
--- app/ubuntu-calculator-app.qml	2016-01-18 23:40:25 +0000
+++ app/ubuntu-calculator-app.qml	2016-08-09 12:38:05 +0000
@@ -16,13 +16,13 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 import QtQuick 2.4
+import QtQuick.Window 2.2
 import Ubuntu.Components 1.3
 import Ubuntu.Components.Themes.Ambiance 1.3
 
 import "ui"
 import "upstreamcomponents"
 import "engine"
-import "engine/math.js" as MathJs
 import "engine/formula.js" as Formula
 import Qt.labs.settings 1.0
 
@@ -39,7 +39,13 @@
     height: units.gu(60);
 
     // This is our engine
-    property var mathJs: MathJs.mathJs;
+    property var mathJs: mathJsLoader.item ? mathJsLoader.item.mathJs : null;
+    Loader {
+        id: mathJsLoader
+        source: "engine/MathJs.qml"
+        asynchronous: true
+        active: keyboardLoader.active
+    }
 
     // Long form of formula, which are saved in the storage/history
     property string longFormula: "";
@@ -264,18 +270,11 @@
 
         PageWithBottomEdge {
             id: calculatorPage
-            title: i18n.tr("Calculator")
             anchors.fill: parent
             visible: false
 
             bottomEdgeTitle: i18n.tr("Favorite")
-
-            bottomEdgePageComponent: FavouritePage {
-                anchors.fill: parent
-
-                title: i18n.tr("Favorite")
-            }
-
+            bottomEdgePageSource: "ui/FavouritePage.qml"
             bottomEdgeEnabled: textInputField.visible
 
             state: visualModel.isInSelectionMode ? "selection" : "default"
@@ -365,7 +364,7 @@
                     property var model: itemModel
                     visible: model.dbId !== -1
 
-                    selectionMode: visualModel.isInSelectionMode
+                    selectMode: visualModel.isInSelectionMode
                     selected: visualModel.isSelected(visualDelegate)
 
                     property var removalAnimation
@@ -376,15 +375,11 @@
                     // parent is the loader component
                     property var visualDelegate: parent ? parent : null
 
-                    onSwippingChanged: {
-                        visualModel.updateSwipeState(screenDelegate);
-                    }
-
-                    onSwipeStateChanged: {
-                        visualModel.updateSwipeState(screenDelegate);
-                    }
-
-                    onItemClicked: {
+                    onSwipedChanged: {
+                        visualModel.updateSwipeState(screenDelegate);
+                    }
+
+                    onClicked: {
                         if (visualModel.isInSelectionMode) {
                             if (!visualModel.selectItem(visualDelegate)) {
                                 visualModel.deselectItem(visualDelegate);
@@ -392,65 +387,71 @@
                         }
                     }
 
-                    onItemPressAndHold: {
+                    onPressAndHold: {
                         visualModel.startSelection();
                         visualModel.selectItem(visualDelegate);
                     }
 
-                    rightSideActions: [
-                        Action {
-                            id: screenDelegateCopyAction
-                            iconName: "edit-copy"
-                            text: i18n.tr("Copy")
-                            onTriggered: {
-                                var mimeData = Clipboard.newData();
-                                mimeData.text = model.formula + "=" + model.result;
-                                Clipboard.push(mimeData);
-                            }
-                        },
-                        Action {
-                            id: screenDelegateEditAction
-                            iconName: "edit"
-                            text: i18n.tr("Edit")
-                            onTriggered: {
-                                longFormula = model.formula;
-                                shortFormula =  model.result;
-                                displayedInputText = model.formula;
-                                isLastCalculate = false;
-                                previousVisual = "";
-                                scrollableView.scrollToBottom();
-                            }
-                        },
-                        Action {
-                            id: screenDelegateFavouriteAction
-                            iconName: (mainView.editedCalculationIndex == model.index || model.isFavourite) ? "starred" : "non-starred"
-
-                            text: i18n.tr("Add to favorites")
-                            onTriggered: {
-
-                                if (model.isFavourite) {
-                                    calculationHistory.updateCalculationInDatabase(model.index, model.dbId, !model.isFavourite, "");
-                                    editedCalculationIndex = -1;
-                                    textInputField.visible = true;
-                                    textInputField.forceActiveFocus();
-                                } else {
-                                    editedCalculationIndex = model.index;
-                                    textInputField.visible = false;
-                                    favouriteTextField.forceActiveFocus();
+                    leadingActions: ListItemActions {
+                        actions: [
+                            Action {
+                                id: screenDelegateDeleteAction
+                                iconName: "delete"
+                                text: i18n.tr("Delete")
+                                onTriggered: {
+                                    screenDelegate.remove();
+                                }
+                            }
+                        ]
+                    }
+                    trailingActions: ListItemActions {
+                        actions: [
+                            Action {
+                                id: screenDelegateCopyAction
+                                iconName: "edit-copy"
+                                text: i18n.tr("Copy")
+                                onTriggered: {
+                                    var mimeData = Clipboard.newData();
+                                    mimeData.text = model.formula + "=" + model.result;
+                                    Clipboard.push(mimeData);
+                                }
+                            },
+                            Action {
+                                id: screenDelegateEditAction
+                                iconName: "edit"
+                                text: i18n.tr("Edit")
+                                onTriggered: {
+                                    longFormula = model.formula;
+                                    shortFormula =  model.result;
+                                    displayedInputText = model.formula;
+                                    isLastCalculate = false;
+                                    previousVisual = "";
                                     scrollableView.scrollToBottom();
                                 }
-
-                                model.isFavourite = !model.isFavourite;
+                            },
+                            Action {
+                                id: screenDelegateFavouriteAction
+                                iconName: (mainView.editedCalculationIndex == model.index || model.isFavourite) ? "starred" : "non-starred"
+
+                                text: i18n.tr("Add to favorites")
+                                onTriggered: {
+
+                                    if (model.isFavourite) {
+                                        calculationHistory.updateCalculationInDatabase(model.index, model.dbId, !model.isFavourite, "");
+                                        editedCalculationIndex = -1;
+                                        textInputField.visible = true;
+                                        textInputField.forceActiveFocus();
+                                    } else {
+                                        editedCalculationIndex = model.index;
+                                        textInputField.visible = false;
+                                        favouriteTextField.forceActiveFocus();
+                                        scrollableView.scrollToBottom();
+                                    }
+
+                                    model.isFavourite = !model.isFavourite;
+                                }
                             }
-                        }
-                    ]
-                    leftSideAction: Action {
-                        id: screenDelegateDeleteAction
-                        iconName: "delete"
-                        text: i18n.tr("Delete")
-                        onTriggered: {
-                            screenDelegate.remove();
-                        }
+                        ]
                     }
 
                     removalAnimation: SequentialAnimation {
@@ -510,13 +511,12 @@
                     }
                 }
 
-                delegate: Component {
-                    Loader {
-                        property var itemModel: model
-                        width: parent.width
-                        height: model.dbId !== -1 ? item.height : 0;
-                        sourceComponent: screenDelegateComponent
-                    }
+                delegate: Loader {
+                    property var itemModel: model
+                    width: parent.width
+                    height: model.dbId !== -1 ? item.height : 0;
+                    sourceComponent: screenDelegateComponent
+                    asynchronous: true
                 }
             }
 
@@ -527,6 +527,7 @@
                 }
                 id: scrollableView
                 objectName: "scrollableView"
+                visible: keyboardLoader.status == Loader.Ready
 
                 Component.onCompleted: {
                     // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
@@ -603,7 +604,7 @@
                             }
                         }
 
-                        text: Formula.returnFormulaToDisplay(displayedInputText)
+                        text: Formula.returnFormulaToDisplay(displayedInputText, i18n, decimalPoint)
                         font.pixelSize: height * 0.7
                         horizontalAlignment: TextInput.AlignRight
                         anchors {
@@ -722,6 +723,14 @@
                 Loader {
                     id: keyboardLoader
                     width: parent.width
+                    enabled: mathJs != null
+                    // FIXME: this works around the fact that the final size
+                    // of keyboardLoader (and of mainView) is only set by the window
+                    // manager quite late; this avoids unnecessary reloads of the
+                    // source
+                    active: false
+                    property bool sizeReady: Window.active
+                    onSizeReadyChanged: if (sizeReady) keyboardLoader.active = true
                     source: scrollableView.width > scrollableView.height ? "ui/LandscapeKeyboard.qml" : "ui/PortraitKeyboard.qml"
                     opacity: ((y + height) >= scrollableView.contentY) &&
                              (y <= (scrollableView.contentY + scrollableView.height)) ? 1 : 0

=== modified file 'app/ui/ActionButton.qml'
--- app/ui/ActionButton.qml	2016-01-19 01:31:11 +0000
+++ app/ui/ActionButton.qml	2016-08-09 12:38:05 +0000
@@ -37,5 +37,6 @@
         height: width
         anchors.centerIn: parent
         color:  UbuntuColors.orange
+        asynchronous: true
     }
 }

=== modified file 'app/ui/FavouritePage.qml'
--- app/ui/FavouritePage.qml	2015-11-27 16:40:30 +0000
+++ app/ui/FavouritePage.qml	2016-08-09 12:38:05 +0000
@@ -25,6 +25,7 @@
 
 Page {
     anchors.fill: parent
+    title: i18n.tr("Favorite")
 
     property var removedFavourites: []
 
@@ -82,6 +83,7 @@
                     Layout.alignment: Qt.AlignVCenter
 
                     name: "starred"
+                    asynchronous: true
                 }
 
                 Text {

=== modified file 'app/ui/KeyboardButton.qml'
--- app/ui/KeyboardButton.qml	2015-11-09 14:18:18 +0000
+++ app/ui/KeyboardButton.qml	2016-08-09 12:38:05 +0000
@@ -19,11 +19,10 @@
 import QtQuick 2.4
 import Ubuntu.Components 1.3
 
-AbstractButton {
+MouseArea {
     id: buttonRect
     objectName: modelname + "Button"
 
-    property real baseSize: 1
     property alias text: buttonText.text
     property string buttonColor: "#eeeeee"
     property string pressedColor: "#E2E1E4"
@@ -38,7 +37,7 @@
 
     onKbdPressedChanged: {
         if (!kbdPressed) {
-            buttonRect.clicked();
+            buttonRect.clicked(null);
         }
     }
 
@@ -46,7 +45,7 @@
         anchors.fill: parent
         border.color: "#d0d0d0"
         border.width: units.dp(0.5)
-        color: buttonRect.pressed || buttonRect.kbdPressed ? pressedColor : buttonColor
+        color: buttonRect.pressed || buttonRect.kbdPressed ? "#E2E1E4" : "#eeeeee"
 
         Behavior on color {
             ColorAnimation {
@@ -62,5 +61,6 @@
         font.pixelSize: 0.5 * parent.height
 
         styleColor: "gray"
+        opacity: enabled ? 1.0 : 0.5
     }
 }

=== modified file 'app/ui/KeyboardPage.qml'
--- app/ui/KeyboardPage.qml	2015-11-09 14:18:18 +0000
+++ app/ui/KeyboardPage.qml	2016-08-09 12:38:05 +0000
@@ -63,12 +63,16 @@
     //Space between the buttons
     spacing: 0
 
+    property bool completed: false
     Component.onCompleted: {
         buildModel();
+        completed = true;
     }
 
     onKeyboardModelChanged: {
-        buildModel();
+        if (completed) {
+            buildModel();
+        }
     }
 
     function buildModel() {
@@ -139,7 +143,6 @@
                         text: model.text
                         textColor: model.textColor
                         objectName: model.objectName
-                        baseSize: repeater.height
                         onClicked: {
                             //If key pressed then scroll down
 

=== modified file 'app/ui/Screen.qml'
--- app/ui/Screen.qml	2016-01-08 23:48:00 +0000
+++ app/ui/Screen.qml	2016-08-09 12:38:05 +0000
@@ -21,7 +21,7 @@
 import "../upstreamcomponents"
 import "../engine/formula.js" as Formula
 
-ListItemWithActions {
+ListItem {
     id: root
     objectName: "screenroot" + model.index
 
@@ -53,6 +53,7 @@
 
     color: "white"
     height: units.gu(7) + (mainView.isScreenIsWide ? 0 : units.gu(3.7))
+    divider.visible: false
     Column {
         anchors.fill: parent
         Row {
@@ -81,6 +82,7 @@
                 width: height
                 name: model.isFavourite ? "starred" : "non-starred"
                 color: model.isFavourite ? UbuntuColors.orange : "white"
+                asynchronous: true
             }
 
             Text {
@@ -113,7 +115,7 @@
                 anchors.top: parent.top
 
                 color: UbuntuColors.darkGrey
-                text: Formula.returnFormulaToDisplay(model.result)
+                text: Formula.returnFormulaToDisplay(model.result, i18n, mainView.decimalPoint)
                 textFormat: Text.PlainText
                 font.pixelSize: units.gu(3.5)
                 lineHeight: units.gu(2)
@@ -129,7 +131,7 @@
 
                 color: UbuntuColors.darkGrey
                 textFormat: Text.PlainText
-                text: Formula.returnFormulaToDisplay(model.formula) + " ="
+                text: Formula.returnFormulaToDisplay(model.formula, i18n, mainView.decimalPoint) + " ="
                 font.pixelSize: units.gu(2.5)
 
                 verticalAlignment: Text.AlignVCenter
@@ -153,7 +155,7 @@
                 anchors.bottom: parent.bottom 
 
                 color: UbuntuColors.darkGrey
-                text: Formula.returnFormulaToDisplay(model.result)
+                text: Formula.returnFormulaToDisplay(model.result, i18n, mainView.decimalPoint)
                 font.pixelSize: units.gu(3.5)
                 lineHeight: units.gu(2)
                 lineHeightMode: Text.FixedHeight

=== modified file 'app/upstreamcomponents/EmptyState.qml'
--- app/upstreamcomponents/EmptyState.qml	2015-11-09 14:18:18 +0000
+++ app/upstreamcomponents/EmptyState.qml	2016-08-09 12:38:05 +0000
@@ -24,6 +24,7 @@
         height: units.gu(10)
         width: height
         color: "#BBBBBB"
+        asynchronous: true
     }
 
     Label {

=== removed file 'app/upstreamcomponents/ListItemWithActions.qml'
--- app/upstreamcomponents/ListItemWithActions.qml	2015-11-09 14:18:18 +0000
+++ app/upstreamcomponents/ListItemWithActions.qml	1970-01-01 00:00:00 +0000
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2012-2015 Canonical, Ltd.
- *
- * 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; version 3.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-import QtQuick 2.4
-import Ubuntu.Components 1.3
-
-Item {
-    id: root
-
-    property Action leftSideAction: null
-    property list<Action> rightSideActions
-    property double defaultHeight: units.gu(8)
-    property bool locked: false
-    property Action activeAction: null
-    property var activeItem: null
-    property bool triggerActionOnMouseRelease: false
-    property color color: Theme.palette.normal.background
-    property color selectedColor: mainView.backgroundColor
-    property bool selected: false
-    property bool selectionMode: false
-    property alias internalAnchors: mainContents.anchors
-    default property alias contents: mainContents.children
-
-    readonly property double actionWidth: units.gu(4)
-    readonly property double leftActionWidth: units.gu(10)
-    readonly property double actionThreshold: actionWidth * 0.4
-    readonly property double threshold: 0.4
-    readonly property string swipeState: main.x == 0 ? "Normal" : main.x > 0 ? "LeftToRight" : "RightToLeft"
-    readonly property alias swipping: mainItemMoving.running
-    readonly property bool _showActions: mouseArea.pressed || swipeState != "Normal" || swipping
-
-    /* internal */
-    property var _visibleRightSideActions: filterVisibleActions(rightSideActions)
-
-    signal itemClicked(var mouse)
-    signal itemPressAndHold(var mouse)
-
-    function returnToBoundsRTL(direction)
-    {
-        var actionFullWidth = actionWidth + units.gu(2)
-
-        // go back to normal state if swipping reverse
-        if (direction === "LTR") {
-            updatePosition(0)
-            return
-        } else if (!triggerActionOnMouseRelease) {
-            updatePosition(-rightActionsView.width + units.gu(2))
-            return
-        }
-
-        var xOffset = Math.abs(main.x)
-        var index = Math.min(Math.floor(xOffset / actionFullWidth), _visibleRightSideActions.length)
-        var newX = 0
-      if (index === _visibleRightSideActions.length) {
-            newX = -(rightActionsView.width - units.gu(2))
-        } else if (index >= 1) {
-            newX = -(actionFullWidth * index)
-        }
-        updatePosition(newX)
-    }
-
-    function returnToBoundsLTR(direction)
-    {
-        var finalX = leftActionWidth
-        if ((direction === "RTL") || (main.x <= (finalX * root.threshold)))
-            finalX = 0
-        updatePosition(finalX)
-    }
-
-    function returnToBounds(direction)
-    {
-        if (main.x < 0) {
-            returnToBoundsRTL(direction)
-        } else if (main.x > 0) {
-            returnToBoundsLTR(direction)
-        } else {
-            updatePosition(0)
-        }
-    }
-
-    function contains(item, point, marginX)
-    {
-        var itemStartX = item.x - marginX
-        var itemEndX = item.x + item.width + marginX
-        return (point.x >= itemStartX) && (point.x <= itemEndX) &&
-               (point.y >= item.y) && (point.y <= (item.y + item.height));
-    }
-
-    function getActionAt(point)
-    {
-        if (contains(leftActionView, point, 0)) {
-            return leftSideAction
-        } else if (contains(rightActionsView, point, 0)) {
-            var newPoint = root.mapToItem(rightActionsView, point.x, point.y)
-            for (var i = 0; i < rightActionsRepeater.count; i++) {
-                var child = rightActionsRepeater.itemAt(i)
-                if (contains(child, newPoint, units.gu(1))) {
-                    return i
-                }
-            }
-        }
-        return -1
-    }
-
-    function updateActiveAction()
-    {
-        if (triggerActionOnMouseRelease &&
-            (main.x <= -(root.actionWidth + units.gu(2))) &&
-            (main.x > -(rightActionsView.width - units.gu(2)))) {
-            var actionFullWidth = actionWidth + units.gu(2)
-            var xOffset = Math.abs(main.x)
-            var index = Math.min(Math.floor(xOffset / actionFullWidth), _visibleRightSideActions.length)
-            index = index - 1
-            if (index > -1) {
-                root.activeItem = rightActionsRepeater.itemAt(index)
-                root.activeAction = root._visibleRightSideActions[index]
-            }
-        } else {
-            root.activeAction = null
-        }
-    }
-
-    function resetSwipe()
-    {
-        updatePosition(0)
-    }
-
-    function filterVisibleActions(actions)
-    {
-        var visibleActions = []
-        for(var i = 0; i < actions.length; i++) {
-            var action = actions[i]
-            if (action.visible) {
-                visibleActions.push(action)
-            }
-        }
-        return visibleActions
-    }
-
-    function updatePosition(pos)
-    {
-        if (!root.triggerActionOnMouseRelease && (pos !== 0)) {
-            mouseArea.state = pos > 0 ? "RightToLeft" : "LeftToRight"
-        } else {
-            mouseArea.state = ""
-        }
-        main.x = pos
-    }
-
-    states: [
-        State {
-            name: "select"
-            when: selectionMode || selected
-            PropertyChanges {
-                target: selectionIcon
-                source: Qt.resolvedUrl("ListItemWithActionsCheckBox.qml")
-                anchors.leftMargin: units.gu(2)
-            }
-            PropertyChanges {
-                target: root
-                locked: true
-            }
-            PropertyChanges {
-                target: main
-                x: 0
-            }
-        }
-    ]
-
-    height: defaultHeight
-    clip: height !== defaultHeight
-
-    Rectangle {
-        id: leftActionView
-
-        anchors {
-            top: parent.top
-            bottom: parent.bottom
-            right: main.left
-        }
-        width: root.leftActionWidth + actionThreshold
-        visible: leftSideAction
-        color: UbuntuColors.red
-        opacity: main.x > 0 ? 1 : 0
-
-        Icon {
-            anchors {
-                centerIn: parent
-                horizontalCenterOffset: actionThreshold / 2
-            }
-            name: leftSideAction && _showActions ? leftSideAction.iconName : ""
-            color: Theme.palette.selected.field
-            height: units.gu(3)
-            width: units.gu(3)
-        }
-    }
-
-    Rectangle {
-       id: rightActionsView
-
-       anchors {
-           top: main.top
-           left: main.right
-           bottom: main.bottom
-       }
-       visible: _visibleRightSideActions.length > 0
-       width: rightActionsRepeater.count > 0 ? rightActionsRepeater.count * (root.actionWidth + units.gu(2)) + root.actionThreshold + units.gu(2) : 0
-       color: "white"
-       Row {
-           anchors{
-               top: parent.top
-               left: parent.left
-               leftMargin: units.gu(2)
-               right: parent.right
-               rightMargin: units.gu(2)
-               bottom: parent.bottom
-           }
-           spacing: units.gu(2)
-           Repeater {
-               id: rightActionsRepeater
-
-               model: _showActions ? _visibleRightSideActions : []
-               Item {
-                   property alias image: img
-
-                   height: rightActionsView.height
-                   width: root.actionWidth
-
-                   Icon {
-                       id: img
-
-                       anchors.centerIn: parent
-                       width: units.gu(3)
-                       height: units.gu(3)
-                       name: modelData.iconName
-                       color: root.activeAction === modelData ? UbuntuColors.lightAubergine : UbuntuColors.lightGrey
-                   }
-              }
-           }
-       }
-    }
-
-
-    Rectangle {
-        id: main
-        objectName: "mainItem"
-
-        anchors {
-            top: parent.top
-            bottom: parent.bottom
-        }
-
-        width: parent.width
-        color: root.selected ? root.selectedColor : root.color
-
-        Loader {
-            id: selectionIcon
-
-            anchors {
-                left: main.left
-                verticalCenter: main.verticalCenter
-            }
-            width: (status === Loader.Ready) ? item.implicitWidth : 0
-            visible: (status === Loader.Ready) && (item.width === item.implicitWidth)
-            Behavior on width {
-                NumberAnimation {
-                    duration: UbuntuAnimation.SnapDuration
-                }
-            }
-        }
-
-
-        Item {
-            id: mainContents
-
-            anchors {
-                left: selectionIcon.right
-                leftMargin: units.gu(2)
-                top: parent.top
-                topMargin: units.gu(1)
-                right: parent.right
-                rightMargin: units.gu(2)
-                bottom: parent.bottom
-                bottomMargin: units.gu(1)
-            }
-        }
-
-        Behavior on x {
-            UbuntuNumberAnimation {
-                id: mainItemMoving
-
-                easing.type: Easing.OutElastic
-                duration: UbuntuAnimation.SlowDuration
-            }
-        }
-        Behavior on color {
-           ColorAnimation {}
-        }
-    }
-
-    SequentialAnimation {
-        id: triggerAction
-
-        property var currentItem: root.activeItem ? root.activeItem.image : null
-
-        running: false
-        ParallelAnimation {
-            UbuntuNumberAnimation {
-                target: triggerAction.currentItem
-                property: "opacity"
-                from: 1.0
-                to: 0.0
-                duration: UbuntuAnimation.SlowDuration
-                easing {type: Easing.InOutBack; }
-            }
-            UbuntuNumberAnimation {
-                target: triggerAction.currentItem
-                properties: "width, height"
-                from: units.gu(3)
-                to: root.actionWidth
-                duration: UbuntuAnimation.SlowDuration
-                easing {type: Easing.InOutBack; }
-            }
-        }
-        PropertyAction {
-            target: triggerAction.currentItem
-            properties: "width, height"
-            value: units.gu(3)
-        }
-        PropertyAction {
-            target: triggerAction.currentItem
-            properties: "opacity"
-            value: 1.0
-        }
-        ScriptAction {
-            script: {
-                root.activeAction.triggered(root)
-                mouseArea.state = ""
-            }
-        }
-        PauseAnimation {
-            duration: 500
-        }
-        UbuntuNumberAnimation {
-            target: main
-            property: "x"
-            to: 0
-
-        }
-    }
-
-    MouseArea {
-        id: mouseArea
-
-        property bool locked: root.locked || ((root.leftSideAction === null) && (root._visibleRightSideActions.count === 0))
-        property bool manual: false
-        property string direction: "None"
-        property real lastX: -1
-
-        anchors.fill: parent
-        drag {
-            target: locked ? null : main
-            axis: Drag.XAxis
-            minimumX: rightActionsView.visible ? -(rightActionsView.width) : 0
-            maximumX: leftActionView.visible ? leftActionView.width : 0
-            threshold: root.actionThreshold
-        }
-
-        states: [
-            State {
-                name: "LeftToRight"
-                PropertyChanges {
-                    target: mouseArea
-                    drag.maximumX: 0
-                }
-            },
-            State {
-                name: "RightToLeft"
-                PropertyChanges {
-                    target: mouseArea
-                    drag.minimumX: 0
-                }
-            }
-        ]
-
-        onMouseXChanged: {
-            var offset = (lastX - mouseX)
-            if (Math.abs(offset) <= root.actionThreshold) {
-                return
-            }
-            lastX = mouseX
-            direction = offset > 0 ? "RTL" : "LTR";
-        }
-
-        onPressed: {
-            lastX = mouse.x
-        }
-
-        onReleased: {
-            if (root.triggerActionOnMouseRelease && root.activeAction) {
-                triggerAction.start()
-            } else {
-                root.returnToBounds(direction)
-                root.activeAction = null
-            }
-            lastX = -1
-            direction = "None"
-        }
-        onClicked: {
-            if (main.x === 0) {
-                root.itemClicked(mouse)
-            } else if (main.x > 0) {
-                var action = getActionAt(Qt.point(mouse.x, mouse.y))
-                if (action && action !== -1) {
-                    action.triggered(root)
-                }
-            } else {
-                var actionIndex = getActionAt(Qt.point(mouse.x, mouse.y))
-                if (actionIndex !== -1) {
-                    root.activeItem = rightActionsRepeater.itemAt(actionIndex)
-                    root.activeAction = root._visibleRightSideActions[actionIndex]
-                    triggerAction.start()
-                    return
-                }
-            }
-            root.resetSwipe()
-        }
-
-        onPositionChanged: {
-            if (mouseArea.pressed) {
-                updateActiveAction()
-            }
-        }
-        onPressAndHold: {
-            if (main.x === 0) {
-                root.itemPressAndHold(mouse)
-            }
-        }
-        z: -1
-    }
-}

=== removed file 'app/upstreamcomponents/ListItemWithActionsCheckBox.qml'
--- app/upstreamcomponents/ListItemWithActionsCheckBox.qml	2015-11-09 14:18:18 +0000
+++ app/upstreamcomponents/ListItemWithActionsCheckBox.qml	1970-01-01 00:00:00 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2012-2015 Canonical, Ltd.
- *
- * 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; version 3.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-import QtQuick 2.4
-import Ubuntu.Components 1.3
-
-CheckBox {
-    checked: root.selected
-    width: implicitWidth
-    // disable item mouse area to avoid conflicts with parent mouse area
-    __mouseArea.enabled: false
-}

=== modified file 'app/welcomewizard/Slide11.qml'
--- app/welcomewizard/Slide11.qml	2016-01-12 05:21:48 +0000
+++ app/welcomewizard/Slide11.qml	2016-08-09 12:38:05 +0000
@@ -40,6 +40,7 @@
                 anchors.centerIn: parent
                 source: Qt.resolvedUrl("../graphics/gift.png")
                 fillMode: Image.PreserveAspectFit
+                asynchronous: true
             }
         }
 

=== modified file 'app/welcomewizard/SlideBase.qml'
--- app/welcomewizard/SlideBase.qml	2016-01-12 05:21:48 +0000
+++ app/welcomewizard/SlideBase.qml	2016-08-09 12:38:05 +0000
@@ -48,6 +48,7 @@
                 anchors.centerIn: parent
                 source: Qt.resolvedUrl(slideImage)
                 fillMode: Image.PreserveAspectFit
+                asynchronous: true
             }
         }
 

-- 
Mailing list: https://launchpad.net/~ubuntu-touch-coreapps-reviewers
Post to     : ubuntu-touch-coreapps-reviewers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~ubuntu-touch-coreapps-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to