Unity 8
Dialogs.qml
1 /*
2  * Copyright (C) 2014-2016 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  */
16 
17 import QtQuick 2.4
18 
19 import Unity.Application 0.1
20 import Unity.Session 0.1
21 import GlobalShortcut 1.0
22 import Ubuntu.Components 1.3
23 import Unity.Platform 1.0
24 import Utils 0.1
25 import "../Greeter"
26 
27 Item {
28  id: root
29 
30  readonly property alias hasActiveDialog: dialogLoader.active
31 
32  // to be set from outside, useful mostly for testing purposes
33  property var unitySessionService: DBusUnitySessionService
34  property var closeAllApps: function() {
35  while (true) {
36  var app = ApplicationManager.get(0);
37  if (app === null) {
38  break;
39  }
40  ApplicationManager.stopApplication(app.appId);
41  }
42  }
43  property string usageScenario
44 
45  signal powerOffClicked();
46 
47  function showPowerDialog() {
48  d.showPowerDialog();
49  }
50 
51  onUsageScenarioChanged: {
52  if (usageScenario != "desktop" && legacyAppsModel.count > 0 && !d.modeSwitchWarningPopup) {
53  var comp = Qt.createComponent(Qt.resolvedUrl("ModeSwitchWarningDialog.qml"))
54  d.modeSwitchWarningPopup = comp.createObject(root, {model: legacyAppsModel});
55  d.modeSwitchWarningPopup.forceClose.connect(function() {
56  for (var i = legacyAppsModel.count - 1; i >= 0; i--) {
57  ApplicationManager.stopApplication(legacyAppsModel.get(i).appId);
58  }
59  d.modeSwitchWarningPopup.hide();
60  d.modeSwitchWarningPopup.destroy();
61  d.modeSwitchWarningPopup = null;
62  })
63  } else if (usageScenario == "desktop" && d.modeSwitchWarningPopup) {
64  d.modeSwitchWarningPopup.hide();
65  d.modeSwitchWarningPopup.destroy();
66  d.modeSwitchWarningPopup = null;
67  }
68  }
69 
70  ApplicationsFilterModel {
71  id: legacyAppsModel
72  applicationsModel: ApplicationManager
73  filterTouchApps: true
74  }
75 
76  GlobalShortcut { // reboot/shutdown dialog
77  shortcut: Qt.Key_PowerDown
78  active: Platform.isPC
79  onTriggered: root.unitySessionService.RequestShutdown()
80  }
81 
82  GlobalShortcut { // reboot/shutdown dialog
83  shortcut: Qt.Key_PowerOff
84  active: Platform.isPC
85  onTriggered: root.unitySessionService.RequestShutdown()
86  }
87 
88  GlobalShortcut { // sleep
89  shortcut: Qt.Key_Sleep
90  onTriggered: root.unitySessionService.Suspend()
91  }
92 
93  GlobalShortcut { // hibernate
94  shortcut: Qt.Key_Hibernate
95  onTriggered: root.unitySessionService.Hibernate()
96  }
97 
98  GlobalShortcut { // logout/lock dialog
99  shortcut: Qt.Key_LogOff
100  onTriggered: root.unitySessionService.RequestLogout()
101  }
102 
103  GlobalShortcut { // logout/lock dialog
104  shortcut: Qt.ControlModifier|Qt.AltModifier|Qt.Key_Delete
105  onTriggered: root.unitySessionService.RequestLogout()
106  }
107 
108  GlobalShortcut { // lock screen
109  shortcut: Qt.Key_ScreenSaver
110  onTriggered: LightDMService.greeter.showGreeter()
111  }
112 
113  GlobalShortcut { // lock screen
114  shortcut: Qt.ControlModifier|Qt.AltModifier|Qt.Key_L
115  onTriggered: LightDMService.greeter.showGreeter()
116  }
117 
118  QtObject {
119  id: d // private stuff
120  objectName: "dialogsPrivate"
121 
122  property var modeSwitchWarningPopup: null
123 
124  function showPowerDialog() {
125  if (!dialogLoader.active) {
126  dialogLoader.sourceComponent = powerDialogComponent;
127  dialogLoader.focus = true;
128  dialogLoader.active = true;
129  }
130  }
131  }
132 
133  Loader {
134  id: dialogLoader
135  objectName: "dialogLoader"
136  anchors.fill: parent
137  active: false
138  }
139 
140  Component {
141  id: logoutDialogComponent
142  ShellDialog {
143  id: logoutDialog
144  title: i18n.ctr("Title: Lock/Log out dialog", "Log out")
145  text: i18n.tr("Are you sure you want to log out?")
146  Button {
147  text: i18n.ctr("Button: Lock the system", "Lock")
148  onClicked: {
149  LightDMService.greeter.showGreeter()
150  logoutDialog.hide();
151  }
152  }
153  Button {
154  text: i18n.ctr("Button: Log out from the system", "Log Out")
155  onClicked: {
156  unitySessionService.logout();
157  logoutDialog.hide();
158  }
159  }
160  Button {
161  text: i18n.tr("Cancel")
162  onClicked: {
163  logoutDialog.hide();
164  }
165  }
166  }
167  }
168 
169  Component {
170  id: rebootDialogComponent
171  ShellDialog {
172  id: rebootDialog
173  title: i18n.ctr("Title: Reboot dialog", "Reboot")
174  text: i18n.tr("Are you sure you want to reboot?")
175  Button {
176  text: i18n.tr("No")
177  onClicked: {
178  rebootDialog.hide();
179  }
180  }
181  Button {
182  text: i18n.tr("Yes")
183  onClicked: {
184  root.closeAllApps();
185  unitySessionService.reboot();
186  rebootDialog.hide();
187  }
188  color: theme.palette.normal.negative
189  }
190  }
191  }
192 
193  Component {
194  id: powerDialogComponent
195  ShellDialog {
196  id: powerDialog
197  title: i18n.ctr("Title: Power off/Restart dialog", "Power")
198  text: i18n.tr("Are you sure you would like\nto power off?")
199  Button {
200  text: i18n.ctr("Button: Power off the system", "Power off")
201  onClicked: {
202  root.closeAllApps();
203  powerDialog.hide();
204  root.powerOffClicked();
205  }
206  color: theme.palette.normal.negative
207  }
208  Button {
209  text: i18n.ctr("Button: Restart the system", "Restart")
210  onClicked: {
211  root.closeAllApps();
212  unitySessionService.reboot();
213  powerDialog.hide();
214  }
215  }
216  Button {
217  text: i18n.tr("Cancel")
218  onClicked: {
219  powerDialog.hide();
220  }
221  }
222  }
223  }
224 
225  Connections {
226  target: root.unitySessionService
227 
228  onLogoutRequested: {
229  // Display a dialog to ask the user to confirm.
230  if (!dialogLoader.active) {
231  dialogLoader.sourceComponent = logoutDialogComponent;
232  dialogLoader.focus = true;
233  dialogLoader.active = true;
234  }
235  }
236 
237  onShutdownRequested: {
238  // Display a dialog to ask the user to confirm.
239  showPowerDialog();
240  }
241 
242  onRebootRequested: {
243  // Display a dialog to ask the user to confirm.
244 
245  // display a combined reboot/shutdown dialog, sadly the session indicator calls rather the "Reboot()" method
246  // than shutdown when clicking on the "Shutdown..." menu item
247  // FIXME: when/if session indicator is fixed, put the rebootDialogComponent here
248  showPowerDialog();
249  }
250 
251  onLogoutReady: {
252  root.closeAllApps();
253  Qt.quit();
254  unitySessionService.endSession();
255  }
256  }
257 }