molstar
Version:
A comprehensive macromolecular library.
398 lines (397 loc) • 18.2 kB
JavaScript
/**
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Representation = exports.RepresentationRegistry = exports.EmptyRepresentationProvider = exports.RepresentationProvider = void 0;
var tslib_1 = require("tslib");
var param_definition_1 = require("../mol-util/param-definition");
var color_1 = require("../mol-theme/color");
var size_1 = require("../mol-theme/size");
var theme_1 = require("../mol-theme/theme");
var rxjs_1 = require("rxjs");
var mol_task_1 = require("../mol-task");
var marker_action_1 = require("../mol-util/marker-action");
var loci_1 = require("../mol-model/loci");
var overpaint_1 = require("../mol-theme/overpaint");
var transparency_1 = require("../mol-theme/transparency");
var linear_algebra_1 = require("../mol-math/linear-algebra");
var util_1 = require("./util");
var base_1 = require("../mol-geo/geometry/base");
var visual_1 = require("./visual");
var clipping_1 = require("../mol-theme/clipping");
var set_1 = require("../mol-util/set");
var util_2 = require("../mol-data/util");
var substance_1 = require("../mol-theme/substance");
var RepresentationProvider;
(function (RepresentationProvider) {
function getDetaultParams(r, ctx, data) {
return param_definition_1.ParamDefinition.getDefaultValues(r.getParams(ctx, data));
}
RepresentationProvider.getDetaultParams = getDetaultParams;
})(RepresentationProvider = exports.RepresentationProvider || (exports.RepresentationProvider = {}));
exports.EmptyRepresentationProvider = {
name: '',
label: '',
description: '',
factory: function () { return Representation.Empty; },
getParams: function () { return ({}); },
defaultValues: {},
defaultColorTheme: color_1.ColorTheme.EmptyProvider,
defaultSizeTheme: size_1.SizeTheme.EmptyProvider,
isApplicable: function () { return true; }
};
function getTypes(list) {
return list.map(function (e) { return [e.name, e.provider.label]; });
}
var RepresentationRegistry = /** @class */ (function () {
function RepresentationRegistry() {
this._list = [];
this._map = new Map();
this._name = new Map();
}
Object.defineProperty(RepresentationRegistry.prototype, "default", {
get: function () { return this._list[0]; },
enumerable: false,
configurable: true
});
Object.defineProperty(RepresentationRegistry.prototype, "types", {
get: function () { return getTypes(this._list); },
enumerable: false,
configurable: true
});
;
RepresentationRegistry.prototype.add = function (provider) {
if (this._map.has(provider.name)) {
throw new Error("".concat(provider.name, " already registered."));
}
this._list.push({ name: provider.name, provider: provider });
this._map.set(provider.name, provider);
this._name.set(provider, provider.name);
};
RepresentationRegistry.prototype.getName = function (provider) {
if (!this._name.has(provider))
throw new Error("'".concat(provider.label, "' is not a registered represenatation provider."));
return this._name.get(provider);
};
RepresentationRegistry.prototype.remove = function (provider) {
var name = provider.name;
this._list.splice(this._list.findIndex(function (e) { return e.name === name; }), 1);
var p = this._map.get(name);
if (p) {
this._map.delete(name);
this._name.delete(p);
}
};
RepresentationRegistry.prototype.get = function (name) {
return this._map.get(name) || exports.EmptyRepresentationProvider;
};
Object.defineProperty(RepresentationRegistry.prototype, "list", {
get: function () {
return this._list;
},
enumerable: false,
configurable: true
});
RepresentationRegistry.prototype.getApplicableList = function (data) {
return this._list.filter(function (e) { return e.provider.isApplicable(data); });
};
RepresentationRegistry.prototype.getApplicableTypes = function (data) {
return getTypes(this.getApplicableList(data));
};
return RepresentationRegistry;
}());
exports.RepresentationRegistry = RepresentationRegistry;
var Representation;
(function (Representation) {
var Loci;
(function (Loci) {
function areEqual(a, b) {
return a.repr === b.repr && loci_1.Loci.areEqual(a.loci, b.loci);
}
Loci.areEqual = areEqual;
function isEmpty(a) {
return loci_1.Loci.isEmpty(a.loci);
}
Loci.isEmpty = isEmpty;
Loci.Empty = { loci: loci_1.EmptyLoci };
})(Loci = Representation.Loci || (Representation.Loci = {}));
function createState() {
return { visible: true, alphaFactor: 1, pickable: true, colorOnly: false, syncManually: false, transform: linear_algebra_1.Mat4.identity(), overpaint: overpaint_1.Overpaint.Empty, transparency: transparency_1.Transparency.Empty, substance: substance_1.Substance.Empty, clipping: clipping_1.Clipping.Empty, markerActions: marker_action_1.MarkerActions.All };
}
Representation.createState = createState;
function updateState(state, update) {
if (update.visible !== undefined)
state.visible = update.visible;
if (update.alphaFactor !== undefined)
state.alphaFactor = update.alphaFactor;
if (update.pickable !== undefined)
state.pickable = update.pickable;
if (update.colorOnly !== undefined)
state.colorOnly = update.colorOnly;
if (update.overpaint !== undefined)
state.overpaint = update.overpaint;
if (update.transparency !== undefined)
state.transparency = update.transparency;
if (update.substance !== undefined)
state.substance = update.substance;
if (update.clipping !== undefined)
state.clipping = update.clipping;
if (update.syncManually !== undefined)
state.syncManually = update.syncManually;
if (update.transform !== undefined)
linear_algebra_1.Mat4.copy(state.transform, update.transform);
if (update.markerActions !== undefined)
state.markerActions = update.markerActions;
}
Representation.updateState = updateState;
Representation.StateBuilder = { create: createState, update: updateState };
Representation.Empty = {
label: '', groupCount: 0, renderObjects: [], geometryVersion: -1, props: {}, params: {}, updated: new rxjs_1.Subject(), state: createState(), theme: theme_1.Theme.createEmpty(),
createOrUpdate: function () { return mol_task_1.Task.constant('', undefined); },
setState: function () { },
setTheme: function () { },
getLoci: function () { return loci_1.EmptyLoci; },
getAllLoci: function () { return []; },
mark: function () { return false; },
destroy: function () { }
};
var GeometryState = /** @class */ (function () {
function GeometryState() {
this.curr = new Set();
this.next = new Set();
this._version = -1;
}
Object.defineProperty(GeometryState.prototype, "version", {
get: function () {
return this._version;
},
enumerable: false,
configurable: true
});
GeometryState.prototype.add = function (id, version) {
this.next.add((0, util_2.cantorPairing)(id, version));
};
GeometryState.prototype.snapshot = function () {
var _a;
if (!set_1.SetUtils.areEqual(this.curr, this.next)) {
this._version += 1;
}
_a = [this.next, this.curr], this.curr = _a[0], this.next = _a[1];
this.next.clear();
};
return GeometryState;
}());
Representation.GeometryState = GeometryState;
function createMulti(label, ctx, getParams, stateBuilder, reprDefs) {
var _this = this;
var version = 0;
var updated = new rxjs_1.Subject();
var geometryState = new GeometryState();
var currentState = stateBuilder.create();
var currentTheme = theme_1.Theme.createEmpty();
var currentParams;
var currentProps;
var currentData;
var reprMap = {};
var reprList = Object.keys(reprDefs).map(function (name, i) {
reprMap[i] = name;
var repr = reprDefs[name](ctx, getParams);
repr.setState(currentState);
return repr;
});
return {
label: label,
updated: updated,
get groupCount() {
var groupCount = 0;
if (currentProps) {
var visuals = currentProps.visuals;
for (var i = 0, il = reprList.length; i < il; ++i) {
if (!visuals || visuals.includes(reprMap[i])) {
groupCount += reprList[i].groupCount;
}
}
}
return groupCount;
},
get renderObjects() {
var renderObjects = [];
if (currentProps) {
var visuals = currentProps.visuals;
for (var i = 0, il = reprList.length; i < il; ++i) {
if (!visuals || visuals.includes(reprMap[i])) {
renderObjects.push.apply(renderObjects, reprList[i].renderObjects);
}
}
}
return renderObjects;
},
get geometryVersion() { return geometryState.version; },
get props() { return currentProps; },
get params() { return currentParams; },
createOrUpdate: function (props, data) {
if (props === void 0) { props = {}; }
if (data && data !== currentData) {
currentParams = getParams(ctx, data);
currentData = data;
if (!currentProps)
currentProps = param_definition_1.ParamDefinition.getDefaultValues(currentParams);
}
var qualityProps = (0, util_1.getQualityProps)(Object.assign({}, currentProps, props), currentData);
Object.assign(currentProps, props, qualityProps);
var visuals = currentProps.visuals;
return mol_task_1.Task.create("Creating or updating '".concat(label, "' representation"), function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var i, il;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
i = 0, il = reprList.length;
_a.label = 1;
case 1:
if (!(i < il)) return [3 /*break*/, 5];
if (!(!visuals || visuals.includes(reprMap[i]))) return [3 /*break*/, 3];
return [4 /*yield*/, reprList[i].createOrUpdate(currentProps, currentData).runInContext(runtime)];
case 2:
_a.sent();
_a.label = 3;
case 3:
geometryState.add(i, reprList[i].geometryVersion);
_a.label = 4;
case 4:
++i;
return [3 /*break*/, 1];
case 5:
geometryState.snapshot();
updated.next(version++);
return [2 /*return*/];
}
});
}); });
},
get state() { return currentState; },
get theme() { return currentTheme; },
getLoci: function (pickingId) {
var visuals = currentProps.visuals;
for (var i = 0, il = reprList.length; i < il; ++i) {
if (!visuals || visuals.includes(reprMap[i])) {
var loci = reprList[i].getLoci(pickingId);
if (!(0, loci_1.isEmptyLoci)(loci))
return loci;
}
}
return loci_1.EmptyLoci;
},
getAllLoci: function () {
var loci = [];
var visuals = currentProps.visuals;
for (var i = 0, il = reprList.length; i < il; ++i) {
if (!visuals || visuals.includes(reprMap[i])) {
loci.push.apply(loci, reprList[i].getAllLoci());
}
}
return loci;
},
mark: function (loci, action) {
var marked = false;
for (var i = 0, il = reprList.length; i < il; ++i) {
marked = reprList[i].mark(loci, action) || marked;
}
return marked;
},
setState: function (state) {
stateBuilder.update(currentState, state);
for (var i = 0, il = reprList.length; i < il; ++i) {
reprList[i].setState(state); // only set the new (partial) state
}
},
setTheme: function (theme) {
currentTheme = theme;
for (var i = 0, il = reprList.length; i < il; ++i) {
reprList[i].setTheme(theme);
}
},
destroy: function () {
for (var i = 0, il = reprList.length; i < il; ++i) {
reprList[i].destroy();
}
}
};
}
Representation.createMulti = createMulti;
function fromRenderObject(label, renderObject) {
var _this = this;
var version = 0;
var updated = new rxjs_1.Subject();
var geometryState = new GeometryState();
var currentState = Representation.createState();
var currentTheme = theme_1.Theme.createEmpty();
var currentParams = param_definition_1.ParamDefinition.clone(base_1.BaseGeometry.Params);
var currentProps = param_definition_1.ParamDefinition.getDefaultValues(base_1.BaseGeometry.Params);
return {
label: label,
updated: updated,
get groupCount() { return renderObject.values.uGroupCount.ref.value; },
get renderObjects() { return [renderObject]; },
get geometryVersion() { return geometryState.version; },
get props() { return currentProps; },
get params() { return currentParams; },
createOrUpdate: function (props) {
if (props === void 0) { props = {}; }
var qualityProps = (0, util_1.getQualityProps)(Object.assign({}, currentProps, props));
Object.assign(currentProps, props, qualityProps);
return mol_task_1.Task.create("Updating '".concat(label, "' representation"), function (runtime) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
// TODO
geometryState.add(0, renderObject.id);
geometryState.snapshot();
updated.next(version++);
return [2 /*return*/];
});
}); });
},
get state() { return currentState; },
get theme() { return currentTheme; },
getLoci: function () {
// TODO
return loci_1.EmptyLoci;
},
getAllLoci: function () {
// TODO
return [];
},
mark: function (loci, action) {
// TODO
return false;
},
setState: function (state) {
if (state.visible !== undefined)
visual_1.Visual.setVisibility(renderObject, state.visible);
if (state.alphaFactor !== undefined)
visual_1.Visual.setAlphaFactor(renderObject, state.alphaFactor);
if (state.pickable !== undefined)
visual_1.Visual.setPickable(renderObject, state.pickable);
if (state.colorOnly !== undefined)
visual_1.Visual.setColorOnly(renderObject, state.colorOnly);
if (state.overpaint !== undefined) {
// TODO
}
if (state.transparency !== undefined) {
// TODO
}
if (state.substance !== undefined) {
// TODO
}
if (state.transform !== undefined)
visual_1.Visual.setTransform(renderObject, state.transform);
Representation.updateState(currentState, state);
},
setTheme: function () { },
destroy: function () { }
};
}
Representation.fromRenderObject = fromRenderObject;
})(Representation || (Representation = {}));
exports.Representation = Representation;
;