From 08a853afa3f76ec24a175e37bff43dc18ef781b1 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Wed, 25 Jul 2018 17:36:13 +0100 Subject: [PATCH] JAL-3073 select columns if dragging sideways in a graph annotation --- src/jalview/gui/AnnotationPanel.java | 112 ++++++++++++++++++++++++++-------- src/jalview/gui/ScalePanel.java | 7 +-- 2 files changed, 91 insertions(+), 28 deletions(-) diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index dee56b0..19577ee 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -75,6 +75,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, MouseListener, MouseWheelListener, MouseMotionListener, ActionListener, AdjustmentListener, Scrollable, ViewportListenerI { + enum DragMode + { + Select, Resize, Undefined + }; + String HELIX = MessageManager.getString("label.helix"); String SHEET = MessageManager.getString("label.sheet"); @@ -118,11 +123,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, // Used For mouse Dragging and resizing graphs int graphStretch = -1; - int graphStretchY = -1; + int mouseDragLastX = -1; - int min; // used by mouseDragged to see if user + int mouseDragLastY = -1; - int max; // used by mouseDragged to see if user + DragMode dragMode = DragMode.Undefined; boolean mouseDragging = false; @@ -497,10 +502,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } /** - * DOCUMENT ME! + * Action on right mouse pressed on Mac is to show a pop-up menu for the + * annotation. Action on left mouse pressed is to find which annotation is + * pressed and mark the start of a column selection or graph resize operation. * * @param evt - * DOCUMENT ME! */ @Override public void mousePressed(MouseEvent evt) @@ -511,7 +517,13 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, { return; } + mouseDragLastX = evt.getX(); + mouseDragLastY = evt.getY(); + /* + * add visible annotation heights until we reach the y + * position, to find which annotation it is in + */ int height = 0; activeRow = -1; @@ -531,11 +543,11 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } else if (aa[i].graph > 0) { - // Stretch Graph + /* + * we have clicked on a resizable graph annotation + */ graphStretch = i; - graphStretchY = y; } - break; } } @@ -601,17 +613,20 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, } /** - * DOCUMENT ME! + * Action on mouse up is to clear mouse drag data and call mouseReleased on + * ScalePanel, to deal with defining the selection group (if any) defined by + * the mouse drag * * @param evt - * DOCUMENT ME! */ @Override public void mouseReleased(MouseEvent evt) { graphStretch = -1; - graphStretchY = -1; + mouseDragLastX = -1; + mouseDragLastY = -1; mouseDragging = false; + dragMode = DragMode.Undefined; ap.getScalePanel().mouseReleased(evt); /* @@ -658,24 +673,73 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, @Override public void mouseDragged(MouseEvent evt) { - if (graphStretch > -1) + /* + * todo: if dragMode is Undefined: + * - set to Select if dx > dy + * - set to Resize if dy > dx + * - do nothing if dx == dy + */ + final int x = evt.getX(); + final int y = evt.getY(); + if (dragMode == DragMode.Undefined) { - av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight += graphStretchY - - evt.getY(); - if (av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight < 0) + int dx = Math.abs(x - mouseDragLastX); + int dy = Math.abs(y - mouseDragLastY); + if (graphStretch == -1 || dx > dy) + { + /* + * mostly horizontal drag, or not a graph annotation + */ + dragMode = DragMode.Select; + } + else if (dy > dx) { - av.getAlignment() - .getAlignmentAnnotation()[graphStretch].graphHeight = 0; + /* + * mostly vertical drag + */ + dragMode = DragMode.Resize; } - graphStretchY = evt.getY(); - adjustPanelHeight(); - ap.paintAlignment(false, false); } - else + + if (dragMode == DragMode.Undefined) + { + /* + * drag is diagonal - defer deciding whether to + * treat as up/down or left/right + */ + return; + } + + try + { + if (dragMode == DragMode.Resize) + { + /* + * resize graph annotation if mouse was dragged up or down + */ + int deltaY = mouseDragLastY - evt.getY(); + if (deltaY != 0) + { + AlignmentAnnotation graphAnnotation = av.getAlignment() + .getAlignmentAnnotation()[graphStretch]; + int newHeight = Math.max(0, graphAnnotation.graphHeight + deltaY); + graphAnnotation.graphHeight = newHeight; + adjustPanelHeight(); + ap.paintAlignment(false, false); + } + } + else + { + /* + * for mouse drag left or right, delegate to + * ScalePanel to adjust the column selection + */ + ap.getScalePanel().mouseDragged(evt); + } + } finally { - ap.getScalePanel().mouseDragged(evt); + mouseDragLastX = x; + mouseDragLastY = y; } } diff --git a/src/jalview/gui/ScalePanel.java b/src/jalview/gui/ScalePanel.java index ea4b42b..6a44d06 100755 --- a/src/jalview/gui/ScalePanel.java +++ b/src/jalview/gui/ScalePanel.java @@ -267,10 +267,10 @@ public class ScalePanel extends JPanel } /** - * DOCUMENT ME! + * Action on mouseUp is to set the limit of the current selection group (if + * there is one) and broadcast the selection * * @param evt - * DOCUMENT ME! */ @Override public void mouseReleased(MouseEvent evt) @@ -278,15 +278,14 @@ public class ScalePanel extends JPanel mouseDragging = false; ap.getSeqPanel().stopScrolling(); + // todo res calculation should be a method on AlignViewport int res = (evt.getX() / av.getCharWidth()) + av.getRanges().getStartRes(); - if (av.hasHiddenColumns()) { res = av.getAlignment().getHiddenColumns() .visibleToAbsoluteColumn(res); } - res = Math.min(res, av.getAlignment().getWidth() - 1); if (!stretchingGroup) -- 1.7.10.2