on xenial help sign in
Fixed indicator menu bindings to server toggle value broken by user interaction. Fixes: 1336715

Approved by: Michael Terry

commitcc2ec9bb71b57586a14f6637ab32298ac547adad authorNick Dedekind <nick.dedekind@canonical.com> dateThu 9 Oct 2014, 14:02 (12 years ago) parent6f6423a7c1af89
2 files changed+42−3
qml/Panel/Indicators/MenuItemFactory.qml+18−3 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
qml/Panel/Indicators/MenuItemFactory.qml+18−3
@@ -283,12 +283,17 @@ Item {
283283 objectName: "checkableMenu"
284284 property QtObject menuData: null
285285 property int menuIndex: -1
286+ property bool serverChecked: menuData && menuData.isToggled || false
286287
287288 text: menuData && menuData.label || ""
288289 enabled: menuData && menuData.sensitive || false
289− checked: menuData && menuData.isToggled || false
290+ checked: serverChecked
290291 highlightWhenPressed: false
291292
293+ onServerCheckedChanged: {
294+ // value can be changed by menu, so a binding won't work.
295+ checked = serverChecked;
296+ }
292297 onTriggered: {
293298 menuModel.activate(menuIndex);
294299 }
@@ -302,13 +307,18 @@ Item {
302307 objectName: "switchMenu"
303308 property QtObject menuData: null
304309 property int menuIndex: -1
310+ property bool serverChecked: menuData && menuData.isToggled || false
305311
306312 text: menuData && menuData.label || ""
307313 iconSource: menuData && menuData.icon || ""
308314 enabled: menuData && menuData.sensitive || false
309− checked: menuData && menuData.isToggled || false
315+ checked: serverChecked
310316 highlightWhenPressed: false
311317
318+ onServerCheckedChanged: {
319+ // value can be changed by menu, so a binding won't work.
320+ checked = serverChecked;
321+ }
312322 onTriggered: {
313323 menuModel.activate(menuIndex);
314324 }
@@ -431,6 +441,7 @@ Item {
431441 property var menuModel: menuFactory.menuModel
432442 property int menuIndex: -1
433443 property var extendedData: menuData && menuData.ext || undefined
444+ property bool serverChecked: menuData && menuData.isToggled || false
434445
435446 property var strengthAction: UnityMenuAction {
436447 model: menuModel
@@ -440,12 +451,16 @@ Item {
440451
441452 text: menuData && menuData.label || ""
442453 enabled: menuData && menuData.sensitive || false
443− active: menuData && menuData.isToggled || false
454+ active: serverChecked
444455 secure: getExtendedProperty(extendedData, "xCanonicalWifiApIsSecure", false)
445456 adHoc: getExtendedProperty(extendedData, "xCanonicalWifiApIsAdhoc", false)
446457 signalStrength: strengthAction.valid ? strengthAction.state : 0
447458 highlightWhenPressed: false
448459
460+ onServerCheckedChanged: {
461+ // value can be changed by menu, so a binding won't work.
462+ active = serverChecked;
463+ }
449464 onMenuModelChanged: {
450465 loadAttributes();
451466 }
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+24
@@ -37,6 +37,11 @@ Item {
3737 property int modelIndex: 0
3838 property var data
3939
40+ anchors {
41+ left: parent.left
42+ right: parent.right
43+ }
44+
4045 onLoaded: {
4146 if (item.hasOwnProperty("menuData")) {
4247 item.menuData = data;
@@ -734,5 +739,24 @@ Item {
734739 compare(loader.item.canGoPrevious, false, "CanGoPrevious should be false");
735740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
736741 }
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+ }
737761 }
738762}