@@ -5,6 +5,7 @@ import { Computed, Signal, SignalOfObject } from "../signals/mod.ts";
5
5
6
6
import { signalify } from "../utils/signals.ts" ;
7
7
import { splitToArray } from "../utils/strings.ts" ;
8
+ import { Rectangle } from "../types.ts" ;
8
9
9
10
/**
10
11
* Type that describes position and size of Label
@@ -19,18 +20,32 @@ export type LabelRectangle = {
19
20
20
21
/** Type that describes text positioning in label */
21
22
export interface LabelAlign {
22
- vertical : "top" | "center" | "bottom" ;
23
- horizontal : "left" | "center" | "right" ;
23
+ vertical : number ;
24
+ horizontal : number ;
24
25
}
25
26
26
- export interface LabelOptions extends Omit < ComponentOptions , "rectangle" > {
27
+ export interface LabelOptions < Prepared extends boolean > extends Omit < ComponentOptions , "rectangle" > {
27
28
text : string | Signal < string > ;
28
- rectangle : LabelRectangle | SignalOfObject < LabelRectangle > ;
29
+ rectangle : Prepared extends true ? ( Rectangle | SignalOfObject < Rectangle > )
30
+ : ( LabelRectangle | SignalOfObject < LabelRectangle > ) ;
29
31
align ?: LabelAlign | SignalOfObject < LabelAlign > ;
30
32
multiCodePointSupport ?: boolean | Signal < boolean > ;
31
33
overwriteRectangle ?: boolean | Signal < boolean > ;
32
34
}
33
35
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
+
34
49
/**
35
50
* Component for creating multi-line, non interactive text
36
51
*
@@ -91,15 +106,19 @@ export class Label extends Component {
91
106
overwriteRectangle : Signal < boolean > ;
92
107
multiCodePointSupport : Signal < boolean > ;
93
108
94
- constructor ( options : LabelOptions ) {
95
- super ( options as ComponentOptions ) ;
109
+ constructor ( options : LabelOptions < false > ) {
110
+ super ( prepareLabelOptions ( options ) ) ;
96
111
97
112
this . text = signalify ( options . text ) ;
98
113
this . overwriteRectangle = signalify ( options . overwriteRectangle ?? false ) ;
99
114
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
+ ) ;
103
122
104
123
const textLines : string [ ] = [ ] ;
105
124
this . #textLines = new Computed ( ( ) => {
@@ -121,8 +140,8 @@ export class Label extends Component {
121
140
text : this . #textLines,
122
141
overwriteRectangle : this . overwriteRectangle ,
123
142
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 ) ,
126
145
} ) ;
127
146
128
147
this . drawnObjects . text = text ;
0 commit comments