Merge pull request #2536 from meithecatte/editor-clipping

text_editor: Avoid rendering text outside the border
This commit is contained in:
Héctor Ramón 2024-08-12 03:07:36 +02:00 committed by GitHub
commit 6d6f354b42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 44 additions and 34 deletions

View file

@ -729,7 +729,7 @@ where
defaults: &renderer::Style,
layout: Layout<'_>,
cursor: mouse::Cursor,
viewport: &Rectangle,
_viewport: &Rectangle,
) {
let bounds = layout.bounds();
@ -768,20 +768,14 @@ where
style.background,
);
let position = bounds.position()
+ Vector::new(self.padding.left, self.padding.top);
let text_bounds = bounds.shrink(self.padding);
if internal.editor.is_empty() {
if let Some(placeholder) = self.placeholder.clone() {
renderer.fill_text(
Text {
content: placeholder.into_owned(),
bounds: bounds.size()
- Size::new(
self.padding.right,
self.padding.bottom,
),
bounds: text_bounds.size(),
size: self
.text_size
.unwrap_or_else(|| renderer.default_size()),
@ -791,24 +785,21 @@ where
vertical_alignment: alignment::Vertical::Top,
shaping: text::Shaping::Advanced,
},
position,
text_bounds.position(),
style.placeholder,
*viewport,
text_bounds,
);
}
} else {
renderer.fill_editor(
&internal.editor,
position,
text_bounds.position(),
defaults.text_color,
*viewport,
text_bounds,
);
}
let translation = Vector::new(
bounds.x + self.padding.left,
bounds.y + self.padding.top,
);
let translation = text_bounds.position() - Point::ORIGIN;
if let Some(focus) = state.focus.as_ref() {
match internal.editor.cursor() {
@ -826,11 +817,13 @@ where
),
);
if let Some(clipped_cursor) = bounds.intersection(&cursor) {
if let Some(clipped_cursor) =
text_bounds.intersection(&cursor)
{
renderer.fill_quad(
renderer::Quad {
bounds: Rectangle {
x: clipped_cursor.x.floor(),
x: clipped_cursor.x,
y: clipped_cursor.y,
width: clipped_cursor.width,
height: clipped_cursor.height,
@ -843,7 +836,7 @@ where
}
Cursor::Selection(ranges) => {
for range in ranges.into_iter().filter_map(|range| {
bounds.intersection(&(range + translation))
text_bounds.intersection(&(range + translation))
}) {
renderer.fill_quad(
renderer::Quad {