BangleApps/typescript/types/layout.d.ts

126 lines
2.5 KiB
TypeScript
Raw Normal View History

2023-01-16 22:11:17 +00:00
type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
type ExtractIds<T extends Layout.Hierarchy, Depth extends Prev[number] = 9> =
2023-02-19 18:01:08 +00:00
[Depth] extends [never]
? never
: (T extends { id: infer Id extends string }
? { [k in Id]: T }
: never)
|
(
T extends { c: Array<infer Sub extends Layout.Hierarchy> }
2023-02-19 18:01:08 +00:00
? ExtractIds<Sub, Prev[Depth]>
: never
);
2023-01-16 22:11:17 +00:00
declare module Layout {
2023-02-19 18:01:08 +00:00
type Layouter<T extends Hierarchy> =
ExtractIds<T>
&
{
// these actually change T
render(l?: T): void;
layout(l: T): void;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
debug(l?: T, c?: ColorResolvable): void;
update(): void; // changes layoutObject into a RenderedHierarchy
clear(obj?: T): void;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
forgetLazyState(): void;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
setUI(): void;
};
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
var Layout: {
new <T extends Hierarchy>(
hier: T,
options?: {
lazy: boolean,
btns?: {
label: string,
cb: () => void,
cbl: () => void,
}[],
back?: () => void,
remove?: () => void,
},
): Layouter<T>;
};
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
export type Layout = typeof Layout;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type Image = string;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type Fill = 0 | 1 | 2; // 0=no, 1=yes, 2=2x more space
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type RenderedHierarchy =
Hierarchy & {
// top left position
x: number,
y: number,
// width and height
w: number,
h: number,
// minimum width and height
_w: number,
_h: number,
};
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type Hierarchy =
HierarchyParts & {
id?: string,
font?: FontNameWithScaleFactor,
scale?: number,
col?: ColorResolvable,
bgCol?: ColorResolvable,
pad?: number,
fillx?: Fill,
filly?: Fill,
width?: number,
height?: number,
} & (
{
r?: number, // 0: 0°, 1: 90°, 2: 180°, 3: 270°.
} | {
wrap?: boolean,
}
);
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type Align = -1 | 0 | 1;
2023-01-16 22:11:17 +00:00
2023-02-19 18:01:08 +00:00
type HierarchyParts =
{
type: "v",
c: Hierarchy[],
halign?: Align,
} | {
type: "h"
c: Hierarchy[],
valign?: Align,
} | {
type: "txt",
label: string,
font: FontNameWithScaleFactor,
} | {
type: undefined, // blank, for padding
} | (
{
type: "btn",
src: Image,
cb: () => void,
} | {
type: "btn",
cb: () => void,
label: string,
font?: FontNameWithScaleFactor,
scale?: number,
}
) | {
type: "img",
src: Image | (() => Image),
} | {
type: "custom",
render: (h: Hierarchy) => void,
};
2023-01-16 22:11:17 +00:00
}