summaryrefslogtreecommitdiffstats
path: root/graphics/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2023-09-17 19:03:58 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2023-09-17 19:04:23 +0200
commitd3011992a76e83e12f74402c2ade616cdc7f1497 (patch)
tree50547c123164ef3b28d1e59264ebe9435edd648c /graphics/src
parent76dc82e8e8b5201ec10f8d00d851c1decf998583 (diff)
downloadiced-d3011992a76e83e12f74402c2ade616cdc7f1497.tar.gz
iced-d3011992a76e83e12f74402c2ade616cdc7f1497.tar.bz2
iced-d3011992a76e83e12f74402c2ade616cdc7f1497.zip
Implement basic syntax highlighting with `syntect` in `editor` example
Diffstat (limited to 'graphics/src')
-rw-r--r--graphics/src/text/editor.rs25
1 files changed, 22 insertions, 3 deletions
diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs
index 901b4295..58fcc3dc 100644
--- a/graphics/src/text/editor.rs
+++ b/graphics/src/text/editor.rs
@@ -447,17 +447,26 @@ impl editor::Editor for Editor {
text::font_system().write().expect("Write font system");
if font_system.version() != internal.version {
+ log::trace!("Updating `FontSystem` of `Editor`...");
+
for line in internal.editor.buffer_mut().lines.iter_mut() {
line.reset();
}
}
if new_font != internal.font {
+ log::trace!("Updating font of `Editor`...");
+
for line in internal.editor.buffer_mut().lines.iter_mut() {
let _ = line.set_attrs_list(cosmic_text::AttrsList::new(
text::to_attributes(new_font),
));
}
+
+ internal.font = new_font;
+ internal.topmost_line_changed = Some(0);
+
+ internal.editor.shape_as_needed(font_system.raw());
}
let metrics = internal.editor.buffer().metrics();
@@ -466,6 +475,8 @@ impl editor::Editor for Editor {
if new_size.0 != metrics.font_size
|| new_line_height.0 != metrics.line_height
{
+ log::trace!("Updating `Metrics` of `Editor`...");
+
internal.editor.buffer_mut().set_metrics(
font_system.raw(),
cosmic_text::Metrics::new(new_size.0, new_line_height.0),
@@ -473,6 +484,8 @@ impl editor::Editor for Editor {
}
if new_bounds != internal.bounds {
+ log::trace!("Updating size of `Editor`...");
+
internal.editor.buffer_mut().set_size(
font_system.raw(),
new_bounds.width,
@@ -484,6 +497,10 @@ impl editor::Editor for Editor {
if let Some(topmost_line_changed) = internal.topmost_line_changed.take()
{
+ log::trace!(
+ "Notifying highlighter of line change: {topmost_line_changed}"
+ );
+
new_highlighter.change_line(topmost_line_changed);
}
@@ -497,10 +514,12 @@ impl editor::Editor for Editor {
format_highlight: impl Fn(&H::Highlight) -> highlighter::Format<Self::Font>,
) {
let internal = self.internal();
+ let buffer = internal.editor.buffer();
- let scroll = internal.editor.buffer().scroll();
- let visible_lines = internal.editor.buffer().visible_lines();
- let last_visible_line = (scroll + visible_lines - 1) as usize;
+ let scroll = buffer.scroll();
+ let visible_lines = buffer.visible_lines();
+ let last_visible_line =
+ ((scroll + visible_lines) as usize).min(buffer.lines.len()) - 1;
let current_line = highlighter.current_line();