Merge pull request #6332 from jasongrout/widget-property-lock

Widget property lock should compare json states, not python states
Jonathan Frederic 12 years ago
commit 1b29be13c6

@ -203,9 +203,7 @@ class Widget(LoggingConfigurable):
raise ValueError("key must be a string, an iterable of keys, or None")
state = {}
for k in keys:
f = self.trait_metadata(k, 'to_json')
if f is None:
f = self._trait_to_json
f = self.trait_metadata(k, 'to_json', self._trait_to_json)
value = getattr(self, k)
state[k] = f(value)
return state
@ -256,6 +254,8 @@ class Widget(LoggingConfigurable):
def _lock_property(self, key, value):
"""Lock a property-value pair.
The value should be the JSON state of the property.
NOTE: This, in addition to the single lock for all state changes, is
flawed. In the future we may want to look into buffering state changes
back to the front-end."""
@ -281,7 +281,9 @@ class Widget(LoggingConfigurable):
def _should_send_property(self, key, value):
"""Check the property lock (property_lock)"""
if (key == self._property_lock[0] and value == self._property_lock[1]):
to_json = self.trait_metadata(key, 'to_json', self._trait_to_json)
if (key == self._property_lock[0]
and to_json(value) == self._property_lock[1]):
return False
elif self._send_state_lock > 0:
self._states_to_send.add(key)
@ -312,12 +314,10 @@ class Widget(LoggingConfigurable):
"""Called when a state is received from the front-end."""
for name in self.keys:
if name in sync_data:
f = self.trait_metadata(name, 'from_json')
if f is None:
f = self._trait_from_json
value = f(sync_data[name])
with self._lock_property(name, value):
setattr(self, name, value)
json_value = sync_data[name]
from_json = self.trait_metadata(name, 'from_json', self._trait_from_json)
with self._lock_property(name, json_value):
setattr(self, name, from_json(json_value))
def _handle_custom_msg(self, content):
"""Called when a custom msg is received."""

Loading…
Cancel
Save