on xenial help sign in
Fixed indicator menu bindings to server toggle value broken by user interaction. Fixes: 1336715
cc2ec9bNick Dedekind
qml/Panel/Indicators/MenuItemFactory.qml+18−3
@@ -283,12 +283,17 @@ Item {
283 objectName: "checkableMenu"
283 objectName: "checkableMenu"
284 property QtObject menuData: null
284 property QtObject menuData: null
285 property int menuIndex: -1
285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286
287
287 text: menuData && menuData.label || ""
288 text: menuData && menuData.label || ""
288 enabled: menuData && menuData.sensitive || false
289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290 highlightWhenPressed: false
291 highlightWhenPressed: false
291
292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292 onTriggered: {
297 onTriggered: {
293 menuModel.activate(menuIndex);
298 menuModel.activate(menuIndex);
294 }
299 }
@@ -302,13 +307,18 @@ Item {
302 objectName: "switchMenu"
307 objectName: "switchMenu"
303 property QtObject menuData: null
308 property QtObject menuData: null
304 property int menuIndex: -1
309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305
311
306 text: menuData && menuData.label || ""
312 text: menuData && menuData.label || ""
307 iconSource: menuData && menuData.icon || ""
313 iconSource: menuData && menuData.icon || ""
308 enabled: menuData && menuData.sensitive || false
314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310 highlightWhenPressed: false
316 highlightWhenPressed: false
311
317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312 onTriggered: {
322 onTriggered: {
313 menuModel.activate(menuIndex);
323 menuModel.activate(menuIndex);
314 }
324 }
@@ -431,6 +441,7 @@ Item {
431 property var menuModel: menuFactory.menuModel
441 property var menuModel: menuFactory.menuModel
432 property int menuIndex: -1
442 property int menuIndex: -1
433 property var extendedData: menuData && menuData.ext || undefined
443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434
445
435 property var strengthAction: UnityMenuAction {
446 property var strengthAction: UnityMenuAction {
436 model: menuModel
447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440
451
441 text: menuData && menuData.label || ""
452 text: menuData && menuData.label || ""
442 enabled: menuData && menuData.sensitive || false
453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446 signalStrength: strengthAction.valid ? strengthAction.state : 0
457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447 highlightWhenPressed: false
458 highlightWhenPressed: false
448
459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449 onMenuModelChanged: {
464 onMenuModelChanged: {
450 loadAttributes();
465 loadAttributes();
451 }
466 }
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
37 property int modelIndex: 0
37 property int modelIndex: 0
38 property var data
38 property var data
39
39
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
40 onLoaded: {
45 onLoaded: {
41 if (item.hasOwnProperty("menuData")) {
46 if (item.hasOwnProperty("menuData")) {
42 item.menuData = data;
47 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736 }
741 }
742+
743+ function test_lp1336715_broken_checkbox_bindings() {
744+ menuData.type = "com.canonical.indicator.switch";
745+ menuData.sensitive = true;
746+ menuData.isToggled = false;
747+
748+ loader.data = menuData;
749+ loader.sourceComponent = factory.load(menuData);
750+
751+ compare(loader.item.checked, false, "Loader did not load check state");
752+ mouseClick(loader.item,
753+ loader.item.width / 2, loader.item.height / 2);
754+ compare(loader.item.checked, true, "Clicking switch menu should toggle check");
755+
756+ menuData.isToggled = true; // toggled will not update in mock
757+ menuData.isToggled = false;
758+
759+ compare(loader.item.checked, false, "Server updates no longer working");
760+ }
737 }
761 }
738}
762}