Skip to content

Commit

Permalink
Fix #1038. Ensure setting session triggers property changed messages …
Browse files Browse the repository at this point in the history
…for session, session_metadata.
  • Loading branch information
cmeyer committed May 1, 2024
1 parent b144f0e commit 7af8d2e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
2 changes: 2 additions & 0 deletions nion/swift/model/DataItem.py
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,8 @@ def __property_changed(self, name: str, value: typing.Any) -> None:
if name == "dynamic_title_enabled":
self.__dynamic_title_enabled_stream.value = value
self.notify_property_changed(name)
if name == "session":
self.notify_property_changed("session_metadata")
if name in ("title", "caption", "description"):
self.__notify_description_changed()

Expand Down
11 changes: 7 additions & 4 deletions nion/swift/model/DynamicString.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,12 @@ class ItemPropertySlug(DynamicStringSlug, typing.Generic[ItemPropertySlugType]):
"""A dynamic string slug that observes a property on an item and converts it to a string."""
def __init__(self,
property: str,
convert_fn: typing.Optional[typing.Callable[[typing.Optional[ItemPropertySlugType]], typing.Optional[str]]],
convert_fn: typing.Optional[typing.Callable[[Observable.Observable, typing.Optional[ItemPropertySlugType]], typing.Optional[str]]],
slug: str,
default_value: typing.Optional[str] = None) -> None:
super().__init__(slug, default_value)
self.__property = property
self.__convert_fn = convert_fn
self.__property_changed_event_listener: typing.Optional[Event.EventListener] = None
self.__item_value_stream = Stream.PropertyChangedEventStream[ItemPropertySlugType](self._item_stream, self.__property)
self.__item_value_stream_listener = self.__item_value_stream.value_stream.listen(weak_partial(ItemPropertySlug.__item_property_stream_value_changed, self))
self.__item_property_stream_value_changed(self.__item_value_stream.value)
Expand All @@ -93,7 +92,11 @@ def convert_to_str(value: typing.Optional[ItemPropertySlugType]) -> typing.Optio
return str(value) if value is not None else None

if self.__convert_fn:
self.value = self.__convert_fn(value)
item = self._item_stream.value
if item:
self.value = self.__convert_fn(item, value)
else:
self.value = None
else:
self.value = convert_to_str(value)

Expand Down Expand Up @@ -208,7 +211,7 @@ def make_dynamic_string(self, dynamic_string_type: str, d: Persistence.Persisten
return dynamic_string
if dynamic_string_type == "_slug_test":

def convert_metadata_to_slug_test_str(value: typing.Optional[Persistence.PersistentDictType]) -> typing.Optional[str]:
def convert_metadata_to_slug_test_str(item: Observable.Observable, value: typing.Optional[Persistence.PersistentDictType]) -> typing.Optional[str]:
if value is not None:
metadata = value
return typing.cast(typing.Optional[str], metadata.get("_slug_test", None))
Expand Down
28 changes: 28 additions & 0 deletions nion/swift/test/DataItem_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1256,6 +1256,34 @@ def test_data_item_copy_copies_session_info(self):
self.assertEqual(data_item_copy.session_metadata, data_item.session_metadata)
self.assertEqual(data_item_copy.session_id, document_model.session_id)

def test_data_item_setting_session_data_trigger_property_changed_event(self):
with TestContext.create_memory_context() as test_context:
document_model = test_context.create_document_model()
data_item = DataItem.DataItem(numpy.ones((2, 2)))
document_model.append_data_item(data_item)

received_session_changed = False
received_session_metadata_changed = False

def property_changed(name: str) -> None:
nonlocal received_session_changed, received_session_metadata_changed
if name == 'session':
received_session_changed = True
elif name == 'session_metadata':
received_session_metadata_changed = True

listener = data_item.property_changed_event.listen(property_changed)

session_metadata = data_item.session_metadata
session_metadata['site'] = 'Home'
data_item.session_metadata = session_metadata

listener = None

self.assertTrue(received_session_changed)
self.assertTrue(received_session_metadata_changed)


def test_data_item_session_id_independent_from_data_source_session_id(self):
with TestContext.create_memory_context() as test_context:
document_model = test_context.create_document_model()
Expand Down

0 comments on commit 7af8d2e

Please sign in to comment.