Files
notebrook-notes/frontend/src/views/view-manager.ts
2024-09-03 14:50:33 +02:00

75 lines
2.3 KiB
TypeScript

import { UIWindow } from "../ui/window";
import { View } from "./view";
export class ViewManager {
private currentView: View | undefined | null;
private views: View[];
private window: UIWindow;
public constructor() {
this.views = [];
this.window = new UIWindow("Notebrook");
this.currentView = null;
}
public add(view: View) {
this.views.push(view);
view.onCreate();
}
public remove(view: View) {
this.views.splice(this.views.indexOf(view), 1);
view.onDestroy();
if (view === this.currentView) this.window.remove(this.currentView.show());
if (this.currentView) this.currentView.setActive(false);
this.currentView = null;
}
public switchTo(view: View) {
if (!this.views.includes(view)) {
throw new Error("View not initialized");
}
if (this.currentView) {
this.currentView.onDeactivate();
this.currentView.setActive(false);
this.window.remove(this.currentView.show());
}
this.currentView = view;
this.currentView.setActive(true);
this.currentView.onActivate();
this.window.add(this.currentView.show());
}
public render(): HTMLElement|undefined {
return this.window.show();
}
public push(view: View) {
if (this.currentView) {
this.currentView.onDeactivate();
this.currentView.setActive(false);
this.window.remove(this.currentView.show());
}
this.views.unshift(view);
this.currentView = view;
this.currentView.onCreate();
this.currentView.setActive(true);
this.currentView.onActivate();
this.window.add(this.currentView.show());
}
public pop() {
if (this.currentView) {
this.currentView.onDeactivate();
this.currentView.setActive(false);
this.window.remove(this.currentView.show());
this.currentView.onDestroy();
}
this.views.splice(0, 1);
this.currentView = this.views[0];
this.currentView.setActive(true);
this.currentView.onActivate();
this.window.add(this.currentView.show());
}
}