feat: add Ellipsize to widgets
This commit is contained in:
parent
f2ef716ad5
commit
cc670e1966
18 changed files with 181 additions and 9 deletions
|
|
@ -201,7 +201,7 @@ repository = "https://github.com/iced-rs/iced"
|
||||||
homepage = "https://iced.rs"
|
homepage = "https://iced.rs"
|
||||||
categories = ["gui"]
|
categories = ["gui"]
|
||||||
keywords = ["gui", "ui", "graphics", "interface", "widgets"]
|
keywords = ["gui", "ui", "graphics", "interface", "widgets"]
|
||||||
rust-version = "1.88"
|
rust-version = "1.89"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
iced = { version = "0.14.0", path = "." }
|
iced = { version = "0.14.0", path = "." }
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,18 @@ impl text::Paragraph for () {
|
||||||
fn span_bounds(&self, _index: usize) -> Vec<Rectangle> {
|
fn span_bounds(&self, _index: usize) -> Vec<Rectangle> {
|
||||||
vec![]
|
vec![]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn min_width(&self) -> f32 {
|
||||||
|
self.min_bounds().width
|
||||||
|
}
|
||||||
|
|
||||||
|
fn min_height(&self) -> f32 {
|
||||||
|
self.min_bounds().height
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ellipsize(&self) -> text::Ellipsize {
|
||||||
|
text::Ellipsize::default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl text::Editor for () {
|
impl text::Editor for () {
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,9 @@ pub struct Text<Content = String, Font = crate::Font> {
|
||||||
|
|
||||||
/// The [`Wrapping`] strategy of the [`Text`].
|
/// The [`Wrapping`] strategy of the [`Text`].
|
||||||
pub wrapping: Wrapping,
|
pub wrapping: Wrapping,
|
||||||
|
|
||||||
|
/// The [`Ellipsize`] strategy of the [`Text`].
|
||||||
|
pub ellipsize: Ellipsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Content, Font> Text<Content, Font>
|
impl<Content, Font> Text<Content, Font>
|
||||||
|
|
@ -63,6 +66,7 @@ where
|
||||||
align_y: self.align_y,
|
align_y: self.align_y,
|
||||||
shaping: self.shaping,
|
shaping: self.shaping,
|
||||||
wrapping: self.wrapping,
|
wrapping: self.wrapping,
|
||||||
|
ellipsize: self.ellipsize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -192,6 +196,31 @@ pub enum Wrapping {
|
||||||
WordOrGlyph,
|
WordOrGlyph,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The ellipsizing strategy of some text.
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Default)]
|
||||||
|
pub enum Ellipsize {
|
||||||
|
/// No ellipsizing.
|
||||||
|
///
|
||||||
|
/// This is the default.
|
||||||
|
#[default]
|
||||||
|
None,
|
||||||
|
/// Ellipsize at the start of the text.
|
||||||
|
Start(EllipsizeHeightLimit),
|
||||||
|
/// Ellipsize in the middle of the text.
|
||||||
|
Middle(EllipsizeHeightLimit),
|
||||||
|
/// Ellipsize at the end of the text.
|
||||||
|
End(EllipsizeHeightLimit),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The ellipsizing strategy of some text when it exceeds a certain height.
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
|
pub enum EllipsizeHeightLimit {
|
||||||
|
/// The number of lines after which ellipsizing should occur.
|
||||||
|
Lines(usize),
|
||||||
|
/// The height limit in pixels
|
||||||
|
Height(f32),
|
||||||
|
}
|
||||||
|
|
||||||
/// The height of a line of text in a paragraph.
|
/// The height of a line of text in a paragraph.
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
pub enum LineHeight {
|
pub enum LineHeight {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ use crate::text::{
|
||||||
};
|
};
|
||||||
use crate::{Pixels, Point, Rectangle, Size};
|
use crate::{Pixels, Point, Rectangle, Size};
|
||||||
|
|
||||||
|
use super::Ellipsize;
|
||||||
|
|
||||||
/// A text paragraph.
|
/// A text paragraph.
|
||||||
pub trait Paragraph: Sized + Default {
|
pub trait Paragraph: Sized + Default {
|
||||||
/// The font of this [`Paragraph`].
|
/// The font of this [`Paragraph`].
|
||||||
|
|
@ -78,6 +80,10 @@ pub trait Paragraph: Sized + Default {
|
||||||
fn min_height(&self) -> f32 {
|
fn min_height(&self) -> f32 {
|
||||||
self.min_bounds().height
|
self.min_bounds().height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Returns the [`Ellipsize`] strategy of the [`Paragraph`]>
|
||||||
|
fn ellipsize(&self) -> Ellipsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A [`Paragraph`] of plain text.
|
/// A [`Paragraph`] of plain text.
|
||||||
|
|
@ -169,6 +175,7 @@ impl<P: Paragraph> Plain<P> {
|
||||||
align_y: self.raw.align_y(),
|
align_y: self.raw.align_y(),
|
||||||
shaping: self.raw.shaping(),
|
shaping: self.raw.shaping(),
|
||||||
wrapping: self.raw.wrapping(),
|
wrapping: self.raw.wrapping(),
|
||||||
|
ellipsize: self.raw.ellipsize()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
pub use text::{Alignment, LineHeight, Shaping, Wrapping};
|
pub use text::{Alignment, Ellipsize, LineHeight, Shaping, Wrapping};
|
||||||
|
|
||||||
/// A bunch of text.
|
/// A bunch of text.
|
||||||
///
|
///
|
||||||
|
|
@ -158,6 +158,12 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sets the [`Ellipsize`] strategy of the [`Text`].
|
||||||
|
pub fn ellipsize(mut self, ellipsize: Ellipsize) -> Self {
|
||||||
|
self.format.ellipsize = ellipsize;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the style of the [`Text`].
|
/// Sets the style of the [`Text`].
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn style(mut self, style: impl Fn(&Theme) -> Style + 'a) -> Self
|
pub fn style(mut self, style: impl Fn(&Theme) -> Style + 'a) -> Self
|
||||||
|
|
@ -328,6 +334,7 @@ pub struct Format<Font> {
|
||||||
pub align_y: alignment::Vertical,
|
pub align_y: alignment::Vertical,
|
||||||
pub shaping: Shaping,
|
pub shaping: Shaping,
|
||||||
pub wrapping: Wrapping,
|
pub wrapping: Wrapping,
|
||||||
|
pub ellipsize: Ellipsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Font> Default for Format<Font> {
|
impl<Font> Default for Format<Font> {
|
||||||
|
|
@ -342,6 +349,7 @@ impl<Font> Default for Format<Font> {
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: Shaping::default(),
|
shaping: Shaping::default(),
|
||||||
wrapping: Wrapping::default(),
|
wrapping: Wrapping::default(),
|
||||||
|
ellipsize: Ellipsize::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -373,6 +381,7 @@ where
|
||||||
align_y: format.align_y,
|
align_y: format.align_y,
|
||||||
shaping: format.shaping,
|
shaping: format.shaping,
|
||||||
wrapping: format.wrapping,
|
wrapping: format.wrapping,
|
||||||
|
ellipsize: format.ellipsize,
|
||||||
});
|
});
|
||||||
|
|
||||||
paragraph.min_bounds()
|
paragraph.min_bounds()
|
||||||
|
|
|
||||||
|
|
@ -355,6 +355,37 @@ pub fn to_wrap(wrapping: Wrapping) -> cosmic_text::Wrap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Converts some [`Ellipsize`] strategy to a [`cosmic_text::Ellipsize`] strategy.
|
||||||
|
pub fn to_ellipsize(
|
||||||
|
ellipsize: crate::core::text::Ellipsize,
|
||||||
|
) -> cosmic_text::Ellipsize {
|
||||||
|
match ellipsize {
|
||||||
|
crate::core::text::Ellipsize::None => cosmic_text::Ellipsize::None,
|
||||||
|
crate::core::text::Ellipsize::Start(limit) => {
|
||||||
|
cosmic_text::Ellipsize::Start(to_ellipsize_height_limit(limit))
|
||||||
|
}
|
||||||
|
crate::core::text::Ellipsize::Middle(limit) => {
|
||||||
|
cosmic_text::Ellipsize::Middle(to_ellipsize_height_limit(limit))
|
||||||
|
}
|
||||||
|
crate::core::text::Ellipsize::End(limit) => {
|
||||||
|
cosmic_text::Ellipsize::End(to_ellipsize_height_limit(limit))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_ellipsize_height_limit(
|
||||||
|
limit: crate::core::text::EllipsizeHeightLimit,
|
||||||
|
) -> cosmic_text::EllipsizeHeightLimit {
|
||||||
|
match limit {
|
||||||
|
crate::core::text::EllipsizeHeightLimit::Lines(lines) => {
|
||||||
|
cosmic_text::EllipsizeHeightLimit::Lines(lines)
|
||||||
|
}
|
||||||
|
crate::core::text::EllipsizeHeightLimit::Height(height) => {
|
||||||
|
cosmic_text::EllipsizeHeightLimit::Height(height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts some [`Color`] to a [`cosmic_text::Color`].
|
/// Converts some [`Color`] to a [`cosmic_text::Color`].
|
||||||
pub fn to_color(color: Color) -> cosmic_text::Color {
|
pub fn to_color(color: Color) -> cosmic_text::Color {
|
||||||
let [r, g, b, a] = color.into_rgba8();
|
let [r, g, b, a] = color.into_rgba8();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
//! Draw paragraphs.
|
//! Draw paragraphs.
|
||||||
|
use iced_core::text::Ellipsize;
|
||||||
|
|
||||||
use crate::core;
|
use crate::core;
|
||||||
use crate::core::alignment;
|
use crate::core::alignment;
|
||||||
use crate::core::text::{
|
use crate::core::text::{
|
||||||
|
|
@ -24,6 +26,7 @@ struct Internal {
|
||||||
align_y: alignment::Vertical,
|
align_y: alignment::Vertical,
|
||||||
bounds: Size,
|
bounds: Size,
|
||||||
min_bounds: Size,
|
min_bounds: Size,
|
||||||
|
ellipsize: Ellipsize,
|
||||||
version: text::Version,
|
version: text::Version,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -83,6 +86,10 @@ impl core::text::Paragraph for Paragraph {
|
||||||
);
|
);
|
||||||
|
|
||||||
buffer.set_wrap(font_system.raw(), text::to_wrap(text.wrapping));
|
buffer.set_wrap(font_system.raw(), text::to_wrap(text.wrapping));
|
||||||
|
buffer.set_ellipsize(
|
||||||
|
font_system.raw(),
|
||||||
|
text::to_ellipsize(text.ellipsize),
|
||||||
|
);
|
||||||
|
|
||||||
buffer.set_text(
|
buffer.set_text(
|
||||||
font_system.raw(),
|
font_system.raw(),
|
||||||
|
|
@ -101,6 +108,7 @@ impl core::text::Paragraph for Paragraph {
|
||||||
align_x: text.align_x,
|
align_x: text.align_x,
|
||||||
align_y: text.align_y,
|
align_y: text.align_y,
|
||||||
shaping: text.shaping,
|
shaping: text.shaping,
|
||||||
|
ellipsize: text.ellipsize,
|
||||||
wrapping: text.wrapping,
|
wrapping: text.wrapping,
|
||||||
bounds: text.bounds,
|
bounds: text.bounds,
|
||||||
min_bounds,
|
min_bounds,
|
||||||
|
|
@ -177,6 +185,7 @@ impl core::text::Paragraph for Paragraph {
|
||||||
align_x: text.align_x,
|
align_x: text.align_x,
|
||||||
align_y: text.align_y,
|
align_y: text.align_y,
|
||||||
shaping: text.shaping,
|
shaping: text.shaping,
|
||||||
|
ellipsize: text.ellipsize,
|
||||||
wrapping: text.wrapping,
|
wrapping: text.wrapping,
|
||||||
bounds: text.bounds,
|
bounds: text.bounds,
|
||||||
min_bounds,
|
min_bounds,
|
||||||
|
|
@ -394,6 +403,10 @@ impl core::text::Paragraph for Paragraph {
|
||||||
glyph.y - glyph.y_offset * glyph.font_size,
|
glyph.y - glyph.y_offset * glyph.font_size,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ellipsize(&self) -> Ellipsize {
|
||||||
|
self.0.ellipsize
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Paragraph {
|
impl Default for Paragraph {
|
||||||
|
|
@ -438,6 +451,7 @@ impl Default for Internal {
|
||||||
}),
|
}),
|
||||||
font: Font::default(),
|
font: Font::default(),
|
||||||
shaping: Shaping::default(),
|
shaping: Shaping::default(),
|
||||||
|
ellipsize: Ellipsize::default(),
|
||||||
wrapping: Wrapping::default(),
|
wrapping: Wrapping::default(),
|
||||||
align_x: Alignment::Default,
|
align_x: Alignment::Default,
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
|
|
|
||||||
|
|
@ -694,6 +694,7 @@ impl Renderer {
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: core::text::Shaping::Advanced,
|
shaping: core::text::Shaping::Advanced,
|
||||||
wrapping: core::text::Wrapping::Word,
|
wrapping: core::text::Wrapping::Word,
|
||||||
|
ellipsize: core::text::Ellipsize::None,
|
||||||
};
|
};
|
||||||
|
|
||||||
renderer.fill_text(
|
renderer.fill_text(
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,7 @@ pub struct Checkbox<
|
||||||
text_line_height: text::LineHeight,
|
text_line_height: text::LineHeight,
|
||||||
text_shaping: text::Shaping,
|
text_shaping: text::Shaping,
|
||||||
text_wrapping: text::Wrapping,
|
text_wrapping: text::Wrapping,
|
||||||
|
text_ellipsize: text::Ellipsize,
|
||||||
font: Option<Renderer::Font>,
|
font: Option<Renderer::Font>,
|
||||||
icon: Icon<Renderer::Font>,
|
icon: Icon<Renderer::Font>,
|
||||||
class: Theme::Class<'a>,
|
class: Theme::Class<'a>,
|
||||||
|
|
@ -145,6 +146,7 @@ where
|
||||||
text_line_height: text::LineHeight::default(),
|
text_line_height: text::LineHeight::default(),
|
||||||
text_shaping: text::Shaping::default(),
|
text_shaping: text::Shaping::default(),
|
||||||
text_wrapping: text::Wrapping::default(),
|
text_wrapping: text::Wrapping::default(),
|
||||||
|
text_ellipsize: text::Ellipsize::default(),
|
||||||
font: None,
|
font: None,
|
||||||
icon: Icon {
|
icon: Icon {
|
||||||
font: Renderer::ICON_FONT,
|
font: Renderer::ICON_FONT,
|
||||||
|
|
@ -351,6 +353,7 @@ where
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: self.text_wrapping,
|
wrapping: self.text_wrapping,
|
||||||
|
ellipsize: self.text_ellipsize,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -477,6 +480,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: *shaping,
|
shaping: *shaping,
|
||||||
wrapping: text::Wrapping::default(),
|
wrapping: text::Wrapping::default(),
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
},
|
},
|
||||||
bounds.center(),
|
bounds.center(),
|
||||||
style.icon_color,
|
style.icon_color,
|
||||||
|
|
|
||||||
|
|
@ -576,6 +576,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: text::Wrapping::default(),
|
wrapping: text::Wrapping::default(),
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
},
|
},
|
||||||
Point::new(bounds.x + self.padding.left, bounds.center_y()),
|
Point::new(bounds.x + self.padding.left, bounds.center_y()),
|
||||||
if is_selected {
|
if is_selected {
|
||||||
|
|
|
||||||
|
|
@ -171,6 +171,7 @@ pub struct PickList<
|
||||||
text_line_height: text::LineHeight,
|
text_line_height: text::LineHeight,
|
||||||
text_shaping: text::Shaping,
|
text_shaping: text::Shaping,
|
||||||
text_wrap: text::Wrapping,
|
text_wrap: text::Wrapping,
|
||||||
|
text_ellipsize: text::Ellipsize,
|
||||||
font: Option<Renderer::Font>,
|
font: Option<Renderer::Font>,
|
||||||
handle: Handle<Renderer::Font>,
|
handle: Handle<Renderer::Font>,
|
||||||
class: <Theme as Catalog>::Class<'a>,
|
class: <Theme as Catalog>::Class<'a>,
|
||||||
|
|
@ -209,6 +210,7 @@ where
|
||||||
text_line_height: text::LineHeight::default(),
|
text_line_height: text::LineHeight::default(),
|
||||||
text_shaping: text::Shaping::Advanced,
|
text_shaping: text::Shaping::Advanced,
|
||||||
text_wrap: text::Wrapping::default(),
|
text_wrap: text::Wrapping::default(),
|
||||||
|
text_ellipsize: text::Ellipsize::default(),
|
||||||
font: None,
|
font: None,
|
||||||
handle: Handle::default(),
|
handle: Handle::default(),
|
||||||
class: <Theme as Catalog>::default(),
|
class: <Theme as Catalog>::default(),
|
||||||
|
|
@ -392,6 +394,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: self.text_wrap,
|
wrapping: self.text_wrap,
|
||||||
|
ellipsize: self.text_ellipsize,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (option, paragraph) in options.iter().zip(state.options.iter_mut())
|
for (option, paragraph) in options.iter().zip(state.options.iter_mut())
|
||||||
|
|
@ -614,6 +617,7 @@ where
|
||||||
text::LineHeight::default(),
|
text::LineHeight::default(),
|
||||||
text::Shaping::Basic,
|
text::Shaping::Basic,
|
||||||
text::Wrapping::default(),
|
text::Wrapping::default(),
|
||||||
|
text::Ellipsize::default(),
|
||||||
)),
|
)),
|
||||||
Handle::Static(Icon {
|
Handle::Static(Icon {
|
||||||
font,
|
font,
|
||||||
|
|
@ -622,9 +626,16 @@ where
|
||||||
line_height,
|
line_height,
|
||||||
shaping,
|
shaping,
|
||||||
wrap,
|
wrap,
|
||||||
}) => {
|
ellipsize,
|
||||||
Some((*font, *code_point, *size, *line_height, *shaping, *wrap))
|
}) => Some((
|
||||||
}
|
*font,
|
||||||
|
*code_point,
|
||||||
|
*size,
|
||||||
|
*line_height,
|
||||||
|
*shaping,
|
||||||
|
*wrap,
|
||||||
|
*ellipsize,
|
||||||
|
)),
|
||||||
Handle::Dynamic { open, closed } => {
|
Handle::Dynamic { open, closed } => {
|
||||||
if state.is_open {
|
if state.is_open {
|
||||||
Some((
|
Some((
|
||||||
|
|
@ -634,6 +645,7 @@ where
|
||||||
open.line_height,
|
open.line_height,
|
||||||
open.shaping,
|
open.shaping,
|
||||||
open.wrap,
|
open.wrap,
|
||||||
|
open.ellipsize,
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
Some((
|
Some((
|
||||||
|
|
@ -643,14 +655,22 @@ where
|
||||||
closed.line_height,
|
closed.line_height,
|
||||||
closed.shaping,
|
closed.shaping,
|
||||||
closed.wrap,
|
closed.wrap,
|
||||||
|
closed.ellipsize,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Handle::None => None,
|
Handle::None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some((font, code_point, size, line_height, shaping, wrap)) =
|
if let Some((
|
||||||
handle
|
font,
|
||||||
|
code_point,
|
||||||
|
size,
|
||||||
|
line_height,
|
||||||
|
shaping,
|
||||||
|
wrap,
|
||||||
|
ellipsize,
|
||||||
|
)) = handle
|
||||||
{
|
{
|
||||||
let size = size.unwrap_or_else(|| renderer.default_size());
|
let size = size.unwrap_or_else(|| renderer.default_size());
|
||||||
|
|
||||||
|
|
@ -668,6 +688,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping,
|
shaping,
|
||||||
wrapping: wrap,
|
wrapping: wrap,
|
||||||
|
ellipsize: ellipsize,
|
||||||
},
|
},
|
||||||
Point::new(
|
Point::new(
|
||||||
bounds.x + bounds.width - self.padding.right,
|
bounds.x + bounds.width - self.padding.right,
|
||||||
|
|
@ -698,6 +719,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: self.text_wrap,
|
wrapping: self.text_wrap,
|
||||||
|
ellipsize: self.text_ellipsize,
|
||||||
},
|
},
|
||||||
Point::new(bounds.x + self.padding.left, bounds.center_y()),
|
Point::new(bounds.x + self.padding.left, bounds.center_y()),
|
||||||
if selected.is_some() {
|
if selected.is_some() {
|
||||||
|
|
@ -851,6 +873,8 @@ pub struct Icon<Font> {
|
||||||
pub shaping: text::Shaping,
|
pub shaping: text::Shaping,
|
||||||
/// The wrap mode of the icon.
|
/// The wrap mode of the icon.
|
||||||
pub wrap: text::Wrapping,
|
pub wrap: text::Wrapping,
|
||||||
|
/// The ellipsize mode of the icon.
|
||||||
|
pub ellipsize: text::Ellipsize,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The possible status of a [`PickList`].
|
/// The possible status of a [`PickList`].
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,7 @@ where
|
||||||
text_line_height: text::LineHeight,
|
text_line_height: text::LineHeight,
|
||||||
text_shaping: text::Shaping,
|
text_shaping: text::Shaping,
|
||||||
text_wrapping: text::Wrapping,
|
text_wrapping: text::Wrapping,
|
||||||
|
text_ellipsize: text::Ellipsize,
|
||||||
font: Option<Renderer::Font>,
|
font: Option<Renderer::Font>,
|
||||||
class: Theme::Class<'a>,
|
class: Theme::Class<'a>,
|
||||||
last_status: Option<Status>,
|
last_status: Option<Status>,
|
||||||
|
|
@ -190,6 +191,7 @@ where
|
||||||
text_line_height: text::LineHeight::default(),
|
text_line_height: text::LineHeight::default(),
|
||||||
text_shaping: text::Shaping::Advanced,
|
text_shaping: text::Shaping::Advanced,
|
||||||
text_wrapping: text::Wrapping::default(),
|
text_wrapping: text::Wrapping::default(),
|
||||||
|
text_ellipsize: text::Ellipsize::default(),
|
||||||
font: None,
|
font: None,
|
||||||
class: Theme::default(),
|
class: Theme::default(),
|
||||||
last_status: None,
|
last_status: None,
|
||||||
|
|
@ -241,6 +243,12 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the [`text::Ellipsize`] strategy of the [`Radio`] button.
|
||||||
|
pub fn text_ellipsize(mut self, ellipsize: text::Ellipsize) -> Self {
|
||||||
|
self.text_ellipsize = ellipsize;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the text font of the [`Radio`] button.
|
/// Sets the text font of the [`Radio`] button.
|
||||||
pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
|
pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
|
||||||
self.font = Some(font.into());
|
self.font = Some(font.into());
|
||||||
|
|
@ -318,6 +326,7 @@ where
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: self.text_wrapping,
|
wrapping: self.text_wrapping,
|
||||||
|
ellipsize: self.text_ellipsize,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1847,6 +1847,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: text::Shaping::Basic,
|
shaping: text::Shaping::Basic,
|
||||||
wrapping: text::Wrapping::None,
|
wrapping: text::Wrapping::None,
|
||||||
|
ellipsize: text::Ellipsize::None,
|
||||||
};
|
};
|
||||||
|
|
||||||
if self.vertical {
|
if self.vertical {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ use crate::core::mouse;
|
||||||
use crate::core::renderer;
|
use crate::core::renderer;
|
||||||
use crate::core::text::{Paragraph, Span};
|
use crate::core::text::{Paragraph, Span};
|
||||||
use crate::core::widget::text::{
|
use crate::core::widget::text::{
|
||||||
self, Alignment, Catalog, LineHeight, Shaping, Style, StyleFn, Wrapping,
|
self, Alignment, Catalog, Ellipsize, LineHeight, Shaping, Style, StyleFn,
|
||||||
|
Wrapping,
|
||||||
};
|
};
|
||||||
use crate::core::widget::tree::{self, Tree};
|
use crate::core::widget::tree::{self, Tree};
|
||||||
use crate::core::{
|
use crate::core::{
|
||||||
|
|
@ -33,6 +34,7 @@ pub struct Rich<
|
||||||
align_x: Alignment,
|
align_x: Alignment,
|
||||||
align_y: alignment::Vertical,
|
align_y: alignment::Vertical,
|
||||||
wrapping: Wrapping,
|
wrapping: Wrapping,
|
||||||
|
ellipsize: Ellipsize,
|
||||||
class: Theme::Class<'a>,
|
class: Theme::Class<'a>,
|
||||||
hovered_link: Option<usize>,
|
hovered_link: Option<usize>,
|
||||||
on_link_click: Option<Box<dyn Fn(Link) -> Message + 'a>>,
|
on_link_click: Option<Box<dyn Fn(Link) -> Message + 'a>>,
|
||||||
|
|
@ -58,6 +60,7 @@ where
|
||||||
align_x: Alignment::Default,
|
align_x: Alignment::Default,
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
wrapping: Wrapping::default(),
|
wrapping: Wrapping::default(),
|
||||||
|
ellipsize: Ellipsize::default(),
|
||||||
class: Theme::default(),
|
class: Theme::default(),
|
||||||
hovered_link: None,
|
hovered_link: None,
|
||||||
on_link_click: None,
|
on_link_click: None,
|
||||||
|
|
@ -145,6 +148,12 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the [`Ellipsize`] strategy of the [`Rich`] text.
|
||||||
|
pub fn ellipsize(mut self, ellipsize: Ellipsize) -> Self {
|
||||||
|
self.ellipsize = ellipsize;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the default style of the [`Rich`] text.
|
/// Sets the default style of the [`Rich`] text.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn style(mut self, style: impl Fn(&Theme) -> Style + 'a) -> Self
|
pub fn style(mut self, style: impl Fn(&Theme) -> Style + 'a) -> Self
|
||||||
|
|
@ -247,6 +256,7 @@ where
|
||||||
self.align_x,
|
self.align_x,
|
||||||
self.align_y,
|
self.align_y,
|
||||||
self.wrapping,
|
self.wrapping,
|
||||||
|
self.ellipsize,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -476,6 +486,7 @@ fn layout<Link, Renderer>(
|
||||||
align_x: Alignment,
|
align_x: Alignment,
|
||||||
align_y: alignment::Vertical,
|
align_y: alignment::Vertical,
|
||||||
wrapping: Wrapping,
|
wrapping: Wrapping,
|
||||||
|
ellipsize: Ellipsize,
|
||||||
) -> layout::Node
|
) -> layout::Node
|
||||||
where
|
where
|
||||||
Link: Clone,
|
Link: Clone,
|
||||||
|
|
@ -497,6 +508,7 @@ where
|
||||||
align_y,
|
align_y,
|
||||||
shaping: Shaping::Advanced,
|
shaping: Shaping::Advanced,
|
||||||
wrapping,
|
wrapping,
|
||||||
|
ellipsize,
|
||||||
};
|
};
|
||||||
|
|
||||||
if state.spans != spans {
|
if state.spans != spans {
|
||||||
|
|
@ -514,6 +526,7 @@ where
|
||||||
align_y,
|
align_y,
|
||||||
shaping: Shaping::Advanced,
|
shaping: Shaping::Advanced,
|
||||||
wrapping,
|
wrapping,
|
||||||
|
ellipsize,
|
||||||
}) {
|
}) {
|
||||||
core::text::Difference::None => {}
|
core::text::Difference::None => {}
|
||||||
core::text::Difference::Bounds => {
|
core::text::Difference::Bounds => {
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ use crate::core::mouse;
|
||||||
use crate::core::renderer;
|
use crate::core::renderer;
|
||||||
use crate::core::text::editor::Editor as _;
|
use crate::core::text::editor::Editor as _;
|
||||||
use crate::core::text::highlighter::{self, Highlighter};
|
use crate::core::text::highlighter::{self, Highlighter};
|
||||||
use crate::core::text::{self, LineHeight, Text, Wrapping};
|
use crate::core::text::{self, Ellipsize, LineHeight, Text, Wrapping};
|
||||||
use crate::core::theme;
|
use crate::core::theme;
|
||||||
use crate::core::time::{Duration, Instant};
|
use crate::core::time::{Duration, Instant};
|
||||||
use crate::core::widget::operation;
|
use crate::core::widget::operation;
|
||||||
|
|
@ -129,6 +129,7 @@ pub struct TextEditor<
|
||||||
max_height: f32,
|
max_height: f32,
|
||||||
padding: Padding,
|
padding: Padding,
|
||||||
wrapping: Wrapping,
|
wrapping: Wrapping,
|
||||||
|
ellipsize: text::Ellipsize,
|
||||||
class: Theme::Class<'a>,
|
class: Theme::Class<'a>,
|
||||||
key_binding: Option<Box<dyn Fn(KeyPress) -> Option<Binding<Message>> + 'a>>,
|
key_binding: Option<Box<dyn Fn(KeyPress) -> Option<Binding<Message>> + 'a>>,
|
||||||
on_edit: Option<Box<dyn Fn(Action) -> Message + 'a>>,
|
on_edit: Option<Box<dyn Fn(Action) -> Message + 'a>>,
|
||||||
|
|
@ -162,6 +163,7 @@ where
|
||||||
padding: Padding::new(5.0),
|
padding: Padding::new(5.0),
|
||||||
wrapping: Wrapping::default(),
|
wrapping: Wrapping::default(),
|
||||||
class: <Theme as Catalog>::default(),
|
class: <Theme as Catalog>::default(),
|
||||||
|
ellipsize: Ellipsize::default(),
|
||||||
key_binding: None,
|
key_binding: None,
|
||||||
on_edit: None,
|
on_edit: None,
|
||||||
highlighter_settings: (),
|
highlighter_settings: (),
|
||||||
|
|
@ -308,6 +310,7 @@ where
|
||||||
max_height: self.max_height,
|
max_height: self.max_height,
|
||||||
padding: self.padding,
|
padding: self.padding,
|
||||||
wrapping: self.wrapping,
|
wrapping: self.wrapping,
|
||||||
|
ellipsize: self.ellipsize,
|
||||||
class: self.class,
|
class: self.class,
|
||||||
key_binding: self.key_binding,
|
key_binding: self.key_binding,
|
||||||
on_edit: self.on_edit,
|
on_edit: self.on_edit,
|
||||||
|
|
@ -1011,6 +1014,7 @@ where
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: text::Shaping::Advanced,
|
shaping: text::Shaping::Advanced,
|
||||||
wrapping: self.wrapping,
|
wrapping: self.wrapping,
|
||||||
|
ellipsize: self.ellipsize,
|
||||||
},
|
},
|
||||||
text_bounds.position(),
|
text_bounds.position(),
|
||||||
style.placeholder,
|
style.placeholder,
|
||||||
|
|
|
||||||
|
|
@ -321,6 +321,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: text::Shaping::Advanced,
|
shaping: text::Shaping::Advanced,
|
||||||
wrapping: text::Wrapping::default(),
|
wrapping: text::Wrapping::default(),
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = state.placeholder.update(placeholder_text);
|
let _ = state.placeholder.update(placeholder_text);
|
||||||
|
|
@ -346,6 +347,7 @@ where
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: text::Shaping::Advanced,
|
shaping: text::Shaping::Advanced,
|
||||||
wrapping: text::Wrapping::default(),
|
wrapping: text::Wrapping::default(),
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = state.icon.update(icon_text);
|
let _ = state.icon.update(icon_text);
|
||||||
|
|
@ -1687,6 +1689,7 @@ fn replace_paragraph<Renderer>(
|
||||||
align_y: alignment::Vertical::Center,
|
align_y: alignment::Vertical::Center,
|
||||||
shaping: text::Shaping::Advanced,
|
shaping: text::Shaping::Advanced,
|
||||||
wrapping: text::Wrapping::default(),
|
wrapping: text::Wrapping::default(),
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ pub struct Toggler<
|
||||||
text_alignment: text::Alignment,
|
text_alignment: text::Alignment,
|
||||||
text_shaping: text::Shaping,
|
text_shaping: text::Shaping,
|
||||||
text_wrapping: text::Wrapping,
|
text_wrapping: text::Wrapping,
|
||||||
|
text_ellipsize: text::Ellipsize,
|
||||||
spacing: f32,
|
spacing: f32,
|
||||||
font: Option<Renderer::Font>,
|
font: Option<Renderer::Font>,
|
||||||
class: Theme::Class<'a>,
|
class: Theme::Class<'a>,
|
||||||
|
|
@ -150,6 +151,7 @@ where
|
||||||
text_line_height: text::LineHeight::default(),
|
text_line_height: text::LineHeight::default(),
|
||||||
text_alignment: text::Alignment::Default,
|
text_alignment: text::Alignment::Default,
|
||||||
text_wrapping: text::Wrapping::default(),
|
text_wrapping: text::Wrapping::default(),
|
||||||
|
text_ellipsize: text::Ellipsize::default(),
|
||||||
spacing: Self::DEFAULT_SIZE / 2.0,
|
spacing: Self::DEFAULT_SIZE / 2.0,
|
||||||
text_shaping: text::Shaping::Advanced,
|
text_shaping: text::Shaping::Advanced,
|
||||||
font: None,
|
font: None,
|
||||||
|
|
@ -237,6 +239,12 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the [`text::Ellipsize`] strategy of the [`Toggler`].
|
||||||
|
pub fn text_ellipsize(mut self, ellipsize: text::Ellipsize) -> Self {
|
||||||
|
self.text_ellipsize = ellipsize;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the spacing between the [`Toggler`] and the text.
|
/// Sets the spacing between the [`Toggler`] and the text.
|
||||||
pub fn spacing(mut self, spacing: impl Into<Pixels>) -> Self {
|
pub fn spacing(mut self, spacing: impl Into<Pixels>) -> Self {
|
||||||
self.spacing = spacing.into().0;
|
self.spacing = spacing.into().0;
|
||||||
|
|
@ -362,6 +370,7 @@ where
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: self.text_shaping,
|
shaping: self.text_shaping,
|
||||||
wrapping: self.text_wrapping,
|
wrapping: self.text_wrapping,
|
||||||
|
ellipsize: self.text_ellipsize,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -434,6 +434,7 @@ where
|
||||||
align_y: alignment::Vertical::Top,
|
align_y: alignment::Vertical::Top,
|
||||||
shaping: text::Shaping::Advanced,
|
shaping: text::Shaping::Advanced,
|
||||||
wrapping: text::Wrapping::None,
|
wrapping: text::Wrapping::None,
|
||||||
|
ellipsize: text::Ellipsize::default(),
|
||||||
});
|
});
|
||||||
|
|
||||||
self.spans.clear();
|
self.spans.clear();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue