diff --git a/src/buffer.rs b/src/buffer.rs index faea76b..a61dd6c 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -116,8 +116,8 @@ impl<'a, 'b> Iterator for TextLayoutRunIter<'a, 'b> { fn next(&mut self) -> Option { while let Some(line) = self.buffer.lines.get(self.line_i) { - let shape = line.shape_opt.as_ref()?; - let layout = line.layout_opt.as_ref()?; + let shape = line.shape_opt().as_ref()?; + let layout = line.layout_opt().as_ref()?; while let Some(layout_line) = layout.get(self.layout_i) { self.layout_i += 1; @@ -230,7 +230,7 @@ impl<'a> TextBuffer<'a> { break; } - if line.shape_opt.is_none() { + if line.shape_opt().is_none() { reshaped += 1; } let layout = line.layout( @@ -261,7 +261,7 @@ impl<'a> TextBuffer<'a> { break; } - if line.shape_opt.is_none() { + if line.shape_opt().is_none() { reshaped += 1; } let layout = line.layout( @@ -314,8 +314,8 @@ impl<'a> TextBuffer<'a> { let instant = Instant::now(); for line in self.lines.iter_mut() { - if line.shape_opt.is_some() { - line.layout_opt = None; + if line.shape_opt().is_some() { + line.reset_layout(); line.layout( self.font_system, self.metrics.font_size, @@ -333,7 +333,7 @@ impl<'a> TextBuffer<'a> { fn layout_cursor(&self, cursor: &TextCursor) -> TextLayoutCursor { let line = &self.lines[cursor.line]; - let layout = line.layout_opt.as_ref().unwrap(); //TODO: ensure layout is done? + let layout = line.layout_opt().as_ref().unwrap(); //TODO: ensure layout is done? for (layout_i, layout_line) in layout.iter().enumerate() { for (glyph_i, glyph) in layout_line.glyphs.iter().enumerate() { if cursor.index == glyph.start { @@ -516,7 +516,7 @@ impl<'a> TextBuffer<'a> { self.cursor_x_opt = None; }, TextAction::Left => { - let rtl_opt = self.lines[self.cursor.line].shape_opt.as_ref().map(|shape| shape.rtl); + let rtl_opt = self.lines[self.cursor.line].shape_opt().as_ref().map(|shape| shape.rtl); if let Some(rtl) = rtl_opt { if rtl { self.action(TextAction::Next); @@ -526,7 +526,7 @@ impl<'a> TextBuffer<'a> { } }, TextAction::Right => { - let rtl_opt = self.lines[self.cursor.line].shape_opt.as_ref().map(|shape| shape.rtl); + let rtl_opt = self.lines[self.cursor.line].shape_opt().as_ref().map(|shape| shape.rtl); if let Some(rtl) = rtl_opt { if rtl { self.action(TextAction::Previous); diff --git a/src/buffer_line.rs b/src/buffer_line.rs index e2a28be..304ba99 100644 --- a/src/buffer_line.rs +++ b/src/buffer_line.rs @@ -6,8 +6,8 @@ pub struct TextBufferLine<'a> { text: String, attrs_list: AttrsList<'a>, wrap_simple: bool, - pub(crate) shape_opt: Option, - pub(crate) layout_opt: Option>, + shape_opt: Option, + layout_opt: Option>, } impl<'a> TextBufferLine<'a> { @@ -121,6 +121,11 @@ impl<'a> TextBufferLine<'a> { self.layout_opt = None; } + /// Reset only layout information + pub fn reset_layout(&mut self) { + self.layout_opt = None; + } + /// Check if shaping and layout information is cleared pub fn is_reset(&self) -> bool { self.shape_opt.is_none() @@ -135,6 +140,11 @@ impl<'a> TextBufferLine<'a> { self.shape_opt.as_ref().unwrap() } + /// Get line shaping cache + pub fn shape_opt(&self) -> &Option { + &self.shape_opt + } + /// Layout line, will cache results pub fn layout(&mut self, font_system: &'a FontSystem<'a>, font_size: i32, width: i32) -> &[LayoutLine] { if self.layout_opt.is_none() { @@ -152,4 +162,9 @@ impl<'a> TextBufferLine<'a> { } self.layout_opt.as_ref().unwrap() } + + /// Get line layout cache + pub fn layout_opt(&self) -> &Option> { + &self.layout_opt + } }