1
- import { QLabel , NodeWidget , QLabelSignals , TextInteractionFlag } from '@nodegui/nodegui' ;
1
+ import { QLabel , NodeWidget , QLabelSignals , TextInteractionFlag , QFontMetrics , TextElideMode , WidgetEventTypes } from '@nodegui/nodegui' ;
2
2
import { ViewProps , setViewProps } from '../View/RNView' ;
3
3
import { RNWidget } from '../config' ;
4
4
import { throwUnsupported } from '../../utils/helpers' ;
5
5
6
6
export interface TextProps extends ViewProps < QLabelSignals > {
7
7
children ?: string | number | Array < string | number > ;
8
8
wordWrap ?: boolean ;
9
+ elideMode ?: TextElideMode ;
9
10
scaledContents ?: boolean ;
10
11
openExternalLinks ?: boolean ;
11
12
textInteractionFlags ?: TextInteractionFlag ;
12
13
}
13
14
15
+ function elideTextListener ( widget : RNText , elideMode : TextElideMode ) {
16
+ const metrics = new QFontMetrics ( widget . font ( ) ) ;
17
+ return ( ) => {
18
+ const lines = widget . wordWrap ( ) ? Math . floor ( widget . size ( ) . height ( ) / metrics . lineSpacing ( ) ) : 1 ;
19
+ const text = metrics . elidedText ( `${ widget . textOfChildren } ` ,
20
+ elideMode ,
21
+ ( widget . size ( ) . width ( ) - metrics . maxWidth ( ) ) * lines ) ;
22
+ widget . setText ( text ) ;
23
+ }
24
+ }
25
+
14
26
/**
15
27
* @ignore
16
28
*/
@@ -23,7 +35,23 @@ export const setTextProps = (
23
35
set children ( text : string | number | Array < string | number > ) {
24
36
text = Array . isArray ( text ) ? text . join ( '' ) : text ;
25
37
26
- widget . setText ( text ) ;
38
+ // Empty Text fields should not write "undefined"
39
+ if ( text === undefined ) {
40
+ widget . textOfChildren = "" ;
41
+ } else {
42
+ widget . textOfChildren = `${ text } ` ;
43
+ }
44
+ widget . setText ( widget . textOfChildren ) ;
45
+ } ,
46
+ set elideMode ( mode : TextElideMode ) {
47
+ if ( oldProps . elideMode !== mode && widget . resizeListener !== undefined ) {
48
+ widget . removeEventListener ( WidgetEventTypes . Resize , widget . resizeListener ) ;
49
+ }
50
+ if ( oldProps . elideMode !== mode && mode !== undefined ) {
51
+ widget . resizeListener = elideTextListener ( widget , mode ) ;
52
+ widget . addEventListener ( WidgetEventTypes . Resize , widget . resizeListener ) ;
53
+ widget . resizeListener ( ) ;
54
+ }
27
55
} ,
28
56
set wordWrap ( shouldWrap : boolean ) {
29
57
widget . setWordWrap ( shouldWrap ) ;
@@ -34,7 +62,7 @@ export const setTextProps = (
34
62
set openExternalLinks ( shouldOpenExternalLinks : boolean ) {
35
63
widget . setProperty ( 'openExternalLinks' , shouldOpenExternalLinks ) ;
36
64
} ,
37
- set textInteractionFlags ( interactionFlag : TextInteractionFlag ) {
65
+ set textInteractionFlags ( interactionFlag : TextInteractionFlag ) {
38
66
widget . setProperty ( 'textInteractionFlags' , interactionFlag ) ;
39
67
}
40
68
} ;
@@ -46,6 +74,9 @@ export const setTextProps = (
46
74
* @ignore
47
75
*/
48
76
export class RNText extends QLabel implements RNWidget {
77
+ textOfChildren ?: string ;
78
+ resizeListener ?: ( ) => void ;
79
+
49
80
setProps ( newProps : TextProps , oldProps : TextProps ) : void {
50
81
setTextProps ( this , newProps , oldProps ) ;
51
82
}
0 commit comments