2019-08-21 21:19:44 +08:00
|
|
|
import { Disposable } from "../observable/Disposable";
|
2019-08-22 00:59:56 +08:00
|
|
|
import { Disposer } from "../observable/Disposer";
|
2019-08-23 04:45:01 +08:00
|
|
|
import { Observable } from "../observable/Observable";
|
|
|
|
import { bind_hidden } from "./dom";
|
2019-08-23 23:00:39 +08:00
|
|
|
import { WritableProperty } from "../observable/WritableProperty";
|
2019-08-28 06:50:38 +08:00
|
|
|
import { WidgetProperty } from "../observable/WidgetProperty";
|
2019-08-20 04:56:40 +08:00
|
|
|
|
2019-08-28 06:50:38 +08:00
|
|
|
export type ViewOptions = {};
|
|
|
|
|
|
|
|
export abstract class Widget implements Disposable {
|
2019-08-20 04:56:40 +08:00
|
|
|
abstract readonly element: HTMLElement;
|
|
|
|
|
2019-08-21 21:19:44 +08:00
|
|
|
get id(): string {
|
|
|
|
return this.element.id;
|
|
|
|
}
|
|
|
|
|
|
|
|
set id(id: string) {
|
|
|
|
this.element.id = id;
|
|
|
|
}
|
|
|
|
|
2019-08-28 06:50:38 +08:00
|
|
|
readonly visible: WritableProperty<boolean>;
|
|
|
|
readonly enabled: WritableProperty<boolean>;
|
|
|
|
|
|
|
|
protected disposed = false;
|
2019-08-23 23:00:39 +08:00
|
|
|
|
2019-08-22 00:59:56 +08:00
|
|
|
private disposer = new Disposer();
|
2019-08-28 06:50:38 +08:00
|
|
|
private _visible = new WidgetProperty<boolean>(this, true, this.set_visible);
|
|
|
|
private _enabled = new WidgetProperty<boolean>(this, true, this.set_enabled);
|
2019-08-20 04:56:40 +08:00
|
|
|
|
2019-08-28 06:50:38 +08:00
|
|
|
constructor(_options?: ViewOptions) {
|
|
|
|
this.visible = this._visible;
|
|
|
|
this.enabled = this._enabled;
|
2019-08-23 23:00:39 +08:00
|
|
|
}
|
|
|
|
|
2019-08-27 01:19:19 +08:00
|
|
|
focus(): void {
|
|
|
|
this.element.focus();
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:45:01 +08:00
|
|
|
dispose(): void {
|
|
|
|
this.element.remove();
|
|
|
|
this.disposer.dispose();
|
2019-08-28 06:50:38 +08:00
|
|
|
this.disposed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected set_visible(visible: boolean): void {
|
|
|
|
this.element.hidden = !visible;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected set_enabled(enabled: boolean): void {
|
|
|
|
if (enabled) {
|
|
|
|
this.element.classList.remove("disabled");
|
|
|
|
} else {
|
|
|
|
this.element.classList.add("disabled");
|
|
|
|
}
|
2019-08-23 04:45:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
protected bind_hidden(element: HTMLElement, observable: Observable<boolean>): void {
|
|
|
|
this.disposable(bind_hidden(element, observable));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected bind_disabled(element: HTMLElement, observable: Observable<boolean>): void {
|
|
|
|
this.disposable(bind_hidden(element, observable));
|
|
|
|
}
|
|
|
|
|
2019-08-20 04:56:40 +08:00
|
|
|
protected disposable<T extends Disposable>(disposable: T): T {
|
2019-08-22 04:04:08 +08:00
|
|
|
return this.disposer.add(disposable);
|
2019-08-20 04:56:40 +08:00
|
|
|
}
|
|
|
|
|
2019-08-21 21:19:44 +08:00
|
|
|
protected disposables(...disposables: Disposable[]): void {
|
2019-08-22 04:04:08 +08:00
|
|
|
this.disposer.add_all(...disposables);
|
2019-08-21 21:19:44 +08:00
|
|
|
}
|
2019-08-20 04:56:40 +08:00
|
|
|
}
|