Skip to main content

Enableable

Enableable

Enableable is the standard runtime switch used across Flowscape core.

It controls whether an object should participate in active processing (update, render, input, interaction pipelines).

IEnableable Contract

export interface IEnableable {
isEnabled(): boolean;
enable(): void;
disable(): void;
setEnabled(value: boolean): void;
}

This gives every runtime object a predictable on/off API.

Enableable Base Class

type Events = {
change: boolean;
};

export abstract class Enableable implements IEnableable {
protected _enabled = true;
private readonly _events = new EventEmitter<Events>();

public onChange(callback: (state: boolean) => void): () => void {
return this._events.on('change', callback);
}

public isEnabled(): boolean {
return this._enabled;
}

public enable(): void {
this.setEnabled(true);
}

public disable(): void {
this.setEnabled(false);
}

public setEnabled(value: boolean): void {
if (this._enabled === value) {
return;
}

this._enabled = value;
this._onEnabledChanged(value);
}

protected _onEnabledChanged(value: boolean): void {
this._events.emit('change', value);
}
}

Why This Design

  • shared toggle behavior for all runtime systems
  • idempotent state change (setEnabled exits if state is unchanged)
  • built-in change event stream
  • extension point via _onEnabledChanged(value)

State Transition Rules

  • initial state is enabled (true)
  • enable()/disable() are convenience wrappers
  • only real state changes emit change event
  • subclasses can react in _onEnabledChanged without rewriting toggle logic

Typical Usage

Enableable is commonly used for:

  • layers
  • tools
  • input controllers/modules
  • runtime services

Minimal Example

class GridModule extends Enableable {
protected override _onEnabledChanged(value: boolean): void {
super._onEnabledChanged(value);
console.log('Grid enabled:', value);
}

public update(): void {
if (!this.isEnabled()) return;
// update logic
}
}

const grid = new GridModule();
const off = grid.onChange((state) => {
console.log('Changed:', state);
});

grid.disable(); // emits false
grid.enable(); // emits true

off();

Practical Rule

Guard expensive work early:

if (!module.isEnabled()) return;

This keeps disabled modules cheap and predictable in frame loops.

Next