summaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-01-11 14:21:38 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-01-11 14:21:38 +0700
commit2e255b7b91264cf1e53e89dfdefd95270957b2e2 (patch)
treea5f8c6c94d27fc125f7d11fe1b9810c965badae7 /native
parent810e086728e938d1d12758c7b486c1e371127349 (diff)
downloadiced-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.rs62
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>>,