UNPKG

@jbrowse/plugin-linear-genome-view

Version:

JBrowse 2 linear genome view

159 lines (158 loc) 6.7 kB
import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'; import { types } from '@jbrowse/mobx-state-tree'; import { modelFactory as LinearFeatureDisplayModelFactory } from "../LinearFeatureDisplay/index.js"; function findSubMenu(items, label) { return items.find((item) => 'label' in item && item.label === label); } function stateModelFactory(configSchema) { return types .compose('LinearBasicDisplay', LinearFeatureDisplayModelFactory(configSchema), types.model({ type: types.literal('LinearBasicDisplay'), trackGeneGlyphMode: types.maybe(types.string), trackSubfeatureLabels: types.maybe(types.string), trackDisplayDirectionalChevrons: types.maybe(types.boolean), configuration: ConfigurationReference(configSchema), })) .views(self => ({ get geneGlyphMode() { return (self.trackGeneGlyphMode ?? getConf(self, ['renderer', 'geneGlyphMode'])); }, get subfeatureLabels() { return (self.trackSubfeatureLabels ?? getConf(self, ['renderer', 'subfeatureLabels'])); }, get displayDirectionalChevrons() { return (self.trackDisplayDirectionalChevrons ?? getConf(self, ['renderer', 'displayDirectionalChevrons'])); }, })) .views(self => ({ get rendererConfig() { const configBlob = getConf(self, ['renderer']) || {}; const config = configBlob; return { ...config, showLabels: self.trackShowLabels ?? config.showLabels, showDescriptions: self.trackShowDescriptions ?? config.showDescriptions, subfeatureLabels: self.trackSubfeatureLabels ?? config.subfeatureLabels, displayMode: self.trackDisplayMode ?? config.displayMode, maxHeight: self.trackMaxHeight ?? config.maxHeight, geneGlyphMode: self.trackGeneGlyphMode ?? config.geneGlyphMode, displayDirectionalChevrons: self.trackDisplayDirectionalChevrons ?? config.displayDirectionalChevrons, }; }, })) .actions(self => ({ setGeneGlyphMode(val) { self.trackGeneGlyphMode = val; }, setSubfeatureLabels(val) { self.trackSubfeatureLabels = val; }, toggleDisplayDirectionalChevrons() { self.trackDisplayDirectionalChevrons = !self.displayDirectionalChevrons; }, })) .views(self => { const { filterMenuItems: superFilterMenuItems } = self; return { filterMenuItems() { const filters = self.activeFilters(); return [ { label: 'Show only genes', type: 'checkbox', checked: filters.includes("jexl:get(feature,'type')=='gene'"), onClick: () => { const geneFilter = "jexl:get(feature,'type')=='gene'"; if (filters.includes(geneFilter)) { self.setJexlFilters(filters.filter(f => f !== geneFilter)); } else { self.setJexlFilters([...filters, geneFilter]); } }, }, ...superFilterMenuItems(), ]; }, }; }) .views(self => { const { trackMenuItems: superTrackMenuItems } = self; return { trackMenuItems() { const items = superTrackMenuItems(); const showMenu = findSubMenu(items, 'Show...'); if (showMenu) { showMenu.subMenu = [ ...showMenu.subMenu, { label: 'Show chevrons', type: 'checkbox', checked: self.displayDirectionalChevrons, onClick: () => { self.toggleDisplayDirectionalChevrons(); }, }, { label: 'Subfeature labels', subMenu: ['none', 'below', 'overlay'].map(val => ({ label: val, type: 'radio', checked: self.subfeatureLabels === val, onClick: () => { self.setSubfeatureLabels(val); }, })), }, { label: 'Gene glyph', subMenu: [ { value: 'all', label: 'All transcripts', }, { value: 'longest', label: 'Longest transcript', }, { value: 'longestCoding', label: 'Longest coding transcript', }, ].map(({ value, label }) => ({ label, type: 'radio', checked: self.geneGlyphMode === value, onClick: () => { self.setGeneGlyphMode(value); }, })), }, ]; } return items; }, }; }) .postProcessSnapshot(snap => { if (!snap) { return snap; } const { trackGeneGlyphMode, trackSubfeatureLabels, trackDisplayDirectionalChevrons, ...rest } = snap; return { ...rest, ...(trackGeneGlyphMode !== undefined ? { trackGeneGlyphMode } : {}), ...(trackSubfeatureLabels !== undefined ? { trackSubfeatureLabels } : {}), ...(trackDisplayDirectionalChevrons !== undefined ? { trackDisplayDirectionalChevrons } : {}), }; }); } export default stateModelFactory;