1- import { QLabel , NodeWidget , QLabelSignals , TextInteractionFlag } from '@nodegui/nodegui' ;
1+ import { QLabel , NodeWidget , QLabelSignals , TextInteractionFlag , QFontMetrics , TextElideMode , WidgetEventTypes } from '@nodegui/nodegui' ;
22import { ViewProps , setViewProps } from '../View/RNView' ;
33import { RNWidget } from '../config' ;
44import { throwUnsupported } from '../../utils/helpers' ;
55
66export interface TextProps extends ViewProps < QLabelSignals > {
77 children ?: string | number | Array < string | number > ;
88 wordWrap ?: boolean ;
9+ elideMode ?: TextElideMode ;
910 scaledContents ?: boolean ;
1011 openExternalLinks ?: boolean ;
1112 textInteractionFlags ?: TextInteractionFlag ;
1213}
1314
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+
1426/**
1527 * @ignore
1628 */
@@ -23,7 +35,23 @@ export const setTextProps = (
2335 set children ( text : string | number | Array < string | number > ) {
2436 text = Array . isArray ( text ) ? text . join ( '' ) : text ;
2537
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+ }
2755 } ,
2856 set wordWrap ( shouldWrap : boolean ) {
2957 widget . setWordWrap ( shouldWrap ) ;
@@ -34,7 +62,7 @@ export const setTextProps = (
3462 set openExternalLinks ( shouldOpenExternalLinks : boolean ) {
3563 widget . setProperty ( 'openExternalLinks' , shouldOpenExternalLinks ) ;
3664 } ,
37- set textInteractionFlags ( interactionFlag : TextInteractionFlag ) {
65+ set textInteractionFlags ( interactionFlag : TextInteractionFlag ) {
3866 widget . setProperty ( 'textInteractionFlags' , interactionFlag ) ;
3967 }
4068 } ;
@@ -46,6 +74,9 @@ export const setTextProps = (
4674 * @ignore
4775 */
4876export class RNText extends QLabel implements RNWidget {
77+ textOfChildren ?: string ;
78+ resizeListener ?: ( ) => void ;
79+
4980 setProps ( newProps : TextProps , oldProps : TextProps ) : void {
5081 setTextProps ( this , newProps , oldProps ) ;
5182 }
0 commit comments