Add text::Wrapping support
Co-authored-by: Neeraj Jaiswal <neerajj85@gmail.com>
This commit is contained in:
parent
8d826cc662
commit
f98328f4f1
21 changed files with 160 additions and 30 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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`...");
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue