on xenial help sign in
Added timer to re-assert server value after indicator menu item activation. Fixes: 1336715
f4aa9acNick Dedekind
qml/Panel/Indicators/MenuItemFactory.qml+36−8
@@ -290,12 +290,26 @@ Item {
290 checked: serverChecked
290 checked: serverChecked
291 highlightWhenPressed: false
291 highlightWhenPressed: false
292
292
293− onServerCheckedChanged: {
293+ onServerCheckedChanged: updateFromServer()
294− // value can be changed by menu, so a binding won't work.
295− checked = serverChecked;
296− }
297 onTriggered: {
294 onTriggered: {
298 menuModel.activate(menuIndex);
295 menuModel.activate(menuIndex);
296+ resyncTimer.restart();
297+ }
298+
299+ // value can be changed by menu, so a binding won't work.
300+ function updateFromServer() {
301+ resyncTimer.stop();
302+ if (checked != serverChecked) {
303+ checked = serverChecked;
304+ }
305+ }
306+
307+ // Server value is not guaranteed to change to what we expect from an activation.
308+ // In this case, we need to re-assert that we are presenting the UI with the set backend value.
309+ Timer {
310+ id: resyncTimer
311+ interval: 1500
312+ onTriggered: updateFromServer()
299 }
313 }
300 }
314 }
301 }
315 }
@@ -315,12 +329,26 @@ Item {
315 checked: serverChecked
329 checked: serverChecked
316 highlightWhenPressed: false
330 highlightWhenPressed: false
317
331
318− onServerCheckedChanged: {
332+ onServerCheckedChanged: updateFromServer()
319− // value can be changed by menu, so a binding won't work.
320− checked = serverChecked;
321− }
322 onTriggered: {
333 onTriggered: {
323 menuModel.activate(menuIndex);
334 menuModel.activate(menuIndex);
335+ resyncTimer.restart();
336+ }
337+
338+ // value can be changed by menu, so a binding won't work.
339+ function updateFromServer() {
340+ resyncTimer.stop();
341+ if (checked != serverChecked) {
342+ checked = serverChecked;
343+ }
344+ }
345+
346+ // Server value is not guaranteed to change to what we expect from an activation.
347+ // In this case, we need to re-assert that we are presenting the UI with the set backend value.
348+ Timer {
349+ id: resyncTimer
350+ interval: 1500
351+ onTriggered: updateFromServer()
324 }
352 }
325 }
353 }
326 }
354 }
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+17−1
@@ -740,7 +740,7 @@ Item {
740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
740 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
741 }
741 }
742
742
743− function test_lp1336715_broken_checkbox_bindings() {
743+ function test_lp1336715_broken_switch_bindings() {
744 menuData.type = "com.canonical.indicator.switch";
744 menuData.type = "com.canonical.indicator.switch";
745 menuData.sensitive = true;
745 menuData.sensitive = true;
746 menuData.isToggled = false;
746 menuData.isToggled = false;
@@ -758,5 +758,21 @@ Item {
758
758
759 compare(loader.item.checked, false, "Server updates no longer working");
759 compare(loader.item.checked, false, "Server updates no longer working");
760 }
760 }
761+
762+ // test that the server value is re-aserted if it is not confirmed.
763+ function test_lp1336715_switch_server_value_reassertion() {
764+ menuData.type = "com.canonical.indicator.switch";
765+ menuData.sensitive = true;
766+ menuData.isToggled = false;
767+
768+ loader.data = menuData;
769+ loader.sourceComponent = factory.load(menuData);
770+
771+ compare(loader.item.checked, false, "Loader did not load check state");
772+ mouseClick(loader.item,
773+ loader.item.width / 2, loader.item.height / 2);
774+ compare(loader.item.checked, true, "Clicking switch menu should toggle check");
775+ tryCompare(loader.item, "checked", false);
776+ }
761 }
777 }
762}
778}