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