Skip to content

Commit e14c13f

Browse files
committed
Add elideMode to Text component
1 parent 45626c4 commit e14c13f

File tree

1 file changed

+34
-3
lines changed

1 file changed

+34
-3
lines changed

src/components/Text/RNText.ts

+34-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
1-
import { QLabel, NodeWidget, QLabelSignals, TextInteractionFlag } from '@nodegui/nodegui';
1+
import { QLabel, NodeWidget, QLabelSignals, TextInteractionFlag, QFontMetrics, TextElideMode, WidgetEventTypes } from '@nodegui/nodegui';
22
import { ViewProps, setViewProps } from '../View/RNView';
33
import { RNWidget } from '../config';
44
import { throwUnsupported } from '../../utils/helpers';
55

66
export 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
*/
4876
export 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

Comments
 (0)