molstar
Version:
A comprehensive macromolecular library.
133 lines • 5.82 kB
JavaScript
/**
* 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