diff --git a/core/src/text/paragraph.rs b/core/src/text/paragraph.rs index b55ff156..9e17a65e 100644 --- a/core/src/text/paragraph.rs +++ b/core/src/text/paragraph.rs @@ -79,11 +79,13 @@ impl Plain

{ } /// Updates the plain [`Paragraph`] to match the given [`Text`], if needed. - pub fn update(&mut self, text: Text<&str, P::Font>) { + /// + /// Returns true if the [`Paragraph`] changed. + pub fn update(&mut self, text: Text<&str, P::Font>) -> bool { if self.content != text.content { text.content.clone_into(&mut self.content); self.raw = P::with_text(text); - return; + return true; } match self.raw.compare(Text { @@ -97,12 +99,14 @@ impl Plain

{ shaping: text.shaping, wrapping: text.wrapping, }) { - Difference::None => {} + Difference::None => false, Difference::Bounds => { self.raw.resize(text.bounds); + true } Difference::Shape => { self.raw = P::with_text(text); + true } } } diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index ca4ac4c2..4f99c4b7 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -303,7 +303,7 @@ where let State(paragraph) = state; - paragraph.update(text::Text { + let _ = paragraph.update(text::Text { content, bounds, size, @@ -340,25 +340,35 @@ pub fn draw( Renderer: text::Renderer, { let bounds = layout.bounds(); + let anchor = anchor(bounds, paragraph.align_x(), paragraph.align_y()); - let x = match paragraph.align_x() { + renderer.fill_paragraph( + paragraph, + anchor, + appearance.color.unwrap_or(style.text_color), + *viewport, + ); +} + +/// Returns the anchor position of a [`Text`] widget. +pub fn anchor( + bounds: Rectangle, + align_x: text::Alignment, + align_y: alignment::Vertical, +) -> Point { + let x = match align_x { Alignment::Default | Alignment::Left | Alignment::Justified => bounds.x, Alignment::Center => bounds.center_x(), Alignment::Right => bounds.x + bounds.width, }; - let y = match paragraph.align_y() { + let y = match align_y { alignment::Vertical::Top => bounds.y, alignment::Vertical::Center => bounds.center_y(), alignment::Vertical::Bottom => bounds.y + bounds.height, }; - renderer.fill_paragraph( - paragraph, - Point::new(x, y), - appearance.color.unwrap_or(style.text_color), - *viewport, - ); + Point::new(x, y) } impl<'a, Message, Theme, Renderer> From> diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index b84e083d..e4f1fd06 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -421,7 +421,7 @@ where shaping: *shaping, wrapping: text::Wrapping::default(), }, - bounds.center(), + bounds.position(), style.icon_color, *viewport, ); diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 4f1d8262..517ff35d 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -381,14 +381,14 @@ where { let label = option.to_string(); - paragraph.update(Text { + let _ = paragraph.update(Text { content: &label, ..option_text }); } if let Some(placeholder) = &self.placeholder { - state.placeholder.update(Text { + let _ = state.placeholder.update(Text { content: placeholder, ..option_text }); diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index bfddabc6..a1f6e560 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -325,12 +325,12 @@ where wrapping: text::Wrapping::default(), }; - state.placeholder.update(placeholder_text); + let _ = state.placeholder.update(placeholder_text); let secure_value = self.is_secure.then(|| value.secure()); let value = secure_value.as_ref().unwrap_or(value); - state.value.update(Text { + let _ = state.value.update(Text { content: &value.to_string(), ..placeholder_text }); @@ -350,7 +350,7 @@ where wrapping: text::Wrapping::default(), }; - state.icon.update(icon_text); + let _ = state.icon.update(icon_text); let icon_width = state.icon.min_width();