UNPKG

molstar

Version:

A comprehensive macromolecular library.

133 lines 5.82 kB
/** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __assign, __awaiter, __generator } from "tslib"; import { ColorTheme } from './color'; import { SizeTheme } from './size'; import { ParamDefinition as PD } from '../mol-util/param-definition'; import { objectForEach } from '../mol-util/object'; export { Theme }; var Theme; (function (Theme) { function create(ctx, data, props, theme) { theme = theme || createEmpty(); var colorProps = props.colorTheme; var sizeProps = props.sizeTheme; theme.color = ctx.colorThemeRegistry.create(colorProps.name, data, colorProps.params); theme.size = ctx.sizeThemeRegistry.create(sizeProps.name, data, sizeProps.params); return theme; } Theme.create = create; function createEmpty() { return { color: ColorTheme.Empty, size: SizeTheme.Empty }; } Theme.createEmpty = createEmpty; function ensureDependencies(ctx, theme, data, props) { var _a, _b; return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_c) { switch (_c.label) { case 0: return [4 /*yield*/, ((_a = theme.colorThemeRegistry.get(props.colorTheme.name).ensureCustomProperties) === null || _a === void 0 ? void 0 : _a.attach(ctx, data))]; case 1: _c.sent(); return [4 /*yield*/, ((_b = theme.sizeThemeRegistry.get(props.sizeTheme.name).ensureCustomProperties) === null || _b === void 0 ? void 0 : _b.attach(ctx, data))]; case 2: _c.sent(); return [2 /*return*/]; } }); }); } Theme.ensureDependencies = ensureDependencies; function releaseDependencies(theme, data, props) { var _a, _b; (_a = theme.colorThemeRegistry.get(props.colorTheme.name).ensureCustomProperties) === null || _a === void 0 ? void 0 : _a.detach(data); (_b = theme.sizeThemeRegistry.get(props.sizeTheme.name).ensureCustomProperties) === null || _b === void 0 ? void 0 : _b.detach(data); } Theme.releaseDependencies = releaseDependencies; })(Theme || (Theme = {})); function getTypes(list) { return list.map(function (e) { return [e.name, e.provider.label, e.provider.category]; }); } var ThemeRegistry = /** @class */ (function () { function ThemeRegistry(builtInThemes, emptyProvider) { var _this = this; this.emptyProvider = emptyProvider; this._list = []; this._map = new Map(); this._name = new Map(); objectForEach(builtInThemes, function (p, k) { if (p.name !== k) throw new Error("Fix build in themes to have matching names. " + p.name + " " + k); _this.add(p); }); } Object.defineProperty(ThemeRegistry.prototype, "default", { get: function () { return this._list[0]; }, enumerable: false, configurable: true }); Object.defineProperty(ThemeRegistry.prototype, "list", { get: function () { return this._list; }, enumerable: false, configurable: true }); Object.defineProperty(ThemeRegistry.prototype, "types", { get: function () { return getTypes(this._list); }, enumerable: false, configurable: true }); ThemeRegistry.prototype.sort = function () { this._list.sort(function (a, b) { if (a.provider.category === b.provider.category) { return a.provider.label < b.provider.label ? -1 : a.provider.label > b.provider.label ? 1 : 0; } return a.provider.category < b.provider.category ? -1 : 1; }); }; ThemeRegistry.prototype.add = function (provider) { if (this._map.has(provider.name)) { throw new Error(provider.name + " already registered."); } var name = provider.name; this._list.push({ name: name, provider: provider }); this._map.set(name, provider); this._name.set(provider, name); this.sort(); }; ThemeRegistry.prototype.remove = function (provider) { this._list.splice(this._list.findIndex(function (e) { return e.name === provider.name; }), 1); var p = this._map.get(provider.name); if (p) { this._map.delete(provider.name); this._name.delete(p); } }; ThemeRegistry.prototype.has = function (provider) { return this._map.has(provider.name); }; ThemeRegistry.prototype.get = function (name) { return this._map.get(name) || this.emptyProvider; }; ThemeRegistry.prototype.getName = function (provider) { if (!this._name.has(provider)) throw new Error("'" + provider.label + "' is not a registered theme provider."); return this._name.get(provider); }; ThemeRegistry.prototype.create = function (name, ctx, props) { if (props === void 0) { props = {}; } var provider = this.get(name); return provider.factory(ctx, __assign(__assign({}, PD.getDefaultValues(provider.getParams(ctx))), props)); }; ThemeRegistry.prototype.getApplicableList = function (ctx) { return this._list.filter(function (e) { return e.provider.isApplicable(ctx); }); }; ThemeRegistry.prototype.getApplicableTypes = function (ctx) { return getTypes(this.getApplicableList(ctx)); }; return ThemeRegistry; }()); export { ThemeRegistry }; //# sourceMappingURL=theme.js.map