modelling/lib/ControlModel.ts

52 lines
1.6 KiB
TypeScript

/*
* Copyright (C) Sapphirecode - All Rights Reserved
* This file is part of Modelling which is released under MIT.
* See file 'LICENSE' for full license details.
* Created by Timo Hocker <timo@scode.ovh>, May 2020
*/
import { Persistent } from './Persistent';
import { PersistentType, ControlObserver, Observer } from './Types';
export abstract class ControlModel extends Persistent {
private _before_change: Record<string, ControlObserver[]> = {};
private _observers: Record<string, Observer[]> = {};
public constructor (obj?: Record<string, PersistentType>) {
super ();
this.define_properties ();
if (typeof obj !== 'undefined')
this.assign_object (obj);
}
public set (key: string, value: PersistentType): void {
const prev = this.get (key);
if (typeof this._before_change[key] !== 'undefined') {
for (const obs of this._before_change[key]) {
if (!obs (value, prev, key))
return;
}
}
super.set (key, value);
if (typeof this._observers[key] !== 'undefined') {
for (const obs of this._observers[key])
obs (value, prev, key);
}
}
public before_change (key: string, func: ControlObserver): void {
if (typeof this._before_change[key] === 'undefined')
this._before_change[key] = [];
this._before_change[key].push (func);
}
public register_observer (key: string, func: Observer): void {
if (typeof this._observers[key] === 'undefined')
this._observers[key] = [];
this._observers[key].push (func);
}
protected abstract define_properties(): void;
}