@@ -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 {
202 text: menuData && menuData.label || ""
288 text: menuData && menuData.label || ""
203 enabled: menuData && menuData.sensitive || false
289 enabled: menuData && menuData.sensitive || false
290+ highlightWhenPressed: false
205 onServerCheckedChanged: {
292 onServerCheckedChanged: {
206 // value can be changed by menu, so a binding won't work.
293 // value can be changed by menu, so a binding won't work.
@@ -212,7 +299,6 @@ Item {
216 Component {
302 Component {
217 id: switchMenu;
303 id: switchMenu;
@@ -225,6 +311,7 @@ Item {
225 text: menuData && menuData.label || ""
311 text: menuData && menuData.label || ""
226 iconSource: menuData && menuData.icon || ""
312 iconSource: menuData && menuData.icon || ""
227 enabled: menuData && menuData.sensitive || false
313 enabled: menuData && menuData.sensitive || false
314+ highlightWhenPressed: false
229 onServerCheckedChanged: {
316 onServerCheckedChanged: {
230 // value can be changed by menu, so a binding won't work.
317 // value can be changed by menu, so a binding won't work.
@@ -255,6 +342,7 @@ Item {
255 iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
342 iconSource: menuData && menuData.icon || "image://theme/alarm-clock"
256 time: timeFormatter.timeString
343 time: timeFormatter.timeString
257 enabled: menuData && menuData.sensitive || false
344 enabled: menuData && menuData.sensitive || false
345+ highlightWhenPressed: false
259 onMenuModelChanged: {
347 onMenuModelChanged: {
260 loadAttributes();
348 loadAttributes();
@@ -294,6 +382,7 @@ Item {
294 time: timeFormatter.timeString
382 time: timeFormatter.timeString
295 eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
383 eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
296 enabled: menuData && menuData.sensitive || false
384 enabled: menuData && menuData.sensitive || false
385+ highlightWhenPressed: false
298 onMenuModelChanged: {
387 onMenuModelChanged: {
299 loadAttributes();
388 loadAttributes();
@@ -363,10 +452,11 @@ Item {
363 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
452 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
364 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
453 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
365 signalStrength: strengthAction.valid ? strengthAction.state : 0
454 signalStrength: strengthAction.valid ? strengthAction.state : 0
455+ highlightWhenPressed: false
367 onServerCheckedChanged: {
457 onServerCheckedChanged: {
368 // value can be changed by menu, so a binding won't work.
458 // value can be changed by menu, so a binding won't work.
369− checked = serverChecked;
459+ active = serverChecked;
371 onMenuModelChanged: {
461 onMenuModelChanged: {
372 loadAttributes();
462 loadAttributes();
@@ -395,6 +485,7 @@ Item {
395 property var menuModel: menuFactory.menuModel
485 property var menuModel: menuFactory.menuModel
396 property int menuIndex: -1
486 property int menuIndex: -1
397 property var extendedData: menuData && menuData.ext || undefined
487 property var extendedData: menuData && menuData.ext || undefined
488+ highlightWhenPressed: false
399 property var statusLabelAction: UnityMenuAction {
490 property var statusLabelAction: UnityMenuAction {
400 model: menuModel
491 model: menuModel
@@ -480,9 +571,10 @@ Item {
480 property var extendedData: menuData && menuData.ext || undefined
571 property var extendedData: menuData && menuData.ext || undefined
482 text: menuData && menuData.label || ""
573 text: menuData && menuData.label || ""
483− iconSource: getExtendedProperty(extendedData, "icon", "qrc:/indicators/artwork/messaging/default_app.svg")
574+ iconSource: getExtendedProperty(extendedData, "icon", "image://theme/message")
484 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
575 count: menuData && menuData.actionState.length > 0 ? menuData.actionState[0] : "0"
485 enabled: menuData && menuData.sensitive || false
576 enabled: menuData && menuData.sensitive || false
577+ highlightWhenPressed: false
486 removable: true
578 removable: true
488 onMenuModelChanged: {
580 onMenuModelChanged: {
@@ -514,17 +606,20 @@ Item {
514 property var menuModel: menuFactory.menuModel
606 property var menuModel: menuFactory.menuModel
515 property int menuIndex: -1
607 property int menuIndex: -1
516 property var actionState: menuData && menuData.actionState || undefined
608 property var actionState: menuData && menuData.actionState || undefined
609+ property bool running: getExtendedProperty(actionState, "running", false)
518− playerIcon: menuData && menuData.icon || ""
611+ playerIcon: menuData && menuData.icon || "image://theme/stock_music"
519− playerName: menuData && menuData.label || ""
612+ playerName: menuData && menuData.label || i18n.tr("Nothing is playing")
521− albumArt: getExtendedProperty(actionState, "art-url", "")
614+ albumArt: getExtendedProperty(actionState, "art-url", "image://theme/stock_music")
522− song: getExtendedProperty(actionState, "title", "unknown")
615+ song: getExtendedProperty(actionState, "title", "")
523− artist: getExtendedProperty(actionState, "artist", "unknown")
616+ artist: getExtendedProperty(actionState, "artist", "")
524− album: getExtendedProperty(actionState, "album", "unknown")
617+ album: getExtendedProperty(actionState, "album", "")
525− running: getExtendedProperty(actionState, "running", false)
618+ showTrack: running && (state == "Playing" || state == "Paused")
526 state: getExtendedProperty(actionState, "state", "")
619 state: getExtendedProperty(actionState, "state", "")
527 enabled: menuData && menuData.sensitive || false
620 enabled: menuData && menuData.sensitive || false
621+ highlightWhenPressed: false
529 onTriggered: {
624 onTriggered: {
530 model.activate(modelIndex);
625 model.activate(modelIndex);
@@ -563,6 +658,7 @@ Item {
563 canGoNext: nextAction.valid
658 canGoNext: nextAction.valid
564 canGoPrevious: previousAction.valid
659 canGoPrevious: previousAction.valid
565 enabled: menuData && menuData.sensitive || false
660 enabled: menuData && menuData.sensitive || false
661+ highlightWhenPressed: false
567 onPlay: {
663 onPlay: {
568 playAction.activate();
664 playAction.activate();
@@ -602,9 +698,10 @@ Item {
602 property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
698 property var uid: getExtendedProperty(extendedData, "xCanonicalUid", undefined)
604 text: menuData && menuData.label || ""
700 text: menuData && menuData.label || ""
605− iconSource: menuData && menuData.icon || ""
701+ iconSource: menuData && menuData.icon || "image://theme/transfer-none"
606 maximum: 1.0
702 maximum: 1.0
607 enabled: menuData && menuData.sensitive || false
703 enabled: menuData && menuData.sensitive || false
704+ highlightWhenPressed: false
608 removable: true
705 removable: true
609 confirmRemoval: true
706 confirmRemoval: true
@@ -700,7 +797,7 @@ Item {
700 Component {
797 Component {
701 id: buttonSectionMenu;
798 id: buttonSectionMenu;
703− ListItems.Standard {
800+ Menus.StandardMenu {
704 objectName: "buttonSectionMenu"
801 objectName: "buttonSectionMenu"
705 property QtObject menuData: null
802 property QtObject menuData: null
706 property var menuModel: menuFactory.menuModel
803 property var menuModel: menuFactory.menuModel
@@ -709,8 +806,9 @@ Item {
710 iconSource: menuData && menuData.icon || ""
807 iconSource: menuData && menuData.icon || ""
711 enabled: menuData && menuData.sensitive || false
808 enabled: menuData && menuData.sensitive || false
809+ highlightWhenPressed: false
712 text: menuData && menuData.label || ""
810 text: menuData && menuData.label || ""
713− showDivider: false
811+ foregroundColor: Theme.palette.normal.backgroundText
715 onMenuModelChanged: {
813 onMenuModelChanged: {
716 loadAttributes();
814 loadAttributes();
@@ -723,22 +821,35 @@ Item {
723 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
821 menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-extra-label': 'string'});
726− control: Button {
824+ component: Component {
826+ objectName: "buttonSectionMenuControl"
727− text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
827+ text: getExtendedProperty(extendedData, "xCanonicalExtraLabel", "")
729− onClicked: {
829+ onClicked: {
730− menuModel.activate(menuIndex);
830+ menuModel.activate(menuIndex);
736− function load(modelData) {
837+ function load(modelData, context) {
737 if (modelData.type !== undefined) {
838 if (modelData.type !== undefined) {
738− var component = _map[modelData.type];
839+ var component = undefined;
841+ var contextComponents = _map[context];
842+ if (contextComponents !== undefined) {
843+ component = contextComponents[modelData.type];
846+ if (component === undefined) {
847+ component = _map["default"][modelData.type];
739 if (component !== undefined) {
849 if (component !== undefined) {
740 return component;
850 return component;
852+ console.debug("Don't know how to make " + modelData.type + " for " + context);
743 if (modelData.isCheck || modelData.isRadio) {
854 if (modelData.isCheck || modelData.isRadio) {
744 return checkableMenu;
855 return checkableMenu;