on 29019df help sign in
unity8/qml/Greeter/Greeter.qml
199 lines 6.1 kB history raw
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
17import QtQuick 2.0
18import Ubuntu.Components 0.1
19import Ubuntu.Gestures 0.1
20import LightDM 0.1 as LightDM
21import "../Components"
23Showable {
24 id: greeter
25 enabled: shown
26 created: greeterContentLoader.status == Loader.Ready && greeterContentLoader.item.ready
28 property url defaultBackground
30 // 1 when fully shown and 0 when fully hidden
31 property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
33 showAnimation: StandardAnimation { property: "x"; to: 0 }
34 hideAnimation: __leftHideAnimation
36 property alias dragHandleWidth: dragHandle.width
37 property alias model: greeterContentLoader.model
38 property bool locked: shown && !LightDM.Greeter.promptless
40 readonly property bool narrowMode: !multiUser && height > width
41 readonly property bool multiUser: LightDM.Users.count > 1
43 readonly property int currentIndex: greeterContentLoader.currentIndex
45 property var __leftHideAnimation: StandardAnimation { property: "x"; to: -width }
46 property var __rightHideAnimation: StandardAnimation { property: "x"; to: width }
48 signal selected(int uid)
49 signal unlocked(int uid)
50 signal tease()
52 function hideRight() {
53 if (shown) {
54 hideAnimation = __rightHideAnimation
55 hide()
56 }
57 }
59 onRequiredChanged: {
60 // Reset hide animation to default once we're finished with it
61 if (!required) {
62 // Put back on left for reliable show direction and so that
63 // if normal hide() is called, we don't animate from right.
64 x = -width
65 hideAnimation = __leftHideAnimation
66 }
67 }
69 // Bi-directional revealer
70 DraggingArea {
71 id: dragHandle
72 anchors.fill: parent
73 enabled: (greeter.narrowMode || !greeter.locked) && greeter.enabled
74 orientation: Qt.Horizontal
75 propagateComposedEvents: true
77 Component.onCompleted: {
78 // set evaluators to baseline of dragValue == 0
79 leftEvaluator.reset()
80 rightEvaluator.reset()
81 }
83 function maybeTease() {
84 if (!greeter.locked || greeter.narrowMode)
85 greeter.tease();
86 }
88 onClicked: maybeTease()
89 onDragStart: maybeTease()
90 onPressAndHold: {} // eat event, but no need to tease, as drag will cover it
92 onDragEnd: {
93 if (rightEvaluator.shouldAutoComplete())
94 greeter.hideRight()
95 else if (leftEvaluator.shouldAutoComplete())
96 greeter.hide();
97 else
98 greeter.show(); // undo drag
99 }
101 onDragValueChanged: {
102 // dragValue is kept as a "step" value since we do this x adjusting on the fly
103 greeter.x += dragValue
104 }
106 EdgeDragEvaluator {
107 id: rightEvaluator
108 trackedPosition: dragHandle.dragValue + greeter.x
109 maxDragDistance: parent.width
110 direction: Direction.Rightwards
111 }
113 EdgeDragEvaluator {
114 id: leftEvaluator
115 trackedPosition: dragHandle.dragValue + greeter.x
116 maxDragDistance: parent.width
117 direction: Direction.Leftwards
118 }
119 }
121 Loader {
122 id: greeterContentLoader
123 objectName: "greeterContentLoader"
124 anchors.fill: parent
125 property var model: LightDM.Users
126 property int currentIndex: 0
127 property var infographicModel: LightDM.Infographic
128 readonly property int backgroundTopMargin: -greeter.y
130 source: required ? "GreeterContent.qml" : ""
132 onLoaded: {
133 selected(currentIndex);
134 }
136 Connections {
137 target: greeterContentLoader.item
139 onSelected: {
140 greeter.selected(uid);
141 greeterContentLoader.currentIndex = uid;
142 }
143 onUnlocked: greeter.unlocked(uid);
144 }
145 }
147 onTease: showLabelAnimation.start()
149 Label {
150 id: swipeHint
151 visible: greeter.shown
152 property real baseOpacity: 0.5
153 opacity: 0.0
154 anchors.horizontalCenter: parent.horizontalCenter
155 anchors.bottom: parent.bottom
156 anchors.bottomMargin: units.gu(5)
157 text: i18n.tr("Swipe to unlock")
158 color: "white"
159 font.weight: Font.Light
161 SequentialAnimation on opacity {
162 id: showLabelAnimation
163 running: false
164 loops: 2
166 StandardAnimation {
167 from: 0.0
168 to: swipeHint.baseOpacity
169 duration: UbuntuAnimation.SleepyDuration
170 }
171 PauseAnimation { duration: UbuntuAnimation.BriskDuration }
172 StandardAnimation {
173 from: swipeHint.baseOpacity
174 to: 0.0
175 duration: UbuntuAnimation.SleepyDuration
176 }
177 }
178 }
180 // right side shadow
181 Image {
182 anchors.left: parent.right
183 anchors.top: parent.top
184 anchors.bottom: parent.bottom
185 visible: parent.required
186 fillMode: Image.Tile
187 source: "../graphics/dropshadow_right.png"
188 }
190 // left side shadow
191 Image {
192 anchors.right: parent.left
193 anchors.top: parent.top
194 anchors.bottom: parent.bottom
195 visible: parent.required
196 fillMode: Image.Tile
197 source: "../graphics/dropshadow_left.png"
198 }