@@ -19,11 +19,10 @@
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
23import QMenuModel 0.1
22import QMenuModel 0.1
24import Utils 0.1 as Utils
23import Utils 0.1 as Utils
25import Ubuntu.Components.ListItems 0.1 as ListItems
24import Ubuntu.Components.ListItems 0.1 as ListItems
26−import Ubuntu.Components 0.1
25+import Ubuntu.Components 1.1
29 id: menuFactory
28 id: menuFactory
@@ -32,32 +31,38 @@ Item {
32 property var menuModel: null
31 property var menuModel: null
34 property var _map: {
33 property var _map: {
35− "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
35+ "unity.widgets.systemsettings.tablet.volumecontrol" : sliderMenu,
36− "unity.widgets.systemsettings.tablet.switch" : switchMenu,
36+ "unity.widgets.systemsettings.tablet.switch" : switchMenu,
38− "com.canonical.indicator.button" : buttonMenu,
38+ "com.canonical.indicator.button" : buttonMenu,
39− "com.canonical.indicator.div" : separatorMenu,
39+ "com.canonical.indicator.div" : separatorMenu,
40− "com.canonical.indicator.section" : sectionMenu,
40+ "com.canonical.indicator.section" : sectionMenu,
41− "com.canonical.indicator.progress" : progressMenu,
41+ "com.canonical.indicator.progress" : progressMenu,
42− "com.canonical.indicator.slider" : sliderMenu,
42+ "com.canonical.indicator.slider" : sliderMenu,
43− "com.canonical.indicator.switch" : switchMenu,
43+ "com.canonical.indicator.switch" : switchMenu,
44− "com.canonical.indicator.alarm" : alarmMenu,
44+ "com.canonical.indicator.alarm" : alarmMenu,
45− "com.canonical.indicator.appointment" : appointmentMenu,
45+ "com.canonical.indicator.appointment" : appointmentMenu,
46− "com.canonical.indicator.transfer" : transferMenu,
46+ "com.canonical.indicator.transfer" : transferMenu,
47− "com.canonical.indicator.button-section" : buttonSectionMenu,
47+ "com.canonical.indicator.button-section" : buttonSectionMenu,
48−
48+ "com.canonical.indicator.link" : linkMenu,
49− "com.canonical.indicator.messages.messageitem" : messageItem,
50+ "com.canonical.indicator.messages.messageitem" : messageItem,
50− "com.canonical.indicator.messages.sourceitem" : groupedMessage,
51+ "com.canonical.indicator.messages.sourceitem" : groupedMessage,
52− "com.canonical.unity.slider" : sliderMenu,
53+ "com.canonical.unity.slider" : sliderMenu,
53− "com.canonical.unity.switch" : switchMenu,
54+ "com.canonical.unity.switch" : switchMenu,
55− "com.canonical.unity.media-player" : mediaPayerMenu,
56+ "com.canonical.unity.media-player" : mediaPayerMenu,
56− "com.canonical.unity.playback-item" : playbackItemMenu,
57+ "com.canonical.unity.playback-item" : playbackItemMenu,
58− "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
59+ "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
59− "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
60+ "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
60− "com.canonical.indicator.network.modeminfoitem" : modeminfoitem,
61+ "com.canonical.indicator.network.modeminfoitem" : modeminfoitem,
63+ "indicator-messages" : {
64+ "com.canonical.indicator.button" : messagesButtonMenu
63 function getExtendedProperty(object, propertyName, defaultValue) {
68 function getExtendedProperty(object, propertyName, defaultValue) {
@@ -100,6 +105,7 @@ Item {
100 return maximum;
105 return maximum;
102 enabled: menuData && menuData.sensitive || false
107 enabled: menuData && menuData.sensitive || false
108+ highlightWhenPressed: false
104 onMenuModelChanged: {
110 onMenuModelChanged: {
105 loadAttributes();
111 loadAttributes();
@@ -138,12 +144,43 @@ Item {
139 buttonText: menuData && menuData.label || ""
145 buttonText: menuData && menuData.label || ""
140 enabled: menuData && menuData.sensitive || false
146 enabled: menuData && menuData.sensitive || false
147+ highlightWhenPressed: false
142 onTriggered: {
149 onTriggered: {
143 menuModel.activate(menuIndex);
150 menuModel.activate(menuIndex);
156+ id: messagesButtonMenu;
159+ objectName: "messagesButtonMenu"
160+ property QtObject menuData: null
161+ property var menuModel: menuFactory.menuModel
162+ property int menuIndex: -1
164+ implicitHeight: units.gu(5)
165+ enabled: menuData && menuData.sensitive || false
169+ text: menuData && menuData.label || ""
170+ anchors.centerIn: parent
176+ fill: buttonMenuLabel
177+ margins: units.gu(-1)
179+ onClicked: menuModel.activate(menuIndex);
147 Component {
184 Component {
148 id: sectionMenu;
185 id: sectionMenu;
@@ -169,6 +206,7 @@ Item {
169 iconSource: menuData && menuData.icon || ""
206 iconSource: menuData && menuData.icon || ""
170 value : menuData && menuData.actionState || 0.0
207 value : menuData && menuData.actionState || 0.0
171 enabled: menuData && menuData.sensitive || false
208 enabled: menuData && menuData.sensitive || false
209+ highlightWhenPressed: false
@@ -183,10 +221,58 @@ Item {
183 text: menuData && menuData.label || ""
221 text: menuData && menuData.label || ""
184 iconSource: menuData && menuData.icon || ""
222 iconSource: menuData && menuData.icon || ""
185 enabled: menuData && menuData.sensitive || false
223 enabled: menuData && menuData.sensitive || false
224+ highlightWhenPressed: false
227+ menuModel.activate(menuIndex);
230+ // FIXME : At the moment, the indicators aren't using
231+ // com.canonical.indicators.link for settings menu. Need to fudge it.
232+ property bool settingsMenu: menuData && menuData.action.indexOf("settings") > -1 || false
233+ backColor: settingsMenu ? Qt.rgba(1,1,1,0.07) : "transparent"
234+ component: settingsMenu ? buttonForSettings : undefined
236+ id: buttonForSettings
241+ color: Theme.palette.selected.backgroundText
250+ Menus.StandardMenu {
251+ objectName: "linkMenu"
252+ property QtObject menuData: null
253+ property int menuIndex: -1
255+ text: menuData && menuData.label || ""
256+ iconSource: menuData && menuData.icon || ""
257+ enabled: menuData && menuData.sensitive || false
258+ highlightWhenPressed: false
187 onTriggered: {
260 onTriggered: {
188 menuModel.activate(menuIndex);
261 menuModel.activate(menuIndex);
264+ backColor: Qt.rgba(1,1,1,0.07)
266+ component: menuData.icon ? icon : undefined
270+ source: menuData.icon
273+ color: Theme.palette.selected.backgroundText
@@ -201,6 +287,7 @@ Item {
201 text: menuData && menuData.label || ""
287 text: menuData && menuData.label || ""
202 enabled: menuData && menuData.sensitive || false
288 enabled: menuData && menuData.sensitive || false
203 checked: menuData && menuData.isToggled || false
289 checked: menuData && menuData.isToggled || false
290+ highlightWhenPressed: false
205 onTriggered: {
292 onTriggered: {
206 menuModel.activate(menuIndex);
293 menuModel.activate(menuIndex);
@@ -208,7 +295,6 @@ Item {
212 Component {
298 Component {
213 id: switchMenu;
299 id: switchMenu;
@@ -221,6 +307,7 @@ Item {
221 iconSource: menuData && menuData.icon || ""
307 iconSource: menuData && menuData.icon || ""
222 enabled: menuData && menuData.sensitive || false
308 enabled: menuData && menuData.sensitive || false
223 checked: menuData && menuData.isToggled || false
309 checked: menuData && menuData.isToggled || false
310+ highlightWhenPressed: false
225 onTriggered: {
312 onTriggered: {
226 menuModel.activate(menuIndex);
313 menuModel.activate(menuIndex);
@@ -247,6 +334,7 @@ Item {
247 iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
334 iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
248 time: timeFormatter.timeString
335 time: timeFormatter.timeString
249 enabled: menuData && menuData.sensitive || false
336 enabled: menuData && menuData.sensitive || false
337+ highlightWhenPressed: false
251 onMenuModelChanged: {
339 onMenuModelChanged: {
252 loadAttributes();
340 loadAttributes();
@@ -286,6 +374,7 @@ Item {
286 time: timeFormatter.timeString
374 time: timeFormatter.timeString
287 eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
375 eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
288 enabled: menuData && menuData.sensitive || false
376 enabled: menuData && menuData.sensitive || false
377+ highlightWhenPressed: false
290 onMenuModelChanged: {
379 onMenuModelChanged: {
291 loadAttributes();
380 loadAttributes();
@@ -351,10 +440,11 @@ Item {
352 text: menuData && menuData.label || ""
441 text: menuData && menuData.label || ""
353 enabled: menuData && menuData.sensitive || false
442 enabled: menuData && menuData.sensitive || false
354− checked: menuData && menuData.isToggled || false
443+ active: menuData && menuData.isToggled || false
355 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
444 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
356 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
445 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
357 signalStrength: strengthAction.valid ? strengthAction.state : 0
446 signalStrength: strengthAction.valid ? strengthAction.state : 0
447+ highlightWhenPressed: false
359 onMenuModelChanged: {
449 onMenuModelChanged: {
360 loadAttributes();
450 loadAttributes();
@@ -383,6 +473,7 @@ Item {
383 property var menuModel: menuFactory.menuModel
473 property var menuModel: menuFactory.menuModel
384 property int menuIndex: -1
474 property int menuIndex: -1
385 property var extendedData: menuData && menuData.ext || undefined
475 property var extendedData: menuData && menuData.ext || undefined
476+ highlightWhenPressed: false
387 property var statusLabelAction: UnityMenuAction {
478 property var statusLabelAction: UnityMenuAction {
388 model: menuModel
479 model: menuModel
@@ -468,9 +559,10 @@ Item {
468 property var extendedData: menuData && menuData.ext || undefined
559 property var extendedData: menuData && menuData.ext || undefined
470 text: menuData && menuData.label || ""
561 text: menuData && menuData.label || ""
471− iconSource: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
562+ iconSource: getExtendedProperty(extendedData, "icon", "image://theme/message")
472 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
563 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
473 enabled: menuData && menuData.sensitive || false
564 enabled: menuData && menuData.sensitive || false
565+ highlightWhenPressed: false
474 removable: true
566 removable: true
476 onMenuModelChanged: {
568 onMenuModelChanged: {
@@ -502,17 +594,20 @@ Item {
502 property var menuModel: menuFactory.menuModel
594 property var menuModel: menuFactory.menuModel
503 property int menuIndex: -1
595 property int menuIndex: -1
504 property var actionState: menuData && menuData.actionState || undefined
596 property var actionState: menuData && menuData.actionState || undefined
597+ property bool running: getExtendedProperty(actionState, "running", false)
506− playerIcon: menuData && menuData.icon || ""
599+ playerIcon: menuData && menuData.icon || "image://theme/stock_music"
507− playerName: menuData && menuData.label || ""
600+ playerName: menuData && menuData.label || i18n.tr("Nothing is playing")
509− albumArt: getExtendedProperty(actionState, "art-url", "")
602+ albumArt: getExtendedProperty(actionState, "art-url", "image://theme/stock_music")
510− song: getExtendedProperty(actionState, "title", "unknown")
603+ song: getExtendedProperty(actionState, "title", "")
511− artist: getExtendedProperty(actionState, "artist", "unknown")
604+ artist: getExtendedProperty(actionState, "artist", "")
512− album: getExtendedProperty(actionState, "album", "unknown")
605+ album: getExtendedProperty(actionState, "album", "")
513− running: getExtendedProperty(actionState, "running", false)
606+ showTrack: running && (state == "Playing" || state == "Paused")
514 state: getExtendedProperty(actionState, "state", "")
607 state: getExtendedProperty(actionState, "state", "")
515 enabled: menuData && menuData.sensitive || false
608 enabled: menuData && menuData.sensitive || false
609+ highlightWhenPressed: false
517 onTriggered: {
612 onTriggered: {
518 model.activate(modelIndex);
613 model.activate(modelIndex);
@@ -551,6 +646,7 @@ Item {
551 canGoNext: nextAction.valid
646 canGoNext: nextAction.valid
552 canGoPrevious: previousAction.valid
647 canGoPrevious: previousAction.valid
553 enabled: menuData && menuData.sensitive || false
648 enabled: menuData && menuData.sensitive || false
649+ highlightWhenPressed: false
555 onPlay: {
651 onPlay: {
556 playAction.activate();
652 playAction.activate();
@@ -590,9 +686,10 @@ Item {
590 property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
686 property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
592 text: menuData && menuData.label || ""
688 text: menuData && menuData.label || ""
593− iconSource: menuData && menuData.icon || ""
689+ iconSource: menuData && menuData.icon || "image://theme/transfer-none"
594 maximum: 1.0
690 maximum: 1.0
595 enabled: menuData && menuData.sensitive || false
691 enabled: menuData && menuData.sensitive || false
692+ highlightWhenPressed: false
596 removable: true
693 removable: true
597 confirmRemoval: true
694 confirmRemoval: true
@@ -688,7 +785,7 @@ Item {
688 Component {
785 Component {
689 id: buttonSectionMenu;
786 id: buttonSectionMenu;
691− ListItems.Standard {
788+ Menus.StandardMenu {
692 objectName: "buttonSectionMenu"
789 objectName: "buttonSectionMenu"
693 property QtObject menuData: null
790 property QtObject menuData: null
694 property var menuModel: menuFactory.menuModel
791 property var menuModel: menuFactory.menuModel
@@ -697,8 +794,9 @@ Item {
698 iconSource: menuData && menuData.icon || ""
795 iconSource: menuData && menuData.icon || ""
699 enabled: menuData && menuData.sensitive || false
796 enabled: menuData && menuData.sensitive || false
797+ highlightWhenPressed: false
700 text: menuData && menuData.label || ""
798 text: menuData && menuData.label || ""
701− showDivider: false
799+ foregroundColor: Theme.palette.normal.backgroundText
703 onMenuModelChanged: {
801 onMenuModelChanged: {
704 loadAttributes();
802 loadAttributes();
@@ -711,22 +809,35 @@ Item {
711 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
809 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
714− control: Button {
812+ component: Component {
814+ objectName: "buttonSectionMenuControl"
715− text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
815+ text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
717− onClicked: {
817+ onClicked: {
718− menuModel.activate(menuIndex);
818+ menuModel.activate(menuIndex);
724− function load(modelData) {
825+ function load(modelData, context) {
725 if (modelData.type !== undefined) {
826 if (modelData.type !== undefined) {
726− var component = _map[modelData.type];
827+ var component = undefined;
829+ var contextComponents = _map[context];
830+ if (contextComponents !== undefined) {
831+ component = contextComponents[modelData.type];
834+ if (component === undefined) {
835+ component = _map["default"][modelData.type];
727 if (component !== undefined) {
837 if (component !== undefined) {
728 return component;
838 return component;
840+ console.debug("Don't know how to make " + modelData.type + " for " + context);
731 if (modelData.isCheck || modelData.isRadio) {
842 if (modelData.isCheck || modelData.isRadio) {
732 return checkableMenu;
843 return checkableMenu;