|
@@ -6,43 +6,76 @@
|
|
|
|
|
|
import { PluginBehavior } from '../behavior';
|
|
|
import { PluginStateObject as SO } from '../../state/base';
|
|
|
-
|
|
|
-class _AddRepresentationToCanvas extends PluginBehavior.Handler {
|
|
|
- register(): void {
|
|
|
- this.subscribeObservable(this.ctx.events.state.data.object.created, o => {
|
|
|
- if (!SO.isRepresentation3D(o.obj)) return;
|
|
|
- this.ctx.canvas3d.add(o.obj.data);
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
- });
|
|
|
- this.subscribeObservable(this.ctx.events.state.data.object.updated, o => {
|
|
|
- const oo = o.obj;
|
|
|
- if (!SO.isRepresentation3D(oo)) return;
|
|
|
- this.ctx.canvas3d.add(oo.data);
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
- });
|
|
|
- this.subscribeObservable(this.ctx.events.state.data.object.removed, o => {
|
|
|
- const oo = o.obj;
|
|
|
- if (!SO.isRepresentation3D(oo)) return;
|
|
|
- this.ctx.canvas3d.remove(oo.data);
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
- oo.data.destroy();
|
|
|
- });
|
|
|
- this.subscribeObservable(this.ctx.events.state.data.object.replaced, o => {
|
|
|
- if (o.oldObj && SO.isRepresentation3D(o.oldObj)) {
|
|
|
- this.ctx.canvas3d.remove(o.oldObj.data);
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
- o.oldObj.data.destroy();
|
|
|
- }
|
|
|
- if (o.newObj && SO.isRepresentation3D(o.newObj)) {
|
|
|
- this.ctx.canvas3d.add(o.newObj.data);
|
|
|
- this.ctx.canvas3d.requestDraw(true);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-}
|
|
|
+import { EmptyLoci, Loci, areLociEqual } from 'mol-model/loci';
|
|
|
+import { MarkerAction } from 'mol-geo/geometry/marker-data';
|
|
|
|
|
|
export const AddRepresentationToCanvas = PluginBehavior.create({
|
|
|
name: 'add-representation-to-canvas',
|
|
|
- ctor: _AddRepresentationToCanvas,
|
|
|
+ ctor: class extends PluginBehavior.Handler {
|
|
|
+ register(): void {
|
|
|
+ this.subscribeObservable(this.ctx.events.state.data.object.created, o => {
|
|
|
+ if (!SO.isRepresentation3D(o.obj)) return;
|
|
|
+ this.ctx.canvas3d.add(o.obj.data);
|
|
|
+ this.ctx.canvas3d.requestDraw(true);
|
|
|
+ });
|
|
|
+ this.subscribeObservable(this.ctx.events.state.data.object.updated, o => {
|
|
|
+ const oo = o.obj;
|
|
|
+ if (!SO.isRepresentation3D(oo)) return;
|
|
|
+ this.ctx.canvas3d.add(oo.data);
|
|
|
+ this.ctx.canvas3d.requestDraw(true);
|
|
|
+ });
|
|
|
+ this.subscribeObservable(this.ctx.events.state.data.object.removed, o => {
|
|
|
+ const oo = o.obj;
|
|
|
+ if (!SO.isRepresentation3D(oo)) return;
|
|
|
+ this.ctx.canvas3d.remove(oo.data);
|
|
|
+ this.ctx.canvas3d.requestDraw(true);
|
|
|
+ oo.data.destroy();
|
|
|
+ });
|
|
|
+ this.subscribeObservable(this.ctx.events.state.data.object.replaced, o => {
|
|
|
+ if (o.oldObj && SO.isRepresentation3D(o.oldObj)) {
|
|
|
+ this.ctx.canvas3d.remove(o.oldObj.data);
|
|
|
+ this.ctx.canvas3d.requestDraw(true);
|
|
|
+ o.oldObj.data.destroy();
|
|
|
+ }
|
|
|
+ if (o.newObj && SO.isRepresentation3D(o.newObj)) {
|
|
|
+ this.ctx.canvas3d.add(o.newObj.data);
|
|
|
+ this.ctx.canvas3d.requestDraw(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
display: { name: 'Add Representation To Canvas' }
|
|
|
+});
|
|
|
+
|
|
|
+export const HighlightLoci = PluginBehavior.create({
|
|
|
+ name: 'representation-highlight-loci',
|
|
|
+ ctor: class extends PluginBehavior.Handler {
|
|
|
+ register(): void {
|
|
|
+ let prevLoci: Loci = EmptyLoci, prevRepr: any = void 0;
|
|
|
+ this.subscribeObservable(this.ctx.behaviors.canvas.highlightLoci, current => {
|
|
|
+ if (!this.ctx.canvas3d) return;
|
|
|
+
|
|
|
+ if (current.repr !== prevRepr || !areLociEqual(current.loci, prevLoci)) {
|
|
|
+ this.ctx.canvas3d.mark(prevLoci, MarkerAction.RemoveHighlight);
|
|
|
+ this.ctx.canvas3d.mark(current.loci, MarkerAction.Highlight);
|
|
|
+ prevLoci = current.loci;
|
|
|
+ prevRepr = current.repr;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ display: { name: 'Highlight Loci on Canvas' }
|
|
|
+});
|
|
|
+
|
|
|
+export const SelectLoci = PluginBehavior.create({
|
|
|
+ name: 'representation-select-loci',
|
|
|
+ ctor: class extends PluginBehavior.Handler {
|
|
|
+ register(): void {
|
|
|
+ this.subscribeObservable(this.ctx.behaviors.canvas.selectLoci, ({ loci }) => {
|
|
|
+ if (!this.ctx.canvas3d) return;
|
|
|
+ this.ctx.canvas3d.mark(loci, MarkerAction.Toggle);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ display: { name: 'Select Loci on Canvas' }
|
|
|
});
|