diff options
author | 2023-12-01 16:04:27 +0100 | |
---|---|---|
committer | 2023-12-01 16:04:27 +0100 | |
commit | 936d480267578d7e80675e78ec1880aaaaab72d6 (patch) | |
tree | 70719766c67dd6a09630c5a4231e952a3200bea1 /widget/src/text_input.rs | |
parent | 99899d49cc93cdec3832f7b5ecad867fdd421e07 (diff) | |
download | iced-936d480267578d7e80675e78ec1880aaaaab72d6.tar.gz iced-936d480267578d7e80675e78ec1880aaaaab72d6.tar.bz2 iced-936d480267578d7e80675e78ec1880aaaaab72d6.zip |
Clip text to `viewport` bounds instead of layout bounds
Diffstat (limited to 'widget/src/text_input.rs')
-rw-r--r-- | widget/src/text_input.rs | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 27efe755..b56e3167 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -238,6 +238,7 @@ where layout: Layout<'_>, cursor: mouse::Cursor, value: Option<&Value>, + viewport: &Rectangle, ) { draw( renderer, @@ -250,6 +251,7 @@ where self.is_secure, self.icon.as_ref(), &self.style, + viewport, ); } } @@ -362,7 +364,7 @@ where _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { draw( renderer, @@ -375,6 +377,7 @@ where self.is_secure, self.icon.as_ref(), &self.style, + viewport, ); } @@ -1055,6 +1058,7 @@ pub fn draw<Renderer>( is_secure: bool, icon: Option<&Icon<Renderer::Font>>, style: &<Renderer::Theme as StyleSheet>::Style, + viewport: &Rectangle, ) where Renderer: text::Renderer, Renderer::Theme: StyleSheet, @@ -1096,6 +1100,7 @@ pub fn draw<Renderer>( &state.icon, icon_layout.bounds().center(), appearance.icon_color, + *viewport, ); } @@ -1189,39 +1194,31 @@ pub fn draw<Renderer>( (None, 0.0) }; - let text_width = state.value.min_width(); - - let render = |renderer: &mut Renderer| { - if let Some((cursor, color)) = cursor { - renderer.fill_quad(cursor, color); - } else { - renderer.with_translation(Vector::ZERO, |_| {}); - } - - renderer.fill_paragraph( - if text.is_empty() { - &state.placeholder - } else { - &state.value - }, - Point::new(text_bounds.x, text_bounds.center_y()), - if text.is_empty() { - theme.placeholder_color(style) - } else if is_disabled { - theme.disabled_color(style) - } else { - theme.value_color(style) - }, - ); - }; - - if text_width > text_bounds.width { - renderer.with_layer(text_bounds, |renderer| { - renderer.with_translation(Vector::new(-offset, 0.0), render); + if let Some((cursor, color)) = cursor { + renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { + renderer.fill_quad(cursor, color) }); } else { - render(renderer); + renderer.with_translation(Vector::ZERO, |_| {}); } + + renderer.fill_paragraph( + if text.is_empty() { + &state.placeholder + } else { + &state.value + }, + Point::new(text_bounds.x, text_bounds.center_y()) + - Vector::new(offset, 0.0), + if text.is_empty() { + theme.placeholder_color(style) + } else if is_disabled { + theme.disabled_color(style) + } else { + theme.value_color(style) + }, + text_bounds, + ); } /// Computes the current [`mouse::Interaction`] of the [`TextInput`]. |