@gmod/jbrowse
Version:
JBrowse - client-side genome browser
146 lines (132 loc) • 5.23 kB
JavaScript
define( [
'dojo/_base/declare',
'dojo/_base/array',
'dojo/promise/all',
'JBrowse/Util',
'JBrowse/View/Track/CanvasFeatures',
'JBrowse/View/Track/_AlignmentsMixin'
],
function(
declare,
array,
all,
Util,
CanvasFeatureTrack,
AlignmentsMixin
) {
return declare( [ CanvasFeatureTrack, AlignmentsMixin ], {
_defaultConfig: function() {
var c = Util.deepUpdate(
dojo.clone( this.inherited(arguments) ),
{
glyph: 'JBrowse/View/FeatureGlyph/Alignment',
maxFeatureGlyphExpansion: 0,
maxFeatureScreenDensity: 15,
hideDuplicateReads: true,
hideQCFailingReads: true,
hideSecondary: true,
hideSupplementary: true,
hideUnmapped: true,
hideUnsplicedReads: false,
hideMissingMatepairs: false,
hideForwardStrand: false,
hideReverseStrand: false,
useXS: false,
useReverseTemplate: false,
useXSOption: true,
useReverseTemplateOption: true,
histograms: {
description: 'coverage depth',
binsPerBlock: 200
},
style: {
showLabels: false
}
}
);
// add menu items for viewing matepair / next segment locations
c.menuTemplate.push(
{
"iconClass": "dijitIconUndo",
"url": function( track, feature ) {
return track.browser.makeCurrentViewURL(
{ loc: track._nextSegmentViewLoc( feature, 0.8 ),
highlight: feature.get('next_segment_position'),
tracklist: 0
});
},
"action": "iframeDialog",
title: "Open {next_segment_position} in a popup",
disabled: function( track, feature ) {
return ! feature.get('next_segment_position');
},
"label": "Quick-view mate/next location"
},
{
"iconClass": "dijitIconUndo",
"url": function( track, feature ) {
return track.browser.makeCurrentViewURL(
{ loc: track._nextSegmentViewLoc( feature ),
highlight: feature.get('next_segment_position')
});
},
"action": "newWindow",
title: "Open {next_segment_position} in a new tab",
disabled: function( track, feature ) {
return ! feature.get('next_segment_position');
},
"label": "Open mate/next location in new tab"
}
);
return c;
},
// make a locstring for a view of the given feature's next segment
// (in a multi-segment read)
_nextSegmentViewLoc: function( feature, factor ) {
var nextLocStr = feature.get('next_segment_position');
if( ! nextLocStr ) return undefined;
var s = nextLocStr.split(':');
var refName = s[0];
var start = parseInt(s[1]);
var visibleRegion = this.browser.view.visibleRegion();
var visibleRegionSize = Math.round( (visibleRegion.end - visibleRegion.start + 1 )*(factor||1) );
return Util.assembleLocString(
{ start: Math.round( start - visibleRegionSize/2 ),
end: Math.round( start + visibleRegionSize/2 ),
ref: refName
});
},
_trackMenuOptions: function() {
var track=this;
var displayOptions=[];
if(this.config.useReverseTemplateOption) {
displayOptions.push({
label: 'Use reversed template',
type: 'dijit/CheckedMenuItem',
checked: this.config.useReverseTemplate,
onClick: function(event) {
track.config.useReverseTemplate = this.get('checked');
track.browser.publish('/jbrowse/v1/v/tracks/replace', [track.config]);
}
});
}
if(this.config.useXSOption) {
displayOptions.push({
label: 'Use XS',
type: 'dijit/CheckedMenuItem',
checked: this.config.useXS,
onClick: function(event) {
track.config.useXS = this.get('checked');
track.browser.publish('/jbrowse/v1/v/tracks/replace', [track.config]);
}
});
}
return all([ this.inherited(arguments), this._alignmentsFilterTrackMenuOptions(), displayOptions ])
.then( function( options ) {
var o = options.shift();
options.unshift({ type: 'dijit/MenuSeparator' } );
return o.concat.apply( o, options );
});
}
});
});