67 lines
1.3 KiB
TypeScript
67 lines
1.3 KiB
TypeScript
import { Emitter } from "./Emitter";
|
|
|
|
enum LayoutDirection {
|
|
X = 1,
|
|
Y = 2
|
|
}
|
|
|
|
class ILayout {
|
|
items?: [ILayout, ILayout];
|
|
panles?: string[];
|
|
layout?: LayoutDirection;
|
|
scale?: number;
|
|
id?: number;
|
|
}
|
|
|
|
interface ILayoutEvent {
|
|
layoutChange: Layout;
|
|
scaleChange: Layout;
|
|
}
|
|
|
|
class Layout extends Emitter<ILayoutEvent> {
|
|
|
|
private id: number = 0;
|
|
|
|
private data: ILayout = {};
|
|
|
|
private map(fn: (layout: ILayout) => boolean | void, layout?: ILayout) {
|
|
const currentLayout = layout ? layout : this.data;
|
|
if( fn(currentLayout) ) return;
|
|
if (currentLayout.items && currentLayout.items[0]) {
|
|
this.map(fn, currentLayout.items[0]);
|
|
}
|
|
if (currentLayout.items && currentLayout.items[1]) {
|
|
this.map(fn, currentLayout.items[1]);
|
|
}
|
|
}
|
|
|
|
public getData = (): ILayout => {
|
|
return this.data;
|
|
}
|
|
|
|
public setData = (data: ILayout) => {
|
|
this.data = data;
|
|
this.id = 0;
|
|
this.map((layout) => {
|
|
layout.id = this.id;
|
|
this.id ++;
|
|
});
|
|
this.emit("layoutChange", this);
|
|
}
|
|
|
|
public setScale = (id: number, scale: number) => {
|
|
let change = false;
|
|
this.map((layout) => {
|
|
if (layout.id === id) {
|
|
layout.scale = scale;
|
|
change = true;
|
|
}
|
|
return change;
|
|
})
|
|
if (change) {
|
|
this.emit("scaleChange", this);
|
|
}
|
|
}
|
|
};
|
|
|
|
export { Layout, ILayout, LayoutDirection }; |