molstar
Version:
A comprehensive macromolecular library.
332 lines • 15.3 kB
JavaScript
/**
* Copyright (c) 2018-2021 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.RepresentationProvider = void 0;
var tslib_1 = require("tslib");
var param_definition_1 = require("../mol-util/param-definition");
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 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 = {}));
var EmptyRepresentationProvider = {
label: '',
description: '',
factory: function () { return Representation.Empty; },
getParams: function () { return ({}); },
defaultValues: {}
};
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(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("'" + 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) || 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, 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.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: [], 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; },
mark: function () { return false; },
destroy: function () { }
};
function createMulti(label, ctx, getParams, stateBuilder, reprDefs) {
var _this = this;
var version = 0;
var updated = new rxjs_1.Subject();
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 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 '" + label + "' representation", function (runtime) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
var i, il;
return (0, 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*/, 4];
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:
++i;
return [3 /*break*/, 1];
case 4:
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;
},
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(currentState);
}
},
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 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 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 '" + label + "' representation", function (runtime) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
return (0, tslib_1.__generator)(this, function (_a) {
// TODO
updated.next(version++);
return [2 /*return*/];
});
}); });
},
get state() { return currentState; },
get theme() { return currentTheme; },
getLoci: function () {
// TODO
return loci_1.EmptyLoci;
},
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.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;
//# sourceMappingURL=representation.js.map
;