From 230b5de09eda879e9b6078faacecc6d1f7659f35 Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Wed, 15 Sep 2021 15:55:46 +0100 Subject: [PATCH] JAL-3638 JAL-3680 fix docs for Alt + Arrow LRUD in cursor mode. help/help/html/keys.html --- help/help/html/keys.html | 5 ++- src/jalview/gui/AlignFrame.java | 8 ++-- src/jalview/gui/SeqPanel.java | 85 +++++++++++++++++++++++++++------------ 3 files changed, 67 insertions(+), 31 deletions(-) diff --git a/help/help/html/keys.html b/help/help/html/keys.html index 29b6813..0faa1d5 100755 --- a/help/help/html/keys.html +++ b/help/help/html/keys.html @@ -81,7 +81,10 @@ Cursor Keys
(Arrow Keys)
Cursor - Move cursor around alignment + Move cursor around alignment.
Press SHIFT to move + cursor from an aligned region to next gap, or to the next + aligned region when at a gap. + Cursor Keys
(Arrow Keys) diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 5370437..aa5cd99 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -565,7 +565,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (viewport.cursorMode) { - alignPanel.getSeqPanel().moveCursor(0, 1); + alignPanel.getSeqPanel().moveCursor(0, 1, evt.isShiftDown()); } break; @@ -576,7 +576,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (viewport.cursorMode) { - alignPanel.getSeqPanel().moveCursor(0, -1); + alignPanel.getSeqPanel().moveCursor(0, -1,evt.isShiftDown()); } break; @@ -589,7 +589,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - alignPanel.getSeqPanel().moveCursor(-1, 0); + alignPanel.getSeqPanel().moveCursor(-1, 0, evt.isShiftDown()); } break; @@ -601,7 +601,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } else { - alignPanel.getSeqPanel().moveCursor(1, 0); + alignPanel.getSeqPanel().moveCursor(1, 0, evt.isShiftDown()); } break; diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 163ae25..454a730 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -483,47 +483,80 @@ public class SeqPanel extends JPanel void moveCursor(int dx, int dy) { - seqCanvas.cursorX += dx; - seqCanvas.cursorY += dy; - + moveCursor(dx, dy,false); + } + void moveCursor(int dx, int dy, boolean nextWord) + { HiddenColumns hidden = av.getAlignment().getHiddenColumns(); - if (av.hasHiddenColumns() && !hidden.isVisible(seqCanvas.cursorX)) + if (nextWord) { - int original = seqCanvas.cursorX - dx; int maxWidth = av.getAlignment().getWidth(); - - if (!hidden.isVisible(seqCanvas.cursorX)) - { - int visx = hidden.absoluteToVisibleColumn(seqCanvas.cursorX - dx); - int[] region = hidden.getRegionWithEdgeAtRes(visx); - - if (region != null) // just in case + int maxHeight=av.getAlignment().getHeight(); + SequenceI seqAtRow = av.getAlignment().getSequenceAt(seqCanvas.cursorY); + // look for next gap or residue + boolean isGap = Comparison.isGap(seqAtRow.getCharAt(seqCanvas.cursorX)); + int p = seqCanvas.cursorX,lastP,r=seqCanvas.cursorY,lastR; + do + { + lastP = p; + lastR = r; + if (dy != 0) { - if (dx == 1) + r += dy; + if (r < 0) { - // moving right - seqCanvas.cursorX = region[1] + 1; + r = 0; } - else if (dx == -1) + if (r >= maxHeight) { - // moving left - seqCanvas.cursorX = region[0] - 1; + r = maxHeight - 1; } + seqAtRow = av.getAlignment().getSequenceAt(r); } - seqCanvas.cursorX = (seqCanvas.cursorX < 0) ? 0 : seqCanvas.cursorX; - } + p = nextVisible(hidden, maxWidth, p, dx); + } while ((dx != 0 ? p != lastP : r != lastR) + && isGap == Comparison.isGap(seqAtRow.getCharAt(p))); + seqCanvas.cursorX=p; + seqCanvas.cursorY=r; + } else { + int maxWidth = av.getAlignment().getWidth(); + seqCanvas.cursorX = nextVisible(hidden, maxWidth, seqCanvas.cursorX, dx); + seqCanvas.cursorY += dy; + } + scrollToVisible(false); + } - if (seqCanvas.cursorX >= maxWidth - || !hidden.isVisible(seqCanvas.cursorX)) + private int nextVisible(HiddenColumns hidden,int maxWidth, int original, int dx) + { + int newCursorX=original+dx; + if (av.hasHiddenColumns() && !hidden.isVisible(newCursorX)) + { + int visx = hidden.absoluteToVisibleColumn(newCursorX - dx); + int[] region = hidden.getRegionWithEdgeAtRes(visx); + + if (region != null) // just in case { - seqCanvas.cursorX = original; + if (dx == 1) + { + // moving right + newCursorX = region[1] + 1; + } + else if (dx == -1) + { + // moving left + newCursorX = region[0] - 1; + } } } - - scrollToVisible(false); + newCursorX = (newCursorX < 0) ? 0 : newCursorX; + if (newCursorX >= maxWidth + || !hidden.isVisible(newCursorX)) + { + newCursorX = original; + } + return newCursorX; } - /** * Scroll to make the cursor visible in the viewport. * -- 1.7.10.2