commit/galaxy-central: jgoecks: Trackster overview enhancements: (a) show and hide overview via track menus; (b) use tile cache to store overview tracks; (c) overview track saved and restored.
1 new changeset in galaxy-central: http://bitbucket.org/galaxy/galaxy-central/changeset/8ab07a531e53/ changeset: 8ab07a531e53 user: jgoecks date: 2011-08-05 17:18:58 summary: Trackster overview enhancements: (a) show and hide overview via track menus; (b) use tile cache to store overview tracks; (c) overview track saved and restored. affected #: 3 files (2.1 KB) --- a/lib/galaxy/web/controllers/tracks.py Thu Aug 04 16:46:37 2011 -0400 +++ b/lib/galaxy/web/controllers/tracks.py Fri Aug 05 11:18:58 2011 -0400 @@ -584,7 +584,8 @@ chrom = decoded_payload['viewport']['chrom'] start = decoded_payload['viewport']['start'] end = decoded_payload['viewport']['end'] - vis_rev.config[ "viewport" ] = { 'chrom': chrom, 'start': start, 'end': end } + overview = decoded_payload['viewport']['overview'] + vis_rev.config[ "viewport" ] = { 'chrom': chrom, 'start': start, 'end': end, 'overview': overview } vis.latest_revision = vis_rev session.add( vis_rev ) --- a/static/scripts/trackster.js Thu Aug 04 16:46:37 2011 -0400 +++ b/static/scripts/trackster.js Fri Aug 05 11:18:58 2011 -0400 @@ -418,6 +418,8 @@ */ // TODO: use chrom in key so that (a) data is not thrown away when changing chroms and (b) // manager does not need to be cleared when changing chroms. + // TODO: use resolution in key b/c summary tree data is dependent on resolution -- is this + // necessary, i.e. will resolution change but not low/high/mode? gen_key: function(low, high, mode) { var key = low + "_" + high + "_" + mode; return key; @@ -920,10 +922,13 @@ view.overview_viewport.height(tile.canvas.height() + view.overview_box.height()); view.resize_window(); - // TODO: Update view state. - - // TODO: Update track state. - + // Update view, track states. + if (view.overview_track) { + console.log("view has overview track"); + view.overview_track.set_is_overview(false); + } + view.overview_track = track; + track.set_is_overview(true); }); }, /** Close and reset overview. */ @@ -936,10 +941,12 @@ this.overview_highlight.hide(); view.resize_window(); - // TODO: Update view state. - - - // TODO: Update track state. + // Update view, track states. + if (view.overview_track) { + console.log("view has overview track"); + view.overview_track.set_is_overview(false); + } + view.overview_track = null; } }); @@ -1794,6 +1801,7 @@ this.filters_available = false; this.filters_visible = false; this.tool = (tool_dict !== undefined && obj_length(tool_dict) > 0 ? new Tool(this, tool_dict) : undefined); + this.is_overview = false; // // TODO: Right now there is only the notion of a parent track and multiple child tracks. However, @@ -1890,8 +1898,13 @@ // // Make track overview option. // - track_dropdown["Set as overview"] = function() { - track.view.set_overview(track); + track_dropdown[(this.is_overview ? "Hide overview" : "Set as overview")] = function() { + if (track.is_overview) { + track.view.reset_overview(); + } + else { + track.view.set_overview(track); + } }; // @@ -1987,6 +2000,13 @@ make_popupmenu(track.name_div, track_dropdown); }, /** + * Set track's overview status. + */ + set_is_overview: function(is_overview) { + this.is_overview = is_overview; + this.make_name_popup_menu(); + }, + /** * Returns a jQuery Deferred object that resolves to a Tile with track's overview. * TODO: this should be the approach used when drawing any tile so that tile drawing is not blocking. */ @@ -1995,18 +2015,31 @@ track = this; view = track.view, resolution = Math.pow(RESOLUTION, Math.ceil( Math.log( (view.max_high - view.max_low) / DENSITY ) / Math.log(RESOLUTION) )), + view_width = view.container.width(), // w_scale units are pixels per base. - w_scale = view.container.width() / (view.max_high - view.max_low), + w_scale = view_width / (view.max_high - view.max_low), overview_tile = $.Deferred(); $.when(track.data_manager.get_data(view.max_low, view.max_high, "Auto", resolution, track.data_url_extra_params)).then(function(overview_data) { - // TODO: save resolution in data cache key. - var tile = track.draw_tile(overview_data, resolution, null, w_scale, null, true); + var + key = track._gen_tile_cache_key(view_width, w_scale, 0), + tile = track.tile_cache.get(key); + if (!tile) { + tile = track.draw_tile(overview_data, resolution, null, w_scale, null, true); + track.tile_cache.set(key, tile); + } overview_tile.resolve(tile); }); return overview_tile; }, /** + * Generate a key for the tile cache. + * TODO: create a TileCache object (like DataCache) and generate key internally. + */ + _gen_tile_cache_key: function(width, w_scale, tile_index) { + return width + '_' + w_scale + '_' + tile_index; + }, + /** * Draw track. It is possible to force a redraw rather than use cached tiles and/or clear old * tiles after drawing new tiles. */ @@ -2022,10 +2055,7 @@ // w_scale units are pixels per base. w_scale = width / range, resolution = this.view.resolution, - parent_element = $("<div style='position: relative;'></div>"), - gen_key = function(width, w_scale, tile_index) { - return width + '_' + w_scale + '_' + tile_index; - }; + parent_element = $("<div style='position: relative;'></div>"); if (!clear_after) { this.content_div.children().remove(); } this.content_div.append( parent_element ); @@ -2038,7 +2068,7 @@ // Draw or fetch and show tiles. while ( ( tile_index * DENSITY * resolution ) < high ) { // Check in cache - var key = gen_key(width, w_scale, tile_index); + var key = this._gen_tile_cache_key(width, w_scale, tile_index); var cached = this.tile_cache.get(key); var tile_low = tile_index * DENSITY * this.view.resolution; var tile_high = tile_low + DENSITY * this.view.resolution; @@ -2550,7 +2580,7 @@ if (tiles[i].max_val !== global_max) { var tile = tiles[i]; tile.canvas.remove(); - track.delayed_draw(true, gen_key(width, w_scale, tile.index), tile.index, + track.delayed_draw(true, track._gen_tile_cache_key(width, w_scale, tile.index), tile.index, tile.resolution, parent_element, w_scale, [], { max: global_max }); } } --- a/templates/tracks/browser.mako Thu Aug 04 16:46:37 2011 -0400 +++ b/templates/tracks/browser.mako Fri Aug 05 11:18:58 2011 -0400 @@ -165,7 +165,22 @@ %if config: var callback; %if 'viewport' in config: - var callback = function() { view.change_chrom( '${config['viewport']['chrom']}', ${config['viewport']['start']}, ${config['viewport']['end']} ); } + var callback = function() { + view.change_chrom( '${config['viewport']['chrom']}', ${config['viewport']['start']}, ${config['viewport']['end']} ); + // Set overview. + %if 'viewport' in config and 'overview' in config['viewport'] and config['viewport']['overview']: + + var + overview_track_name = "${config['viewport']['overview']}", + overview_track; + for (var i = 0; i < view.tracks.length; i++) { + if (view.tracks[i].name == overview_track_name) { + view.set_overview(view.tracks[i]); + break; + } + } + %endif + } %endif view = new View( $("#browser-container"), "${config.get('title') | h}", "${config.get('vis_id')}", "${config.get('dbkey')}", callback ); view.editor = true; @@ -194,7 +209,7 @@ parent_obj.add_track(track); } init(); - + // Load bookmarks. var bookmarks = JSON.parse('${ h.to_json_string( config.get('bookmarks') ) }'), bookmark; @@ -257,7 +272,7 @@ // Show saving dialog box show_modal("Saving...", "<img src='${h.url_for('/static/images/yui/rel_interstitial_loading.gif')}'/>"); - // Save all tracks. + // Save tracks. var tracks = []; $(".viewport-container .track").each(function () { // ID has form track_<main_track_id>_<child_track_id> @@ -282,8 +297,8 @@ "is_child": (child_id ? true : false ) }); }); - - // Save all bookmarks. + + // Save bookmarks. var bookmarks = []; $(".bookmark").each(function() { bookmarks[bookmarks.length] = { @@ -292,9 +307,10 @@ }; }); + var overview_track_name = (view.overview_track ? view.overview_track.name : null); var payload = { 'tracks': tracks, - 'viewport': { 'chrom': view.chrom, 'start': view.low , 'end': view.high }, + 'viewport': { 'chrom': view.chrom, 'start': view.low , 'end': view.high, 'overview': overview_track_name }, 'bookmarks': bookmarks }; Repository URL: https://bitbucket.org/galaxy/galaxy-central/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email.
participants (1)
-
Bitbucket