src/hg/js/hgTracks.js 1.66
1.66 2010/04/09 17:08:48 kent
Refactoring so that ruler and makeItems share code to convert from pixel to chromosome coordinates.
Index: src/hg/js/hgTracks.js
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/js/hgTracks.js,v
retrieving revision 1.65
retrieving revision 1.66
diff -b -B -U 4 -r1.65 -r1.66
--- src/hg/js/hgTracks.js 9 Apr 2010 07:48:47 -0000 1.65
+++ src/hg/js/hgTracks.js 9 Apr 2010 17:08:48 -0000 1.66
@@ -134,33 +134,30 @@
return (selection.event.pageX >= leftX) && (selection.event.pageX < rightX)
&& (selection.event.pageY >= (imgOfs.top - slop)) && (selection.event.pageY < (imgOfs.top + imgHeight + slop));
}
-
-function selectionPixelsToBases(img, selection)
-// Convert selection x1/x2 coordinates to chromStart/chromEnd.
+function pixelsToBases(img, selStart, selEnd, winStart, winEnd)
+// Convert image coordinates to chromosome coordinates
{
var insideX = parseInt(document.getElementById("hgt.insideX").value);
var imgWidth = jQuery(img).width() - insideX;
-var winStart = parseInt(document.getElementById("hgt.winStart").value);
-var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
var width = winEnd - winStart;
var mult = width / imgWidth; // mult is bp/pixel multiplier
var startDelta; // startDelta is how many bp's to the right/left
if(revCmplDisp) {
- var x1 = Math.min(imgWidth, selection.x1);
+ var x1 = Math.min(imgWidth, selStart);
startDelta = Math.floor(mult * (imgWidth - x1));
} else {
- var x1 = Math.max(insideX, selection.x1);
+ var x1 = Math.max(insideX, selStart);
startDelta = Math.floor(mult * (x1 - insideX));
}
var endDelta;
if(revCmplDisp) {
endDelta = startDelta;
- var x2 = Math.min(imgWidth, selection.x2);
+ var x2 = Math.min(imgWidth, selEnd);
startDelta = Math.floor(mult * (imgWidth - x2));
} else {
- var x2 = Math.max(insideX, selection.x2);
+ var x2 = Math.max(insideX, selEnd);
endDelta = Math.floor(mult * (x2 - insideX));
}
var newStart = winStart + startDelta;
var newEnd = winStart + 1 + endDelta;
@@ -169,66 +166,34 @@
}
return {chromStart : newStart, chromEnd : newEnd};
}
+function selectionPixelsToBases(img, selection)
+// Convert selection x1/x2 coordinates to chromStart/chromEnd.
+{
+var winStart = parseInt(document.getElementById("hgt.winStart").value);
+var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
+return pixelsToBases(img, selection.x1, selection.x2, winStart, winEnd);
+}
function updatePosition(img, selection, singleClick)
{
- // singleClick is true when the mouse hasn't moved (or has only moved a small amount).
- var chromName = document.getElementById("hgt.chromName").value;
- var winStart = parseInt(document.getElementById("hgt.winStart").value);
- var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
- if(typeof imgBoxPortalStart != "undefined" && imgBoxPortalStart) {
+var chromName = document.getElementById("hgt.chromName").value;
+var winStart = parseInt(document.getElementById("hgt.winStart").value);
+var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
+var pos = pixelsToBases(img, selection.x1, selection.x2, winStart, winEnd);
+if(typeof imgBoxPortalStart != "undefined" && imgBoxPortalStart) {
winStart = imgBoxPortalStart;
winEnd = imgBoxPortalEnd;
- }
- var imgWidth = jQuery(img).width() - insideX;
- var width = winEnd - winStart;
- var newPos = null;
- var newSize = null;
- var mult = width / imgWidth; // mult is bp/pixel multiplier
- var startDelta; // startDelta is how many bp's to the right/left
- if(revCmplDisp) {
- var x1 = Math.min(imgWidth, selection.x1);
- startDelta = Math.floor(mult * (imgWidth - x1));
- } else {
- var x1 = Math.max(insideX, selection.x1);
- startDelta = Math.floor(mult * (x1 - insideX));
- }
- if(singleClick) {
- var newStart = (winStart + 1) + (startDelta - Math.floor(newWinWidth / 2));
- if(newStart < 1) {
- newStart = 1;
- newEnd = newWinWidth;
- } else {
- // hgTracks gracefully handles overflow past the end of the chrom, so don't worry about that.
- newEnd = (winStart + 1) + (startDelta + Math.floor(newWinWidth / 2));
- }
- newPos = chromName + ":" + commify(newStart) + "-" + commify(newEnd);
- newSize = newEnd - newStart + 1;
- } else {
- var endDelta;
- if(revCmplDisp) {
- endDelta = startDelta;
- var x2 = Math.min(imgWidth, selection.x2);
- startDelta = Math.floor(mult * (imgWidth - x2));
- } else {
- var x2 = Math.max(insideX, selection.x2);
- endDelta = Math.floor(mult * (x2 - insideX));
- }
- var newStart = winStart + 1 + startDelta;
- var newEnd = winStart + 1 + endDelta;
- if(newEnd > winEnd) {
- newEnd = winEnd;
- }
- newPos = chromName + ":" + commify(newStart) + "-" + commify(newEnd);
- newSize = newEnd - newStart + 1;
- }
-
- if(newPos != null) {
- setPosition(newPos, commify(newSize));
- return true;
- }
+}
+// singleClick is true when the mouse hasn't moved (or has only moved a small amount).
+if(singleClick) {
+ var center = (pos.chromStart + pos.chromEnd)/2;
+ pos.chromStart = Math.floor(center - newWinWidth/2);
+ pos.chromEnd = pos.chromStart + newWinWidth;
+}
+setPositionByCoordinates(chromName, pos.chromStart+1, pos.chromEnd);
+return true;
}
function selectChange(img, selection)
{