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
33import Unity.Notifications 1.0 as NotificationBackend
34import Unity.Session 0.1
39 // this is only here to select the width / height of the window if not running fullscreen
40 property bool tablet: false
41 width: tablet ? units.gu(160) : applicationArguments.hasGeometry() ? applicationArguments.width() : units.gu(40)
42 height: tablet ? units.gu(100) : applicationArguments.hasGeometry() ? applicationArguments.height() : units.gu(71)
44 property real edgeSize: units.gu(2)
45 property url defaultBackground: Qt.resolvedUrl(shell.width >= units.gu(60) ? "graphics/tablet_background.jpg" : "graphics/phone_background.jpg")
46 property url background
47 readonly property real panelHeight: panel.panelHeight
49 property bool dashShown: dash.shown
51 property bool sideStageEnabled: shell.width >= units.gu(100)
52 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
54 function activateApplication(appId) {
55 if (ApplicationManager.findApplication(appId)) {
56 ApplicationManager.requestFocusApplication(appId);
58 if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
59 applicationsDisplayLoader.item.select(appId);
62 var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
63 ApplicationManager.startApplication(appId, execFlags);
70 property: "applicationManager"
71 value: ApplicationManager
74 Component.onCompleted: {
75 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
79 id: backgroundSettings
80 schema.id: "org.gnome.desktop.background"
82 property url gSettingsPicture: backgroundSettings.pictureUri != undefined && backgroundSettings.pictureUri.length > 0 ? backgroundSettings.pictureUri : shell.defaultBackground
83 onGSettingsPictureChanged: {
84 shell.background = gSettingsPicture
91 Keys.onVolumeUpPressed: volumeControl.volumeUp()
92 Keys.onVolumeDownPressed: volumeControl.volumeDown()
97 anchors.rightMargin: stages.overlayWidth
98 clip: stages.overlayMode && !stages.painting
102 blockInput: parent.clip
107 objectName: "underlay"
109 anchors.rightMargin: -parent.anchors.rightMargin
111 // Whether the underlay is fully covered by opaque UI elements.
112 property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicators.width
114 // Whether the user should see the topmost application surface (if there's one at all).
115 readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
117 // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
118 // through the translucent parts of the shell surface.
119 visible: !fullyCovered && !applicationSurfaceShouldBeSeen
124 opacity: dash.disappearingAnimationProgress
129 source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
130 fillMode: Image.PreserveAspectCrop
131 horizontalAlignment: Image.AlignRight
132 verticalAlignment: Image.AlignTop
139 available: !greeter.shown && !lockscreen.shown
140 hides: [stages, launcher, panel.indicators]
141 shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
142 enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
146 topMargin: panel.panelHeight
149 contentScale: 1.0 - 0.2 * disappearingAnimationProgress
150 opacity: 1.0 - disappearingAnimationProgress
151 property real disappearingAnimationProgress: {
152 if (stages.overlayMode) {
155 return stages.showProgress
159 // FIXME: only necessary because stages.showProgress is not animated
160 Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
167 direction: Direction.Leftwards
169 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
170 width: shell.edgeSize
172 property real progress: stages.width
175 if (status == DirectionalDragArea.Recognized) {
176 if (ApplicationManager.count == 0) {
177 progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
179 progress = stages.width - stagesDragHandle.width + touchX
186 if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
189 stagesDragHandle.progress = stages.width;
198 height: parent.height
202 if (overlayMode || locked) {
205 return launcher.progress
207 return stagesDragHandle.progress
211 Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
213 property bool shown: false
215 property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
217 property bool fullyShown: x == 0
218 property bool fullyHidden: x == width
220 property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
221 property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
222 property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
223 property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
224 property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
226 function show(focusApp) {
228 panel.indicators.hide();
231 if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
232 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
238 if (ApplicationManager.focusedApplicationId) {
239 ApplicationManager.unfocusCurrentApplication();
244 target: ApplicationManager
250 onFocusedApplicationIdChanged: {
251 if (ApplicationManager.focusedApplicationId.length > 0) {
254 if (!stages.overlayMode) {
260 onApplicationAdded: {
264 onApplicationRemoved: {
265 if (ApplicationManager.focusedApplicationId.length == 0) {
272 target: DBusUnitySessionService
274 function closeAllApps() {
276 var app = ApplicationManager.get(0);
280 ApplicationManager.stopApplication(app.appId);
285 // TODO: Display a dialog to ask the user to confirm.
286 DBusUnitySessionService.Logout();
296 id: applicationsDisplayLoader
299 source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
302 target: applicationsDisplayLoader.item
304 value: !stages.fullyShown
307 target: applicationsDisplayLoader.item
312 target: applicationsDisplayLoader.item
313 property: "dragAreaWidth"
314 value: shell.edgeSize
321 objectName: "lockscreen"
323 readonly property int backgroundTopMargin: -panel.panelHeight
325 hides: [launcher, panel.indicators]
328 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
329 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
334 bottom: parent.bottom
335 topMargin: panel.panelHeight
337 background: shell.background
341 onEntered: LightDM.Greeter.respond(passphrase);
342 onCancel: greeter.show()
344 Component.onCompleted: {
345 if (LightDM.Users.count == 1) {
346 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
352 target: LightDM.Greeter
355 if (LightDM.Users.count == 1) {
356 // TODO: There's no better way for now to determine if its a PIN or a passphrase.
358 lockscreen.alphaNumeric = false
360 lockscreen.alphaNumeric = true
362 lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text);
367 onAuthenticationComplete: {
368 if (LightDM.Greeter.promptless) {
371 if (LightDM.Greeter.authenticated) {
374 lockscreen.clear(true);
382 opacity: greeterWrapper.showProgress * 0.8
386 // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
391 height: parent.height - panel.panelHeight
394 enabled: !launcher.dashSwipe
398 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
402 objectName: "greeter"
405 hides: [launcher, panel.indicators]
408 defaultBackground: shell.background
411 height: parent.height
413 dragHandleWidth: shell.edgeSize
418 // If there is only one user, we start authenticating with that one here.
419 // If there are more users, the Greeter will handle that
420 if (LightDM.Users.count == 1) {
421 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
423 greeter.forceActiveFocus();
427 onUnlocked: greeter.hide()
429 // Update launcher items for new user
430 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
431 AccountsService.user = user;
432 LauncherModel.setUser(user);
435 onTease: launcher.tease()
438 target: ApplicationManager
439 property: "suspended"
440 value: greeter.shown && greeterWrapper.showProgress == 1
447 blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
448 || panel.indicators.shown
455 onDisplayPowerStateChange: {
456 // We ignore any display-off signals when the proximity sensor
457 // is active. This usually indicates something like a phone call.
458 if (status == Powerd.Off && reason != Powerd.Proximity) {
462 // No reason to chew demo CPU when user isn't watching
463 if (status == Powerd.Off) {
464 edgeDemo.paused = true;
465 } else if (status == Powerd.On) {
466 edgeDemo.paused = false;
471 function showHome() {
472 var animate = !greeter.shown && !stages.shown
474 dash.setCurrentScope("clickscope", animate, false)
478 function hideIndicatorMenu(delay) {
479 panel.hideIndicatorMenu(delay);
489 anchors.fill: parent //because this draws indicator menus
492 available: edgeDemo.panelEnabled
493 contentEnabled: edgeDemo.panelContentEnabled
494 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
495 panelHeight: units.gu(3)
497 property string focusedAppId: ApplicationManager.focusedApplicationId
498 property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
499 fullscreenMode: focusedApplication && stages.fullscreen && !greeter.shown && !lockscreen.shown
500 searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable
508 height: (panel.fullscreenMode) ? shell.edgeSize : panel.panelHeight
514 blockInput: launcher.shown
517 bottom: parent.bottom
520 width: launcher.width
526 readonly property bool dashSwipe: progress > 0
528 anchors.top: parent.top
529 anchors.bottom: parent.bottom
531 dragAreaWidth: shell.edgeSize
532 available: edgeDemo.launcherEnabled
535 if (edgeDemo.running)
541 if (stages.shown && !stages.overlayMode) {
542 if (!stages.locked) {
552 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
553 onLauncherApplicationSelected: {
554 if (!edgeDemo.running)
555 shell.activateApplication(appId)
559 panel.indicators.hide()
565 id: modalNotificationBackground
567 visible: notifications.useModal && !greeter.shown && (notifications.state == "narrow")
578 blockInput: modalNotificationBackground.visible
585 model: NotificationBackend.Model
590 height: parent.height - panel.panelHeight
595 when: overlay.width <= units.gu(60)
596 AnchorChanges { target: notifications; anchors.left: parent.left }
600 when: overlay.width > units.gu(60)
601 AnchorChanges { target: notifications; anchors.left: undefined }
602 PropertyChanges { target: notifications; width: units.gu(38) }
607 anchors { left: parent.left; right: parent.right }
608 height: parent.contentHeight
609 blockInput: height > 0
615 onFocusChanged: if (!focus) forceActiveFocus();
620 bottom: parent.bottom
623 width: shell.edgeSize
630 bottom: parent.bottom
633 width: shell.edgeSize
644 anchors.topMargin: panel.panelHeight
645 anchors.fill: parent // as needs to know the geometry of the shell
648 //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
650 anchors.bottom: parent.bottom
651 anchors.left: parent.left
652 anchors.right: parent.right
653 height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
655 enabled: ApplicationManager.keyboardVisible
659 anchors.centerIn: parent
660 visible: ApplicationManager.fake ? ApplicationManager.fake : false
661 text: "EARLY ALPHA\nNOT READY FOR USE"
664 font.weight: Font.Black
665 horizontalAlignment: Text.AlignHCenter
666 verticalAlignment: Text.AlignVCenter
667 fontSizeMode: Text.Fit
669 scale: Math.min(parent.width, parent.height) / width
677 indicators: panel.indicators
682 target: SessionBroadcast
683 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