UNPKG

@bokeh/bokehjs

Version:

Interactive, novel data visualization

66 lines 1.96 kB
import { Signal0 } from "../../core/signaling"; export class StateManager { parent; initial_state; static __name__ = "StateManager"; changed; constructor(parent, initial_state) { this.parent = parent; this.initial_state = initial_state; this.changed = new Signal0(this.parent, "state_changed"); } history = []; index = -1; _do_state_change(index) { const state = index in this.history ? this.history[index].state : this.initial_state; if (state.range != null) { this.parent.update_range(state.range); } if (state.selection != null) { this.parent.update_selection(state.selection); } return state; } peek() { return this.can_undo ? this.history[this.index] : null; } push(type, new_state) { const { history, index } = this; const prev_state = index in history ? history[index].state : {}; const state = { ...this.initial_state, ...prev_state, ...new_state }; this.history = this.history.slice(0, this.index + 1); this.history.push({ type, state }); this.index = this.history.length - 1; this.changed.emit(); } clear() { this.history = []; this.index = -1; this.changed.emit(); } undo() { if (this.can_undo) { this.index -= 1; const state = this._do_state_change(this.index); this.changed.emit(); return state; } return null; } redo() { if (this.can_redo) { this.index += 1; const state = this._do_state_change(this.index); this.changed.emit(); return state; } return null; } get can_undo() { return this.index >= 0; } get can_redo() { return this.index < this.history.length - 1; } } //# sourceMappingURL=state_manager.js.map