@@ -19,7 +19,8 @@
20import QtQuick 2.0
20import QtQuick 2.0
21import Ubuntu.Settings.Menus 0.1 as Menus
21import Ubuntu.Settings.Menus 0.1 as Menus
22+import Ubuntu.Settings.Components 0.1 as SettingsComponents
22−import QMenuModel 0.1 as QMenuModel
23+import QMenuModel 0.1
23import Utils 0.1 as Utils
24import Utils 0.1 as Utils
24import Ubuntu.Components.ListItems 0.1 as ListItems
25import Ubuntu.Components.ListItems 0.1 as ListItems
25import Ubuntu.Components 0.1
26import Ubuntu.Components 0.1
@@ -27,20 +28,23 @@ import Ubuntu.Components 0.1
28 id: menuFactory
29 id: menuFactory
31+ property var rootModel: null
30 property var menuModel: null
32 property var menuModel: null
32 property var _map: {
34 property var _map: {
33 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
35 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
34 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
36 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
36− "com.canonical.indicator.button" : buttonMenu,
38+ "com.canonical.indicator.button" : buttonMenu,
37− "com.canonical.indicator.div" : separatorMenu,
39+ "com.canonical.indicator.div" : separatorMenu,
38− "com.canonical.indicator.section" : sectionMenu,
40+ "com.canonical.indicator.section" : sectionMenu,
39− "com.canonical.indicator.progress" : progressMenu,
41+ "com.canonical.indicator.progress" : progressMenu,
40− "com.canonical.indicator.slider" : sliderMenu,
42+ "com.canonical.indicator.slider" : sliderMenu,
41− "com.canonical.indicator.switch" : switchMenu,
43+ "com.canonical.indicator.switch" : switchMenu,
42− "com.canonical.indicator.alarm" : alarmMenu,
44+ "com.canonical.indicator.alarm" : alarmMenu,
43− "com.canonical.indicator.appointment" : appointmentMenu,
45+ "com.canonical.indicator.appointment" : appointmentMenu,
46+ "com.canonical.indicator.transfer" : transferMenu,
47+ "com.canonical.indicator.button-section" : buttonSectionMenu,
45 "com.canonical.indicator.messages.messageitem" : messageItem,
49 "com.canonical.indicator.messages.messageitem" : messageItem,
46 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
50 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
@@ -64,6 +68,7 @@ Item {
65 Component {
69 Component {
66 id: separatorMenu;
70 id: separatorMenu;
67 Menus.SeparatorMenu {
72 Menus.SeparatorMenu {
68 objectName: "separatorMenu"
73 objectName: "separatorMenu"
@@ -71,6 +76,7 @@ Item {
72 Component {
77 Component {
73 id: sliderMenu;
78 id: sliderMenu;
74 Menus.SliderMenu {
80 Menus.SliderMenu {
75 objectName: "sliderMenu"
81 objectName: "sliderMenu"
76 property QtObject menuData: null
82 property QtObject menuData: null
@@ -122,6 +128,7 @@ Item {
123 Component {
129 Component {
124 id: buttonMenu;
130 id: buttonMenu;
125 Menus.ButtonMenu {
132 Menus.ButtonMenu {
126 objectName: "buttonMenu"
133 objectName: "buttonMenu"
127 property QtObject menuData: null
134 property QtObject menuData: null
@@ -139,6 +146,7 @@ Item {
140 Component {
147 Component {
141 id: sectionMenu;
148 id: sectionMenu;
142 Menus.SectionMenu {
150 Menus.SectionMenu {
143 objectName: "sectionMenu"
151 objectName: "sectionMenu"
144 property QtObject menuData: null
152 property QtObject menuData: null
@@ -151,6 +159,7 @@ Item {
152 Component {
160 Component {
153 id: progressMenu;
161 id: progressMenu;
154 Menus.ProgressValueMenu {
163 Menus.ProgressValueMenu {
155 objectName: "progressMenu"
164 objectName: "progressMenu"
156 property QtObject menuData: null
165 property QtObject menuData: null
@@ -165,6 +174,7 @@ Item {
166 Component {
175 Component {
167 id: standardMenu;
176 id: standardMenu;
168 Menus.StandardMenu {
178 Menus.StandardMenu {
169 objectName: "standardMenu"
179 objectName: "standardMenu"
170 property QtObject menuData: null
180 property QtObject menuData: null
@@ -183,6 +193,7 @@ Item {
184 Component {
194 Component {
185 id: checkableMenu;
195 id: checkableMenu;
186 Menus.CheckableMenu {
197 Menus.CheckableMenu {
187 objectName: "checkableMenu"
198 objectName: "checkableMenu"
188 property QtObject menuData: null
199 property QtObject menuData: null
@@ -202,6 +213,7 @@ Item {
203 Component {
214 Component {
204 id: switchMenu;
215 id: switchMenu;
205 Menus.SwitchMenu {
217 Menus.SwitchMenu {
206 objectName: "switchMenu"
218 objectName: "switchMenu"
207 property QtObject menuData: null
219 property QtObject menuData: null
@@ -221,6 +233,7 @@ Item {
222 Component {
234 Component {
223 id: alarmMenu;
235 id: alarmMenu;
224 Menus.EventMenu {
237 Menus.EventMenu {
225 objectName: "alarmMenu"
238 objectName: "alarmMenu"
226 property QtObject menuData: null
239 property QtObject menuData: null
@@ -258,6 +271,7 @@ Item {
259 Component {
272 Component {
260 id: appointmentMenu;
273 id: appointmentMenu;
261 Menus.EventMenu {
275 Menus.EventMenu {
262 objectName: "appointmentMenu"
276 objectName: "appointmentMenu"
263 property QtObject menuData: null
277 property QtObject menuData: null
@@ -297,6 +311,7 @@ Item {
298 Component {
312 Component {
299 id: wifiSection;
313 id: wifiSection;
300 Menus.SectionMenu {
315 Menus.SectionMenu {
301 objectName: "wifiSection"
316 objectName: "wifiSection"
302 property QtObject menuData: null
317 property QtObject menuData: null
@@ -323,6 +338,7 @@ Item {
324 Component {
339 Component {
325 id: accessPoint;
340 id: accessPoint;
326 Menus.AccessPointMenu {
342 Menus.AccessPointMenu {
327 objectName: "accessPoint"
343 objectName: "accessPoint"
328 property QtObject menuData: null
344 property QtObject menuData: null
@@ -330,7 +346,7 @@ Item {
330 property int menuIndex: -1
346 property int menuIndex: -1
331 property var extendedData: menuData && menuData.ext || undefined
347 property var extendedData: menuData && menuData.ext || undefined
333− property var strengthAction: QMenuModel.UnityMenuAction {
349+ property var strengthAction: UnityMenuAction {
334 model: menuModel
350 model: menuModel
335 index: menuIndex
351 index: menuIndex
336 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
352 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
@@ -365,6 +381,7 @@ Item {
366 Component {
382 Component {
367 id: messageItem
383 id: messageItem
368 MessageMenuItemFactory {
385 MessageMenuItemFactory {
369 objectName: "messageItem"
386 objectName: "messageItem"
370 menuModel: menuFactory.menuModel
387 menuModel: menuFactory.menuModel
@@ -373,6 +390,7 @@ Item {
374 Component {
391 Component {
375 id: groupedMessage
392 id: groupedMessage
376 Menus.GroupedMessageMenu {
394 Menus.GroupedMessageMenu {
377 objectName: "groupedMessage"
395 objectName: "groupedMessage"
378 property QtObject menuData: null
396 property QtObject menuData: null
@@ -409,6 +427,7 @@ Item {
410 Component {
428 Component {
411 id: mediaPayerMenu;
429 id: mediaPayerMenu;
412 Menus.MediaPlayerMenu {
431 Menus.MediaPlayerMenu {
413 objectName: "mediaPayerMenu"
432 objectName: "mediaPayerMenu"
414 property QtObject menuData: null
433 property QtObject menuData: null
@@ -435,6 +454,7 @@ Item {
436 Component {
455 Component {
437 id: playbackItemMenu;
456 id: playbackItemMenu;
438 Menus.PlaybackItemMenu {
458 Menus.PlaybackItemMenu {
439 objectName: "playbackItemMenu"
459 objectName: "playbackItemMenu"
440 property QtObject menuData: null
460 property QtObject menuData: null
@@ -442,17 +462,17 @@ Item {
442 property int menuIndex: -1
462 property int menuIndex: -1
443 property var extendedData: menuData && menuData.ext || undefined
463 property var extendedData: menuData && menuData.ext || undefined
445− property var playAction: QMenuModel.UnityMenuAction {
465+ property var playAction: UnityMenuAction {
446 model: menuModel
466 model: menuModel
447 index: menuIndex
467 index: menuIndex
448 name: getExtendedProperty(extendedData, "xCanonicalPlayAction", "")
468 name: getExtendedProperty(extendedData, "xCanonicalPlayAction", "")
450− property var nextAction: QMenuModel.UnityMenuAction {
470+ property var nextAction: UnityMenuAction {
451 model: menuModel
471 model: menuModel
452 index: menuIndex
472 index: menuIndex
453 name: getExtendedProperty(extendedData, "xCanonicalNextAction", "")
473 name: getExtendedProperty(extendedData, "xCanonicalNextAction", "")
455− property var previousAction: QMenuModel.UnityMenuAction {
475+ property var previousAction: UnityMenuAction {
456 model: menuModel
476 model: menuModel
457 index: menuIndex
477 index: menuIndex
458 name: getExtendedProperty(extendedData, "xCanonicalPreviousAction", "")
478 name: getExtendedProperty(extendedData, "xCanonicalPreviousAction", "")
@@ -489,6 +509,150 @@ Item {
515+ Menus.TransferMenu {
516+ objectName: "transferMenu"
518+ property QtObject menuData: null
519+ property var menuModel: menuFactory.menuModel
520+ property int menuIndex: -1
521+ property var extendedData: menuData && menuData.ext || undefined
522+ property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
524+ text: menuData && menuData.label || ""
525+ iconSource: menuData && menuData.icon || ""
527+ enabled: menuData && menuData.sensitive || false
529+ confirmRemoval: true
534+ busName: rootModel.busName
535+ objectPath: rootModel.actions["indicator"]
537+ property var activateAction: action("activate-transfer")
538+ property var cancelAction: action("cancel-transfer")
539+ property var transferStateAction: uid !== undefined ? action("transfer-state."+uid) : null
541+ Component.onCompleted: actionGroup.start()
544+ property var transferState: {
545+ if (actionGroup.transferStateAction === null) return undefined;
546+ return actionGroup.transferStateAction.valid ? actionGroup.transferStateAction.state : undefined
549+ property var runningState : transferState !== undefined ? transferState["state"] : undefined
550+ property var secondsLeft : transferState !== undefined ? transferState["seconds-left"] : undefined
552+ active: runningState !== undefined && runningState !== Menus.TransferState.Finished
553+ progress: transferState !== undefined ? transferState["percent"] : 0.0
555+ // TODO - Should be in the SDK
556+ property var timeRemaining: {
557+ if (secondsLeft === undefined) return undefined;
560+ var hours = Math.floor(secondsLeft / (60 * 60));
561+ var minutes = Math.floor(secondsLeft / 60) % 60;
562+ var seconds = secondsLeft % 60;
564+ remaining += hours + (hours == 1 ? " hour" : " hours");
567+ if (remaining != "") remaining += ", ";
568+ remaining += minutes + (minutes == 1 ? " minute" : " minutes");
570+ // don't include seconds if hours > 0
571+ if (hours == 0 && minutes < 5 && seconds > 0) {
572+ if (remaining != "") remaining += ", ";
573+ remaining += seconds + (seconds == 1 ? " second" : " seconds");
575+ if (remaining == "")
576+ remaining = "0 seconds";
577+ return remaining + " remaining";
581+ switch (runningState) {
582+ case Menus.TransferState.Queued:
583+ return i18n.tr("In queue…");
584+ case Menus.TransferState.Hashing:
585+ case Menus.TransferState.Processing:
586+ case Menus.TransferState.Running:
587+ return timeRemaining === undefined ? i18n.tr("Downloading") : timeRemaining;
588+ case Menus.TransferState.Paused:
589+ return i18n.tr("Paused, tap to resume");
590+ case Menus.TransferState.Canceled:
591+ return i18n.tr("Canceled");
592+ case Menus.TransferState.Finished:
593+ return i18n.tr("Finished");
594+ case Menus.TransferState.Error:
595+ return i18n.tr("Failed, tap to retry");
600+ onMenuModelChanged: {
603+ onMenuIndexChanged: {
607+ actionGroup.activateAction.activate(uid);
610+ actionGroup.cancelAction.activate(uid);
613+ function loadAttributes() {
614+ if (!menuModel || menuIndex == -1) return;
615+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-uid': 'string'});
621+ id: buttonSectionMenu;
623+ ListItems.Standard {
624+ objectName: "buttonSectionMenu"
625+ property QtObject menuData: null
626+ property var menuModel: menuFactory.menuModel
627+ property int menuIndex: -1
628+ property var extendedData: menuData && menuData.ext || undefined
630+ iconSource: menuData && menuData.icon || ""
631+ enabled: menuData && menuData.sensitive || false
632+ text: menuData && menuData.label || ""
635+ onMenuModelChanged: {
638+ onMenuIndexChanged: {
641+ function loadAttributes() {
642+ if (!menuModel || menuIndex == -1) return;
643+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
647+ text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
650+ menuModel.activate(menuIndex);
492 function load(modelData) {
656 function load(modelData) {
493 if (modelData.type !== undefined) {
657 if (modelData.type !== undefined) {
494 var component = _map[modelData.type];
658 var component = _map[modelData.type];