diff --git a/src/mol-plugin/command.ts b/src/mol-plugin/command.ts index 2ab28baf362f7c4b08248198d82bfb552e70fd31..fc26dc2eb51de31776154f2f38a88ac8d271b82c 100644 --- a/src/mol-plugin/command.ts +++ b/src/mol-plugin/command.ts @@ -6,6 +6,7 @@ import { PluginContext } from './context'; import { LinkedList } from 'mol-data/generic'; +import { RxEventHelper } from 'mol-util/rx-event-helper'; export { PluginCommand } @@ -42,6 +43,16 @@ namespace PluginCommand { private queue = LinkedList<Instance>(); private disposing = false; + private ev = RxEventHelper.create(); + + readonly behaviour = { + locked: this.ev.behavior<boolean>(false) + }; + + lock(locked: boolean = true) { + this.behaviour.locked.next(locked); + } + subscribe<T>(cmd: Descriptor<T>, action: Action<T>) { let actions = this.subs.get(cmd.id); if (!actions) { diff --git a/src/mol-plugin/context.ts b/src/mol-plugin/context.ts index 7cd0967c1ebbde5ecb097e1d2526addc55a86ee4..112ecaf907f3d4e42bee635b435dee6ce3657d05 100644 --- a/src/mol-plugin/context.ts +++ b/src/mol-plugin/context.ts @@ -18,14 +18,18 @@ export class PluginContext { private ev = RxEventHelper.create(); readonly state = new PluginState(this); + readonly commands = new PluginCommand.Manager(); readonly events = { data: this.state.data.context.events }; + readonly behaviors = { + command: this.commands.behaviour + }; + readonly canvas3d: Canvas3D; - readonly commands = new PluginCommand.Manager(); initViewer(canvas: HTMLCanvasElement, container: HTMLDivElement) { try { diff --git a/src/mol-state/context.ts b/src/mol-state/context.ts index acbf366c6003967b50114a7823f940c77f7c73f9..35a01880f38b954301c8a1e0cbc4357fed94c273 100644 --- a/src/mol-state/context.ts +++ b/src/mol-state/context.ts @@ -13,7 +13,7 @@ export { StateContext } class StateContext { private ev = RxEventHelper.create(); - events = { + readonly events = { object: { stateChanged: this.ev<{ ref: Transform.Ref }>(), propsChanged: this.ev<{ ref: Transform.Ref, newProps: unknown }>(), @@ -29,6 +29,10 @@ class StateContext { updated: this.ev<void>() }; + readonly behaviours = { + currentObject: this.ev.behavior<{ ref: Transform.Ref }>(void 0 as any) + }; + readonly globalContext: unknown; readonly defaultObjectProps: unknown; @@ -36,8 +40,9 @@ class StateContext { this.ev.dispose(); } - constructor(params: { globalContext: unknown, defaultObjectProps: unknown }) { + constructor(params: { globalContext: unknown, defaultObjectProps: unknown, rootRef: Transform.Ref }) { this.globalContext = params.globalContext; this.defaultObjectProps = params.defaultObjectProps; + this.behaviours.currentObject.next({ ref: params.rootRef }); } } \ No newline at end of file diff --git a/src/mol-state/state.ts b/src/mol-state/state.ts index 2f10a47415cfee67f0447961121b35e3b330b7e0..384274d2f92767aabe2d787f42aa86f3a8d3849f 100644 --- a/src/mol-state/state.ts +++ b/src/mol-state/state.ts @@ -89,7 +89,8 @@ class State { this.context = new StateContext({ globalContext: params && params.globalContext, - defaultObjectProps + defaultObjectProps, + rootRef: tree.rootRef }); } } @@ -125,6 +126,7 @@ namespace State { ctx.objects.delete(d); ctx.transformCache.delete(d); ctx.stateCtx.events.object.removed.next({ ref: d }); + // TODO: handle current object change } initObjectState(ctx, roots); diff --git a/src/mol-util/rx-event-helper.ts b/src/mol-util/rx-event-helper.ts index c24a16be7b89335bd0c3209791e7a6902d98d69d..4ef9d5eef0d3a4d735a643bbee2b058274f0fd4d 100644 --- a/src/mol-util/rx-event-helper.ts +++ b/src/mol-util/rx-event-helper.ts @@ -4,12 +4,13 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import { Subject } from 'rxjs'; +import { Subject, BehaviorSubject } from 'rxjs'; export { RxEventHelper } interface RxEventHelper { <T>(): Subject<T>, + behavior<T>(v: T): BehaviorSubject<T>, dispose(): void } @@ -31,6 +32,13 @@ class _RxEventHelper { this._eventList.push(s); return s; } + + behavior<T>(v: T) { + const s = new BehaviorSubject<T>(v); + this._eventList.push(s); + return s; + } + dispose() { if (this._disposed) return; for (const e of this._eventList) e.complete();