@@ -19,6 +19,7 @@ import AccountsService 0.1
1919import GSettings 1.0
2020import Unity.Application 0.1
2121import Ubuntu.Components 0.1
22+import Ubuntu.Components.Popups 0.1
2223import Ubuntu.Gestures 0.1
2324import Unity.Launcher 0.1
2425import LightDM 0.1 as LightDM
@@ -268,7 +269,128 @@ FocusScope {
268269 }
269270 }
270271
272+ property bool dialogShown: false
273+
274+ Component {
275+ id: logoutDialog
276+ Dialog {
277+ id: dialogueLogout
278+ title: "Logout"
279+ text: "Are you sure that you want to logout?"
280+ Button {
281+ text: "Cancel"
282+ onClicked: {
283+ PopupUtils.close(dialogueLogout);
284+ stages.dialogShown = false;
285+ }
286+ }
287+ Button {
288+ text: "Yes"
289+ onClicked: {
290+ DBusUnitySessionService.Logout();
291+ PopupUtils.close(dialogueLogout);
292+ stages.dialogShown = false;
293+ }
294+ }
295+ }
296+ }
297+
298+ Component {
299+ id: shutdownDialog
300+ Dialog {
301+ id: dialogueShutdown
302+ title: "Shutdown"
303+ text: "Are you sure that you want to shutdown?"
304+ Button {
305+ text: "Cancel"
306+ onClicked: {
307+ PopupUtils.close(dialogueShutdown);
308+ stages.dialogShown = false;
309+ }
310+ }
311+ Button {
312+ text: "Yes"
313+ onClicked: {
314+ dBusUnitySessionServiceConnection.closeAllApps();
315+ DBusUnitySessionService.Shutdown();
316+ PopupUtils.close(dialogueShutdown);
317+ stages.dialogShown = false;
318+ }
319+ }
320+ }
321+ }
322+
323+ Component {
324+ id: rebootDialog
325+ Dialog {
326+ id: dialogueReboot
327+ title: "Reboot"
328+ text: "Are you sure that you want to reboot?"
329+ Button {
330+ text: "Cancel"
331+ onClicked: {
332+ PopupUtils.close(dialogueReboot)
333+ stages.dialogShown = false;
334+ }
335+ }
336+ Button {
337+ text: "Yes"
338+ onClicked: {
339+ dBusUnitySessionServiceConnection.closeAllApps();
340+ DBusUnitySessionService.Reboot();
341+ PopupUtils.close(dialogueReboot);
342+ stages.dialogShown = false;
343+ }
344+ }
345+ }
346+ }
347+
348+ Component {
349+ id: powerDialog
350+ Dialog {
351+ id: dialoguePower
352+ title: "Power"
353+ text: i18n.tr("Are you sure you would like to turn power off?")
354+ Button {
355+ text: i18n.tr("Power off")
356+ onClicked: {
357+ dBusUnitySessionServiceConnection.closeAllApps();
358+ PopupUtils.close(dialoguePower);
359+ stages.dialogShown = false;
360+ shutdownFadeOutRectangle.enabled = true;
361+ shutdownFadeOutRectangle.visible = true;
362+ shutdownFadeOut.start();
363+ }
364+ }
365+ Button {
366+ text: i18n.tr("Restart")
367+ onClicked: {
368+ dBusUnitySessionServiceConnection.closeAllApps();
369+ DBusUnitySessionService.Reboot();
370+ PopupUtils.close(dialoguePower);
371+ stages.dialogShown = false;
372+ }
373+ }
374+ Button {
375+ text: i18n.tr("Cancel")
376+ onClicked: {
377+ PopupUtils.close(dialoguePower);
378+ stages.dialogShown = false;
379+ }
380+ }
381+ }
382+ }
383+
384+ function showPowerDialog() {
385+ if (!stages.dialogShown) {
386+ stages.dialogShown = true;
387+ PopupUtils.open(powerDialog);
388+ }
389+ }
390+
271391 Connections {
392+ id: dBusUnitySessionServiceConnection
393+ objectName: "dBusUnitySessionServiceConnection"
272394 target: DBusUnitySessionService
273395
274396 function closeAllApps() {
@@ -282,8 +404,27 @@ FocusScope {
282404 }
283405
284406 onLogoutRequested: {
285− // TODO: Display a dialog to ask the user to confirm.
286− DBusUnitySessionService.Logout();
407+ // Display a dialog to ask the user to confirm.
408+ if (!stages.dialogShown) {
409+ stages.dialogShown = true;
410+ PopupUtils.open(logoutDialog);
411+ }
412+ }
413+
414+ onShutdownRequested: {
415+ // Display a dialog to ask the user to confirm.
416+ if (!stages.dialogShown) {
417+ stages.dialogShown = true;
418+ PopupUtils.open(shutdownDialog);
419+ }
420+ }
421+
422+ onRebootRequested: {
423+ // Display a dialog to ask the user to confirm.
424+ if (!stages.dialogShown) {
425+ stages.dialogShown = true;
426+ PopupUtils.open(rebootDialog);
427+ }
287428 }
288429
289430 onLogoutReady: {
@@ -690,4 +831,50 @@ FocusScope {
690831 target: SessionBroadcast
691832 onShowHome: showHome()
692833 }
834+
835+ Keys.onPressed: {
836+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
837+ if (!powerKeyTimer.running) {
838+ powerKeyTimer.start();
839+ }
840+ event.accepted = true;
841+ }
842+ }
843+
844+ Keys.onReleased: {
845+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
846+ powerKeyTimer.stop();
847+ event.accepted = true;
848+ }
849+ }
850+
851+ Timer {
852+ id: powerKeyTimer
853+ interval: 2000
854+ repeat: false
855+ triggeredOnStart: false
856+
857+ onTriggered: {
858+ stages.showPowerDialog();
859+ }
860+ }
861+
862+ Rectangle {
863+ id: shutdownFadeOutRectangle
864+ enabled: false
865+ visible: false
866+ color: "black"
867+ anchors.fill: parent
868+ opacity: 0.0
869+ NumberAnimation on opacity {
870+ id: shutdownFadeOut
871+ from: 0.0
872+ to: 1.0
873+ onStopped: {
874+ if (shutdownFadeOutRectangle.enabled && shutdownFadeOutRectangle.visible) {
875+ DBusUnitySessionService.Shutdown();
876+ }
877+ }
878+ }
879+ }
693880}