diff --git a/src/mol-plugin/state.ts b/src/mol-plugin/state.ts index 89da2a46133369fcda224d0ea2fc1179568d132d..07127dbf56ca0ea5e03f1781016e64157b99cf3a 100644 --- a/src/mol-plugin/state.ts +++ b/src/mol-plugin/state.ts @@ -64,7 +64,7 @@ class PluginState { } async setSnapshot(snapshot: PluginState.Snapshot) { - this.animation.stop(); + await this.animation.stop(); if (snapshot.behaviour) await this.plugin.runTask(this.behaviorState.setSnapshot(snapshot.behaviour)); if (snapshot.data) await this.plugin.runTask(this.dataState.setSnapshot(snapshot.data)); diff --git a/src/mol-plugin/state/animation/built-in.ts b/src/mol-plugin/state/animation/built-in.ts index f8211ea444d024033f5ae2d07747094ee0df922e..0e75c918b2ade162140cc336413c63de733fe20f 100644 --- a/src/mol-plugin/state/animation/built-in.ts +++ b/src/mol-plugin/state/animation/built-in.ts @@ -90,7 +90,8 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({ name: 'built-in.animate-assembly-unwind', display: { name: 'Unwind Assembly' }, params: () => ({ - durationInMs: PD.Numeric(3000, { min: 100, max: 10000, step: 100}) + durationInMs: PD.Numeric(3000, { min: 100, max: 10000, step: 100}), + playOnce: PD.Boolean(false) }), initialState: () => ({ t: 0 }), async setup(_, plugin) { @@ -133,7 +134,13 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({ const update = state.build(); const d = (t.current - t.lastApplied) / ctx.params.durationInMs; - const newTime = (animState.t + d) % 1; + let newTime = (animState.t + d), finished = false; + if (ctx.params.playOnce && newTime >= 1) { + finished = true; + newTime = 1; + } else { + newTime = newTime % 1; + } for (const m of anims) { update.to(m).update({ t: newTime }); @@ -141,6 +148,7 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({ await PluginCommands.State.Update.dispatch(ctx.plugin, { state, tree: update, options: { doNotLogTiming: true } }); + if (finished) return { kind: 'finished' }; return { kind: 'next', state: { t: newTime } }; } }) diff --git a/src/mol-plugin/ui/controls.tsx b/src/mol-plugin/ui/controls.tsx index 7985f17542b3a45679209929e24221c6d41ed7ae..3ca349f024b3a36dbcab6de50d1abada76eb3ced 100644 --- a/src/mol-plugin/ui/controls.tsx +++ b/src/mol-plugin/ui/controls.tsx @@ -109,7 +109,7 @@ export class StateSnapshotViewportControls extends PluginUIComponent<{}, { isBus // TODO: this needs to be diabled when the state is updating! this.subscribe(this.plugin.state.snapshots.events.changed, () => this.forceUpdate()); this.subscribe(this.plugin.behaviors.state.isUpdating, isBusy => this.setState({ isBusy })); - this.subscribe(this.plugin.behaviors.state.isAnimating, isAnimating => this.setState({ show: !isAnimating })); + this.subscribe(this.plugin.behaviors.state.isAnimating, isBusy => this.setState({ isBusy })); } async update(id: string) {