X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FOverviewDimensionsShowHidden.java;h=3aa6e1b0efbf36ac008c5d09485fd02ae4bfe4cf;hb=e42eed3a0089a8a064560df4cf17a5021fd1e16a;hp=4ab27de51432318d9162a1800f303df7db1979b4;hpb=236efa0d06562386ba9a5e44764143298e0306d2;p=jalview.git diff --git a/src/jalview/viewmodel/OverviewDimensionsShowHidden.java b/src/jalview/viewmodel/OverviewDimensionsShowHidden.java index 4ab27de..3aa6e1b 100644 --- a/src/jalview/viewmodel/OverviewDimensionsShowHidden.java +++ b/src/jalview/viewmodel/OverviewDimensionsShowHidden.java @@ -32,6 +32,12 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions { private ViewportRanges ranges; + private int xdiff; // when dragging, difference in alignment units between + // start residue and original mouse click position + + private int ydiff; // when dragging, difference in alignment units between + // start sequence and original mouse click position + /** * Create an OverviewDimensions object * @@ -66,165 +72,78 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions public void updateViewportFromMouse(int mousex, int mousey, HiddenSequences hiddenSeqs, HiddenColumns hiddenCols) { + resetAlignmentDims(); + + // convert mousex and mousey to alignment units as well as + // translating to top left corner of viewport - this is an absolute position int xAsRes = getLeftXFromCentreX(mousex, hiddenCols); int yAsSeq = getTopYFromCentreY(mousey, hiddenSeqs); - updateViewportFromTopLeft(xAsRes, yAsSeq, hiddenSeqs, hiddenCols); + // convert to visible positions + int visXAsRes = hiddenCols.absoluteToVisibleColumn(xAsRes); + yAsSeq = hiddenSeqs.adjustForHiddenSeqs( + hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq)); + yAsSeq = Math.max(yAsSeq, 0); // -1 if before first visible sequence + int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq); + visYAsSeq = Math.max(visYAsSeq, 0); // -1 if before first visible sequence + + // update viewport accordingly + updateViewportFromTopLeft(visXAsRes, visYAsSeq, hiddenSeqs, hiddenCols); } @Override public void adjustViewportFromMouse(int mousex, int mousey, HiddenSequences hiddenSeqs, HiddenColumns hiddenCols) { + resetAlignmentDims(); + // calculate translation in pixel terms: // get mouse location in viewport coords, add translation in viewport // coords, // convert back to pixel coords int vpx = Math.round((float) mousex * alwidth / width); - // int visXAsRes = hiddenCols.findColumnPosition(vpx); - - int vpy = Math.round((float) mousey * alheight / sequencesHeight); - // int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy); - - System.out.println("vpx: " + vpx); - // System.out.println("VisXAsRes: " + visXAsRes); - System.out.println("transX: " + transX); - // updateViewportFromTopLeft(vpx + transX, vpy + transY, - // hiddenSeqs, - // hiddenCols); - - int xAsRes = vpx + transX; - int yAsSeq = vpy + transY; - - resetAlignmentDims(); - - if (xAsRes < 0) - { - xAsRes = 0; - } - - if (yAsSeq < 0) - { - yAsSeq = 0; - } - - // - // Convert x value to residue position - // - - // need to determine where scrollCol should be, given x - // to do this also need to know width of viewport, and some hidden column - // correction - - // convert x to residues - this is an absolute position - // int xAsRes = Math.round((float) x * alwidth / width); + int visXAsRes = hiddenCols.absoluteToVisibleColumn(vpx) + xdiff; - // get viewport width in residues - int vpwidth = ranges.getViewportWidth(); - - // get where x should be when accounting for hidden cols - // if x is in a hidden col region, shift to left - but we still need - // absolute position - // so convert back after getting visible region position - // int visXAsRes = hiddenCols.findColumnPosition(xAsRes); - int visXAsRes = xAsRes; - - // check in case we went off the edge of the alignment - int visAlignWidth = hiddenCols.findColumnPosition(alwidth - 1); - /* if (visXAsRes + vpwidth - 1 > visAlignWidth) - { - // went past the end of the alignment, adjust backwards - - // if last position was before the end of the alignment, need to update - if (ranges.getEndRes() < visAlignWidth) - { - visXAsRes = hiddenCols.findColumnPosition(hiddenCols - .subtractVisibleColumns(vpwidth - 1, alwidth - 1)); - } - else - { - visXAsRes = ranges.getStartRes(); - } - }*/ - - // - // Convert y value to sequence position - // - - // convert y to residues - // int yAsSeq = Math.round((float) y * alheight / sequencesHeight); - - // get viewport height in sequences - int vpheight = ranges.getViewportHeight(); - - // get where y should be when accounting for hidden rows - // if y is in a hidden row region, shift up - but we still need absolute - // position, - // so convert back after getting visible region position - yAsSeq = hiddenSeqs.adjustForHiddenSeqs( - hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq)); + int vpy = Math.round(mousey * heightRatio); + int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy) + ydiff; - // check in case we went off the edge of the alignment - int visAlignHeight = hiddenSeqs.findIndexWithoutHiddenSeqs(alheight); - int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq); - if (visYAsSeq + vpheight - 1 > visAlignHeight) - { - // went past the end of the alignment, adjust backwards - if (ranges.getEndSeq() < visAlignHeight) - { - visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs( - hiddenSeqs.subtractVisibleRows(vpheight - 1, alheight - 1)); - } - else - { - visYAsSeq = ranges.getStartSeq(); - } - } - - // update viewport - ranges.setStartRes(visXAsRes); - ranges.setStartSeq(visYAsSeq); + // update viewport accordingly + updateViewportFromTopLeft(visXAsRes, visYAsRes, hiddenSeqs, hiddenCols); } + /** + * {@inheritDoc} Callers should have already called resetAlignmentDims to + * refresh alwidth, alheight and width/height ratios + */ @Override - protected void updateViewportFromTopLeft(int xAsRes, int yAsSeq, + protected void updateViewportFromTopLeft(int leftx, int topy, HiddenSequences hiddenSeqs, HiddenColumns hiddenCols) { + int visXAsRes = leftx; + int visYAsSeq = topy; - resetAlignmentDims(); - - if (xAsRes < 0) + if (visXAsRes < 0) { - xAsRes = 0; + visXAsRes = 0; } - if (yAsSeq < 0) + if (visYAsSeq < 0) { - yAsSeq = 0; + visYAsSeq = 0; } - // - // Convert x value to residue position - // - - // need to determine where scrollCol should be, given x - // to do this also need to know width of viewport, and some hidden column - // correction + if (ranges.isWrappedMode()) + { + visYAsSeq = 0; // sorry, no vertical scroll when wrapped + } - // convert x to residues - this is an absolute position - // int xAsRes = Math.round((float) x * alwidth / width); + // Determine where scrollCol should be, given visXAsRes // get viewport width in residues int vpwidth = ranges.getViewportWidth(); - // get where x should be when accounting for hidden cols - // if x is in a hidden col region, shift to left - but we still need - // absolute position - // so convert back after getting visible region position - int visXAsRes = hiddenCols.findColumnPosition(xAsRes); - // check in case we went off the edge of the alignment - int visAlignWidth = hiddenCols.findColumnPosition(alwidth - 1); + int visAlignWidth = hiddenCols.absoluteToVisibleColumn(alwidth - 1); if (visXAsRes + vpwidth - 1 > visAlignWidth) { // went past the end of the alignment, adjust backwards @@ -232,8 +151,8 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions // if last position was before the end of the alignment, need to update if (ranges.getEndRes() < visAlignWidth) { - visXAsRes = hiddenCols.findColumnPosition(hiddenCols - .subtractVisibleColumns(vpwidth - 1, alwidth - 1)); + visXAsRes = hiddenCols.absoluteToVisibleColumn(hiddenCols + .offsetByVisibleColumns(-(vpwidth - 1), alwidth - 1)); } else { @@ -241,33 +160,21 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions } } - // - // Convert y value to sequence position - // - - // convert y to residues - // int yAsSeq = Math.round((float) y * alheight / sequencesHeight); + // Determine where scrollRow should be, given visYAsSeq // get viewport height in sequences int vpheight = ranges.getViewportHeight(); - // get where y should be when accounting for hidden rows - // if y is in a hidden row region, shift up - but we still need absolute - // position, - // so convert back after getting visible region position - yAsSeq = hiddenSeqs.adjustForHiddenSeqs(hiddenSeqs - .findIndexWithoutHiddenSeqs(yAsSeq)); - // check in case we went off the edge of the alignment int visAlignHeight = hiddenSeqs.findIndexWithoutHiddenSeqs(alheight); - int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq); + if (visYAsSeq + vpheight - 1 > visAlignHeight) { // went past the end of the alignment, adjust backwards if (ranges.getEndSeq() < visAlignHeight) { - visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(hiddenSeqs - .subtractVisibleRows(vpheight - 1, alheight - 1)); + visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs( + hiddenSeqs.subtractVisibleRows(vpheight - 1, alheight - 1)); } else { @@ -276,9 +183,7 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions } // update viewport - ranges.setStartRes(visXAsRes); - ranges.setStartSeq(visYAsSeq); - + ranges.setStartResAndSeq(visXAsRes, visYAsSeq); } /** @@ -296,31 +201,29 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions public void setBoxPosition(HiddenSequences hiddenSeqs, HiddenColumns hiddenCols) { - // work with absolute values of startRes and endRes - int startRes = hiddenCols.adjustForHiddenColumns(ranges.getStartRes()); - int endRes = hiddenCols.adjustForHiddenColumns(ranges.getEndRes()); + int startRes = hiddenCols.visibleToAbsoluteColumn(ranges.getStartRes()); + int endRes = hiddenCols.visibleToAbsoluteColumn(ranges.getEndRes()); // work with absolute values of startSeq and endSeq int startSeq = hiddenSeqs.adjustForHiddenSeqs(ranges.getStartSeq()); int endSeq = hiddenSeqs.adjustForHiddenSeqs(ranges.getEndSeq()); - setBoxPosition(startRes, startSeq, endRes - startRes + 1, endSeq - - startSeq + 1); + setBoxPosition(startRes, startSeq, endRes - startRes + 1, + endSeq - startSeq + 1); } @Override public AlignmentColsCollectionI getColumns(AlignmentI al) { - return new AllColsCollection(0, - ranges.getAbsoluteAlignmentWidth() - 1, al); + return new AllColsCollection(0, ranges.getAbsoluteAlignmentWidth() - 1, + al); } @Override public AlignmentRowsCollectionI getRows(AlignmentI al) { - return new AllRowsCollection(0, - ranges.getAbsoluteAlignmentHeight() - 1, + return new AllRowsCollection(0, ranges.getAbsoluteAlignmentHeight() - 1, al); } @@ -329,20 +232,32 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions { alwidth = ranges.getAbsoluteAlignmentWidth(); alheight = ranges.getAbsoluteAlignmentHeight(); + + widthRatio = (float) alwidth / width; + heightRatio = (float) alheight / sequencesHeight; } + + /** + * {@inheritDoc} Callers should have already called resetAlignmentDims to + * refresh widthRatio + */ @Override protected int getLeftXFromCentreX(int mousex, HiddenColumns hidden) { int vpx = Math.round((float) mousex * alwidth / width); - return hidden.subtractVisibleColumns(ranges.getViewportWidth() / 2, + return hidden.offsetByVisibleColumns(-ranges.getViewportWidth() / 2, vpx); } + /** + * {@inheritDoc} Callers should have already called resetAlignmentDims to + * refresh heightRatio + */ @Override protected int getTopYFromCentreY(int mousey, HiddenSequences hidden) { - int vpy = Math.round((float) mousey * alheight / sequencesHeight); + int vpy = Math.round(mousey * heightRatio); return hidden.subtractVisibleRows(ranges.getViewportHeight() / 2, vpy); } @@ -350,17 +265,16 @@ public class OverviewDimensionsShowHidden extends OverviewDimensions public void setDragPoint(int x, int y, HiddenSequences hiddenSeqs, HiddenColumns hiddenCols) { - { - // get alignment position of x and box (can get directly from vpranges) and calc difference - int vpx = Math.round((float) x * alwidth / width); - int visXAsRes = hiddenCols.findColumnPosition(vpx); - - int vpy = Math.round((float) y * alheight / sequencesHeight); - int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy); - - transX = ranges.getStartRes() - visXAsRes; - transY = ranges.getStartSeq() - visYAsRes; - } + resetAlignmentDims(); + + // get alignment position of x and box (can get directly from vpranges) and + // calculate difference between the positions + int vpx = Math.round(x * widthRatio); + int vpy = Math.round(y * heightRatio); + + xdiff = ranges.getStartRes() - hiddenCols.absoluteToVisibleColumn(vpx); + ydiff = ranges.getStartSeq() + - hiddenSeqs.findIndexWithoutHiddenSeqs(vpy); } }