diff --git a/fsl/fslview/displaycontext/modelopts.py b/fsl/fslview/displaycontext/modelopts.py index 0c5ef4c009d2892309b8d98ef6e908156ae472f8..b8089fb202db66933f65a3d96eb05d60e442feaf 100644 --- a/fsl/fslview/displaycontext/modelopts.py +++ b/fsl/fslview/displaycontext/modelopts.py @@ -56,7 +56,18 @@ class ModelOpts(fsldisplay.DisplayOpts): self.name, self.__overlayListChanged) - self.addListener('refImage', self.name, self.__refImageChanged) + # This attribute tracks the name of the + # space-related property (refImage, + # coordSpace, or transform) which most + # recently changed. It is updated by + # the corresponding listener callbacks, + # and used by the transformDisplayLocation + # method. + self.__lastPropChanged = None + + self.addListener('refImage', self.name, self.__refImageChanged) + self.addListener('transform', self.name, self.__transformChanged) + self.addListener('coordSpace', self.name, self.__coordSpaceChanged) self.__overlayListChanged() @@ -71,7 +82,6 @@ class ModelOpts(fsldisplay.DisplayOpts): fsldisplay.DisplayOpts.destroy(self) - def getReferenceImage(self): """Overrides :meth:`.DisplayOpts.getReferenceIamge`. @@ -81,19 +91,6 @@ class ModelOpts(fsldisplay.DisplayOpts): if self.refImage == 'none': return None return self.refImage - - - def getDisplayBounds(self): - - lo, hi = self.overlay.getBounds() - xform = self.getCoordSpaceTransform() - - if xform is None: - return lo, hi - - lohi = transform.transform([lo, hi], xform) - - return lohi[0, :], lohi[1, :] def getCoordSpaceTransform(self): @@ -109,9 +106,10 @@ class ModelOpts(fsldisplay.DisplayOpts): return opts.getTransform(self.coordSpace, self.transform) - def transformDisplayLocation(self, propName, oldLoc): + def transformDisplayLocation(self, oldLoc): - newLoc = oldLoc + newLoc = oldLoc + propName = self.__lastPropChanged if propName == 'refImage': @@ -154,9 +152,23 @@ class ModelOpts(fsldisplay.DisplayOpts): return newLoc + def __transformChanged(self, *a): + self.__lastPropChanged = 'transform' + self.__updateBounds() + + + def __coordSpaceChanged(self, *a): + self.__lastPropChanged = 'coordSpace' + self.__updateBounds() + + def __refImageChanged(self, *a): - if self.__oldRefImage != 'none': + self.__lastPropChanged = 'refImage' + + if self.__oldRefImage != 'none' and \ + self.__oldRefImage in self._overlayList: + opts = self.displayCtx.getOpts(self.__oldRefImage) self.unbindProps('transform', opts) @@ -165,6 +177,25 @@ class ModelOpts(fsldisplay.DisplayOpts): if self.refImage != 'none': opts = self.displayCtx.getOpts(self.refImage) self.bindProps('transform', opts) + + self.__updateBounds() + + + def __updateBounds(self): + """Called whenever any of the :attr:`refImage`, :attr:`coordSpace`, + or :attr:`transform` properties change. + + Updates the :attr:`.DisplayOpts.bounds` property accordingly. + """ + + lo, hi = self.overlay.getBounds() + xform = self.getCoordSpaceTransform() + + if xform is not None: + lohi = transform.transform([lo, hi], xform) + lo, hi = lohi[0, :], lohi[1, :] + + self.bounds = [lo[0], hi[0], lo[1], hi[1], lo[2], hi[2]] def __overlayListChanged(self, *a): diff --git a/fsl/fslview/gl/glmodel.py b/fsl/fslview/gl/glmodel.py index a1d339292e7306e4c130a4a06c7a1b80153cdfbc..187667583afecec287a9e8e759196457ea57d382 100644 --- a/fsl/fslview/gl/glmodel.py +++ b/fsl/fslview/gl/glmodel.py @@ -101,7 +101,8 @@ class GLModel(globject.GLObject): def getDisplayBounds(self): - return self.opts.getDisplayBounds() + return (self.opts.bounds.getLo(), + self.opts.bounds.getHi()) def getDataResolution(self, xax, yax):