diff --git a/fsl/fsleyes/displaycontext/vectoropts.py b/fsl/fsleyes/displaycontext/vectoropts.py index 7d0dab1667feb3256f8b08e1d6e8fc0a266f1741..7a270265810f0d21b08c4f75860a0bb26941e014 100644 --- a/fsl/fsleyes/displaycontext/vectoropts.py +++ b/fsl/fsleyes/displaycontext/vectoropts.py @@ -93,7 +93,9 @@ class VectorOpts(volumeopts.Nifti1Opts): volumeopts.Nifti1Opts.__init__(self, *args, **kwargs) - if self.getParent() is not None: + self.__registered = self.getParent() is not None + + if self.__registered: self.overlayList.addListener('overlays', self.name, @@ -101,6 +103,14 @@ class VectorOpts(volumeopts.Nifti1Opts): self .addListener('clipImage', self.name, self.__clipImageChanged) + + if not self.isSyncedToParent('modulateImage'): + self.__refreshAuxImage('modulateImage') + if not self.isSyncedToParent('clipImage'): + self.__refreshAuxImage('clipImage') + if not self.isSyncedToParent('colourImage'): + self.__refreshAuxImage('colourImage') + else: self.__overlayListChanged() self.__clipImageChanged() @@ -110,8 +120,9 @@ class VectorOpts(volumeopts.Nifti1Opts): """Removes some property listeners, and calls the :meth:`.Nifti1Opts.destroy` method. """ - self.overlayList.removeListener('overlays', self.name) - self .removeListener('clipImage', self.name) + if self.__registered: + self.overlayList.removeListener('overlays', self.name) + self .removeListener('clipImage', self.name) volumeopts.Nifti1Opts.destroy(self) @@ -145,27 +156,35 @@ class VectorOpts(volumeopts.Nifti1Opts): image. """ - modProp = self.getProp('modulateImage') - clipProp = self.getProp('clipImage') - colourProp = self.getProp('colourImage') - modVal = self.modulateImage - clipVal = self.clipImage - colourVal = self.colourImage - overlays = self.displayCtx.getOrderedOverlays() + overlays = self.displayCtx.getOrderedOverlays() # the image for this VectorOpts # instance has been removed if self.overlay not in overlays: - self.overlayList.removeListener('overlays', self.name) return + + self.__refreshAuxImage('modulateImage') + self.__refreshAuxImage('clipImage') + self.__refreshAuxImage('colourImage') + + + def __refreshAuxImage(self, imageName): + """Updates the named image property (:attr:`modulateImage`, + :attr:`colourImage` or :attr:`clipImage`) so that it contains a list + of overlays which could be used to modulate the vector image. + """ + + prop = self.getProp(imageName) + val = self.modulateImage + overlays = self.displayCtx.getOrderedOverlays() options = [None] for overlay in overlays: # It doesn't make sense to - # modulate/clip the image by - # itself. + # modulate/clip/colour the + # image by itself. if overlay is self.overlay: continue @@ -184,16 +203,10 @@ class VectorOpts(volumeopts.Nifti1Opts): options.append(overlay) - modProp .setChoices(options, instance=self) - clipProp .setChoices(options, instance=self) - colourProp.setChoices(options, instance=self) - - if modVal in options: self.modulateImage = modVal - else: self.modulateImage = None - if clipVal in options: self.clipImage = clipVal - else: self.clipImage = None - if colourVal in options: self.colourImage = colourVal - else: self.colourImage = None + prop.setChoices(options, instance=self) + + if val in options: setattr(self, imageName, val) + else: setattr(self, imageName, None) class LineVectorOpts(VectorOpts): diff --git a/fsl/fsleyes/frame.py b/fsl/fsleyes/frame.py index ea6675c3d4412f6bc566897a1470f7746b5d2461..a2f467e3eb381bfb89d35fcdde2f0126283a915f 100644 --- a/fsl/fsleyes/frame.py +++ b/fsl/fsleyes/frame.py @@ -452,7 +452,22 @@ class FSLEyesFrame(wx.Frame): if numPanels >= 1 and wasCentre: paneInfo = self.__auiManager.GetPane(self.__viewPanels[0]) paneInfo.Centre().Dockable(False).CaptionVisible(numPanels > 1) - + + # If there's only one panel left, + # and it is a canvas panel, sync + # its display properties to the + # master display context. + if numPanels == 1 and \ + isinstance(self.__viewPanels[0], views.CanvasPanel): + dctx = self.__viewPanels[0].getDisplayContext() + + # TODO Currently this causes the child + # context to inherit the values of the + # parent context. But we need the + # opposite - for the parent to inherit + # the values of the child. + dctx.syncOverlayDisplay = True + dctx.syncToParent('overlayOrder') def __onClose(self, ev): """Called when the user closes this ``FSLEyesFrame``.