Add event system

This commit is contained in:
Schmelczer András 2019-12-25 14:26:34 +01:00
parent 29e1546eb2
commit 5a87d2db71
15 changed files with 151 additions and 92 deletions

View file

@ -1,7 +0,0 @@
import { html } from "../model/misc";
export const createElement = (from: html): HTMLElement => {
const element: HTMLElement = document.createElement("div");
element.innerHTML = from;
return element.firstElementChild as HTMLElement;
};

View file

@ -1,31 +1,11 @@
export const mixColorsToRGB = (
hexColorA: string,
hexColorB: string,
qA: number
): string => {
const colorA = hexToRGB(hexColorA);
const colorB = hexToRGB(hexColorB);
const mixedColor: [number, number, number] = [
colorA[0] * qA + colorB[0] * (1 - qA),
colorA[1] * qA + colorB[1] * (1 - qA),
colorA[2] * qA + colorB[2] * (1 - qA)
];
import { html } from "../model/misc";
return RGBToHex(mixedColor);
export const createElement = (from: html): HTMLElement => {
const element: HTMLElement = document.createElement("div");
element.innerHTML = from;
return element.firstElementChild as HTMLElement;
};
const hexToRGB = (hex: string): [number, number, number] => {
const [r1, r2, g1, g2, b1, b2] = hex;
return [
Number.parseInt(r1 + r2, 16),
Number.parseInt(g1 + g2, 16),
Number.parseInt(b1 + b2, 16)
];
};
const RGBToHex = (rgb: [number, number, number]): string =>
rgb.map(n => Math.round(n).toString(16)).join("");
export const randomFactory = seed => () =>
((2 ** 31 - 1) & (seed = Math.imul(48271, seed))) / 2 ** 31;

View file

@ -1,16 +1,32 @@
import { PageEvent, PageEventType } from "./page-event";
export abstract class PageElement {
private element: HTMLElement;
// Getter and setter accessors would have to agree in visibility
public getElement(): HTMLElement {
return this._element;
return this.element;
}
private _element: HTMLElement;
protected setElement(value: HTMLElement) {
this._element = value;
this.element = value;
}
protected eventGenerator: PageElement;
protected constructor(private children: Array<PageElement> = []) {}
public onAfterLoad(parent: HTMLElement) {
this.children.forEach(c => c.onAfterLoad(this.getElement()));
public giveEvent(event: PageEvent, parent: PageElement = null) {
if (event.type === PageEventType.eventGeneratorChanged) {
this.eventGenerator = event.data;
}
this.handleEvent(event, parent);
this.children.forEach(c => c.giveEvent(event, this));
}
protected query(query: string): HTMLElement | null {
return this.getElement()?.querySelector(query);
}
protected handleEvent(event: PageEvent, parent: PageElement) {}
}

View file

@ -0,0 +1,10 @@
export class PageEvent {
type: PageEventType;
data?: any;
}
export enum PageEventType {
onLoad,
onBodyDimensionsChanged,
eventGeneratorChanged
}

18
src/framework/page.ts Normal file
View file

@ -0,0 +1,18 @@
import { PageElement } from "./page-element";
import { PageEventType } from "./page-event";
export class Page extends PageElement {
public constructor(
children: Array<PageElement>,
private rootElement: HTMLElement
) {
super(children);
this.setElement(rootElement);
this.giveEvent(
{ type: PageEventType.eventGeneratorChanged, data: this },
this
);
rootElement.append(...children.map(e => e.getElement()));
this.giveEvent({ type: PageEventType.onLoad }, this);
}
}