891063b37aee1aaa86ad2eb4af5e389c6f9220bb larrym Wed Nov 17 15:08:53 2010 -0800 handle case where track cannot be changed to higher visibility; refactor code into updateVisibility diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js index 62ea39e..32b57a2 100644 --- src/hg/js/hgTracks.js +++ src/hg/js/hgTracks.js @@ -12,30 +12,31 @@ var startDragZoom = null; var newWinWidth; var imageV2 = false; var imgBoxPortal = false; var blockUseMap = false; var mapItems; var trackImg; // jQuery element for the track image var trackImgTbl; // jQuery element used for image table under imageV2 var imgAreaSelect; // jQuery element used for imgAreaSelect var originalImgTitle; var autoHideSetting = true; // Current state of imgAreaSelect autoHide setting var selectedMenuItem; // currently choosen context menu item (via context menu). var browser; // browser ("msie", "safari" etc.) var mapIsUpdateable = true; var currentMapItem; +var visibilityStrsOrder = new Array("hide", "dense", "full", "pack", "squish"); // map browser numeric visibility codes to strings function initVars(img) { // There are various entry points, so we call initVars in several places to make sure this variables get updated. if(!originalPosition) { // remember initial position and size so we can restore it if user cancels originalPosition = getOriginalPosition(); originalSize = $('#size').text(); originalCursor = jQuery('body').css('cursor'); } } function selectStart(img, selection) { initVars(); @@ -1635,38 +1636,31 @@ // make sure the link contains chrom info (necessary b/c we are stripping hgsid) href = href + "&c=" + chrom; } if(window.open(href) == null) { windowOpenFailedMsg(); } } else if (cmd == 'followLink') { // XXXX This is blocked by Safari's popup blocker (without any warning message). location.assign(selectedMenuItem.href); } else { // if( cmd in 'hide','dense','squish','pack','full','show' ) // Change visibility settings: // // First change the select on our form: var id = selectedMenuItem.id; var rec = trackDbJson[id]; - var selectUpdated = false; - $("select[name=" + id + "]").each(function(t) { - $(this).val(cmd); - selectUpdated = true; - }); - if(rec) { - rec.localVisibility = cmd; - } + var selectUpdated = updateVisibility(id, cmd); // Now change the track image if(imageV2 && cmd == 'hide') { // Hide local display of this track and update server side cart. // Subtracks controlled by 2 settings so del vis and set sel=0. Others, just set vis hide. if(rec.parentTrack != undefined) setCartVars( [ id, id+"_sel" ], [ "[]", 0 ] ); // Don't set '_sel" to [] because default gets used, but we are explicitly hiding this! else setCartVar(id, 'hide' ); $('#tr_' + id).remove(); initImgTblButtons(); loadImgAreaSelect(false); } else if (!mapIsUpdateable) { jQuery('body').css('cursor', 'wait'); @@ -1686,30 +1680,31 @@ } //var center = $("#img_data_" + id); //center.attr('src', "../images/loading.gif") //center.attr('style', "text-align: center; display: block;"); //warn("hgTracks?"+data); // Uesful to cut and paste the url var loadingId = showLoadingImage("tr_" + id); $.ajax({ type: "GET", url: "../cgi-bin/hgTracks", data: data, dataType: "html", trueSuccess: handleUpdateTrackMap, success: catchErrorOrDispatch, error: errorHandler, cmd: cmd, + newVisibility: cmd, id: id, loadingId: loadingId, cache: false }); } } } function makeContextMenuHitCallback(title) { // stub to avoid problem with a function closure w/n a loop return function(menuItemClicked, menuObject) { contextMenuHit(menuItemClicked, menuObject, title); return true; }; } @@ -1745,31 +1740,30 @@ if(cur) { select.children().each(function(index, o) { var title = $(this).val(); var str = title; if(title == cur) { str += selectedImg; } var o = new Object(); o[str] = {onclick: function (menuItemClicked, menuObject) { contextMenuHit(menuItemClicked, menuObject, title); return true;}}; menu.push(o); }); done = true; } else { if(rec) { // XXXX check current state from a hidden variable. - var visibilityStrsOrder = new Array("hide", "dense", "full", "pack", "squish"); var visibilityStrs = new Array("hide", "dense", "squish", "pack", "full"); for (i in visibilityStrs) { // XXXX use maxVisibility and change hgTracks so it can hide subtracks var o = new Object(); var str = visibilityStrs[i]; if(rec.canPack || (str != "pack" && str != "squish")) { if(rec.localVisibility) { if(rec.localVisibility == str) { str += selectedImg; } } else if(str == visibilityStrsOrder[rec.visibility]) { str += selectedImg; } o[str] = {onclick: makeContextMenuHitCallback(visibilityStrs[i])}; menu.push(o); @@ -1959,36 +1953,31 @@ var newVis = changedVars[trackName]; var hide = (newVis != null && (newVis == 'hide' || newVis == '[]')); // subtracks do not have "hide", thus '[]' if($('#imgTbl') == undefined) { // On findTracks or config page setVarsFromHash(changedVars); //if(hide) // TODO: When findTracks or config page has cfg popup, then vis change needs to be handled in page here } else { // On image page if(hide) { setVarsFromHash(changedVars); $('#tr_' + trackName).remove(); initImgTblButtons(); loadImgAreaSelect(false); } else { // Keep local state in sync if user changed visibility if(newVis != null) { - $("select[name=" + trackName + "]").each(function(t) { - $(this).val(newVis); - }); - if(rec) { - rec.localVisibility = newVis; - } + updateVisibility(trackName, newVis); } var urlData = varHashToQueryString(changedVars); if(mapIsUpdateable) { updateTrackImg(trackName,urlData,""); } else { window.location = "../cgi-bin/hgTracks?" + urlData + "&hgsid=" + getHgsid(); } } } } function handleTrackUi(response, status) { // Take html from hgTrackUi and put it up as a modal dialog. if(popUpTrackDescriptionOnly) { @@ -2045,30 +2034,44 @@ function handleUpdateTrackMap(response, status) { // Handle ajax response with an updated trackMap image (gif or png) and map. // // this.cmd can be used to figure out which menu item triggered this. // // e.g.: // Parse out new ideoGram url (if available) var a = /]+SRC[^>]+id='chrom'[^>]*)>/.exec(response); if(a && a[1]) { b = /SRC\s*=\s*"([^")]+)"/.exec(a[1]); if(b[1]) { $('#chrom').attr('src', b[1]); } } + if(this.newVisibility) { + var re = /<\!-- trackDbJson -->\n