diff --git a/lib/galaxy/web/controllers/tracks.py b/lib/galaxy/web/controllers/tracks.py index a5a1a4884ee..6a1761e76ca 100644 --- a/lib/galaxy/web/controllers/tracks.py +++ b/lib/galaxy/web/controllers/tracks.py @@ -221,7 +221,6 @@ class TracksController( BaseController ): converted dataset (possibly new) is returned, if it cannot be converted, None is returned. """ - log.debug("Inside dataset as type") # Already of correct type if dataset.extension == type: return dataset diff --git a/lib/galaxy/web/controllers/visualization.py b/lib/galaxy/web/controllers/visualization.py index c0312a69130..2b4aac357fc 100644 --- a/lib/galaxy/web/controllers/visualization.py +++ b/lib/galaxy/web/controllers/visualization.py @@ -25,17 +25,16 @@ class VisualizationListGrid( grids.Grid ): return query.filter_by( user=trans.user ) class VisualizationController( BaseController ): - + list_grid = VisualizationListGrid() @web.expose @web.require_login() - def index( self, trans ): - return trans.fill_template( "panels.mako", active_view='visualization', main_url=url_for( action='list' ) ) + def index( self, trans, *args, **kwargs ): + return trans.fill_template( "panels.mako", grid=self.list_grid( trans, *args, **kwargs ), active_view='visualization', main_url=url_for( action='list' ) ) - list_grid = VisualizationListGrid() - @web.expose - @web.require_login() - def list( self, trans, *args, **kwargs ): - return self.list_grid( trans, *args, **kwargs ) + # @web.expose + # @web.require_login() + # def list( self, trans, *args, **kwargs ): + # return self.list_grid( trans, *args, **kwargs ) #@web.expose #@web.require_admin diff --git a/static/scripts/packed/galaxy.panels.js b/static/scripts/packed/galaxy.panels.js index f7dd62de8f4..a281743de3b 100644 --- a/static/scripts/packed/galaxy.panels.js +++ b/static/scripts/packed/galaxy.panels.js @@ -1 +1 @@ -function ensure_dd_helper(){if($("#DD-helper").length==0){$("
").css({background:"white",opacity:0,zIndex:9000,position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendTo("body").hide()}}function make_left_panel(h,c,e){var g=false;var f=null;var d=function(i){var j=i;if(i<0){i=0}$(h).css("width",i);$(e).css("left",j);$(c).css("left",i+7);if(document.recalc){document.recalc()}};var a=function(){if(g){$(e).removeClass("hover");$(e).animate({left:f},"fast");$(h).css("left",-f).show().animate({left:0},"fast",function(){d(f);$(e).removeClass("hidden")});g=false}else{f=$(e).position().left;$(c).css("left",$(e).innerWidth());if(document.recalc){document.recalc()}$(e).removeClass("hover");$(h).animate({left:-f},"fast");$(e).animate({left:-1},"fast",function(){$(this).addClass("hidden")});g=true}};$(e).hover(function(){$(this).addClass("hover")},function(){$(this).removeClass("hover")}).bind("dragstart",function(i){$("#DD-helper").show()}).bind("dragend",function(i){$("#DD-helper").hide()}).bind("drag",function(i){x=i.offsetX;x=Math.min(400,Math.max(100,x));if(g){$(h).css("left",0);$(e).removeClass("hidden");g=false}d(x)}).bind("dragclickonly",function(i){a()}).find("div").show();var b=function(i){if((g&&i=="show")||(!g&&i=="hide")){a()}};return{force_panel:b}}function make_right_panel(a,e,h){var j=false;var g=false;var c=null;var d=function(k){$(a).css("width",k);$(e).css("right",k+9);$(h).css("right",k).css("left","");if(document.recalc){document.recalc()}};var i=function(){if(j){$(h).removeClass("hover");$(h).animate({right:c},"fast");$(a).css("right",-c).show().animate({right:0},"fast",function(){d(c);$(h).removeClass("hidden")});j=false}else{c=$(document).width()-$(h).position().left-$(h).outerWidth();$(e).css("right",$(h).innerWidth()+1);if(document.recalc){document.recalc()}$(h).removeClass("hover");$(a).animate({right:-c},"fast");$(h).animate({right:-1},"fast",function(){$(this).addClass("hidden")});j=true}g=false};var b=function(k){var l=$(e).width()-(j?c:0);if(l
")}$(".dialog-box").find(".body").html(c);if(!$(".dialog-box-container").is(":visible")){$("#overlay").show();$(".dialog-box-container").fadeIn()}}function show_in_overlay(c){var d=c.width||"600";var b=c.height||"400";var a=c.scroll||"auto";$("#overlay-background").bind("click.overlay",function(){hide_modal();$("#overlay-background").unbind("click.overlay")});show_modal(null,$("
")}$(".dialog-box").find(".body").html(c);if(!$(".dialog-box-container").is(":visible")){$("#overlay").show();$(".dialog-box-container").fadeIn()}}function show_in_overlay(c){var d=c.width||"600";var b=c.height||"400";var a=c.scroll||"auto";$("#overlay-background").bind("click.overlay",function(){hide_modal();$("#overlay-background").unbind("click.overlay")});show_modal(null,$("r[0]&&cthis.show_labels_scale){if(!this.showing_details){this.showing_details=true}for(var B in this.data_cache.obj_cache){var p=B.split("_"),e=p[0],d=p[1];if(e<=G&&d>=c){K=this.data_cache.get(B);break}}if(!K){this.data_queue[[G,c]]=true;this.get_data(G,c);return}h=this.incremental_slots(this.view.zoom_res,K)*this.vertical_detail_px+15;u=this.inc_slots[this.view.zoom_res]}else{if(this.showing_details){this.showing_details=false}h=this.height_px;u=this.zo_slots;K=this.values}var y=Math.ceil(v*r),x=$("");x.css({position:"absolute",top:0,left:(G-this.view.low)*r-this.left_offset});x.get(0).width=y+this.left_offset;x.get(0).height=h;var z=x.get(0).getContext("2d");z.fillStyle=this.base_color;z.font=this.default_font;z.textAlign="right";var C=0;for(var D=0,E=K.length;D =G){var g=Math.floor(Math.max(0,(m.start-G)*r)),l=Math.ceil(Math.min(y,(m.end-G)*r)),f=u[m.uid]*(this.showing_details?this.vertical_detail_px:this.vertical_nodetail_px);var a,L,b=null,s=null;if(m.thick_start&&m.thick_end){b=Math.floor(Math.max(0,(m.thick_start-G)*r));s=Math.ceil(Math.min(y,(m.thick_end-G)*r))}if(!this.showing_details){z.fillRect(g+this.left_offset,f+5,l-g,1)}else{if(z.fillText&&m.start>G){z.fillText(m.name,g-1+this.left_offset,f+8)}var I=m.blocks;if(I){if(m.strand){if(m.strand=="+"){z.fillStyle=RIGHT_STRAND}else{if(m.strand=="-"){z.fillStyle=LEFT_STRAND}}z.fillRect(g+this.left_offset,f,l-g,10);z.fillStyle=this.base_color}for(var B=0,J=I.length;B H){continue}a=5;L=3;z.fillRect(o+this.left_offset,f+L,H-o,a);if(b!==undefined&&(o<=s||H>=b)){a=9;L=1;var w=Math.max(o,b),t=Math.min(H,s);z.fillRect(w+this.left_offset,f+L,t-w,a)}}}else{a=9;L=1;z.fillRect(g+this.left_offset,f+L,l-g,a);if(m.strand){if(m.strand=="+"){z.fillStyle=RIGHT_STRAND_INV}else{if(m.strand=="-"){z.fillStyle=LEFT_STRAND_INV}}z.fillRect(g+this.left_offset,f,l-g,10);z.fillStyle=this.base_color}}}C++}}n.append(x);return x}});var ReadTrack=function(c,b,d,a){this.tile_cache=new Cache(CACHED_TILES_FEATURE);Track.call(this,c,$("#viewport"));TiledTrack.call(this);FeatureTrack.call(this,c,b,d,a);this.default_font="9px Monaco, Lucida Console, monospace"};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_tile:function(v,z,m,n){if(!this.values){return}var A=z*DENSITY*v,e=(z+1)*DENSITY*v,q=DENSITY*v;var D,p,h;h=this.height_px;p=this.zo_slots;D=this.values;var t=Math.ceil(q*n),r=$("");r.css({position:"absolute",top:0,left:(A-this.view.low)*n-this.left_offset});r.get(0).width=t+this.left_offset;r.get(0).height=h;var u=r.get(0).getContext("2d");u.fillStyle=this.base_color;u.font=this.default_font;u.textAlign="right";var s=u.measureText("A").width;var w=0;for(var x=0,y=D.length;x =A){var g=Math.floor(Math.max(0,(l.start-A)*n)),k=Math.ceil(Math.min(t,(l.end-A)*n)),f=p[l.uid]*this.vertical_detail_px;var a,E,d=null,o=null;if(n>s){for(var B=0,b=l.name.length;B" + track.min_value + ""); var max_label = $(" " + track.max_value + ""); - max_label.css({ position: "relative", top: "35px" }); - max_label.prependTo(track.container_div) + max_label.css({ position: "relative", top: "25px" }); + max_label.prependTo(track.container_div); - min_label.css({ position: "relative", top: track.height_px + 32 + "px" }); + min_label.css({ position: "relative", top: track.height_px + 55 + "px" }); min_label.prependTo(track.container_div); track.draw(); @@ -371,13 +371,15 @@ var FeatureTrack = function ( name, dataset_id, indexer, height ) { this.dataset_id = dataset_id; this.zo_slots = {}; this.show_labels_scale = 0.001; - this.showing_labels = false; - this.vertical_gap = 10; + this.showing_details = false; + this.vertical_detail_px = 10; + this.vertical_nodetail_px = 3; this.base_color = "#2C3143"; this.default_font = "9px Monaco, Lucida Console, monospace"; this.left_offset = 200; this.inc_slots = {}; this.data_queue = {}; + this.s_e_by_tile = {}; this.data_cache = new Cache(20); }; $.extend( FeatureTrack.prototype, TiledTrack.prototype, { @@ -425,10 +427,8 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { } }, calc_slots: function() { - // console.log("num vals: " + this.values.length); var end_ary = [], scale = this.content_div.width() / (this.view.high - this.view.low), - max_high = this.view.max_high, max_low = this.view.max_low; // console.log(scale, this.view.high, this.view.low); for (var i = 0, len = this.values.length; i < len; i++) { @@ -447,43 +447,62 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { j++; } } - this.height_px = end_ary.length * this.vertical_gap + 15; + this.height_px = end_ary.length * this.vertical_nodetail_px + 15; this.content_div.css( "height", this.height_px + "px" ); }, incremental_slots: function( level, features ) { if (!this.inc_slots[level]) { this.inc_slots[level] = {}; - this.inc_slots[level].w_scale = DENSITY / Math.pow(FEATURE_LEVELS, level+1); + this.inc_slots[level].w_scale = 1 / level; + this.s_e_by_tile[level] = {}; } - var slots = this.inc_slots[level]; - // console.log(level, slots.w_scale, slots); - var end_ary = [], + // TODO: Should calculate zoom tile index, which will improve performance + // by only having to look at a smaller subset + // if (this.s_e_by_tile[0] === undefined) { this.s_e_by_tile[0] = []; } + var w_scale = this.inc_slots[level].w_scale, undone = [], highest_slot = 0, // To measure how big to draw canvas dummy_canvas = $("").get(0).getContext("2d"), max_low = this.view.max_low; + var f_start, f_end, slotted = []; + + // If feature already exists in slots (from previously seen tiles), use the same slot, + // otherwise if not seen, add to "undone" list for slot calculation for (var i = 0, len = features.length; i < len; i++) { var feature = features[i]; - // console.log(feature.name, feature.uid, slots[feature.uid]); - if (slots[feature.uid]) { - highest_slot = Math.max(highest_slot, slots[feature.uid]); - end_ary[ slots[feature.uid] ] = Math.ceil( (feature.end - max_low) * slots.w_scale ); + if (this.inc_slots[level][feature.uid] !== undefined) { + highest_slot = Math.max(highest_slot, this.inc_slots[level][feature.uid]); + slotted.push(this.inc_slots[level][feature.uid]); } else { - undone.push(feature); - } + undone.push(i); + } } + + // console.log("Slotted: ", features.length - undone.length, "/", features.length, slotted); for (var i = 0, len = undone.length; i < len; i++) { - var feature = undone[i]; - f_start = Math.floor( (feature.start - max_low) * slots.w_scale ); + var feature = features[undone[i]]; + f_start = Math.floor( (feature.start - max_low) * w_scale ); f_start -= dummy_canvas.measureText(feature.name).width; - f_end = Math.ceil( (feature.end - max_low) * slots.w_scale ); - // console.log(f_start, f_end, feature.name); + f_end = Math.ceil( (feature.end - max_low) * w_scale ); + var j = 0; + // Try to fit the feature to the first slot that doesn't overlap any other features in that slot while (true) { - if (end_ary[j] === undefined || end_ary[j] < f_start) { - end_ary[j] = f_end; - slots[feature.uid] = j; + var found = true; + if (this.s_e_by_tile[level][j] !== undefined) { + for (var k = 0, k_len = this.s_e_by_tile[level][j].length; k < k_len; k++) { + var s_e = this.s_e_by_tile[level][j][k]; + if (f_end > s_e[0] && f_start < s_e[1]) { + found = false; + break; + } + } + } + if (found) { + if (this.s_e_by_tile[level][j] === undefined) { this.s_e_by_tile[level][j] = []; } + this.s_e_by_tile[level][j].push([f_start, f_end]); + this.inc_slots[level][feature.uid] = j; highest_slot = Math.max(highest_slot, j); break; } @@ -504,8 +523,8 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { // Once we zoom in enough, show name labels var data, slots, required_height; if (w_scale > this.show_labels_scale) { - if (!this.showing_labels) { - this.showing_labels = true; + if (!this.showing_details) { + this.showing_details = true; } for (var k in this.data_cache.obj_cache) { var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1]; @@ -519,12 +538,13 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { this.get_data(tile_low, tile_high); return; } - required_height = this.incremental_slots( this.view.zoom_res, data ) * this.vertical_gap + 15; + // Calculate new slots incrementally for this new chunk of data and update height if necessary + required_height = this.incremental_slots( this.view.zoom_res, data ) * this.vertical_detail_px + 15; // console.log(required_height); slots = this.inc_slots[this.view.zoom_res]; } else { - if (this.showing_labels) { - this.showing_labels = false; + if (this.showing_details) { + this.showing_details = false; } required_height = this.height_px; slots = this.zo_slots; @@ -554,14 +574,14 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { if (feature.start <= tile_high && feature.end >= tile_low) { var f_start = Math.floor( Math.max(0, (feature.start - tile_low) * w_scale) ), f_end = Math.ceil( Math.min(width, (feature.end - tile_low) * w_scale) ), - y_center = slots[feature.uid] * this.vertical_gap; + y_center = slots[feature.uid] * (this.showing_details ? this.vertical_detail_px : this.vertical_nodetail_px); var thickness, y_start, thick_start = null, thick_end = null; if (feature.thick_start && feature.thick_end) { thick_start = Math.floor( Math.max(0, (feature.thick_start - tile_low) * w_scale) ); thick_end = Math.ceil( Math.min(width, (feature.thick_end - tile_low) * w_scale) ); } - if (!this.showing_labels) { + if (!this.showing_details) { // Non-detail levels ctx.fillRect(f_start + this.left_offset, y_center + 5, f_end - f_start, 1); } else { @@ -569,6 +589,7 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { if (ctx.fillText && feature.start > tile_low) { ctx.fillText(feature.name, f_start - 1 + this.left_offset, y_center + 8); // ctx.fillText(commatize(feature.start), f_start - 1 + this.left_offset, y_center + 8); + // ctx.fillText(slots[feature.uid], f_start - 1 + this.left_offset, y_center + 8); } var blocks = feature.blocks; if (blocks) { @@ -592,13 +613,12 @@ $.extend( FeatureTrack.prototype, TiledTrack.prototype, { thickness = 5; y_start = 3; ctx.fillRect(block_start + this.left_offset, y_center + y_start, block_end - block_start, thickness); - - if (thick_start && (block_start < thick_end || block_end > thick_start) ) { + + if (thick_start !== undefined && (block_start <= thick_end || block_end >= thick_start) ) { thickness = 9; y_start = 1; var block_thick_start = Math.max(block_start, thick_start), block_thick_end = Math.min(block_end, thick_end); - ctx.fillRect(block_thick_start + this.left_offset, y_center + y_start, block_thick_end - block_thick_start, thickness); } @@ -654,9 +674,7 @@ $.extend( ReadTrack.prototype, TiledTrack.prototype, FeatureTrack.prototype, { // console.log(tile_low, tile_high, tile_length, w_scale); var width = Math.ceil( tile_span * w_scale ), new_canvas = $(""); - - var dummy_canvas = $("").get(0).getContext("2d"); - + new_canvas.css({ position: "absolute", top: 0, @@ -677,7 +695,7 @@ $.extend( ReadTrack.prototype, TiledTrack.prototype, FeatureTrack.prototype, { if (feature.start <= tile_high && feature.end >= tile_low) { var f_start = Math.floor( Math.max(0, (feature.start - tile_low) * w_scale) ), f_end = Math.ceil( Math.min(width, (feature.end - tile_low) * w_scale) ), - y_center = slots[feature.uid] * this.vertical_gap; + y_center = slots[feature.uid] * this.vertical_detail_px; var thickness, y_start, thick_start = null, thick_end = null; if (w_scale > px_per_char) { diff --git a/static/trackster.css b/static/trackster.css index 13c4481898a..c03ab5f42bc 100644 --- a/static/trackster.css +++ b/static/trackster.css @@ -22,7 +22,6 @@ body { #nav-container { position: fixed; bottom: 0; - width: 100%; } input { @@ -60,7 +59,8 @@ input { width: 100%; margin: 0px; color: white; - margin-top: 10px; + margin-top: -6px; + margin-bottom: -3px; } #overview-viewport { @@ -82,7 +82,7 @@ input { } #viewport { - overflow-x: hidden; +/* overflow-x: hidden;*/ background-color: #fff; /* overflow: scroll;*/ /* border-bottom: 2px solid black;*/ diff --git a/templates/base_panels.mako b/templates/base_panels.mako index 1ca19af2aad..4592c03d962 100644 --- a/templates/base_panels.mako +++ b/templates/base_panels.mako @@ -318,8 +318,8 @@${self.title()} - ${self.javascripts()} ${self.stylesheets()} + ${self.javascripts()} diff --git a/templates/panels.mako b/templates/panels.mako index 2ad39149cce..4a3c1a8586d 100644 --- a/templates/panels.mako +++ b/templates/panels.mako @@ -11,6 +11,6 @@ <%def name="center_panel()"> - + ${grid} %def> diff --git a/templates/tracks/browser.mako b/templates/tracks/browser.mako index 86d132718c1..23426009f23 100644 --- a/templates/tracks/browser.mako +++ b/templates/tracks/browser.mako @@ -1,4 +1,13 @@ -<%inherit file="/base.mako"/> +<%inherit file="/base_panels.mako"/> + +<%def name="init()"> +<% + self.has_left_panel=False + self.has_right_panel=True + self.active_view="visualization" + self.message_box_visible=False +%> +%def> <%def name="stylesheets()"> ${parent.stylesheets()} @@ -53,13 +62,16 @@ ${h.js( "jquery", "jquery.event.drag", "jquery.mousewheel", "trackster" )} }); // To adjust the size of the viewport to fit the fixed-height footer - $(window).resize( function( e ) { - $("#content").height( $(window).height() - $("#nav-container").height() ); + var refresh = function( e ) { + $("#content").height( $(window).height() - $("#nav-container").height() - $("#masthead").height()); $("#viewport-container").height( $("#content").height() - $("#top-labeltrack").height() - $("#nav-labeltrack").height() ); + $("#nav-container").width( $("#center").width() ); view.redraw(); - }); - - $(window).resize(); + }; + $(window).bind( "resize", function(e) { refresh(e); } ); + $("#right-border").bind( "click", function(e) { refresh(e); } ); + $("#right-border").bind( "dragend", function(e) { refresh(e); } ); + $(window).trigger( "resize" ); $("#viewport").bind( "dragstart", function( e ) { this.original_low = view.low; @@ -103,15 +115,16 @@ ${h.js( "jquery", "jquery.event.drag", "jquery.mousewheel", "trackster" )} %def> +<%def name="center_panel()">- +