** Description changed: Often a CheckBox/Switch is used to show the value of a property outside of the CheckBox. For example: Switch { id: hiddenSwitch checked: !header.exposed onClicked: header.exposed = !header.exposed } At first look, this code may seem fine, but clicking the switch will trigger checked = !checked, which breaks the binding, so if header.exposed updates because of events happening outside of the switch, the switch will be out-of-sync. + Perhaps we need to add some properties to the CheckBox: + + CheckBox { + property Object bindTarget + property string bindProperty + } + + and then the behavior of this: + Switch { + id: exposedSwitch + bindTarget: header + bindProperty: "exposed" + } + + can do what we want: the switch shows the value of "exposed", and + clicking the switch should update the "exposed" value (which in turn + will update the state of the switch). + + Note that in this case we could not track "!exposed", so if we need + that, some more complicated solution is needed. + --- update 2015-09-11 (thanks Christian) --- It appears to work like this: Switch { - id: hiddenSwitch - checked: header.exposed - function trigger() { header.exposed = !header.exposed; } + id: hiddenSwitch + checked: header.exposed + function trigger() { header.exposed = !header.exposed; } } so DON'T use the onClicked or onTriggered signal as you would expect, but override the trigger() function. We need to document this.
-- You received this bug notification because you are a member of Ubuntu Touch seeded packages, which is subscribed to ubuntu-ui-toolkit in Ubuntu. https://bugs.launchpad.net/bugs/1494387 Title: CheckBox needs to track external properties Status in ubuntu-ui-toolkit package in Ubuntu: Confirmed Bug description: Often a CheckBox/Switch is used to show the value of a property outside of the CheckBox. For example: Switch { id: hiddenSwitch checked: !header.exposed onClicked: header.exposed = !header.exposed } At first look, this code may seem fine, but clicking the switch will trigger checked = !checked, which breaks the binding, so if header.exposed updates because of events happening outside of the switch, the switch will be out-of-sync. Perhaps we need to add some properties to the CheckBox: CheckBox { property Object bindTarget property string bindProperty } and then the behavior of this: Switch { id: exposedSwitch bindTarget: header bindProperty: "exposed" } can do what we want: the switch shows the value of "exposed", and clicking the switch should update the "exposed" value (which in turn will update the state of the switch). Note that in this case we could not track "!exposed", so if we need that, some more complicated solution is needed. --- update 2015-09-11 (thanks Christian) --- It appears to work like this: Switch { id: hiddenSwitch checked: header.exposed function trigger() { header.exposed = !header.exposed; } } so DON'T use the onClicked or onTriggered signal as you would expect, but override the trigger() function. We need to document this. To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/ubuntu-ui-toolkit/+bug/1494387/+subscriptions -- Mailing list: https://launchpad.net/~touch-packages Post to : touch-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~touch-packages More help : https://help.launchpad.net/ListHelp