From 055b05bfb8c8c2f2a6003dbef0ccb69d87d6e759 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Fri, 4 Mar 2016 17:03:13 +0000 Subject: [PATCH] Edit profile had been broken by changes to annotations in commit 28df70c. Also, mouse-wheel changing of selection cursor size was not working due to weird mapping in profilemap.py. --- fsl/fsleyes/gl/annotations.py | 19 ++-- fsl/fsleyes/gl/resources.py | 2 +- fsl/fsleyes/profiles/orthoeditprofile.py | 122 +++++++++++++++++------ fsl/fsleyes/profiles/profilemap.py | 4 +- 4 files changed, 108 insertions(+), 39 deletions(-) diff --git a/fsl/fsleyes/gl/annotations.py b/fsl/fsleyes/gl/annotations.py index e73348e82..40aaccb31 100644 --- a/fsl/fsleyes/gl/annotations.py +++ b/fsl/fsleyes/gl/annotations.py @@ -31,10 +31,11 @@ import logging import numpy as np import OpenGL.GL as gl -import fsl.fsleyes.gl.globject as globject -import fsl.fsleyes.gl.routines as glroutines -import fsl.fsleyes.gl.textures as textures -import fsl.utils.transform as transform +import fsl.fsleyes.gl.globject as globject +import fsl.fsleyes.gl.routines as glroutines +import fsl.fsleyes.gl.resources as glresources +import fsl.fsleyes.gl.textures as textures +import fsl.utils.transform as transform log = logging.getLogger(__name__) @@ -525,9 +526,13 @@ class VoxelSelection(AnnotationObject): self.displayToVoxMat = displayToVoxMat self.voxToDisplayMat = voxToDisplayMat self.offsets = offsets + + texName = '{}_{}'.format(type(self).__name__, id(selection)) - self.texture = textures.SelectionTexture( - '{}_{}'.format(type(self).__name__, id(selection)), + self.texture = glresources.get( + texName, + textures.SelectionTexture, + texName, selection) @@ -535,7 +540,7 @@ class VoxelSelection(AnnotationObject): """Must be called when this ``VoxelSelection`` is no longer needed. Destroys the :class:`.SelectionTexture`. """ - self.texture.destroy() + glresources.delete(self.texture.getTextureName()) self.texture = None diff --git a/fsl/fsleyes/gl/resources.py b/fsl/fsleyes/gl/resources.py index 7df347ca5..a80ef172a 100644 --- a/fsl/fsleyes/gl/resources.py +++ b/fsl/fsleyes/gl/resources.py @@ -46,7 +46,7 @@ texture, and will increase its reference count:: interp=gl.GL_LINEAR) -.. note:: Here, we have used ``'myTexture'`` as the resource key in practice, +.. note:: Here, we have used ``'myTexture'`` as the resource key. In practice, you will need to use something that is guaranteed to be unique throughout your application. diff --git a/fsl/fsleyes/profiles/orthoeditprofile.py b/fsl/fsleyes/profiles/orthoeditprofile.py index 2b8caa54f..b0ecc4578 100644 --- a/fsl/fsleyes/profiles/orthoeditprofile.py +++ b/fsl/fsleyes/profiles/orthoeditprofile.py @@ -194,7 +194,9 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): self.__xcanvas = viewPanel.getXCanvas() self.__ycanvas = viewPanel.getYCanvas() self.__zcanvas = viewPanel.getZCanvas() - self.__selAnnotation = None + self.__xselAnnotation = None + self.__yselAnnotation = None + self.__zselAnnotation = None self.__selecting = False self.__currentOverlay = None @@ -239,14 +241,29 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): editor.removeListener('canRedo', self._name) editor.destroy() - if self.__selAnnotation is not None: - self.__selAnnotaiton.destroy() + xannot = self.__xcanvas.getAnnotations() + yannot = self.__ycanvas.getAnnotations() + zannot = self.__zcanvas.getAnnotations() + + if self.__xselAnnotation is not None: + xannot.dequeue(self.__xselAnnotation, hold=True) + self.__xselAnnotaiton.destroy() + + if self.__yselAnnotation is not None: + yannot.dequeue(self.__yselAnnotation, hold=True) + self.__yselAnnotaiton.destroy() + + if self.__zselAnnotation is not None: + zannot.dequeue(self.__zselAnnotation, hold=True) + self.__zselAnnotaiton.destroy() self.__editors = None self.__xcanvas = None self.__ycanvas = None self.__zcanvas = None - self.__selAnnotation = None + self.__xselAnnotation = None + self.__yselAnnotation = None + self.__zselAnnotation = None self.__currentOverlay = None orthoviewprofile.OrthoViewProfile.destroy(self) @@ -256,14 +273,26 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): """Destroys all :mod:`.annotations`, and calls :meth:`.OrthoViewProfile.deregister`. """ - if self.__selAnnotation is not None: - sa = self.__selAnnotation - self.__xcanvas.getAnnotations().dequeue(sa, hold=True) - self.__ycanvas.getAnnotations().dequeue(sa, hold=True) - self.__zcanvas.getAnnotations().dequeue(sa, hold=True) - sa.destroy() - - self.__selAnnotation = None + + xannot = self.__xcanvas.getAnnotations() + yannot = self.__ycanvas.getAnnotations() + zannot = self.__zcanvas.getAnnotations() + + if self.__xselAnnotation is not None: + xannot.dequeue(self.__xselAnnotation, hold=True) + self.__xselAnnotation.destroy() + + if self.__yselAnnotation is not None: + yannot.dequeue(self.__yselAnnotation, hold=True) + self.__yselAnnotation.destroy() + + if self.__zselAnnotation is not None: + zannot.dequeue(self.__zselAnnotation, hold=True) + self.__zselAnnotation.destroy() + + self.__xselAnnotation = None + self.__yselAnnotation = None + self.__zselAnnotation = None orthoviewprofile.OrthoViewProfile.deregister(self) @@ -359,7 +388,7 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): editor.getSelection().enableNotification('selection') self.__selectionChanged() - self.__selAnnotation.texture.refresh() + self.__xselAnnotation.texture.refresh() self._viewPanel.Refresh() @@ -374,12 +403,14 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): editor = self.__editors[self.__currentOverlay] + # See comment in undo method + # about disabling notification editor.getSelection().disableNotification('selection') editor.redo() editor.getSelection().enableNotification('selection') self.__selectionChanged() - self.__selAnnotation.texture.refresh() + self.__xselAnnotation.texture.refresh() self._viewPanel.Refresh() @@ -409,8 +440,14 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): Updates the :mod:`.annotations` colours accordingly. """ - if self.__selAnnotation is not None: - self.__selAnnotation.colour = self.selectionOverlayColour + if self.__xselAnnotation is not None: + self.__xselAnnotation.colour = self.selectionOverlayColour + + if self.__yselAnnotation is not None: + self.__yselAnnotation.colour = self.selectionOverlayColour + + if self.__zselAnnotation is not None: + self.__zselAnnotation.colour = self.selectionOverlayColour def __setFillValueLimits(self, overlay): @@ -483,14 +520,21 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): zannot = self.__zcanvas.getAnnotations() # Clear the selection annotation - if self.__selAnnotation is not None: - xannot.dequeue(self.__selAnnotation, hold=True) - yannot.dequeue(self.__selAnnotation, hold=True) - zannot.dequeue(self.__selAnnotation, hold=True) + if self.__xselAnnotation is not None: + xannot.dequeue(self.__xselAnnotation, hold=True) + self.__xselAnnotation.destroy() + + if self.__yselAnnotation is not None: + yannot.dequeue(self.__yselAnnotation, hold=True) + self.__yselAnnotation.destroy() - self.__selAnnotation.destroy() + if self.__zselAnnotation is not None: + zannot.dequeue(self.__zselAnnotation, hold=True) + self.__zselAnnotation.destroy() - self.__selAnnotation = None + self.__xselAnnotation = None + self.__yselAnnotation = None + self.__zselAnnotation = None # Remove property listeners from the # editor/selection instances associated @@ -604,15 +648,33 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): # Create a selection annotation and # queue it on the canvases for drawing - self.__selAnnotation = annotations.VoxelSelection( + self.__xselAnnotation = annotations.VoxelSelection( + self.__xcanvas.xax, + self.__xcanvas.yax, + editor.getSelection(), + opts.getTransform('pixdim', 'voxel'), + opts.getTransform('voxel', 'pixdim'), + colour=self.selectionOverlayColour) + + self.__yselAnnotation = annotations.VoxelSelection( + self.__ycanvas.xax, + self.__ycanvas.yax, editor.getSelection(), opts.getTransform('pixdim', 'voxel'), opts.getTransform('voxel', 'pixdim'), colour=self.selectionOverlayColour) + + self.__zselAnnotation = annotations.VoxelSelection( + self.__zcanvas.xax, + self.__zcanvas.yax, + editor.getSelection(), + opts.getTransform('pixdim', 'voxel'), + opts.getTransform('voxel', 'pixdim'), + colour=self.selectionOverlayColour) - xannot.obj(self.__selAnnotation, hold=True) - yannot.obj(self.__selAnnotation, hold=True) - zannot.obj(self.__selAnnotation, hold=True) + xannot.obj(self.__xselAnnotation, hold=True) + yannot.obj(self.__yselAnnotation, hold=True) + zannot.obj(self.__zselAnnotation, hold=True) self._viewPanel.Refresh() @@ -674,9 +736,11 @@ class OrthoEditProfile(orthoviewprofile.OrthoViewProfile): kwargs = {'colour' : self.selectionCursorColour, 'width' : 2} - cursors = [annotations.Rect((0, 0), 0, 0, **kwargs), - annotations.Rect((0, 0), 0, 0, **kwargs), - annotations.Rect((0, 0), 0, 0, **kwargs)] + cursors = [] + + for c in canvases: + r = annotations.Rect(c.xax, c.yax, (0, 0), 0, 0, **kwargs) + cursors.append(r) # If we are running in a low # performance mode, the cursor diff --git a/fsl/fsleyes/profiles/profilemap.py b/fsl/fsleyes/profiles/profilemap.py index 16c365c1a..bc73b0a80 100644 --- a/fsl/fsleyes/profiles/profilemap.py +++ b/fsl/fsleyes/profiles/profilemap.py @@ -159,8 +159,8 @@ altHandlerMap = { (('desel', 'MiddleMouseDrag'), ('pan', 'LeftMouseDrag')), (('selint', 'MiddleMouseDrag'), ('pan', 'LeftMouseDrag')), - (('sel', 'MouseWheel'), ('chsize', 'MiddleMouse')), - (('desel', 'MouseWheel'), ('chsize', 'MiddleMouse')), + (('sel', 'MouseWheel'), ('chsize', 'MouseWheel')), + (('desel', 'MouseWheel'), ('chsize', 'MouseWheel')), (('selint', 'MouseWheel'), ('chthres', 'MouseWheel')), # Keyboard navigation works in the -- GitLab