diff options
author | 2022-01-11 14:21:38 +0700 | |
---|---|---|
committer | 2022-01-11 14:21:38 +0700 | |
commit | 2e255b7b91264cf1e53e89dfdefd95270957b2e2 (patch) | |
tree | a5f8c6c94d27fc125f7d11fe1b9810c965badae7 /native | |
parent | 810e086728e938d1d12758c7b486c1e371127349 (diff) | |
download | iced-2e255b7b91264cf1e53e89dfdefd95270957b2e2.tar.gz iced-2e255b7b91264cf1e53e89dfdefd95270957b2e2.tar.bz2 iced-2e255b7b91264cf1e53e89dfdefd95270957b2e2.zip |
Implement `Widget::mouse_interaction` for `Responsive`
Diffstat (limited to 'native')
-rw-r--r-- | native/src/widget/responsive.rs | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/native/src/widget/responsive.rs b/native/src/widget/responsive.rs index becaa980..fd9e490a 100644 --- a/native/src/widget/responsive.rs +++ b/native/src/widget/responsive.rs @@ -1,5 +1,6 @@ use crate::event::{self, Event}; use crate::layout::{self, Layout}; +use crate::mouse; use crate::renderer; use crate::{ Clipboard, Element, Hasher, Length, Point, Rectangle, Shell, Size, Widget, @@ -74,22 +75,13 @@ where clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, ) -> event::Status { - use std::ops::DerefMut; - let mut internal = self.0.borrow_mut(); - let Internal { content, state } = internal.deref_mut(); - - if state.last_size != Some(state.last_layout.size()) { + if internal.state.last_size != Some(internal.state.last_layout.size()) { shell.invalidate_widgets(); } - let content = content.resolve(state, renderer); - - let content_layout = Layout::with_offset( - layout.position() - Point::ORIGIN, - &state.last_layout, - ); + let (content, content_layout) = internal.content(layout, renderer); content.on_event( event, @@ -109,20 +101,28 @@ where cursor_position: Point, viewport: &Rectangle, ) { - use std::ops::DerefMut; - let mut internal = self.0.borrow_mut(); + let (content, content_layout) = internal.content(layout, renderer); - let Internal { content, state } = internal.deref_mut(); - - let content = content.resolve(state, renderer); + content.draw(renderer, style, content_layout, cursor_position, viewport) + } - let content_layout = Layout::with_offset( - layout.position() - Point::ORIGIN, - &state.last_layout, - ); + fn mouse_interaction( + &self, + layout: Layout<'_>, + cursor_position: Point, + viewport: &Rectangle, + renderer: &Renderer, + ) -> mouse::Interaction { + let mut internal = self.0.borrow_mut(); + let (content, content_layout) = internal.content(layout, renderer); - content.draw(renderer, style, content_layout, cursor_position, viewport) + content.mouse_interaction( + content_layout, + cursor_position, + viewport, + renderer, + ) } } @@ -131,6 +131,26 @@ struct Internal<'a, Message, Renderer> { content: Content<'a, Message, Renderer>, } +impl<'a, Message, Renderer> Internal<'a, Message, Renderer> +where + Renderer: crate::Renderer, +{ + fn content( + &mut self, + layout: Layout<'_>, + renderer: &Renderer, + ) -> (&mut Element<'a, Message, Renderer>, Layout<'_>) { + let content = self.content.resolve(&mut self.state, renderer); + + let content_layout = Layout::with_offset( + layout.position() - Point::ORIGIN, + &self.state.last_layout, + ); + + (content, content_layout) + } +} + enum Content<'a, Message, Renderer> { Pending( Option<Box<dyn FnOnce(Size) -> Element<'a, Message, Renderer> + 'a>>, |