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-29 03:36:45 +08:00
|
|
|
import { Property } from "../observable/Property";
|
2019-08-20 04:56:40 +08:00
|
|
|
|
2019-08-29 03:36:45 +08:00
|
|
|
export type WidgetOptions = {
|
|
|
|
enabled?: boolean | Property<boolean>;
|
|
|
|
tooltip?: string | Property<string>;
|
|
|
|
};
|
2019-08-28 06:50:38 +08:00
|
|
|
|
2019-08-29 03:36:45 +08:00
|
|
|
export abstract class Widget<E extends HTMLElement = HTMLElement> implements Disposable {
|
|
|
|
readonly element: E;
|
2019-08-20 04:56:40 +08:00
|
|
|
|
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>;
|
2019-08-29 03:36:45 +08:00
|
|
|
readonly tooltip: WritableProperty<string>;
|
2019-08-28 06:50:38 +08:00
|
|
|
|
|
|
|
protected disposed = false;
|
2019-08-23 23:00:39 +08:00
|
|
|
|
2019-08-29 03:36:45 +08:00
|
|
|
private readonly disposer = new Disposer();
|
|
|
|
private readonly _visible: WidgetProperty<boolean> = new WidgetProperty<boolean>(
|
|
|
|
this,
|
|
|
|
true,
|
|
|
|
this.set_visible,
|
|
|
|
);
|
|
|
|
private readonly _enabled: WidgetProperty<boolean> = new WidgetProperty<boolean>(
|
|
|
|
this,
|
|
|
|
true,
|
|
|
|
this.set_enabled,
|
|
|
|
);
|
|
|
|
private readonly _tooltip: WidgetProperty<string> = new WidgetProperty<string>(
|
|
|
|
this,
|
|
|
|
"",
|
|
|
|
this.set_tooltip,
|
|
|
|
);
|
|
|
|
|
|
|
|
protected constructor(element: E, options?: WidgetOptions) {
|
|
|
|
this.element = element;
|
2019-08-28 06:50:38 +08:00
|
|
|
this.visible = this._visible;
|
|
|
|
this.enabled = this._enabled;
|
2019-08-29 03:36:45 +08:00
|
|
|
this.tooltip = this._tooltip;
|
|
|
|
|
|
|
|
if (options) {
|
|
|
|
if (typeof options.enabled === "boolean") {
|
|
|
|
this.enabled.val = options.enabled;
|
|
|
|
} else if (options.enabled) {
|
|
|
|
this.enabled.bind_to(options.enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof options.tooltip === "string") {
|
|
|
|
this.tooltip.val = options.tooltip;
|
|
|
|
} else if (options.tooltip) {
|
|
|
|
this.tooltip.bind_to(options.tooltip);
|
|
|
|
}
|
|
|
|
}
|
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
|
|
|
}
|
|
|
|
|
2019-08-29 03:36:45 +08:00
|
|
|
protected set_tooltip(tooltip: string): void {
|
|
|
|
this.element.title = tooltip;
|
2019-08-23 04:45:01 +08:00
|
|
|
}
|
|
|
|
|
2019-08-29 03:36:45 +08:00
|
|
|
protected bind_hidden(element: HTMLElement, observable: Observable<boolean>): void {
|
2019-08-23 04:45:01 +08:00
|
|
|
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
|
|
|
}
|