-
-
Notifications
You must be signed in to change notification settings - Fork 173
Expand file tree
/
Copy pathRNText.ts
More file actions
96 lines (90 loc) · 3.08 KB
/
RNText.ts
File metadata and controls
96 lines (90 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { QLabel, NodeWidget, QLabelSignals, TextInteractionFlag, QFontMetrics, TextElideMode, WidgetEventTypes } from '@nodegui/nodegui';
import { ViewProps, setViewProps } from '../View/RNView';
import { RNWidget } from '../config';
import { throwUnsupported } from '../../utils/helpers';
export interface TextProps extends ViewProps<QLabelSignals> {
children?: string | number | Array<string | number>;
wordWrap?: boolean;
elideMode?: TextElideMode;
scaledContents?: boolean;
openExternalLinks?: boolean;
textInteractionFlags?: TextInteractionFlag;
}
function elideTextListener(widget: RNText, elideMode: TextElideMode) {
const metrics = new QFontMetrics(widget.font());
return () => {
const lines = widget.wordWrap() ? Math.floor(widget.size().height() / metrics.lineSpacing()) : 1;
const text = metrics.elidedText(`${widget.textOfChildren}`,
elideMode,
(widget.size().width() - metrics.maxWidth()) * lines);
widget.setText(text);
}
}
/**
* @ignore
*/
export const setTextProps = (
widget: RNText,
newProps: TextProps,
oldProps: TextProps
) => {
const setter: TextProps = {
set children(text: string | number | Array<string | number>) {
text = Array.isArray(text) ? text.join('') : text;
// Empty Text fields should not write "undefined"
if (text === undefined) {
widget.textOfChildren = "";
} else {
widget.textOfChildren = `${text}`;
}
widget.setText(widget.textOfChildren);
},
set elideMode(mode: TextElideMode) {
if (oldProps.elideMode !== mode && widget.resizeListener !== undefined) {
widget.removeEventListener(WidgetEventTypes.Resize, widget.resizeListener);
}
if (oldProps.elideMode !== mode && mode !== undefined) {
widget.resizeListener = elideTextListener(widget, mode);
widget.addEventListener(WidgetEventTypes.Resize, widget.resizeListener);
widget.resizeListener();
}
},
set wordWrap(shouldWrap: boolean) {
widget.setWordWrap(shouldWrap);
},
set scaledContents(scaled: boolean) {
widget.setProperty('scaledContents', scaled);
},
set openExternalLinks(shouldOpenExternalLinks: boolean) {
widget.setProperty('openExternalLinks', shouldOpenExternalLinks);
},
set textInteractionFlags(interactionFlag: TextInteractionFlag) {
widget.setProperty('textInteractionFlags', interactionFlag);
}
};
Object.assign(setter, newProps);
setViewProps(widget, newProps, oldProps);
};
/**
* @ignore
*/
export class RNText extends QLabel implements RNWidget {
textOfChildren?: string;
resizeListener?: () => void;
setProps(newProps: TextProps, oldProps: TextProps): void {
setTextProps(this, newProps, oldProps);
}
appendInitialChild(child: NodeWidget<any>): void {
throwUnsupported(this);
}
appendChild(child: NodeWidget<any>): void {
throwUnsupported(this);
}
insertBefore(child: NodeWidget<any>, beforeChild: NodeWidget<any>): void {
throwUnsupported(this);
}
removeChild(child: NodeWidget<any>): void {
throwUnsupported(this);
}
static tagName = 'text';
}