@@ -5,6 +5,7 @@ import { Computed, Signal, SignalOfObject } from "../signals/mod.ts";
55
66import { signalify } from "../utils/signals.ts" ;
77import { splitToArray } from "../utils/strings.ts" ;
8+ import { Rectangle } from "../types.ts" ;
89
910/**
1011 * Type that describes position and size of Label
@@ -19,18 +20,32 @@ export type LabelRectangle = {
1920
2021/** Type that describes text positioning in label */
2122export interface LabelAlign {
22- vertical : "top" | "center" | "bottom" ;
23- horizontal : "left" | "center" | "right" ;
23+ vertical : number ;
24+ horizontal : number ;
2425}
2526
26- export interface LabelOptions extends Omit < ComponentOptions , "rectangle" > {
27+ export interface LabelOptions < Prepared extends boolean > extends Omit < ComponentOptions , "rectangle" > {
2728 text : string | Signal < string > ;
28- rectangle : LabelRectangle | SignalOfObject < LabelRectangle > ;
29+ rectangle : Prepared extends true ? ( Rectangle | SignalOfObject < Rectangle > )
30+ : ( LabelRectangle | SignalOfObject < LabelRectangle > ) ;
2931 align ?: LabelAlign | SignalOfObject < LabelAlign > ;
3032 multiCodePointSupport ?: boolean | Signal < boolean > ;
3133 overwriteRectangle ?: boolean | Signal < boolean > ;
3234}
3335
36+ export function prepareLabelOptions ( options : LabelOptions < false > ) : LabelOptions < true > {
37+ let rectangle = options . rectangle ;
38+
39+ if ( rectangle instanceof Signal ) {
40+ rectangle = rectangle . value ;
41+ }
42+
43+ rectangle . width ??= 0 ;
44+ rectangle . height ??= 0 ;
45+
46+ return options as unknown as LabelOptions < true > ;
47+ }
48+
3449/**
3550 * Component for creating multi-line, non interactive text
3651 *
@@ -91,15 +106,19 @@ export class Label extends Component {
91106 overwriteRectangle : Signal < boolean > ;
92107 multiCodePointSupport : Signal < boolean > ;
93108
94- constructor ( options : LabelOptions ) {
95- super ( options as ComponentOptions ) ;
109+ constructor ( options : LabelOptions < false > ) {
110+ super ( prepareLabelOptions ( options ) ) ;
96111
97112 this . text = signalify ( options . text ) ;
98113 this . overwriteRectangle = signalify ( options . overwriteRectangle ?? false ) ;
99114 this . multiCodePointSupport = signalify ( options . multiCodePointSupport ?? false ) ;
100- this . align = signalify ( options . align ?? { vertical : "top" , horizontal : "left" } , { deepObserve : true } ) ;
101-
102- // FIXME: alignment and stuff needs to be reimplemented
115+ this . align = signalify (
116+ options . align ?? {
117+ vertical : 0 ,
118+ horizontal : 0 ,
119+ } ,
120+ { deepObserve : true } ,
121+ ) ;
103122
104123 const textLines : string [ ] = [ ] ;
105124 this . #textLines = new Computed ( ( ) => {
@@ -121,8 +140,8 @@ export class Label extends Component {
121140 text : this . #textLines,
122141 overwriteRectangle : this . overwriteRectangle ,
123142 multiCodePointSupport : this . multiCodePointSupport ,
124- alignHorizontally : 0.5 ,
125- alignVertically : 0.5 ,
143+ alignHorizontally : new Computed ( ( ) => this . align . value . horizontal ) ,
144+ alignVertically : new Computed ( ( ) => this . align . value . vertical ) ,
126145 } ) ;
127146
128147 this . drawnObjects . text = text ;
0 commit comments