Showing
2 changed files
with
62 additions
and
24 deletions
| @@ -5,6 +5,7 @@ | @@ -5,6 +5,7 @@ | ||
| 5 | * Add SizedBox Widget | 5 | * Add SizedBox Widget |
| 6 | * Fix RichText Widget word spacing | 6 | * Fix RichText Widget word spacing |
| 7 | * Improve Theme and TextStyle | 7 | * Improve Theme and TextStyle |
| 8 | +* Implement properly RichText.softWrap | ||
| 8 | 9 | ||
| 9 | # 1.3.7 | 10 | # 1.3.7 |
| 10 | * Add Pdf Creation date | 11 | * Add Pdf Creation date |
| @@ -98,11 +98,10 @@ class RichText extends Widget { | @@ -98,11 +98,10 @@ class RichText extends Widget { | ||
| 98 | RichText( | 98 | RichText( |
| 99 | {@required this.text, | 99 | {@required this.text, |
| 100 | this.textAlign = TextAlign.left, | 100 | this.textAlign = TextAlign.left, |
| 101 | - bool softWrap = true, | 101 | + this.softWrap = true, |
| 102 | this.textScaleFactor = 1.0, | 102 | this.textScaleFactor = 1.0, |
| 103 | - int maxLines}) | ||
| 104 | - : maxLines = !softWrap ? 1 : maxLines, | ||
| 105 | - assert(text != null); | 103 | + this.maxLines}) |
| 104 | + : assert(text != null); | ||
| 106 | 105 | ||
| 107 | static const bool debug = false; | 106 | static const bool debug = false; |
| 108 | 107 | ||
| @@ -112,6 +111,8 @@ class RichText extends Widget { | @@ -112,6 +111,8 @@ class RichText extends Widget { | ||
| 112 | 111 | ||
| 113 | final double textScaleFactor; | 112 | final double textScaleFactor; |
| 114 | 113 | ||
| 114 | + final bool softWrap; | ||
| 115 | + | ||
| 115 | final int maxLines; | 116 | final int maxLines; |
| 116 | 117 | ||
| 117 | final List<_Word> _words = <_Word>[]; | 118 | final List<_Word> _words = <_Word>[]; |
| @@ -183,16 +184,57 @@ class RichText extends Widget { | @@ -183,16 +184,57 @@ class RichText extends Widget { | ||
| 183 | final PdfFontMetrics space = | 184 | final PdfFontMetrics space = |
| 184 | font.stringMetrics(' ') * (style.fontSize * textScaleFactor); | 185 | font.stringMetrics(' ') * (style.fontSize * textScaleFactor); |
| 185 | 186 | ||
| 186 | - for (String word in span.text.split(RegExp(r'\s'))) { | ||
| 187 | - if (word.isEmpty) { | ||
| 188 | - offsetX += space.advanceWidth * style.wordSpacing; | ||
| 189 | - continue; | ||
| 190 | - } | 187 | + final List<String> spanLines = span.text.split('\n'); |
| 188 | + for (int line = 0; line < spanLines.length; line++) { | ||
| 189 | + for (String word in spanLines[line].split(RegExp(r'\s'))) { | ||
| 190 | + if (word.isEmpty) { | ||
| 191 | + offsetX += space.advanceWidth * style.wordSpacing; | ||
| 192 | + continue; | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + final PdfFontMetrics metrics = | ||
| 196 | + font.stringMetrics(word) * (style.fontSize * textScaleFactor); | ||
| 197 | + | ||
| 198 | + if (offsetX + metrics.width > constraintWidth && wCount > 0) { | ||
| 199 | + width = math.max( | ||
| 200 | + width, | ||
| 201 | + _realignLine( | ||
| 202 | + _words.sublist(lineStart), | ||
| 203 | + constraintWidth, | ||
| 204 | + offsetX - space.advanceWidth * style.wordSpacing, | ||
| 205 | + false, | ||
| 206 | + bottom)); | ||
| 207 | + | ||
| 208 | + lineStart += wCount; | ||
| 209 | + | ||
| 210 | + if (maxLines != null && ++lines > maxLines) { | ||
| 211 | + break; | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | + offsetX = 0.0; | ||
| 215 | + offsetY += bottom - top + style.lineSpacing; | ||
| 216 | + top = null; | ||
| 217 | + bottom = null; | ||
| 218 | + | ||
| 219 | + if (offsetY > constraintHeight) { | ||
| 220 | + return false; | ||
| 221 | + } | ||
| 222 | + wCount = 0; | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + top = math.min(top ?? metrics.top, metrics.top); | ||
| 226 | + bottom = math.max(bottom ?? metrics.bottom, metrics.bottom); | ||
| 227 | + | ||
| 228 | + final _Word wd = _Word(word, style, metrics, span.annotation); | ||
| 229 | + wd.offset = PdfPoint(offsetX, -offsetY); | ||
| 191 | 230 | ||
| 192 | - final PdfFontMetrics metrics = | ||
| 193 | - font.stringMetrics(word) * (style.fontSize * textScaleFactor); | 231 | + _words.add(wd); |
| 232 | + wCount++; | ||
| 233 | + offsetX += | ||
| 234 | + metrics.advanceWidth + space.advanceWidth * style.wordSpacing; | ||
| 235 | + } | ||
| 194 | 236 | ||
| 195 | - if (offsetX + metrics.width > constraintWidth && wCount > 0) { | 237 | + if (softWrap && line < spanLines.length - 1) { |
| 196 | width = math.max( | 238 | width = math.max( |
| 197 | width, | 239 | width, |
| 198 | _realignLine( | 240 | _realignLine( |
| @@ -201,13 +243,19 @@ class RichText extends Widget { | @@ -201,13 +243,19 @@ class RichText extends Widget { | ||
| 201 | offsetX - space.advanceWidth * style.wordSpacing, | 243 | offsetX - space.advanceWidth * style.wordSpacing, |
| 202 | false, | 244 | false, |
| 203 | bottom)); | 245 | bottom)); |
| 246 | + | ||
| 204 | lineStart += wCount; | 247 | lineStart += wCount; |
| 248 | + | ||
| 205 | if (maxLines != null && ++lines > maxLines) { | 249 | if (maxLines != null && ++lines > maxLines) { |
| 206 | break; | 250 | break; |
| 207 | } | 251 | } |
| 208 | 252 | ||
| 209 | offsetX = 0.0; | 253 | offsetX = 0.0; |
| 210 | - offsetY += bottom - top + style.lineSpacing; | 254 | + if (wCount > 0) { |
| 255 | + offsetY += bottom - top + style.lineSpacing; | ||
| 256 | + } else { | ||
| 257 | + offsetY += space.ascent + space.descent + style.lineSpacing; | ||
| 258 | + } | ||
| 211 | top = null; | 259 | top = null; |
| 212 | bottom = null; | 260 | bottom = null; |
| 213 | 261 | ||
| @@ -216,17 +264,6 @@ class RichText extends Widget { | @@ -216,17 +264,6 @@ class RichText extends Widget { | ||
| 216 | } | 264 | } |
| 217 | wCount = 0; | 265 | wCount = 0; |
| 218 | } | 266 | } |
| 219 | - | ||
| 220 | - top = math.min(top ?? metrics.top, metrics.top); | ||
| 221 | - bottom = math.max(bottom ?? metrics.bottom, metrics.bottom); | ||
| 222 | - | ||
| 223 | - final _Word wd = _Word(word, style, metrics, span.annotation); | ||
| 224 | - wd.offset = PdfPoint(offsetX, -offsetY); | ||
| 225 | - | ||
| 226 | - _words.add(wd); | ||
| 227 | - wCount++; | ||
| 228 | - offsetX += | ||
| 229 | - metrics.advanceWidth + space.advanceWidth * style.wordSpacing; | ||
| 230 | } | 267 | } |
| 231 | 268 | ||
| 232 | offsetX -= space.advanceWidth * style.wordSpacing; | 269 | offsetX -= space.advanceWidth * style.wordSpacing; |
-
Please register or login to post a comment