@@ -18,11 +18,10 @@
20import QtQuick 2.0
20import QtQuick 2.0
21−import Unity.Indicators 0.1 as Indicators
21+import Ubuntu.Settings.Menus 0.1 as Menus
22−import Unity.Indicators.Network 0.1 as ICNetwork
23−import Unity.Indicators.Messaging 0.1 as ICMessaging
24import QMenuModel 0.1 as QMenuModel
22import QMenuModel 0.1 as QMenuModel
23+import Unity.Indicators 0.1 as Indicators
25−import Ubuntu.Components 0.1
24+import Ubuntu.Components.ListItems 0.1 as ListItems
28 id: menuFactory
27 id: menuFactory
@@ -33,12 +32,14 @@ Item {
33 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
32 "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
34 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
33 "unity.widgets.systemsettings.tablet.switch" : switchMenu,
36− "com.canonical.indicator.button" : buttonMenu,
35+ "com.canonical.indicator.button" : buttonMenu,
37− "com.canonical.indicator.div" : divMenu,
36+ "com.canonical.indicator.div" : separatorMenu,
38− "com.canonical.indicator.section" : sectionMenu,
37+ "com.canonical.indicator.section" : sectionMenu,
39− "com.canonical.indicator.progress" : progressMenu,
38+ "com.canonical.indicator.progress" : progressMenu,
40− "com.canonical.indicator.slider" : sliderMenu,
39+ "com.canonical.indicator.slider" : sliderMenu,
41− "com.canonical.indicator.switch" : switchMenu,
40+ "com.canonical.indicator.switch" : switchMenu,
41+ "com.canonical.indicator.alarm" : alarmMenu,
42+ "com.canonical.indicator.appointment" : appointmentMenu,
43 "com.canonical.indicator.messages.messageitem" : messageItem,
44 "com.canonical.indicator.messages.messageitem" : messageItem,
44 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
45 "com.canonical.indicator.messages.sourceitem" : groupedMessage,
@@ -46,6 +47,9 @@ Item {
46 "com.canonical.unity.slider" : sliderMenu,
47 "com.canonical.unity.slider" : sliderMenu,
47 "com.canonical.unity.switch" : switchMenu,
48 "com.canonical.unity.switch" : switchMenu,
50+ "com.canonical.unity.media-player" : mediaPayerMenu,
51+ "com.canonical.unity.playback-item" : playbackItemMenu,
49 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
53 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
50 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
54 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
@@ -58,15 +62,15 @@ Item {
60 Component {
64 Component {
61− id: divMenu;
65+ id: separatorMenu;
62− Indicators.DivMenuItem {
66+ Menus.SeparatorMenu {
63− objectName: "divMenu"
67+ objectName: "separatorMenu"
67 Component {
71 Component {
68 id: sliderMenu;
72 id: sliderMenu;
69− Indicators.SliderMenuItem {
73+ Menus.SliderMenu {
70 objectName: "sliderMenu"
74 objectName: "sliderMenu"
71 property QtObject menuData: null
75 property QtObject menuData: null
72 property var menuModel: menuFactory.menuModel
76 property var menuModel: menuFactory.menuModel
@@ -95,12 +99,12 @@ Item {
95 onMenuIndexChanged: {
99 onMenuIndexChanged: {
96 loadAttributes();
100 loadAttributes();
98− onChangeState: {
102+ onUpdated: {
99 menuModel.changeState(menuIndex, value);
103 menuModel.changeState(menuIndex, value);
102 function loadAttributes() {
106 function loadAttributes() {
103− if (!menuModel || menuIndex == undefined) return;
107+ if (!menuModel || menuIndex == -1) return;
104 menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
108 menuModel.loadExtendedAttributes(menuIndex, {'min-value': 'double',
105 'max-value': 'double',
109 'max-value': 'double',
106 'min-icon': 'icon',
110 'min-icon': 'icon',
@@ -111,7 +115,7 @@ Item {
112 Component {
116 Component {
113 id: buttonMenu;
117 id: buttonMenu;
114− Indicators.ButtonMenuItem {
118+ Menus.ButtonMenu {
115 objectName: "buttonMenu"
119 objectName: "buttonMenu"
116 property QtObject menuData: null
120 property QtObject menuData: null
117 property var menuModel: menuFactory.menuModel
121 property var menuModel: menuFactory.menuModel
@@ -120,7 +124,7 @@ Item {
120 buttonText: menuData && menuData.label || ""
124 buttonText: menuData && menuData.label || ""
121 enabled: menuData && menuData.sensitive || false
125 enabled: menuData && menuData.sensitive || false
123− onActivate: {
127+ onTriggered: {
124 menuModel.activate(menuIndex);
128 menuModel.activate(menuIndex);
125 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
129 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
@@ -128,18 +132,19 @@ Item {
129 Component {
133 Component {
130 id: sectionMenu;
134 id: sectionMenu;
131− Indicators.SectionMenuItem {
135+ Menus.SectionMenu {
132 objectName: "sectionMenu"
136 objectName: "sectionMenu"
133 property QtObject menuData: null
137 property QtObject menuData: null
134 property var menuIndex: undefined
138 property var menuIndex: undefined
136 text: menuData && menuData.label || ""
140 text: menuData && menuData.label || ""
140 Component {
145 Component {
141 id: progressMenu;
146 id: progressMenu;
142− Indicators.ProgressMenuItem {
147+ Menus.ProgressValueMenu {
143 objectName: "progressMenu"
148 objectName: "progressMenu"
144 property QtObject menuData: null
149 property QtObject menuData: null
145 property int menuIndex: -1
150 property int menuIndex: -1
@@ -153,7 +158,7 @@ Item {
154 Component {
159 Component {
155 id: standardMenu;
160 id: standardMenu;
156− Indicators.StandardMenuItem {
161+ ListItems.Standard {
157 objectName: "standardMenu"
162 objectName: "standardMenu"
158 property QtObject menuData: null
163 property QtObject menuData: null
159 property int menuIndex: -1
164 property int menuIndex: -1
@@ -161,10 +166,8 @@ Item {
161 text: menuData && menuData.label || ""
166 text: menuData && menuData.label || ""
162 iconSource: menuData && menuData.icon || ""
167 iconSource: menuData && menuData.icon || ""
163 enabled: menuData && menuData.sensitive || false
168 enabled: menuData && menuData.sensitive || false
164− checkable: menuData ? (menuData.isCheck || menuData.isRadio) : false
165− checked: checkable ? menuData.isToggled : false
167− onActivate: {
170+ onTriggered: {
168 menuModel.activate(menuIndex);
171 menuModel.activate(menuIndex);
169 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
172 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
@@ -173,7 +176,7 @@ Item {
174 Component {
177 Component {
175 id: switchMenu;
178 id: switchMenu;
176− Indicators.SwitchMenuItem {
179+ Menus.SwitchMenu {
177 objectName: "switchMenu"
180 objectName: "switchMenu"
178 property QtObject menuData: null
181 property QtObject menuData: null
179 property int menuIndex: -1
182 property int menuIndex: -1
@@ -181,18 +184,96 @@ Item {
181 text: menuData && menuData.label || ""
184 text: menuData && menuData.label || ""
182 iconSource: menuData && menuData.icon || ""
185 iconSource: menuData && menuData.icon || ""
183 enabled: menuData && menuData.sensitive || false
186 enabled: menuData && menuData.sensitive || false
184− checked: menuData ? menuData.isToggled : false
187+ checked: menuData && menuData.isToggled || false
186− onActivate: {
189+ onTriggered: {
187 menuModel.activate(menuIndex);
190 menuModel.activate(menuIndex);
188 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
191 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
199+ objectName: "alarmMenu"
200+ property QtObject menuData: null
201+ property var menuModel: menuFactory.menuModel
202+ property int menuIndex: -1
203+ property var extendedData: menuData && menuData.ext || undefined
204+ // TODO - bug #1260728
205+ property var timeFormatter: Indicators.TimeFormatter {
206+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
207+// format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
208+ format: "hh:mm - MMM dd"
211+ text: menuData && menuData.label || ""
212+ iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
213+ time: timeFormatter.timeString
214+ enabled: menuData && menuData.sensitive || false
216+ onMenuModelChanged: {
219+ onMenuIndexChanged: {
223+ menuModel.activate(menuIndex);
226+ function loadAttributes() {
227+ if (!menuModel || menuIndex == -1) return;
228+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-time': 'int64',
229+ 'x-canonical-time-format': 'string'});
235+ id: appointmentMenu;
237+ objectName: "appointmentMenu"
238+ property QtObject menuData: null
239+ property var menuModel: menuFactory.menuModel
240+ property int menuIndex: -1
241+ property var extendedData: menuData && menuData.ext || undefined
242+ // TODO - bug #1260728
243+ property var timeFormatter: Indicators.TimeFormatter {
244+ time: getExtendedProperty(extendedData, "xCanonicalTime", 0)
245+// format: getExtendedProperty(extendedData, "xCanonicalTimeFormat", "")
246+ format: "hh:mm - MMM dd"
249+ text: menuData && menuData.label || ""
250+ iconSource: menuData && menuData.icon || "image://theme/calendar"
251+ time: timeFormatter.timeString
252+ eventColor: menu && menu.ext.hasOwnProperty("xCanonicalColor") ? menu.ext.xCanonicalColor : Qt.rgba(0.0, 0.0, 0.0, 0.0)
253+ enabled: menuData && menuData.sensitive || false
255+ onMenuModelChanged: {
258+ onMenuIndexChanged: {
262+ menuModel.activate(menuIndex);
265+ function loadAttributes() {
266+ if (!menuModel || menuIndex == -1) return;
267+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-color': 'string',
268+ 'x-canonical-time': 'int64',
269+ 'x-canonical-time-format': 'string'});
193 Component {
274 Component {
194 id: wifiSection;
275 id: wifiSection;
195− Indicators.SectionMenuItem {
276+ Menus.SectionMenu {
196 objectName: "wifiSection"
277 objectName: "wifiSection"
197 property QtObject menuData: null
278 property QtObject menuData: null
198 property var menuModel: menuFactory.menuModel
279 property var menuModel: menuFactory.menuModel
@@ -210,7 +291,7 @@ Item {
212 function loadAttributes() {
293 function loadAttributes() {
213− if (!menuModel || menuIndex == undefined) return;
294+ if (!menuModel || menuIndex == -1) return;
214 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
295 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-busy-action': 'bool'})
@@ -218,7 +299,7 @@ Item {
219 Component {
300 Component {
220 id: accessPoint;
301 id: accessPoint;
221− ICNetwork.AccessPoint {
302+ Menus.AccessPointMenu {
222 objectName: "accessPoint"
303 objectName: "accessPoint"
223 property QtObject menuData: null
304 property QtObject menuData: null
224 property var menuModel: menuFactory.menuModel
305 property var menuModel: menuFactory.menuModel
@@ -231,11 +312,11 @@ Item {
231 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
312 name: getExtendedProperty(extendedData, "xCanonicalWifiApStrengthAction", "")
234− label: menuData && menuData.label || ""
315+ text: menuData && menuData.label || ""
235 enabled: menuData && menuData.sensitive || false
316 enabled: menuData && menuData.sensitive || false
317+ checked: menuData && menuData.isToggled || false
236 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
318 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
237 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
319 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
238− checked: menuData ? menuData.isToggled : false
239 signalStrength: strengthAction.valid ? strengthAction.state : 0
320 signalStrength: strengthAction.valid ? strengthAction.state : 0
241 onMenuModelChanged: {
322 onMenuModelChanged: {
@@ -244,13 +325,13 @@ Item {
244 onMenuIndexChanged: {
325 onMenuIndexChanged: {
245 loadAttributes();
326 loadAttributes();
247− onActivate: {
328+ onTriggered: {
248 menuModel.activate(menuIndex);
329 menuModel.activate(menuIndex);
249 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
330 shell.hideIndicatorMenu(UbuntuAnimation.BriskDuration);
252 function loadAttributes() {
333 function loadAttributes() {
253− if (!menuModel || menuIndex == undefined) return;
334+ if (!menuModel || menuIndex == -1) return;
254 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
335 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-wifi-ap-is-adhoc': 'bool',
255 'x-canonical-wifi-ap-is-secure': 'bool',
336 'x-canonical-wifi-ap-is-secure': 'bool',
256 'x-canonical-wifi-ap-strength-action': 'string'});
337 'x-canonical-wifi-ap-strength-action': 'string'});
@@ -260,7 +341,7 @@ Item {
261 Component {
342 Component {
262 id: messageItem
343 id: messageItem
263− ICMessaging.MessageMenuItemFactory {
344+ MessageMenuItemFactory {
264 objectName: "messageItem"
345 objectName: "messageItem"
265 menuModel: menuFactory.menuModel
346 menuModel: menuFactory.menuModel
@@ -268,17 +349,18 @@ Item {
269 Component {
350 Component {
270 id: groupedMessage
351 id: groupedMessage
271− ICMessaging.GroupedMessage {
352+ Menus.GroupedMessageMenu {
272 objectName: "groupedMessage"
353 objectName: "groupedMessage"
273 property QtObject menuData: null
354 property QtObject menuData: null
274 property var menuModel: menuFactory.menuModel
355 property var menuModel: menuFactory.menuModel
275 property int menuIndex: -1
356 property int menuIndex: -1
276 property var extendedData: menuData && menuData.ext || undefined
357 property var extendedData: menuData && menuData.ext || undefined
278− title: menuData && menuData.label || ""
359+ text: menuData && menuData.label || ""
279− appIcon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
360+ icon: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
280 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
361 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
281 enabled: menuData && menuData.sensitive || false
362 enabled: menuData && menuData.sensitive || false
283 onMenuModelChanged: {
365 onMenuModelChanged: {
284 loadAttributes();
366 loadAttributes();
@@ -286,21 +368,98 @@ Item {
286 onMenuIndexChanged: {
368 onMenuIndexChanged: {
287 loadAttributes();
369 loadAttributes();
289− onActivateApp: {
371+ onClicked: {
290 menuModel.activate(menuIndex, true);
372 menuModel.activate(menuIndex, true);
291 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
373 shell.hideIndicatorMenu(UbuntuAnimation.FastDuration);
293− onDismiss: {
375+ onDismissed: {
294 menuModel.activate(menuIndex, false);
376 menuModel.activate(menuIndex, false);
297 function loadAttributes() {
379 function loadAttributes() {
298− if (!menuModel || menuIndex == undefined) return;
380+ if (!menuModel || menuIndex == -1) return;
299 menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
381 menuModel.loadExtendedAttributes(modelIndex, {'icon': 'icon'});
388+ Menus.MediaPlayerMenu {
389+ property QtObject menuData: null
390+ property var menuModel: menuFactory.menuModel
391+ property int menuIndex: -1
392+ property var actionState: menuData && menuData.actionState || undefined
394+ playerIcon: menuData && menuData.icon || ""
395+ playerName: menuData && menuData.label || ""
397+ albumArt: getExtendedProperty(actionState, "art-url", "")
398+ song: getExtendedProperty(actionState, "title", "unknown")
399+ artist: getExtendedProperty(actionState, "artist", "unknown")
400+ album: getExtendedProperty(actionState, "album", "unknown")
401+ running: getExtendedProperty(actionState, "running", false)
402+ state: getExtendedProperty(actionState, "state", "")
405+ model.activate(modelIndex);
411+ id: playbackItemMenu;
412+ Menus.PlaybackItemMenu {
413+ property var menuModel: menuFactory.menuModel
414+ property int menuIndex: -1
415+ property var extendedData: menuData && menuData.ext || undefined
417+ property var playAction: QMenuModel.UnityMenuAction {
420+ name: getExtendedProperty(extendedData, "xCanonicalPlayAction", "")
422+ property var nextAction: QMenuModel.UnityMenuAction {
425+ name: getExtendedProperty(extendedData, "xCanonicalNextAction", "")
427+ property var previousAction: QMenuModel.UnityMenuAction {
430+ name: getExtendedProperty(extendedData, "xCanonicalPreviousAction", "")
433+ playing: playAction.state === "Playing"
434+ canPlay: playAction.valid
435+ canGoNext: nextAction.valid
436+ canGoPrevious: previousAction.valid
439+ playAction.activate();
442+ nextAction.activate();
445+ previousAction.activate();
447+ onMenuModelChanged: {
450+ onMenuIndexChanged: {
454+ function loadAttributes() {
455+ if (!menuModel || menuIndex == -1) return;
456+ menuModel.loadExtendedAttributes(modelIndex, {'x-canonical-play-action': 'string',
457+ 'x-canonical-next-action': 'string',
458+ 'x-canonical-previous-action': 'string'});
304 function load(modelData) {
463 function load(modelData) {
305 if (modelData.type !== undefined) {
464 if (modelData.type !== undefined) {
306 var component = _map[modelData.type];
465 var component = _map[modelData.type];
@@ -309,7 +468,7 @@ Item {
311 if (modelData.isSeparator) {
470 if (modelData.isSeparator) {
312− return divMenu;
471+ return separatorMenu;
314 return standardMenu;
473 return standardMenu;