From 4d849aaf0bded82b728b9470bb41203b49cc4db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maja=20K=C4=85dzio=C5=82ka?= Date: Sat, 3 Aug 2024 20:32:51 +0200 Subject: [PATCH 1/5] text_editor: Avoid rendering text outside the border If the height could fit slightly less than an extra line, said line would protrude beyond the border of the text editor. --- widget/src/text_editor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index a264ba068f..8b4b892ddb 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -729,7 +729,7 @@ where defaults: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - viewport: &Rectangle, + _viewport: &Rectangle, ) { let bounds = layout.bounds(); @@ -793,7 +793,7 @@ where }, position, style.placeholder, - *viewport, + bounds, ); } } else { @@ -801,7 +801,7 @@ where &internal.editor, position, defaults.text_color, - *viewport, + bounds, ); } From 03472dfd4f8a472f38f03d332b4835580eb84489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 12 Aug 2024 02:53:23 +0200 Subject: [PATCH 2/5] Make `Padding` affect `text_editor` clipping --- core/src/rectangle.rs | 26 ++++++++++++++++++++------ widget/src/text_editor.rs | 27 ++++++++++----------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/core/src/rectangle.rs b/core/src/rectangle.rs index 1556e072e3..155cfcbfda 100644 --- a/core/src/rectangle.rs +++ b/core/src/rectangle.rs @@ -1,4 +1,4 @@ -use crate::{Point, Radians, Size, Vector}; +use crate::{Padding, Point, Radians, Size, Vector}; /// An axis-aligned rectangle. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] @@ -164,12 +164,26 @@ impl Rectangle { } /// Expands the [`Rectangle`] a given amount. - pub fn expand(self, amount: f32) -> Self { + pub fn expand(self, padding: impl Into) -> Self { + let padding = padding.into(); + + Self { + x: self.x - padding.left, + y: self.y - padding.top, + width: self.width + padding.horizontal(), + height: self.height + padding.vertical(), + } + } + + /// Shrinks the [`Rectangle`] a given amount. + pub fn shrink(self, padding: impl Into) -> Self { + let padding = padding.into(); + Self { - x: self.x - amount, - y: self.y - amount, - width: self.width + amount * 2.0, - height: self.height + amount * 2.0, + x: self.x + padding.left, + y: self.y + padding.top, + width: self.width - padding.horizontal(), + height: self.height - padding.vertical(), } } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 8b4b892ddb..9e8479fc6d 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -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,7 +785,7 @@ where vertical_alignment: alignment::Vertical::Top, shaping: text::Shaping::Advanced, }, - position, + text_bounds.position(), style.placeholder, bounds, ); @@ -799,16 +793,13 @@ where } else { renderer.fill_editor( &internal.editor, - position, + text_bounds.position(), defaults.text_color, - bounds, + 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,7 +817,9 @@ 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 { @@ -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 { From be7d175388076cf24ca902a2d4cd457ce2a8e9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 12 Aug 2024 02:54:22 +0200 Subject: [PATCH 3/5] Remove cursor snapping hack in `text_editor` The `quad` shader now properly takes care of snapping lines to the pixel grid. --- widget/src/text_editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 9e8479fc6d..32537aff0b 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -823,7 +823,7 @@ where 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, From 373e887a5834dbf2272aeaea8f1820ee90698400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 12 Aug 2024 02:55:49 +0200 Subject: [PATCH 4/5] Focus `text_editor` at start-up in `editor` example --- examples/editor/src/main.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 155e74a172..aa07b32810 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,7 +1,7 @@ use iced::highlighter; use iced::keyboard; use iced::widget::{ - button, column, container, horizontal_space, pick_list, row, text, + self, button, column, container, horizontal_space, pick_list, row, text, text_editor, tooltip, }; use iced::{Center, Element, Fill, Font, Subscription, Task, Theme}; @@ -49,13 +49,16 @@ impl Editor { is_loading: true, is_dirty: false, }, - Task::perform( - load_file(format!( - "{}/src/main.rs", - env!("CARGO_MANIFEST_DIR") - )), - Message::FileOpened, - ), + Task::batch([ + Task::perform( + load_file(format!( + "{}/src/main.rs", + env!("CARGO_MANIFEST_DIR") + )), + Message::FileOpened, + ), + widget::focus_next(), + ]), ) } From 3e59d824f8be029720f4064b49099e6aabc11179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 12 Aug 2024 02:57:45 +0200 Subject: [PATCH 5/5] Fix clipping area of `text_editor` placeholder --- widget/src/text_editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 32537aff0b..e41c50d7fc 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -787,7 +787,7 @@ where }, text_bounds.position(), style.placeholder, - bounds, + text_bounds, ); } } else {