components for android added
[mardrone] / mardrone / imports / Qt / labs / components / native / Fader.qml
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the Qt Components project.
8 **
9 ** $QT_BEGIN_LICENSE:BSD$
10 ** You may use this file under the terms of the BSD license as follows:
11 **
12 ** "Redistribution and use in source and binary forms, with or without
13 ** modification, are permitted provided that the following conditions are
14 ** met:
15 **   * Redistributions of source code must retain the above copyright
16 **     notice, this list of conditions and the following disclaimer.
17 **   * Redistributions in binary form must reproduce the above copyright
18 **     notice, this list of conditions and the following disclaimer in
19 **     the documentation and/or other materials provided with the
20 **     distribution.
21 **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22 **     the names of its contributors may be used to endorse or promote
23 **     products derived from this software without specific prior written
24 **     permission.
25 **
26 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 import QtQuick 1.1
42
43 // Background dimming
44 Rectangle {
45     id: faderBackground
46
47     property double dim: 0.9
48     property int fadeInDuration: 250
49     property int fadeOutDuration: 250
50
51     property int fadeInDelay: 0
52     property int fadeOutDelay: 0
53
54     property int fadeInEasingType: Easing.InQuint
55     property int fadeOutEasingType: Easing.OutQuint
56
57     property url background: ""
58
59     property Item visualParent: null
60     property Item originalParent: parent
61
62     // widen the edges to avoid artefacts during rotation
63     anchors.topMargin:    -1
64     anchors.rightMargin:  -1
65     anchors.bottomMargin: -1
66     anchors.leftMargin:   -1
67
68     // opacity is passed to child elements - that is not, what we want
69     // so we need to use alpha value here
70     property double alpha: dim
71
72     signal privateClicked
73
74      //Deprecated, TODO Remove the following two lines on w13
75     signal clicked
76     onClicked: privateClicked()
77
78     // we need the possibility to fetch the red, green, blue components from a color
79     // see http://bugreports.qt.nokia.com/browse/QTBUG-14731
80     color: background != "" ? "transparent" : Qt.rgba(0.0, 0.0, 0.0, alpha)
81     state: 'hidden'
82
83     anchors.fill: parent
84
85     // eat mouse events
86     MouseArea {
87         id: mouseEventEater
88         anchors.fill: parent
89         enabled: faderBackground.alpha != 0.0
90         onClicked: { parent.privateClicked() }
91     }
92
93     Component {
94         id: backgroundComponent
95         BorderImage {
96             id: backgroundImage
97             source: background
98
99             width: faderBackground.width
100             height: faderBackground.height
101
102             opacity: faderBackground.alpha
103         }
104     }
105     Loader {id: backgroundLoader}
106
107     onAlphaChanged: {
108           if (background && faderBackground.alpha && backgroundLoader.sourceComponent == undefined) {
109             backgroundLoader.sourceComponent = backgroundComponent;
110           }
111           if (!faderBackground.alpha) {
112             backgroundLoader.sourceComponent = undefined;
113           }
114     }
115
116     function findRoot() {
117         var next = parent;
118
119         if (next != null) {
120             while (next.parent) {
121                 if(next.objectName == "appWindowContent" || next.objectName == "windowContent"){
122                     break
123                 }
124
125                 next = next.parent;
126             }
127         }
128         return next;
129     }
130
131
132     states: [
133         State {
134             name: "visible"
135             PropertyChanges {
136                 target: faderBackground
137                 alpha: dim
138             }
139         },
140         State {
141             name: "hidden"
142             PropertyChanges {
143                 target: faderBackground
144                 alpha: 0.0
145             }
146         }
147     ]
148     
149     transitions: [
150         Transition {
151             from: "hidden"; to: "visible"
152             //reparent fader whenever it is going to be visible
153             SequentialAnimation {
154                 ScriptAction {script: {
155                         //console.log("=============00=============");
156                         // the algorithm works in the following way:
157                         // First:  Check if visualParent property is set; if yes, center the fader in visualParent
158                         // Second: If not, center inside window content element
159                         // Third:  If no window was found, use root window
160                         originalParent = faderBackground.parent;
161                         if (visualParent != null) {
162                             faderBackground.parent = visualParent
163                         } else {
164                             var root = findRoot();
165                             if (root != null) {
166                                 faderBackground.parent = root;
167                             } else {
168                                // console.log("Error: Cannot find root");
169                             }
170                         }
171                     }
172                 }
173                 PauseAnimation { duration: fadeInDelay }
174
175                 NumberAnimation {
176                     properties: "alpha"
177                     duration: faderBackground.fadeInDuration
178                     easing.type: faderBackground.fadeInEasingType;
179                 }
180             }
181         },
182         Transition {
183             from: "visible"; to: "hidden"
184             SequentialAnimation {
185                 PauseAnimation { duration: fadeOutDelay }
186
187                 NumberAnimation {
188                     properties: "alpha"
189                     duration: faderBackground.fadeOutDuration
190                     easing.type: faderBackground.fadeOutEasingType;
191                 }
192                 ScriptAction {script: {
193                         faderBackground.parent = originalParent;
194                     }
195                 }
196             }
197         }
198     ]
199 }
200
201
202