2 * Copyright (C) 2013 Canonical, Ltd.
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.
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.
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/>.
18import AccountsService 0.1
20import Unity.Application 0.1
21import Ubuntu.Components 0.1
22import Ubuntu.Gestures 0.1
23import Unity.Launcher 0.1
24import LightDM 0.1 as LightDM
26import SessionBroadcast 0.1
34import Unity.Notifications 1.0 as NotificationBackend
35import Unity.Session 0.1
40 // this is only here to select the width / height of the window if not running fullscreen
41 property bool tablet: false
42 width: tablet ? units.gu(160) : applicationArguments.hasGeometry() ? applicationArguments.width() : units.gu(40)
43 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
45 property real edgeSize: units.gu(2)
46 property url defaultBackground: Qt.resolvedUrl(shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg")
47 property url background
48 readonly property real panelHeight: panel.panelHeight
50 property bool dashShown: dash.shown && dash.available && underlay.visible
52 property bool sideStageEnabled: shell.width >= units.gu(100)
53 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
55 function activateApplication(appId) {
56 if (ApplicationManager.findApplication(appId)) {
57 ApplicationManager.requestFocusApplication(appId);
59 var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
60 ApplicationManager.startApplication(appId, execFlags);
67 property: "applicationManager"
68 value: ApplicationManager
71 Component.onCompleted: {
72 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
76 id: backgroundSettings
77 schema.id: "org.gnome.desktop.background"
79 property url gSettingsPicture: backgroundSettings.pictureUri != undefined && backgroundSettings.pictureUri.length > 0 ? backgroundSettings.pictureUri : shell.defaultBackground
80 onGSettingsPictureChanged: {
81 shell.background = gSettingsPicture
88 Keys.onVolumeUpPressed: volumeControl.volumeUp()
89 Keys.onVolumeDownPressed: volumeControl.volumeDown()
93 objectName: "underlay"
96 // Whether the underlay is fully covered by opaque UI elements.
97 property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
99 // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
100 // through the translucent parts of the shell surface.
101 visible: !fullyCovered
106 opacity: dash.disappearingAnimationProgress
111 source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
112 fillMode: Image.PreserveAspectCrop
113 horizontalAlignment: Image.AlignRight
114 verticalAlignment: Image.AlignTop
121 available: !greeter.shown && !lockscreen.shown
122 hides: [stages, launcher, panel.indicators]
123 shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
124 enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
128 topMargin: panel.panelHeight
131 contentScale: 1.0 - 0.2 * disappearingAnimationProgress
132 opacity: 1.0 - disappearingAnimationProgress
133 property real disappearingAnimationProgress: stages.showProgress
135 // FIXME: only necessary because stages.showProgress is not animated
136 Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
142 direction: Direction.Leftwards
144 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
145 width: shell.edgeSize
147 property real progress: stages.width
150 if (status == DirectionalDragArea.Recognized) {
151 if (ApplicationManager.empty) {
152 progress = Math.max(stages.width - stagesDragArea.width + touchX, stages.width * .3);
154 progress = stages.width - stagesDragArea.width + touchX;
161 if (!ApplicationManager.empty && progress < stages.width - units.gu(10)) {
164 stagesDragArea.progress = Qt.binding(function () { return stages.width; });
173 height: parent.height
175 visible: !fullyHidden && !ApplicationManager.empty
177 x: shown ? launcher.progress : stagesDragArea.progress
178 Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
180 property bool shown: false
183 if (ApplicationManager.topmostApplication) {
184 ApplicationManager.focusApplication(ApplicationManager.topmostApplication.appId);
187 if (ApplicationManager.focusedApplicationId) {
188 ApplicationManager.updateScreenshot(ApplicationManager.focusedApplicationId);
189 ApplicationManager.unfocusCurrentApplication();
194 // Avoid a silent "divide by zero -> NaN" situation during init as shell.width will be
195 // zero. That breaks the property binding and the function won't be reevaluated once
196 // shell.width is set, with the NaN result staying there for good.
197 property real showProgress: shell.width ? MathUtils.clamp(1 - x / shell.width, 0, 1) : 0
199 property bool fullyShown: x == 0
200 property bool fullyHidden: x == width
202 // It might technically not be fullyShown but visually it just looks so.
203 property bool roughlyFullyShown: x >= 0 && x <= units.gu(1)
214 target: ApplicationManager
222 onApplicationAdded: {
232 if (ApplicationManager.empty) {
239 target: DBusUnitySessionService
241 function closeAllApps() {
243 var app = ApplicationManager.get(0);
247 ApplicationManager.stopApplication(app.appId);
252 // TODO: Display a dialog to ask the user to confirm.
253 DBusUnitySessionService.Logout();
263 id: applicationsDisplayLoader
266 source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
269 target: applicationsDisplayLoader.item
270 property: "dragAreaWidth"
271 value: shell.edgeSize
274 target: applicationsDisplayLoader.item
275 property: "maximizedAppTopMargin"
276 // Not just using panel.panelHeight as that changes depending on the focused app.
277 value: panel.indicators.panelHeight
280 target: applicationsDisplayLoader.item
281 property: "interactive"
282 value: stages.roughlyFullyShown
290 z: notifications.useModal || panel.indicators.shown ? overlay.z + 1 : overlay.z - 1
294 target: SurfaceManager
296 if (surface.type == MirSurfaceItem.InputMethod) {
297 inputMethod.surface = surface;
301 onSurfaceDestroyed: {
302 if (inputMethod.surface == surface) {
303 inputMethod.surface = null;
304 surface.parent = null;
306 if (!surface.parent) {
307 // there's no one displaying it. delete it right away
315 objectName: "lockscreen"
317 readonly property int backgroundTopMargin: -panel.panelHeight
319 hides: [launcher, panel.indicators]
322 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
323 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
325 x: required ? 0 : - width
327 height: parent.height - panel.panelHeight
328 //background: shell.background // FIXME: Commenting out as Qt was complaining about this line
332 onEntered: LightDM.Greeter.respond(passphrase);
333 onCancel: greeter.show()
335 Component.onCompleted: {
336 if (LightDM.Users.count == 1) {
337 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
343 target: LightDM.Greeter
346 if (LightDM.Users.count == 1) {
347 // TODO: There's no better way for now to determine if its a PIN or a passphrase.
349 lockscreen.alphaNumeric = false
351 lockscreen.alphaNumeric = true
353 lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text);
358 onAuthenticationComplete: {
359 if (LightDM.Greeter.promptless) {
362 if (LightDM.Greeter.authenticated) {
365 lockscreen.clear(true);
373 opacity: greeterWrapper.showProgress * 0.8
377 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
382 height: parent.height - panel.panelHeight
385 enabled: !launcher.dashSwipe
389 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
393 objectName: "greeter"
396 hides: [launcher, panel.indicators]
399 defaultBackground: shell.background
402 height: parent.height
404 dragHandleWidth: shell.edgeSize
409 // If there is only one user, we start authenticating with that one here.
410 // If there are more users, the Greeter will handle that
411 if (LightDM.Users.count == 1) {
412 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
414 greeter.forceActiveFocus();
418 onUnlocked: greeter.hide()
420 // Update launcher items for new user
421 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
422 AccountsService.user = user;
423 LauncherModel.setUser(user);
426 onTease: launcher.tease()
429 target: ApplicationManager
430 property: "suspended"
431 value: greeter.shown && greeterWrapper.showProgress == 1
440 onDisplayPowerStateChange: {
441 // We ignore any display-off signals when the proximity sensor
442 // is active. This usually indicates something like a phone call.
443 if (status == Powerd.Off && reason != Powerd.Proximity) {
447 // No reason to chew demo CPU when user isn't watching
448 if (status == Powerd.Off) {
449 edgeDemo.paused = true;
450 } else if (status == Powerd.On) {
451 edgeDemo.paused = false;
456 function showHome() {
457 var animate = !greeter.shown && !stages.shown
459 dash.setCurrentScope("clickscope", animate, false)
463 function hideIndicatorMenu(delay) {
464 panel.hideIndicatorMenu(delay);
475 anchors.fill: parent //because this draws indicator menus
478 available: edgeDemo.panelEnabled
479 contentEnabled: edgeDemo.panelContentEnabled
480 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
481 panelHeight: units.gu(3)
484 property bool topmostApplicationIsFullscreen:
485 ApplicationManager.topmostApplication &&
486 ApplicationManager.topmostApplication.fullscreen
488 fullscreenMode: stages.roughlyFullyShown && topmostApplicationIsFullscreen
489 && !greeter.shown && !lockscreen.shown
495 readonly property bool dashSwipe: progress > 0
497 anchors.top: parent.top
498 anchors.bottom: parent.bottom
500 dragAreaWidth: shell.edgeSize
501 available: edgeDemo.launcherEnabled
504 if (edgeDemo.running)
510 if (!stages.locked) {
514 launcher.switchToNextState("visible");
522 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
523 onLauncherApplicationSelected: {
524 if (!edgeDemo.running)
525 shell.activateApplication(appId)
529 panel.indicators.hide()
535 id: modalNotificationBackground
537 visible: notifications.useModal && !greeter.shown && (notifications.state == "narrow")
550 model: NotificationBackend.Model
555 height: parent.height - panel.panelHeight
560 when: overlay.width <= units.gu(60)
561 AnchorChanges { target: notifications; anchors.left: parent.left }
565 when: overlay.width > units.gu(60)
566 AnchorChanges { target: notifications; anchors.left: undefined }
567 PropertyChanges { target: notifications; width: units.gu(38) }
574 onFocusChanged: if (!focus) forceActiveFocus();
583 id: alphaDisclaimerLabel
584 anchors.centerIn: parent
585 visible: ApplicationManager.fake ? ApplicationManager.fake : false
587 text: "EARLY ALPHA\nNOT READY FOR USE"
590 font.weight: Font.Black
591 horizontalAlignment: Text.AlignHCenter
592 verticalAlignment: Text.AlignVCenter
593 fontSizeMode: Text.Fit
595 scale: Math.min(parent.width, parent.height) / width
600 z: alphaDisclaimerLabel.z + 10
604 indicators: panel.indicators
609 target: SessionBroadcast
610 onShowHome: showHome()
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list