forked from humblerookie/binance-ninja
/
TextModifier.kt
188 lines (150 loc) · 5.65 KB
/
TextModifier.kt
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package dev.anvith.binanceninja.core.ui.theme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.TextUnit
import dev.anvith.binanceninja.ui.theme.font
@Composable
private fun getFontFamily(): FontFamily {
return FontFamily(
font("montserrat", "montserrat_thin", FontWeight.Light, FontStyle.Normal),
font("montserrat", "montserrat_regular", FontWeight.Normal, FontStyle.Normal),
font("montserrat", "montserrat_medium", FontWeight.Medium, FontStyle.Normal),
font("montserrat", "montserrat_bold", FontWeight.Bold, FontStyle.Normal),
)
}
interface TextModifier {
fun font(font: FontFamily): TextModifier
fun size(size: TextUnit): TextModifier
fun color(color: Color): TextModifier
fun lineHeight(height: TextUnit): TextModifier
fun weight(weight: FontWeight): TextModifier
fun letterSpacing(spacing: TextUnit): TextModifier
fun copy(modifier: TextModifier): TextModifier
@Composable
fun applyToText(text: String, modifier: Modifier)
@Composable
fun style(): TextStyle
companion object : TextModifier {
val default: TextModifier = TextModifierImpl()
override fun font(font: FontFamily): TextModifier {
return TextModifierImpl().font(font)
}
override fun size(size: TextUnit): TextModifier {
return TextModifierImpl().size(size)
}
override fun color(color: Color): TextModifier {
return TextModifierImpl().color(color)
}
override fun lineHeight(height: TextUnit): TextModifier {
return TextModifierImpl().lineHeight(height)
}
override fun weight(weight: FontWeight): TextModifier {
return TextModifierImpl().weight(weight)
}
override fun letterSpacing(spacing: TextUnit): TextModifier {
return TextModifierImpl().letterSpacing(spacing)
}
override fun copy(modifier: TextModifier): TextModifier {
return TextModifierImpl(modifier)
}
@Composable
override fun applyToText(text: String, modifier: Modifier) {
//Do Nothing, Let subclasses decide composable implementation
}
@Composable
override fun style(): TextStyle {
throw IllegalStateException();
}
}
}
open class TextModifierImpl(textModifier: TextModifier? = null) : TextModifier {
var font: FontFamily? = (textModifier as? TextModifierImpl)?.font
private set
var size: TextUnit? = (textModifier as? TextModifierImpl)?.size
private set
var color: Color? = (textModifier as? TextModifierImpl)?.color
private set
var lineHeight: TextUnit? = (textModifier as? TextModifierImpl)?.lineHeight
private set
var weight: FontWeight? = (textModifier as? TextModifierImpl)?.weight
private set
var letterSpacing: TextUnit? = (textModifier as? TextModifierImpl)?.letterSpacing
private set
override fun font(font: FontFamily): TextModifier {
this.font = font
return this
}
override fun size(size: TextUnit): TextModifier {
this.size = size
return this
}
override fun color(color: Color): TextModifier {
this.color = color
return this
}
override fun lineHeight(height: TextUnit): TextModifier {
this.lineHeight = height
return this
}
override fun weight(weight: FontWeight): TextModifier {
this.weight = weight
return this
}
override fun letterSpacing(spacing: TextUnit): TextModifier {
this.letterSpacing = spacing
return this
}
override fun copy(modifier: TextModifier): TextModifier {
return if (modifier is TextModifierImpl) {
font = modifier.font ?: font
size = modifier.size ?: size
color = modifier.color ?: color
lineHeight = modifier.lineHeight ?: lineHeight
weight = modifier.weight ?: weight
letterSpacing = modifier.letterSpacing ?: letterSpacing
TextModifierImpl(this)
} else {
modifier
}
}
@Composable
override fun applyToText(text: String, modifier: Modifier) {
Text(
text = text,
lineHeight = lineHeight ?: TextUnit.Unspecified,
color = color ?: ThemeColors.onSurface,
fontSize = size ?: TextUnit.Unspecified,
fontFamily = font ?: getFontFamily(),
fontWeight = weight ?: FontWeight.Normal,
letterSpacing = letterSpacing ?: TextUnit.Unspecified,
modifier = modifier
)
}
@Composable
override fun style(): TextStyle {
return TextStyle(
lineHeight = lineHeight ?: TextUnit.Unspecified,
color = color ?: TextStyle.Default.color,
fontSize = size ?: TextUnit.Unspecified,
fontFamily = font ?: getFontFamily(),
fontWeight = weight ?: FontWeight.Normal,
letterSpacing = letterSpacing ?: TextUnit.Unspecified,
)
}
override fun toString(): String {
return "TextModifierImpl(" +
"font = $font, " +
"size= $size, " +
"weight=$weight, " +
"lineHeight= $lineHeight," +
"color= $color, " +
"spacing= $letterSpacing" +
")"
}
}