OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 import 'dart:sky'; | 5 import 'dart:sky'; |
6 | 6 |
7 enum FontWeight { | 7 enum FontWeight { |
8 w100, | 8 w100, |
9 w200, | 9 w200, |
10 w300, | 10 w300, |
(...skipping 14 matching lines...) Expand all Loading... |
25 const bold = FontWeight.w700; | 25 const bold = FontWeight.w700; |
26 const extraBold = FontWeight.w800; | 26 const extraBold = FontWeight.w800; |
27 const black = FontWeight.w900; | 27 const black = FontWeight.w900; |
28 | 28 |
29 enum TextAlign { | 29 enum TextAlign { |
30 left, | 30 left, |
31 right, | 31 right, |
32 center | 32 center |
33 } | 33 } |
34 | 34 |
| 35 enum TextDecoration { |
| 36 none, |
| 37 underline, |
| 38 overline, |
| 39 lineThrough |
| 40 } |
| 41 |
| 42 const underline = const <TextDecoration> [TextDecoration.underline]; |
| 43 const overline = const <TextDecoration> [TextDecoration.overline]; |
| 44 const lineThrough = const <TextDecoration> [TextDecoration.lineThrough]; |
| 45 |
| 46 enum TextDecorationStyle { |
| 47 solid, |
| 48 double, |
| 49 dotted, |
| 50 dashed, |
| 51 wavy |
| 52 } |
| 53 |
35 class TextStyle { | 54 class TextStyle { |
36 const TextStyle({ | 55 const TextStyle({ |
37 this.color, | 56 this.color, |
38 this.fontFamily, | 57 this.fontFamily, |
39 this.fontSize, | 58 this.fontSize, |
40 this.fontWeight, | 59 this.fontWeight, |
41 this.textAlign | 60 this.textAlign, |
| 61 List<TextDecoration> this.decoration, |
| 62 this.decorationColor, |
| 63 this.decorationStyle |
42 }); | 64 }); |
43 | 65 |
44 final Color color; | 66 final Color color; |
45 final String fontFamily; | 67 final String fontFamily; |
46 final double fontSize; // in pixels | 68 final double fontSize; // in pixels |
47 final FontWeight fontWeight; | 69 final FontWeight fontWeight; |
48 final TextAlign textAlign; | 70 final TextAlign textAlign; |
| 71 final List<TextDecoration> decoration; |
| 72 final Color decorationColor; |
| 73 final TextDecorationStyle decorationStyle; |
| 74 |
| 75 String _decorationToString() { |
| 76 assert(decoration != null); |
| 77 const toCSS = const { |
| 78 TextDecoration.none: 'none', |
| 79 TextDecoration.underline: 'underline', |
| 80 TextDecoration.overline: 'overline', |
| 81 TextDecoration.lineThrough: 'lineThrough' |
| 82 }; |
| 83 return decoration.map((d) => toCSS[d]).join(' '); |
| 84 } |
49 | 85 |
50 TextStyle copyWith({ | 86 TextStyle copyWith({ |
51 Color color, | 87 Color color, |
52 double fontSize, | 88 double fontSize, |
53 FontWeight fontWeight, | 89 FontWeight fontWeight, |
54 TextAlign textAlign | 90 TextAlign textAlign, |
| 91 TextDecoration decoration, |
| 92 Color decorationColor, |
| 93 TextDecorationStyle decorationStyle |
55 }) { | 94 }) { |
56 return new TextStyle( | 95 return new TextStyle( |
57 color: color != null ? color : this.color, | 96 color: color != null ? color : this.color, |
58 fontFamily: fontFamily != null ? fontFamily : this.fontFamily, | 97 fontFamily: fontFamily != null ? fontFamily : this.fontFamily, |
59 fontSize: fontSize != null ? fontSize : this.fontSize, | 98 fontSize: fontSize != null ? fontSize : this.fontSize, |
60 fontWeight: fontWeight != null ? fontWeight : this.fontWeight, | 99 fontWeight: fontWeight != null ? fontWeight : this.fontWeight, |
61 textAlign: textAlign != null ? textAlign : this.textAlign | 100 textAlign: textAlign != null ? textAlign : this.textAlign, |
| 101 decoration: decoration != null ? decoration : this.decoration, |
| 102 decorationColor: decorationColor != null ? decorationColor : this.decorati
onColor, |
| 103 decorationStyle: decorationStyle != null ? decorationStyle : this.decorati
onStyle |
62 ); | 104 ); |
63 } | 105 } |
64 | 106 |
65 bool operator ==(other) { | 107 bool operator ==(other) { |
66 return other is TextStyle && | 108 return other is TextStyle && |
67 color == other.color && | 109 color == other.color && |
68 fontFamily == other.fontFamily && | 110 fontFamily == other.fontFamily && |
69 fontSize == other.fontSize && | 111 fontSize == other.fontSize && |
70 fontWeight == other.fontWeight && | 112 fontWeight == other.fontWeight && |
71 textAlign == other.textAlign; | 113 textAlign == other.textAlign && |
| 114 decoration == other.decoration && |
| 115 decorationColor == other.decorationColor && |
| 116 decorationStyle == other.decorationStyle; |
72 } | 117 } |
73 | 118 |
74 int get hashCode { | 119 int get hashCode { |
75 // Use Quiver: https://github.com/domokit/mojo/issues/236 | 120 // Use Quiver: https://github.com/domokit/mojo/issues/236 |
76 int value = 373; | 121 int value = 373; |
77 value = 37 * value + color.hashCode; | 122 value = 37 * value + color.hashCode; |
78 value = 37 * value + fontFamily.hashCode; | 123 value = 37 * value + fontFamily.hashCode; |
79 value = 37 * value + fontSize.hashCode; | 124 value = 37 * value + fontSize.hashCode; |
80 value = 37 * value + fontWeight.hashCode; | 125 value = 37 * value + fontWeight.hashCode; |
81 value = 37 * value + textAlign.hashCode; | 126 value = 37 * value + textAlign.hashCode; |
| 127 value = 37 * value + decoration.hashCode; |
| 128 value = 37 * value + decorationColor.hashCode; |
| 129 value = 37 * value + decorationStyle.hashCode; |
82 return value; | 130 return value; |
83 } | 131 } |
84 | 132 |
85 void applyToCSSStyle(CSSStyleDeclaration cssStyle) { | 133 void applyToCSSStyle(CSSStyleDeclaration cssStyle) { |
86 if (color != null) { | 134 if (color != null) { |
87 cssStyle['color'] = 'rgba(${color.red}, ${color.green}, ${color.blue}, ${c
olor.alpha / 255.0})'; | 135 cssStyle['color'] = 'rgba(${color.red}, ${color.green}, ${color.blue}, ${c
olor.alpha / 255.0})'; |
88 } | 136 } |
89 // TODO(hansmuller): escape the fontFamily string. | 137 // TODO(hansmuller): escape the fontFamily string. |
90 if (fontFamily != null) { | 138 if (fontFamily != null) { |
91 cssStyle['font-family'] = fontFamily; | 139 cssStyle['font-family'] = fontFamily; |
(...skipping 14 matching lines...) Expand all Loading... |
106 FontWeight.w900: '900' | 154 FontWeight.w900: '900' |
107 }[fontWeight]; | 155 }[fontWeight]; |
108 } | 156 } |
109 if (textAlign != null) { | 157 if (textAlign != null) { |
110 cssStyle['text-align'] = const { | 158 cssStyle['text-align'] = const { |
111 TextAlign.left: 'left', | 159 TextAlign.left: 'left', |
112 TextAlign.right: 'right', | 160 TextAlign.right: 'right', |
113 TextAlign.center: 'center', | 161 TextAlign.center: 'center', |
114 }[textAlign]; | 162 }[textAlign]; |
115 } | 163 } |
| 164 if (decoration != null) { |
| 165 cssStyle['text-decoration'] = _decorationToString(); |
| 166 } |
| 167 // TODO(hansmuller): add support for decoration color and style. |
116 } | 168 } |
117 | 169 |
118 String toString([String prefix = '']) { | 170 String toString([String prefix = '']) { |
119 List<String> result = []; | 171 List<String> result = []; |
120 if (color != null) | 172 if (color != null) |
121 result.add('${prefix}color: $color'); | 173 result.add('${prefix}color: $color'); |
122 // TODO(hansmuller): escape the fontFamily string. | 174 // TODO(hansmuller): escape the fontFamily string. |
123 if (fontFamily != null) | 175 if (fontFamily != null) |
124 result.add('${prefix}fontFamily: "${fontFamily}"'); | 176 result.add('${prefix}fontFamily: "${fontFamily}"'); |
125 if (fontSize != null) | 177 if (fontSize != null) |
126 result.add('${prefix}fontSize: $fontSize'); | 178 result.add('${prefix}fontSize: $fontSize'); |
127 if (fontWeight != null) | 179 if (fontWeight != null) |
128 result.add('${prefix}fontWeight: $fontWeight'); | 180 result.add('${prefix}fontWeight: $fontWeight'); |
129 if (textAlign != null) | 181 if (textAlign != null) |
130 result.add('${prefix}textAlign: $textAlign'); | 182 result.add('${prefix}textAlign: $textAlign'); |
| 183 if (decoration != null) |
| 184 result.add('${prefix}decoration: ${_decorationToString()}'); |
| 185 if (decorationColor != null) |
| 186 result.add('${prefix}decorationColor: $decorationColor'); |
| 187 if (decorationStyle != null) |
| 188 result.add('${prefix}decorationStyle: $decorationStyle'); |
131 if (result.isEmpty) | 189 if (result.isEmpty) |
132 return '${prefix}<no style specified>'; | 190 return '${prefix}<no style specified>'; |
133 return result.join('\n'); | 191 return result.join('\n'); |
134 } | 192 } |
135 } | 193 } |
OLD | NEW |