components for android added
[mardrone] / mardrone / imports / Qt / labs / components / native / NotificationBanner.qml
diff --git a/mardrone/imports/Qt/labs/components/native/NotificationBanner.qml b/mardrone/imports/Qt/labs/components/native/NotificationBanner.qml
new file mode 100644 (file)
index 0000000..1801fbb
--- /dev/null
@@ -0,0 +1,255 @@
+/****************************************************************************
+**
+** 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 1.1
+import "." 1.0
+//import com.nokia.meego 1.0
+
+/*
+   Class: InfoBanner
+   The InfoBanner component is used to display information to the user. The number of lines of text
+   shouldn't exceed 3.
+*/
+
+Item {
+    id: root
+
+    /*
+     * Property: iconSource
+     * [url] The path to the icon image
+     */
+    property url iconSource: ""
+
+    /*
+     * Property: text
+     * [string] Text to be displayed in InfoBanner
+     */
+    property alias text: text.text
+
+    /*
+     * Property: timerEnabled
+     * [bool=true] Enable/disable timer that dismisses InfoBanner
+     */
+    property bool timerEnabled: true
+
+    /*
+     * Property: timerShowTime
+     * [int=3000ms] For setting how long InfoBanner stays visible to user before being dismissed
+     */
+    property alias timerShowTime: sysBannerTimer.interval
+
+    /*
+     * Property: topMargin
+     * [int=8 pix] Allows user to customize top margin if needed
+     */
+    property alias topMargin: root.y
+
+    /*
+     * Property: leftMargin
+     * [int=8 pix] Allows user to customize left margin if needed
+     */
+    property alias leftMargin: root.x
+
+    /*
+     * Function: show
+     * Show InfoBanner
+     */
+    function show() {
+        parent = __findParent();
+        animationShow.running = true;
+        if (root.timerEnabled)
+            sysBannerTimer.restart();
+    }
+
+    function __findParent() {
+        var next = parent;
+        while (next && next.parent && next.objectName != "appWindowContent") {
+            next = next.parent;
+        }
+        return next;
+    }
+
+    /*
+     * Function: hide
+     * Hide InfoBanner
+     */
+    function hide() {
+        animationHide.running = true;
+    }
+
+    implicitHeight: internal.getBannerHeight()
+    implicitWidth: internal.getBannerWidth()
+    x:8; y:8
+    scale: 0
+
+    BorderImage {
+        source: "image://theme/meegotouch-notification-system-background"
+        anchors.fill: root
+        horizontalTileMode: BorderImage.Stretch
+        verticalTileMode: BorderImage.Stretch
+        border { left: 10; top: 10; right: 10; bottom: 10 }
+        opacity: 1
+    }
+
+    Image {
+        id: image
+        anchors { left: parent.left; leftMargin: 16; top: parent.top; topMargin: 16 }
+        source: root.iconSource
+        visible: root.iconSource != ""
+    }
+
+    Text {
+        id: text
+        width: internal.getTextWidth()
+        anchors { left: (image.visible ? image.right : parent.left); leftMargin: (image.visible ? 14:16);
+            top: parent.top; topMargin: internal.getTopMargin(); bottom: parent.bottom }
+        color: "white"
+        wrapMode: Text.Wrap
+        verticalAlignment: Text.AlignHCenter
+        font.pixelSize: 24
+        font.family: "Nokia Pure"
+        font.letterSpacing: -1.2
+        maximumLineCount: 3
+        elide: Text.ElideRight
+    }
+
+    QtObject {
+        id: internal
+
+        function getBannerHeight() {
+            if (image.visible) {
+                if (text.lineCount <= 2)
+                    return 80; 
+                else
+                    return 80; //106
+            } else {
+                if (text.lineCount <= 1)
+                    return 80; //64
+                else if (text.lineCount <= 2)
+                    return 80; 
+                else
+                    return 80; //106
+            }
+        }
+
+        function getBannerWidth() {
+            if ( screen.currentOrientation==Screen.Portrait || screen.currentOrientation==Screen.PortraitInverted ) {
+                // In portrait mode, the width of the banner is equal to the width of parent minus left
+                // and right margins in-between banner and parent.
+                return parent.width-root.x*2;
+            } else {
+                if (image.visible) {
+                    // If an icon image is specified...
+                    if ((image.width+text.paintedWidth+46) <= parent.width*0.54 && text.lineCount <= 1) {
+                        // 46 is the sum of all horizontal margins within the banner. The above condition basically
+                        // says that if there's only one line of text, and the sum of width of icon, text, and required
+                        // margins is less then 54% of the screen width, banner width should be 54% of the screen.
+                        return parent.width*0.54;
+                    } else {
+                        return parent.width-root.x*2;
+                    }
+                } else {
+                    // If no icon image specified...
+                    if ((text.paintedWidth+32) <= parent.width*0.54 && text.lineCount <= 1) {
+                        // 32 is the sum of all horizontal margins within the banner. The above condition basically
+                        // says that if there's only one line of text, and the sum of width of text and required
+                        // margins is less then 54% of the screen width, banner width should be 54% of the screen.
+                        return parent.width-root.x*2;
+                    } else {
+                        return parent.width-root.x*2;
+                    }
+                }
+            }
+        }
+
+        function getTopMargin() {
+            if (text.lineCount <= 1 && !image.visible) {
+                // If there's only one line of text and no icon image, top and bottom margins are equal.
+                return (root.height-text.paintedHeight)/2;
+            } else {
+                // In all other cases, top margin is 4 px more than bottom margin.
+                return (root.height-text.paintedHeight)/2 + 2;
+            }
+        }
+
+        function getTextWidth() {
+            // 46(32 when there's no icon) is sum of all margins within banner. root.x*2 is sum of margins outside banner.
+            // Text element width is dertermined by substracting parent width(screen width) by all the margins and
+            // icon width(if applicable).
+            return image.visible ? (parent.width-root.x*2-46-image.width) : (parent.width-root.x*2-32);
+        }
+
+        function getScaleValue() {
+            // When banner is displayed, as part of transition effect, it'll first be enlarged to the point where its width
+            // is equal to screen width. root.x*2/root.width calculates the amount of expanding required, where root.x*2 is
+            // equal to screen.displayWidth minus banner.width
+            return root.x*2/root.width + 1;
+        }
+    }
+
+    Timer {
+        id: sysBannerTimer
+        repeat: false
+        running: false
+        interval: 3000
+        onTriggered: hide()
+    }
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: hide()
+    }
+
+    SequentialAnimation {
+        id: animationShow
+        NumberAnimation { target: root; property: "scale"; from: 0; to: internal.getScaleValue(); duration: 200; easing.type: Easing.OutQuad}
+        NumberAnimation { target: root; property: "scale"; from: internal.getScaleValue(); to: 1; duration: 200 }
+    }
+
+    NumberAnimation {
+        id: animationHide
+        target: root; property: "scale"; to: 0; duration: 200; easing.type: Easing.InExpo
+    }
+
+    Component.onCompleted: {
+        //__owner = parent;
+    }
+}
+