Fix wrapped lines not being considered when measuring TextEditor

This commit is contained in:
Héctor Ramón Jiménez 2024-02-07 21:48:28 +01:00
parent 8b492a9b44
commit 2ba73b0faf
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
5 changed files with 38 additions and 22 deletions

View file

@ -150,6 +150,10 @@ impl text::Editor for () {
Size::ZERO
}
fn min_bounds(&self) -> Size {
Size::ZERO
}
fn update(
&mut self,
_new_bounds: Size,

View file

@ -36,6 +36,10 @@ pub trait Editor: Sized + Default {
/// Returns the current boundaries of the [`Editor`].
fn bounds(&self) -> Size;
/// Returns the minimum boundaries to fit the current contents of
/// the [`Editor`].
fn min_bounds(&self) -> Size;
/// Updates the [`Editor`] with some new attributes.
fn update(
&mut self,

View file

@ -191,6 +191,7 @@ impl Application for Editor {
column![
controls,
text_editor(&self.content)
.height(Length::Fill)
.on_action(Message::ActionPerformed)
.highlight::<Highlighter>(
highlighter::Settings {

View file

@ -470,6 +470,12 @@ impl editor::Editor for Editor {
self.internal().bounds
}
fn min_bounds(&self) -> Size {
let internal = self.internal();
text::measure(internal.editor.buffer())
}
fn update(
&mut self,
new_bounds: Size,

View file

@ -64,7 +64,7 @@ where
text_size: None,
line_height: LineHeight::default(),
width: Length::Fill,
height: Length::Fill,
height: Length::Shrink,
padding: Padding::new(5.0),
style: Default::default(),
on_edit: None,
@ -83,6 +83,12 @@ where
Theme: StyleSheet,
Renderer: text::Renderer,
{
/// Sets the height of the [`TextEditor`].
pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height.into();
self
}
/// Sets the message that should be produced when some action is performed in
/// the [`TextEditor`].
///
@ -139,17 +145,6 @@ where
self.style = style.into();
self
}
/// Choose whether or not to shrink the size of the editor to its contents.
pub fn shrink_to_content(mut self, shrink: bool) -> Self {
if shrink {
self.height = Length::Shrink;
} else {
self.height = Length::Fill;
}
self
}
}
/// The content of a [`TextEditor`].
@ -363,6 +358,8 @@ where
state.highlighter_settings = self.highlighter_settings.clone();
}
let limits = limits.height(self.height);
internal.editor.update(
limits.shrink(self.padding).max(),
self.font.unwrap_or_else(|| renderer.default_font()),
@ -371,16 +368,20 @@ where
state.highlighter.borrow_mut().deref_mut(),
);
if self.height == Length::Fill {
layout::Node::new(limits.max())
} else {
let lines_height = self
.line_height
.to_absolute(self.text_size.unwrap_or(renderer.default_size()))
.0
* internal.editor.line_count() as f32;
let height = lines_height + self.padding.top + self.padding.bottom;
layout::Node::new(limits.max_height(height).max())
match self.height {
Length::Fill | Length::FillPortion(_) | Length::Fixed(_) => {
layout::Node::new(limits.max())
}
Length::Shrink => {
let min_bounds = internal.editor.min_bounds();
layout::Node::new(
limits
.height(min_bounds.height)
.max()
.expand(Size::new(0.0, self.padding.vertical())),
)
}
}
}