Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions NaviNIBS/Navigator/Model/Tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@

SurfMesh = pv.PolyData

_sessionPathDependentAttribs = [
'romFilepath',
'toolStlFilepath',
'trackerStlFilepath',
'sessionPath',
]
"""
Attribs signaled as changed when a tool's session path changes, since session-relative
filepaths resolve differently afterward.
"""


@attrs.define
class Tool(GenericCollectionDictItem[str]):
Expand Down Expand Up @@ -303,12 +314,7 @@ def sessionPath(self, newPath: tp.Optional[str]):
if self._sessionPath == newPath:
return

filepathAttribs = [
'romFilepath',
'toolStlFilepath',
'trackerStlFilepath'
'sessionPath'
]
filepathAttribs = _sessionPathDependentAttribs

if self._filepathsRelTo == '<session>':
self.sigItemAboutToChange.emit(self.key, filepathAttribs)
Expand Down Expand Up @@ -656,13 +662,14 @@ def sessionPath(self, newPath: tp.Optional[str]):
if self._sessionPath == newPath:
return

changingKeys = [tool.key for tool in self.values() if tool.filepathsRelTo == '<session>']
self.sigItemsAboutToChange.emit(changingKeys)
changingKeys = [tool.key for tool in self.values() if tool.filepathsRelToKey == '<session>']
filepathAttribs = _sessionPathDependentAttribs
self.sigItemsAboutToChange.emit(changingKeys, filepathAttribs)
self._sessionPath = newPath
with self.sigItemsAboutToChange.blocked(), self.sigItemsChanged.blocked():
for tool in self.values():
tool.sessionPath = self._sessionPath
self.sigItemsChanged.emit(changingKeys)
self.sigItemsChanged.emit(changingKeys, filepathAttribs)

def asList(self) -> tp.List[tp.Dict[str, tp.Any]]:
toolList = super().asList()
Expand Down
51 changes: 51 additions & 0 deletions tests/test_Model/test_toolsSessionPath.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""
Regression tests for change signaling when a tool or tool collection's
session path changes (e.g. after save-as / session move).
"""

from NaviNIBS.Navigator.Model.Tools import Tool, Tools


def test_toolSessionPathChangeSignalsFilepathAttribs():
"""
A missing comma previously merged 'trackerStlFilepath' and 'sessionPath'
into one bogus attrib name in the signaled attrib list.
"""
tool = Tool(key='t1', usedFor='visualization',
filepathsRelTo='<session>', sessionPath='/tmp/sesA')
received = []
tool.sigItemAboutToChange.connect(lambda key, attribs=None: received.append(list(attribs)))
tool.sessionPath = '/tmp/sesB'

assert received, 'sessionPath change did not signal'
attribs = received[0]
assert 'trackerStlFilepathsessionPath' not in attribs
assert 'trackerStlFilepath' in attribs
assert 'sessionPath' in attribs


def test_toolsCollectionSessionPathChangeSignalsSessionRelativeTools():
"""
The collection-level setter previously compared the resolved
``filepathsRelTo`` path against the literal token '<session>', so
session-relative tools were never included in the signaled keys.
"""
tools = Tools(sessionPath='/tmp/sesA')
tools.addItem(Tool(key='rel', usedFor='visualization',
filepathsRelTo='<session>', sessionPath='/tmp/sesA'))
tools.addItem(Tool(key='abs', usedFor='visualization',
filepathsRelTo='<userDataDir>', sessionPath='/tmp/sesA'))

receivedAboutTo = []
receivedChanged = []
tools.sigItemsAboutToChange.connect(
lambda keys, attribs=None: receivedAboutTo.append((list(keys), attribs)))
tools.sigItemsChanged.connect(
lambda keys, attribs=None: receivedChanged.append((list(keys), attribs)))

tools.sessionPath = '/tmp/sesB'

assert receivedAboutTo and receivedChanged
assert receivedAboutTo[0][0] == ['rel']
assert receivedChanged[0][0] == ['rel']
assert 'sessionPath' in receivedChanged[0][1]