|
2 | 2 |
|
3 | 3 | use cosmic_text::{ |
4 | 4 | Action, Attrs, AttrsBuilder, AttrsList, Buffer, BufferLine, Color, Edit, Editor, Family, |
5 | | - FontSystem, Metrics, Style, SwashCache, Weight, |
| 5 | + FontSystem, Metrics, Spans, Style, SwashCache, Weight, |
6 | 6 | }; |
7 | 7 | use orbclient::{EventOption, Renderer, Window, WindowFlag}; |
8 | 8 | use std::{ |
@@ -52,96 +52,129 @@ fn main() { |
52 | 52 |
|
53 | 53 | editor.buffer_mut().lines.clear(); |
54 | 54 |
|
55 | | - let lines: &[&[(&str, AttrsBuilder)]] = &[ |
| 55 | + let lines: &[&[(&str, AttrsBuilder, Option<Color>)]] = &[ |
56 | 56 | &[ |
57 | | - ("B", attrs.clone().weight(Weight::BOLD)), |
58 | | - ("old ", attrs.clone()), |
59 | | - ("I", attrs.clone().style(Style::Italic)), |
60 | | - ("talic ", attrs.clone()), |
61 | | - ("f", attrs.clone()), |
62 | | - ("i ", attrs.clone()), |
63 | | - ("f", attrs.clone().weight(Weight::BOLD)), |
64 | | - ("i ", attrs.clone()), |
65 | | - ("f", attrs.clone().style(Style::Italic)), |
66 | | - ("i ", attrs.clone()), |
| 57 | + ("B", attrs.clone().weight(Weight::BOLD), None), |
| 58 | + ("old ", attrs.clone(), None), |
| 59 | + ("I", attrs.clone().style(Style::Italic), None), |
| 60 | + ("talic ", attrs.clone(), None), |
| 61 | + ("f", attrs.clone(), None), |
| 62 | + ("i ", attrs.clone(), None), |
| 63 | + ("f", attrs.clone().weight(Weight::BOLD), None), |
| 64 | + ("i ", attrs.clone(), None), |
| 65 | + ("f", attrs.clone().style(Style::Italic), None), |
| 66 | + ("i ", attrs.clone(), None), |
67 | 67 | ], |
68 | 68 | &[ |
69 | | - ("Sans-Serif Normal ", attrs.clone()), |
70 | | - ("Sans-Serif Bold ", attrs.clone().weight(Weight::BOLD)), |
71 | | - ("Sans-Serif Italic ", attrs.clone().style(Style::Italic)), |
| 69 | + ("Sans-Serif Normal ", attrs.clone(), None), |
| 70 | + ("Sans-Serif Bold ", attrs.clone().weight(Weight::BOLD), None), |
| 71 | + ( |
| 72 | + "Sans-Serif Italic ", |
| 73 | + attrs.clone().style(Style::Italic), |
| 74 | + None, |
| 75 | + ), |
72 | 76 | ( |
73 | 77 | "Sans-Serif Bold Italic", |
74 | 78 | attrs.clone().weight(Weight::BOLD).style(Style::Italic), |
| 79 | + None, |
75 | 80 | ), |
76 | 81 | ], |
77 | 82 | &[ |
78 | | - ("Serif Normal ", serif_attrs.clone()), |
79 | | - ("Serif Bold ", serif_attrs.clone().weight(Weight::BOLD)), |
80 | | - ("Serif Italic ", serif_attrs.clone().style(Style::Italic)), |
| 83 | + ("Serif Normal ", serif_attrs.clone(), None), |
| 84 | + ( |
| 85 | + "Serif Bold ", |
| 86 | + serif_attrs.clone().weight(Weight::BOLD), |
| 87 | + None, |
| 88 | + ), |
| 89 | + ( |
| 90 | + "Serif Italic ", |
| 91 | + serif_attrs.clone().style(Style::Italic), |
| 92 | + None, |
| 93 | + ), |
81 | 94 | ( |
82 | 95 | "Serif Bold Italic", |
83 | 96 | serif_attrs.weight(Weight::BOLD).style(Style::Italic), |
| 97 | + None, |
84 | 98 | ), |
85 | 99 | ], |
86 | 100 | &[ |
87 | | - ("Mono Normal ", mono_attrs.clone()), |
88 | | - ("Mono Bold ", mono_attrs.clone().weight(Weight::BOLD)), |
89 | | - ("Mono Italic ", mono_attrs.clone().style(Style::Italic)), |
| 101 | + ("Mono Normal ", mono_attrs.clone(), None), |
| 102 | + ("Mono Bold ", mono_attrs.clone().weight(Weight::BOLD), None), |
| 103 | + ( |
| 104 | + "Mono Italic ", |
| 105 | + mono_attrs.clone().style(Style::Italic), |
| 106 | + None, |
| 107 | + ), |
90 | 108 | ( |
91 | 109 | "Mono Bold Italic", |
92 | 110 | mono_attrs.weight(Weight::BOLD).style(Style::Italic), |
| 111 | + None, |
93 | 112 | ), |
94 | 113 | ], |
95 | 114 | &[ |
96 | | - ("Comic Normal ", comic_attrs.clone()), |
97 | | - ("Comic Bold ", comic_attrs.clone().weight(Weight::BOLD)), |
98 | | - ("Comic Italic ", comic_attrs.clone().style(Style::Italic)), |
| 115 | + ("Comic Normal ", comic_attrs.clone(), None), |
| 116 | + ( |
| 117 | + "Comic Bold ", |
| 118 | + comic_attrs.clone().weight(Weight::BOLD), |
| 119 | + None, |
| 120 | + ), |
| 121 | + ( |
| 122 | + "Comic Italic ", |
| 123 | + comic_attrs.clone().style(Style::Italic), |
| 124 | + None, |
| 125 | + ), |
99 | 126 | ( |
100 | 127 | "Comic Bold Italic", |
101 | 128 | comic_attrs.weight(Weight::BOLD).style(Style::Italic), |
| 129 | + None, |
102 | 130 | ), |
103 | 131 | ], |
104 | 132 | &[ |
105 | | - ("R", attrs.clone().color(Color::rgb(0xFF, 0x00, 0x00))), |
106 | | - ("A", attrs.clone().color(Color::rgb(0xFF, 0x7F, 0x00))), |
107 | | - ("I", attrs.clone().color(Color::rgb(0xFF, 0xFF, 0x00))), |
108 | | - ("N", attrs.clone().color(Color::rgb(0x00, 0xFF, 0x00))), |
109 | | - ("B", attrs.clone().color(Color::rgb(0x00, 0x00, 0xFF))), |
110 | | - ("O", attrs.clone().color(Color::rgb(0x4B, 0x00, 0x82))), |
111 | | - ("W ", attrs.clone().color(Color::rgb(0x94, 0x00, 0xD3))), |
112 | | - ("Red ", attrs.clone().color(Color::rgb(0xFF, 0x00, 0x00))), |
113 | | - ("Orange ", attrs.clone().color(Color::rgb(0xFF, 0x7F, 0x00))), |
114 | | - ("Yellow ", attrs.clone().color(Color::rgb(0xFF, 0xFF, 0x00))), |
115 | | - ("Green ", attrs.clone().color(Color::rgb(0x00, 0xFF, 0x00))), |
116 | | - ("Blue ", attrs.clone().color(Color::rgb(0x00, 0x00, 0xFF))), |
117 | | - ("Indigo ", attrs.clone().color(Color::rgb(0x4B, 0x00, 0x82))), |
118 | | - ("Violet ", attrs.clone().color(Color::rgb(0x94, 0x00, 0xD3))), |
119 | | - ("U", attrs.clone().color(Color::rgb(0x94, 0x00, 0xD3))), |
120 | | - ("N", attrs.clone().color(Color::rgb(0x4B, 0x00, 0x82))), |
121 | | - ("I", attrs.clone().color(Color::rgb(0x00, 0x00, 0xFF))), |
122 | | - ("C", attrs.clone().color(Color::rgb(0x00, 0xFF, 0x00))), |
123 | | - ("O", attrs.clone().color(Color::rgb(0xFF, 0xFF, 0x00))), |
124 | | - ("R", attrs.clone().color(Color::rgb(0xFF, 0x7F, 0x00))), |
125 | | - ("N", attrs.clone().color(Color::rgb(0xFF, 0x00, 0x00))), |
| 133 | + ("R", attrs.clone(), Some(Color::rgb(0xFF, 0x00, 0x00))), |
| 134 | + ("A", attrs.clone(), Some(Color::rgb(0xFF, 0x7F, 0x00))), |
| 135 | + ("I", attrs.clone(), Some(Color::rgb(0xFF, 0xFF, 0x00))), |
| 136 | + ("N", attrs.clone(), Some(Color::rgb(0x00, 0xFF, 0x00))), |
| 137 | + ("B", attrs.clone(), Some(Color::rgb(0x00, 0x00, 0xFF))), |
| 138 | + ("O", attrs.clone(), Some(Color::rgb(0x4B, 0x00, 0x82))), |
| 139 | + ("W ", attrs.clone(), Some(Color::rgb(0x94, 0x00, 0xD3))), |
| 140 | + ("Red ", attrs.clone(), Some(Color::rgb(0xFF, 0x00, 0x00))), |
| 141 | + ("Orange ", attrs.clone(), Some(Color::rgb(0xFF, 0x7F, 0x00))), |
| 142 | + ("Yellow ", attrs.clone(), Some(Color::rgb(0xFF, 0xFF, 0x00))), |
| 143 | + ("Green ", attrs.clone(), Some(Color::rgb(0x00, 0xFF, 0x00))), |
| 144 | + ("Blue ", attrs.clone(), Some(Color::rgb(0x00, 0x00, 0xFF))), |
| 145 | + ("Indigo ", attrs.clone(), Some(Color::rgb(0x4B, 0x00, 0x82))), |
| 146 | + ("Violet ", attrs.clone(), Some(Color::rgb(0x94, 0x00, 0xD3))), |
| 147 | + ("U", attrs.clone(), Some(Color::rgb(0x94, 0x00, 0xD3))), |
| 148 | + ("N", attrs.clone(), Some(Color::rgb(0x4B, 0x00, 0x82))), |
| 149 | + ("I", attrs.clone(), Some(Color::rgb(0x00, 0x00, 0xFF))), |
| 150 | + ("C", attrs.clone(), Some(Color::rgb(0x00, 0xFF, 0x00))), |
| 151 | + ("O", attrs.clone(), Some(Color::rgb(0xFF, 0xFF, 0x00))), |
| 152 | + ("R", attrs.clone(), Some(Color::rgb(0xFF, 0x7F, 0x00))), |
| 153 | + ("N", attrs.clone(), Some(Color::rgb(0xFF, 0x00, 0x00))), |
126 | 154 | ], |
127 | 155 | &[( |
128 | 156 | "生活,삶,जिंदगी 😀 FPS", |
129 | | - attrs.clone().color(Color::rgb(0xFF, 0x00, 0x00)), |
| 157 | + attrs.clone(), |
| 158 | + Some(Color::rgb(0xFF, 0x00, 0x00)), |
130 | 159 | )], |
131 | 160 | ]; |
132 | 161 | for line in lines { |
133 | 162 | let mut line_text = String::new(); |
134 | 163 | let mut attrs_list = AttrsList::new(attrs.clone().build()); |
135 | | - for (text, attrs) in line.iter() { |
| 164 | + let mut color_spans = Spans::<Color>::default(); |
| 165 | + for (text, attrs, color) in line.iter() { |
136 | 166 | let start = line_text.len(); |
137 | 167 | line_text.push_str(text); |
138 | 168 | let end = line_text.len(); |
139 | 169 | attrs_list.add_span(start..end, attrs.clone().build()); |
| 170 | + if let Some(color) = color { |
| 171 | + color_spans.add(start..end, *color); |
| 172 | + } |
140 | 173 | } |
141 | 174 | editor |
142 | 175 | .buffer_mut() |
143 | 176 | .lines |
144 | | - .push(BufferLine::new(line_text, attrs_list)); |
| 177 | + .push(BufferLine::new(line_text, attrs_list, color_spans)); |
145 | 178 | } |
146 | 179 |
|
147 | 180 | let mut swash_cache = SwashCache::new(); |
|
0 commit comments