on 5529866 help sign in
unity8/GreeterShell.qml
225 lines 6.7 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 AccountsService 0.1
18import GSettings 1.0
19import LightDM 0.1 as LightDM
20import Powerd 0.1
21import QtQuick 2.0
22import SessionBroadcast 0.1
23import Ubuntu.Components 0.1
24import Unity.Application 0.1
25import Unity.Launcher 0.1
26import "Components"
27import "Greeter"
28import "Launcher"
29import "Panel"
31BasicShell {
32 id: shell
34 function activateApplication(appId) {
35 SessionBroadcast.requestApplicationStart(LightDM.Greeter.authenticationUser, appId)
36 greeter.hide()
37 }
39 GSettings {
40 id: backgroundSettings
41 schema.id: "org.gnome.desktop.background"
42 }
43 backgroundFallbackSource: backgroundSettings.pictureUri // for ease of customization by system builders
44 backgroundSource: AccountsService.backgroundFile
46 Lockscreen {
47 id: lockscreen
48 objectName: "lockscreen"
50 hides: [launcher, panel.indicators]
51 shown: false
52 enabled: true
53 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
54 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
55 y: panel.panelHeight
56 x: required ? 0 : - width
57 width: parent.width
58 height: parent.height - panel.panelHeight
60 onUnlocked: lockscreen.hide()
61 onCancel: greeter.show()
63 Component.onCompleted: {
64 if (LightDM.Users.count == 1) {
65 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
66 greeter.selected(0)
67 }
68 }
69 }
71 Connections {
72 target: LightDM.Greeter
74 onShowPrompt: {
75 if (LightDM.Users.count == 1) {
76 // TODO: There's no better way for now to determine if its a PIN or a passphrase.
77 if (text == "PIN") {
78 lockscreen.alphaNumeric = false
79 } else {
80 lockscreen.alphaNumeric = true
81 }
82 lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text);
83 lockscreen.show();
84 }
85 }
86 }
88 Greeter {
89 id: greeter
90 objectName: "greeter"
92 available: true
93 hides: [launcher, panel.indicators]
94 shown: true
95 background: shell.background
97 y: panel.panelHeight
98 width: parent.width
99 height: parent.height - panel.panelHeight
101 dragHandleWidth: shell.edgeSize
103 function login() {
104 enabled = false;
105 LightDM.Greeter.startSessionSync();
106 }
108 onShownChanged: {
109 if (shown) {
110 lockscreen.reset();
111 // If there is only one user, we start authenticating with that one here.
112 // If there are more users, the Greeter will handle that
113 if (LightDM.Users.count == 1) {
114 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
115 greeter.selected(0);
116 }
117 greeter.forceActiveFocus();
118 }
119 }
121 onShowProgressChanged: if (LightDM.Greeter.promptless && showProgress == 0) login()
123 onUnlocked: login()
124 onSelected: {
125 // Update launcher items for new user
126 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
127 AccountsService.user = user;
128 LauncherModel.setUser(user);
129 }
131 onLeftTeaserPressedChanged: {
132 if (leftTeaserPressed) {
133 launcher.tease();
134 }
135 }
136 }
138 InputFilterArea {
139 anchors.fill: parent
140 blockInput: true
141 }
143 Revealer {
144 id: greeterRevealer
145 objectName: "greeterRevealer"
147 property real animatedProgress: MathUtils.clamp(-dragPosition / closedValue, 0, 1)
148 target: greeter
149 width: greeter.width
150 height: greeter.height
151 handleSize: shell.edgeSize
152 orientation: Qt.Horizontal
153 enabled: !greeter.locked
154 }
156 Item {
157 id: overlay
159 anchors.fill: parent
161 Panel {
162 id: panel
163 anchors.fill: parent //because this draws indicator menus
164 indicatorsMenuWidth: parent.width > units.gu(60) ? units.gu(40) : parent.width
165 indicators {
166 hides: [launcher]
167 available: !edgeDemo.active
168 }
169 fullscreenMode: false
170 searchVisible: false
171 }
173 Launcher {
174 id: launcher
176 anchors.top: parent.top
177 anchors.bottom: parent.bottom
178 width: parent.width
179 dragAreaWidth: shell.edgeSize
180 available: greeter.narrowMode && !edgeDemo.active
181 onLauncherApplicationSelected: {
182 shell.activateApplication(appId)
183 }
184 onShownChanged: {
185 if (shown) {
186 panel.indicators.hide()
187 }
188 }
189 onDashItemSelected: greeter.show()
190 }
191 }
193 Connections {
194 id: powerConnection
195 target: Powerd
197 onDisplayPowerStateChange: {
198 if (status == Powerd.Off) {
199 greeter.show();
200 edgeDemo.paused = true;
201 } else if (status == Powerd.On) {
202 edgeDemo.paused = false;
203 }
204 }
205 }
207/*
208 Connections {
209 target: applicationManager
210 ignoreUnknownSignals: true
211 // If any app is focused when greeter is open, it's due to a user action
212 // like a snap decision (say, an incoming call).
213 // TODO: these should be protected to only unlock for certain applications / certain usecases
214 // potentially only in connection with a notification.
215 // TODO: what about the app the shell will restore focus to by itself?
216 onMainStageFocusedApplicationChanged: greeter.hide()
217 onSideStageFocusedApplicationChanged: greeter.hide()
218 }
219*/
221 GreeterEdgeDemo {
222 id: edgeDemo
223 greeter: greeter
224 }