From 9e453843b26f2f73228316334298a4c608b2f050 Mon Sep 17 00:00:00 2001 From: anunge Date: Fri, 12 Feb 2021 21:52:20 +0200 Subject: Touch support for `PaneGrid` and `PickList` (#650) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * touch events properly parsed and converted to logical size, button working * scrolling with a nice touch * fixed application state level touch cursor. panel_grid is touchable now. * format glicthes fixes * format glitches * tight format * fixed pane grid * fixing with upstream * Remove unused `touch` module from `iced_core` * Remove unused `crate::text` import in `iced_native` * Remove redundant match branch in `iced_winit` * Keep removed line break in `UserInterface::update` * Compute `text_size` only when bounds contains cursor in `overlay::menu` Co-authored-by: Héctor Ramón Jiménez --- native/src/overlay/menu.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index abac849f..5ad1391f 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -6,6 +6,7 @@ use crate::mouse; use crate::overlay; use crate::scrollable; use crate::text; +use crate::touch; use crate::{ Clipboard, Container, Element, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size, Vector, Widget, @@ -337,15 +338,36 @@ where } Event::Mouse(mouse::Event::CursorMoved { .. }) => { let bounds = layout.bounds(); - let text_size = - self.text_size.unwrap_or(renderer.default_size()); if bounds.contains(cursor_position) { + let text_size = + self.text_size.unwrap_or(renderer.default_size()); + + *self.hovered_option = Some( + ((cursor_position.y - bounds.y) + / f32::from(text_size + self.padding * 2)) + as usize, + ); + } + } + Event::Touch(touch::Event::FingerPressed { .. }) => { + let bounds = layout.bounds(); + + if bounds.contains(cursor_position) { + let text_size = + self.text_size.unwrap_or(renderer.default_size()); + *self.hovered_option = Some( ((cursor_position.y - bounds.y) / f32::from(text_size + self.padding * 2)) as usize, ); + + if let Some(index) = *self.hovered_option { + if let Some(option) = self.options.get(index) { + *self.last_selection = Some(option.clone()); + } + } } } _ => {} -- cgit From 21971e0037c2ddcb96fd48ea96332445de4137bb Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 10 Mar 2021 01:59:02 +0100 Subject: Make `Clipboard` argument in `Widget` trait mutable --- native/src/overlay/menu.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 5ad1391f..afb17bd3 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -219,17 +219,17 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, - messages: &mut Vec, renderer: &Renderer, - clipboard: Option<&dyn Clipboard>, + clipboard: &mut dyn Clipboard, + messages: &mut Vec, ) -> event::Status { self.container.on_event( event.clone(), layout, cursor_position, - messages, renderer, clipboard, + messages, ) } @@ -320,9 +320,9 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, - _messages: &mut Vec, renderer: &Renderer, - _clipboard: Option<&dyn Clipboard>, + _clipboard: &mut dyn Clipboard, + _messages: &mut Vec, ) -> event::Status { match event { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => { -- cgit From fe0a27c56d9d75fb521e69352259f1d737402a20 Mon Sep 17 00:00:00 2001 From: Ben LeFevre Date: Mon, 23 Nov 2020 17:19:21 +0000 Subject: Add support for asymmetrical padding --- native/src/overlay/menu.rs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index afb17bd3..3c4062fd 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -8,8 +8,8 @@ use crate::scrollable; use crate::text; use crate::touch; use crate::{ - Clipboard, Container, Element, Hasher, Layout, Length, Point, Rectangle, - Scrollable, Size, Vector, Widget, + Clipboard, Container, Element, Hasher, Layout, Length, Padding, Point, + Rectangle, Scrollable, Size, Vector, Widget, }; /// A list of selectable options. @@ -20,7 +20,7 @@ pub struct Menu<'a, T, Renderer: self::Renderer> { hovered_option: &'a mut Option, last_selection: &'a mut Option, width: u16, - padding: u16, + padding: Padding, text_size: Option, font: Renderer::Font, style: ::Style, @@ -45,7 +45,7 @@ where hovered_option, last_selection, width: 0, - padding: 0, + padding: Padding::ZERO, text_size: None, font: Default::default(), style: Default::default(), @@ -58,9 +58,14 @@ where self } - /// Sets the padding of the [`Menu`]. - pub fn padding(mut self, padding: u16) -> Self { - self.padding = padding; + /// Sets the [`Padding`] of the [`Menu`]. + ///```ignore + /// Menu::new(/*...*/).padding(20); // 20px on all sides + /// Menu::new(/*...*/).padding([10, 20]); // top/bottom, left/right + /// Menu::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left + /// ``` + pub fn padding>(mut self, padding: P) -> Self { + self.padding = padding.into(); self } @@ -261,7 +266,7 @@ struct List<'a, T, Renderer: self::Renderer> { options: &'a [T], hovered_option: &'a mut Option, last_selection: &'a mut Option, - padding: u16, + padding: Padding, text_size: Option, font: Renderer::Font, style: ::Style, @@ -294,7 +299,7 @@ where let size = { let intrinsic = Size::new( 0.0, - f32::from(text_size + self.padding * 2) + f32::from(text_size + self.padding.top + self.padding.bottom) * self.options.len() as f32, ); @@ -359,8 +364,11 @@ where *self.hovered_option = Some( ((cursor_position.y - bounds.y) - / f32::from(text_size + self.padding * 2)) - as usize, + / f32::from( + text_size + + self.padding.top + + self.padding.bottom, + )) as usize, ); if let Some(index) = *self.hovered_option { @@ -430,7 +438,7 @@ pub trait Renderer: viewport: &Rectangle, options: &[T], hovered_option: Option, - padding: u16, + padding: Padding, text_size: u16, font: Self::Font, style: &::Style, -- cgit From 92361ef07d69cf9418289be131af53952915c423 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Date: Tue, 1 Jun 2021 19:13:34 +0700 Subject: Fix `overlay::Menu` implementation --- native/src/overlay/menu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 3c4062fd..d4375a1d 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -350,7 +350,7 @@ where *self.hovered_option = Some( ((cursor_position.y - bounds.y) - / f32::from(text_size + self.padding * 2)) + / f32::from(text_size + self.padding.vertical())) as usize, ); } -- cgit From b94cd7a2a83d81769d31f6379539089ce68cbdcd Mon Sep 17 00:00:00 2001 From: Héctor Ramón Date: Tue, 1 Jun 2021 19:21:43 +0700 Subject: Use `Padding::horizontal` and `Padding::vertical` helpers --- native/src/overlay/menu.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index d4375a1d..b5ed07c7 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -299,7 +299,7 @@ where let size = { let intrinsic = Size::new( 0.0, - f32::from(text_size + self.padding.top + self.padding.bottom) + f32::from(text_size + self.padding.vertical()) * self.options.len() as f32, ); @@ -364,11 +364,8 @@ where *self.hovered_option = Some( ((cursor_position.y - bounds.y) - / f32::from( - text_size - + self.padding.top - + self.padding.bottom, - )) as usize, + / f32::from(text_size + self.padding.vertical())) + as usize, ); if let Some(index) = *self.hovered_option { -- cgit From 8a3b71df8b619571ce0a972826cb5a3987b66b3d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Date: Tue, 1 Jun 2021 19:45:47 +0700 Subject: Replace ignored doc-tests with additional documentation for `Padding` --- native/src/overlay/menu.rs | 5 ----- 1 file changed, 5 deletions(-) (limited to 'native/src/overlay/menu.rs') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index b5ed07c7..f62dcb46 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -59,11 +59,6 @@ where } /// Sets the [`Padding`] of the [`Menu`]. - ///```ignore - /// Menu::new(/*...*/).padding(20); // 20px on all sides - /// Menu::new(/*...*/).padding([10, 20]); // top/bottom, left/right - /// Menu::new(/*...*/).padding([5, 10, 15, 20]); // top, right, bottom, left - /// ``` pub fn padding>(mut self, padding: P) -> Self { self.padding = padding.into(); self -- cgit