diff options
Diffstat (limited to '')
| -rw-r--r-- | graphics/src/text.rs | 12 | ||||
| -rw-r--r-- | graphics/src/text/editor.rs | 27 | ||||
| -rw-r--r-- | graphics/src/text/paragraph.rs | 7 | 
3 files changed, 33 insertions, 13 deletions
| diff --git a/graphics/src/text.rs b/graphics/src/text.rs index 23ec14d4..feb9932a 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -11,7 +11,7 @@ pub use cosmic_text;  use crate::core::alignment;  use crate::core::font::{self, Font}; -use crate::core::text::Shaping; +use crate::core::text::{Shaping, Wrapping};  use crate::core::{Color, Pixels, Point, Rectangle, Size, Transformation};  use once_cell::sync::OnceCell; @@ -306,6 +306,16 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping {      }  } +/// Converts some [`Wrapping`] strategy to a [`cosmic_text::Wrap`] strategy. +pub fn to_wrap(wrapping: Wrapping) -> cosmic_text::Wrap { +    match wrapping { +        Wrapping::None => cosmic_text::Wrap::None, +        Wrapping::Word => cosmic_text::Wrap::Word, +        Wrapping::Glyph => cosmic_text::Wrap::Glyph, +        Wrapping::WordOrGlyph => cosmic_text::Wrap::WordOrGlyph, +    } +} +  /// Converts some [`Color`] to a [`cosmic_text::Color`].  pub fn to_color(color: Color) -> cosmic_text::Color {      let [r, g, b, a] = color.into_rgba8(); diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 80733bbb..fe1442d1 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -3,7 +3,7 @@ use crate::core::text::editor::{      self, Action, Cursor, Direction, Edit, Motion,  };  use crate::core::text::highlighter::{self, Highlighter}; -use crate::core::text::LineHeight; +use crate::core::text::{LineHeight, Wrapping};  use crate::core::{Font, Pixels, Point, Rectangle, Size};  use crate::text; @@ -437,6 +437,7 @@ impl editor::Editor for Editor {          new_font: Font,          new_size: Pixels,          new_line_height: LineHeight, +        new_wrapping: Wrapping,          new_highlighter: &mut impl Highlighter,      ) {          let editor = @@ -448,13 +449,12 @@ impl editor::Editor for Editor {          let mut font_system =              text::font_system().write().expect("Write font system"); +        let buffer = buffer_mut_from_editor(&mut internal.editor); +          if font_system.version() != internal.version {              log::trace!("Updating `FontSystem` of `Editor`..."); -            for line in buffer_mut_from_editor(&mut internal.editor) -                .lines -                .iter_mut() -            { +            for line in buffer.lines.iter_mut() {                  line.reset();              } @@ -465,10 +465,7 @@ impl editor::Editor for Editor {          if new_font != internal.font {              log::trace!("Updating font of `Editor`..."); -            for line in buffer_mut_from_editor(&mut internal.editor) -                .lines -                .iter_mut() -            { +            for line in buffer.lines.iter_mut() {                  let _ = line.set_attrs_list(cosmic_text::AttrsList::new(                      text::to_attributes(new_font),                  )); @@ -478,7 +475,7 @@ impl editor::Editor for Editor {              internal.topmost_line_changed = Some(0);          } -        let metrics = buffer_from_editor(&internal.editor).metrics(); +        let metrics = buffer.metrics();          let new_line_height = new_line_height.to_absolute(new_size);          if new_size.0 != metrics.font_size @@ -486,12 +483,20 @@ impl editor::Editor for Editor {          {              log::trace!("Updating `Metrics` of `Editor`..."); -            buffer_mut_from_editor(&mut internal.editor).set_metrics( +            buffer.set_metrics(                  font_system.raw(),                  cosmic_text::Metrics::new(new_size.0, new_line_height.0),              );          } +        let new_wrap = text::to_wrap(new_wrapping); + +        if new_wrap != buffer.wrap() { +            log::trace!("Updating `Wrap` strategy of `Editor`..."); + +            buffer.set_wrap(font_system.raw(), new_wrap); +        } +          if new_bounds != internal.bounds {              log::trace!("Updating size of `Editor`..."); diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index b9f9c833..07ddbb82 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -1,7 +1,7 @@  //! Draw paragraphs.  use crate::core;  use crate::core::alignment; -use crate::core::text::{Hit, Shaping, Span, Text}; +use crate::core::text::{Hit, Shaping, Span, Text, Wrapping};  use crate::core::{Font, Point, Rectangle, Size};  use crate::text; @@ -17,6 +17,7 @@ struct Internal {      buffer: cosmic_text::Buffer,      font: Font,      shaping: Shaping, +    wrapping: Wrapping,      horizontal_alignment: alignment::Horizontal,      vertical_alignment: alignment::Vertical,      bounds: Size, @@ -94,6 +95,7 @@ impl core::text::Paragraph for Paragraph {              horizontal_alignment: text.horizontal_alignment,              vertical_alignment: text.vertical_alignment,              shaping: text.shaping, +            wrapping: text.wrapping,              bounds: text.bounds,              min_bounds,              version: font_system.version(), @@ -160,6 +162,7 @@ impl core::text::Paragraph for Paragraph {              horizontal_alignment: text.horizontal_alignment,              vertical_alignment: text.vertical_alignment,              shaping: text.shaping, +            wrapping: text.wrapping,              bounds: text.bounds,              min_bounds,              version: font_system.version(), @@ -192,6 +195,7 @@ impl core::text::Paragraph for Paragraph {              || metrics.line_height != text.line_height.to_absolute(text.size).0              || paragraph.font != text.font              || paragraph.shaping != text.shaping +            || paragraph.wrapping != text.wrapping              || paragraph.horizontal_alignment != text.horizontal_alignment              || paragraph.vertical_alignment != text.vertical_alignment          { @@ -387,6 +391,7 @@ impl Default for Internal {              }),              font: Font::default(),              shaping: Shaping::default(), +            wrapping: Wrapping::default(),              horizontal_alignment: alignment::Horizontal::Left,              vertical_alignment: alignment::Vertical::Top,              bounds: Size::ZERO, | 
