@jbrowse/plugin-linear-genome-view
Version:
JBrowse 2 linear genome view
296 lines (295 loc) • 10.1 kB
JavaScript
import { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons';
import { getSession, isSessionWithAddTracks, toLocale, } from '@jbrowse/core/util';
import CenterFocusStrongIcon from '@mui/icons-material/CenterFocusStrong';
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
import FolderOpenIcon from '@mui/icons-material/FolderOpen';
import LabelIcon from '@mui/icons-material/Label';
import MenuOpenIcon from '@mui/icons-material/MenuOpen';
import PaletteIcon from '@mui/icons-material/Palette';
import PhotoCameraIcon from '@mui/icons-material/PhotoCamera';
import SearchIcon from '@mui/icons-material/Search';
import SyncAltIcon from '@mui/icons-material/SyncAlt';
import VisibilityIcon from '@mui/icons-material/Visibility';
import ZoomInIcon from '@mui/icons-material/ZoomIn';
import { ExportSvgDialog, GetSequenceDialog, ReturnToImportFormDialog, SequenceSearchDialog, } from "./lazyDialogs.js";
function toLocaleRounded(n) {
return toLocale(Math.round(n));
}
export function rewriteOnClicks(self, trackType, viewMenuActions) {
for (const action of viewMenuActions) {
if ('subMenu' in action) {
rewriteOnClicks(self, trackType, action.subMenu);
}
if ('onClick' in action) {
const holdOnClick = action.onClick;
action.onClick = (...args) => {
for (const track of self.tracks) {
if (track.type === trackType) {
holdOnClick.apply(track, [track, ...args]);
}
}
};
}
}
}
export function buildMenuItems(self) {
if (!self.hasDisplayedRegions) {
return [];
}
const { canShowCytobands, showCytobands } = self;
const session = getSession(self);
const menuItems = [
{
label: 'Return to import form',
onClick: () => {
session.queueDialog(handleClose => [
ReturnToImportFormDialog,
{
model: self,
handleClose,
},
]);
},
icon: FolderOpenIcon,
},
...(isSessionWithAddTracks(session)
? [
{
label: 'Sequence search',
icon: SearchIcon,
onClick: () => {
session.queueDialog(handleClose => [
SequenceSearchDialog,
{
model: self,
handleClose,
},
]);
},
},
]
: []),
{
label: 'Export SVG',
icon: PhotoCameraIcon,
onClick: () => {
session.queueDialog(handleClose => [
ExportSvgDialog,
{
model: self,
handleClose,
},
]);
},
},
{
label: 'Open track selector',
onClick: self.activateTrackSelector,
icon: TrackSelectorIcon,
},
{
label: 'Horizontally flip',
icon: SyncAltIcon,
onClick: self.horizontallyFlip,
},
{
label: 'Color by CDS and draw amino acids',
type: 'checkbox',
checked: self.colorByCDS,
icon: PaletteIcon,
onClick: () => {
self.setColorByCDS(!self.colorByCDS);
},
},
{
label: 'Show...',
icon: VisibilityIcon,
subMenu: [
{
label: 'Show all regions in assembly',
onClick: self.showAllRegionsInAssembly,
},
{
label: 'Show center line',
type: 'checkbox',
checked: self.showCenterLine,
onClick: () => {
self.setShowCenterLine(!self.showCenterLine);
},
},
{
label: 'Show header',
type: 'checkbox',
checked: !self.hideHeader,
onClick: () => {
self.setHideHeader(!self.hideHeader);
},
},
{
label: 'Show track outlines',
type: 'checkbox',
checked: self.showTrackOutlines,
onClick: () => {
self.setShowTrackOutlines(!self.showTrackOutlines);
},
},
{
label: 'Show header overview',
type: 'checkbox',
checked: !self.hideHeaderOverview,
onClick: () => {
self.setHideHeaderOverview(!self.hideHeaderOverview);
},
disabled: self.hideHeader,
},
{
label: 'Show no tracks active button',
type: 'checkbox',
checked: !self.hideNoTracksActive,
onClick: () => {
self.setHideNoTracksActive(!self.hideNoTracksActive);
},
},
{
label: 'Show guidelines',
type: 'checkbox',
checked: self.showGridlines,
onClick: () => {
self.setShowGridlines(!self.showGridlines);
},
},
...(canShowCytobands
? [
{
label: 'Show ideogram',
type: 'checkbox',
checked: self.showCytobands,
onClick: () => {
self.setShowCytobands(!showCytobands);
},
},
]
: []),
],
},
{
label: 'Track labels',
icon: LabelIcon,
subMenu: [
{
label: 'Overlapping',
icon: VisibilityIcon,
type: 'radio',
checked: self.trackLabelsSetting === 'overlapping',
onClick: () => {
self.setTrackLabels('overlapping');
},
},
{
label: 'Offset',
icon: VisibilityIcon,
type: 'radio',
checked: self.trackLabelsSetting === 'offset',
onClick: () => {
self.setTrackLabels('offset');
},
},
{
label: 'Hidden',
icon: VisibilityIcon,
type: 'radio',
checked: self.trackLabelsSetting === 'hidden',
onClick: () => {
self.setTrackLabels('hidden');
},
},
],
},
];
for (const [key, value] of self.trackTypeActions.entries()) {
if (value.length) {
menuItems.push({
type: 'divider',
}, {
type: 'subHeader',
label: key,
});
for (const action of value) {
menuItems.push(action);
}
}
}
return menuItems;
}
export function buildRubberBandMenuItems(self) {
const { leftOffset, rightOffset } = self;
const leftRef = leftOffset?.refName ?? '';
const rightRef = rightOffset?.refName ?? '';
const leftCoord = toLocaleRounded((leftOffset?.coord ?? 0) + 1);
const rightCoord = toLocaleRounded(rightOffset?.coord ?? 0);
const rangeString = leftRef === rightRef
? `${leftRef}:${leftCoord}-${rightCoord}`
: `${leftRef}:${leftCoord}..${rightRef}:${rightCoord}`;
return [
{
label: 'Zoom to region',
icon: ZoomInIcon,
onClick: () => {
self.moveTo(self.leftOffset, self.rightOffset);
},
},
{
label: 'Get sequence',
icon: MenuOpenIcon,
onClick: () => {
getSession(self).queueDialog(handleClose => [
GetSequenceDialog,
{
model: self,
handleClose,
},
]);
},
},
{
label: 'Copy range',
icon: ContentCopyIcon,
onClick: async () => {
const { default: copy } = await import('copy-to-clipboard');
copy(rangeString);
},
},
];
}
export function buildRubberbandClickMenuItems(self, clickOffset) {
const { coord, refName } = clickOffset;
if (coord === undefined || refName === undefined) {
return [];
}
const locString = `${refName}:${toLocaleRounded(coord + 1)}`;
return [
{
label: 'Center view here',
icon: CenterFocusStrongIcon,
onClick: () => {
self.centerAt(coord, refName);
},
},
{
label: 'Zoom to base level',
icon: ZoomInIcon,
onClick: () => {
self.centerAt(coord, refName);
self.zoomTo(self.minBpPerPx);
},
},
{
label: `Copy coordinate (${locString})`,
icon: ContentCopyIcon,
onClick: async () => {
const { default: copy } = await import('copy-to-clipboard');
copy(locString);
},
},
];
}