summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-07-15 10:04:25 -0700
committerLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-07-15 10:04:25 -0700
commit42c423b4a89613c4e1c552c891c1391a34837122 (patch)
treecd724464d59619f63ea24a0476cb342b0eca4caa
parente462f48a5a0b5023c3ca52e23698f5e9b25d86dd (diff)
downloadiced-42c423b4a89613c4e1c552c891c1391a34837122.tar.gz
iced-42c423b4a89613c4e1c552c891c1391a34837122.tar.bz2
iced-42c423b4a89613c4e1c552c891c1391a34837122.zip
Add viewport to Widget::on_event
-rw-r--r--core/src/element.rs9
-rw-r--r--core/src/widget.rs1
-rw-r--r--examples/loading_spinners/src/circular.rs1
-rw-r--r--examples/loading_spinners/src/linear.rs1
-rw-r--r--examples/modal/src/main.rs3
-rw-r--r--examples/toast/src/main.rs5
-rw-r--r--runtime/src/user_interface.rs3
-rw-r--r--widget/src/button.rs2
-rw-r--r--widget/src/canvas.rs1
-rw-r--r--widget/src/checkbox.rs1
-rw-r--r--widget/src/column.rs2
-rw-r--r--widget/src/container.rs2
-rw-r--r--widget/src/image/viewer.rs1
-rw-r--r--widget/src/lazy.rs2
-rw-r--r--widget/src/lazy/component.rs2
-rw-r--r--widget/src/lazy/responsive.rs2
-rw-r--r--widget/src/mouse_area.rs2
-rw-r--r--widget/src/overlay/menu.rs4
-rw-r--r--widget/src/pane_grid.rs2
-rw-r--r--widget/src/pane_grid/content.rs3
-rw-r--r--widget/src/pane_grid/title_bar.rs3
-rw-r--r--widget/src/pick_list.rs1
-rw-r--r--widget/src/radio.rs1
-rw-r--r--widget/src/row.rs2
-rw-r--r--widget/src/scrollable.rs20
-rw-r--r--widget/src/slider.rs1
-rw-r--r--widget/src/text_input.rs1
-rw-r--r--widget/src/toggler.rs1
-rw-r--r--widget/src/tooltip.rs2
-rw-r--r--widget/src/vertical_slider.rs1
30 files changed, 77 insertions, 5 deletions
diff --git a/core/src/element.rs b/core/src/element.rs
index 3268f14b..b9b76247 100644
--- a/core/src/element.rs
+++ b/core/src/element.rs
@@ -380,6 +380,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, B>,
+ viewport: &Rectangle,
) -> event::Status {
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
@@ -392,6 +393,7 @@ where
renderer,
clipboard,
&mut local_shell,
+ viewport,
);
shell.merge(local_shell, &self.mapper);
@@ -511,10 +513,11 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
- self.element
- .widget
- .on_event(state, event, layout, cursor, renderer, clipboard, shell)
+ self.element.widget.on_event(
+ state, event, layout, cursor, renderer, clipboard, shell, viewport,
+ )
}
fn draw(
diff --git a/core/src/widget.rs b/core/src/widget.rs
index 79d86444..25c1cae8 100644
--- a/core/src/widget.rs
+++ b/core/src/widget.rs
@@ -115,6 +115,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
event::Status::Ignored
}
diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs
index 3a35e029..3898d76e 100644
--- a/examples/loading_spinners/src/circular.rs
+++ b/examples/loading_spinners/src/circular.rs
@@ -272,6 +272,7 @@ where
_renderer: &iced::Renderer<Theme>,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
const FRAME_RATE: u64 = 60;
diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs
index 3d95729b..20fbe9f3 100644
--- a/examples/loading_spinners/src/linear.rs
+++ b/examples/loading_spinners/src/linear.rs
@@ -193,6 +193,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
const FRAME_RATE: u64 = 60;
diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs
index 7fcbbfe4..8a48f830 100644
--- a/examples/modal/src/main.rs
+++ b/examples/modal/src/main.rs
@@ -300,6 +300,7 @@ mod modal {
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.base.as_widget_mut().on_event(
&mut state.children[0],
@@ -309,6 +310,7 @@ mod modal {
renderer,
clipboard,
shell,
+ viewport,
)
}
@@ -446,6 +448,7 @@ mod modal {
renderer,
clipboard,
shell,
+ &layout.bounds(),
)
}
diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs
index 4282ddcf..5d29e895 100644
--- a/examples/toast/src/main.rs
+++ b/examples/toast/src/main.rs
@@ -400,6 +400,7 @@ mod toast {
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.content.as_widget_mut().on_event(
&mut state.children[0],
@@ -409,6 +410,7 @@ mod toast {
renderer,
clipboard,
shell,
+ viewport,
)
}
@@ -559,6 +561,8 @@ mod toast {
}
}
+ let viewport = layout.bounds();
+
self.toasts
.iter_mut()
.zip(self.state.iter_mut())
@@ -576,6 +580,7 @@ mod toast {
renderer,
clipboard,
&mut local_shell,
+ &viewport,
);
if !local_shell.is_empty() {
diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs
index 619423fd..e31ea98f 100644
--- a/runtime/src/user_interface.rs
+++ b/runtime/src/user_interface.rs
@@ -284,6 +284,8 @@ where
(cursor, vec![event::Status::Ignored; events.len()])
};
+ let viewport = Rectangle::with_size(self.bounds);
+
let _ = ManuallyDrop::into_inner(manual_overlay);
let event_statuses = events
@@ -305,6 +307,7 @@ where
renderer,
clipboard,
&mut shell,
+ &viewport,
);
if matches!(event_status, event::Status::Captured) {
diff --git a/widget/src/button.rs b/widget/src/button.rs
index 8ebc9657..1312095f 100644
--- a/widget/src/button.rs
+++ b/widget/src/button.rs
@@ -200,6 +200,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
if let event::Status::Captured = self.content.as_widget_mut().on_event(
&mut tree.children[0],
@@ -209,6 +210,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
) {
return event::Status::Captured;
}
diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs
index 96062038..1a186432 100644
--- a/widget/src/canvas.rs
+++ b/widget/src/canvas.rs
@@ -147,6 +147,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
let bounds = layout.bounds();
diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs
index aa0bff42..310a67ed 100644
--- a/widget/src/checkbox.rs
+++ b/widget/src/checkbox.rs
@@ -208,6 +208,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
diff --git a/widget/src/column.rs b/widget/src/column.rs
index d92d794b..9271d5ef 100644
--- a/widget/src/column.rs
+++ b/widget/src/column.rs
@@ -170,6 +170,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.children
.iter_mut()
@@ -184,6 +185,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
})
.fold(event::Status::Ignored, event::Status::merge)
diff --git a/widget/src/container.rs b/widget/src/container.rs
index da9a31d6..64cf5cd5 100644
--- a/widget/src/container.rs
+++ b/widget/src/container.rs
@@ -200,6 +200,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.content.as_widget_mut().on_event(
&mut tree.children[0],
@@ -209,6 +210,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
}
diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs
index 8040d6bd..0038f858 100644
--- a/widget/src/image/viewer.rs
+++ b/widget/src/image/viewer.rs
@@ -148,6 +148,7 @@ where
renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
_shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
let bounds = layout.bounds();
diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs
index da287f06..761f45ad 100644
--- a/widget/src/lazy.rs
+++ b/widget/src/lazy.rs
@@ -186,6 +186,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.with_element_mut(|element| {
element.as_widget_mut().on_event(
@@ -196,6 +197,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
})
}
diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs
index c7814966..bc0e23df 100644
--- a/widget/src/lazy/component.rs
+++ b/widget/src/lazy/component.rs
@@ -270,6 +270,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
let mut local_messages = Vec::new();
let mut local_shell = Shell::new(&mut local_messages);
@@ -284,6 +285,7 @@ where
renderer,
clipboard,
&mut local_shell,
+ viewport,
)
});
diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs
index 07300857..b56545c8 100644
--- a/widget/src/lazy/responsive.rs
+++ b/widget/src/lazy/responsive.rs
@@ -182,6 +182,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
let state = tree.state.downcast_mut::<State>();
let mut content = self.content.borrow_mut();
@@ -203,6 +204,7 @@ where
renderer,
clipboard,
&mut local_shell,
+ viewport,
)
},
);
diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs
index da7dc88f..490f7c48 100644
--- a/widget/src/mouse_area.rs
+++ b/widget/src/mouse_area.rs
@@ -150,6 +150,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
if let event::Status::Captured = self.content.as_widget_mut().on_event(
&mut tree.children[0],
@@ -159,6 +160,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
) {
return event::Status::Captured;
}
diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs
index ccf4dfb5..72662422 100644
--- a/widget/src/overlay/menu.rs
+++ b/widget/src/overlay/menu.rs
@@ -268,8 +268,11 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
) -> event::Status {
+ let bounds = layout.bounds();
+
self.container.on_event(
self.state, event, layout, cursor, renderer, clipboard, shell,
+ &bounds,
)
}
@@ -377,6 +380,7 @@ where
renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) => {
diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs
index 31bb0e86..4f6dfbe8 100644
--- a/widget/src/pane_grid.rs
+++ b/widget/src/pane_grid.rs
@@ -317,6 +317,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
let action = tree.state.downcast_mut::<state::Action>();
@@ -357,6 +358,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
is_picked,
)
})
diff --git a/widget/src/pane_grid/content.rs b/widget/src/pane_grid/content.rs
index c28ae6e3..e890e41a 100644
--- a/widget/src/pane_grid/content.rs
+++ b/widget/src/pane_grid/content.rs
@@ -222,6 +222,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
is_picked: bool,
) -> event::Status {
let mut event_status = event::Status::Ignored;
@@ -237,6 +238,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
);
children.next().unwrap()
@@ -255,6 +257,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
};
diff --git a/widget/src/pane_grid/title_bar.rs b/widget/src/pane_grid/title_bar.rs
index 2fe79f80..cac24e68 100644
--- a/widget/src/pane_grid/title_bar.rs
+++ b/widget/src/pane_grid/title_bar.rs
@@ -304,6 +304,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
let mut children = layout.children();
let padded = children.next().unwrap();
@@ -328,6 +329,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
} else {
event::Status::Ignored
@@ -342,6 +344,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
} else {
event::Status::Ignored
diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs
index 832aae6b..d99ada10 100644
--- a/widget/src/pick_list.rs
+++ b/widget/src/pick_list.rs
@@ -200,6 +200,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
update(
event,
diff --git a/widget/src/radio.rs b/widget/src/radio.rs
index 5b883147..65d71ec2 100644
--- a/widget/src/radio.rs
+++ b/widget/src/radio.rs
@@ -233,6 +233,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
diff --git a/widget/src/row.rs b/widget/src/row.rs
index 1db22416..7baaaae3 100644
--- a/widget/src/row.rs
+++ b/widget/src/row.rs
@@ -159,6 +159,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
self.children
.iter_mut()
@@ -173,6 +174,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
})
.fold(event::Status::Ignored, event::Status::merge)
diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs
index e0aeeebd..f621fb26 100644
--- a/widget/src/scrollable.rs
+++ b/widget/src/scrollable.rs
@@ -278,6 +278,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
update(
tree.state.downcast_mut::<State>(),
@@ -288,7 +289,7 @@ where
shell,
self.direction,
&self.on_scroll,
- |event, layout, cursor, clipboard, shell| {
+ |event, layout, cursor, clipboard, shell, viewport| {
self.content.as_widget_mut().on_event(
&mut tree.children[0],
event,
@@ -297,6 +298,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
},
)
@@ -492,6 +494,7 @@ pub fn update<Message>(
mouse::Cursor,
&mut dyn Clipboard,
&mut Shell<'_, Message>,
+ &Rectangle,
) -> event::Status,
) -> event::Status {
let bounds = layout.bounds();
@@ -518,7 +521,20 @@ pub fn update<Message>(
_ => mouse::Cursor::Unavailable,
};
- update_content(event.clone(), content, cursor, clipboard, shell)
+ let translation = state.translation(direction, bounds, content_bounds);
+
+ update_content(
+ event.clone(),
+ content,
+ cursor,
+ clipboard,
+ shell,
+ &Rectangle {
+ y: bounds.y + translation.y,
+ x: bounds.x + translation.x,
+ ..bounds
+ },
+ )
};
if let event::Status::Captured = event_status {
diff --git a/widget/src/slider.rs b/widget/src/slider.rs
index 3ea4391b..e41be7c9 100644
--- a/widget/src/slider.rs
+++ b/widget/src/slider.rs
@@ -187,6 +187,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
update(
event,
diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs
index a335afbc..9958cbcc 100644
--- a/widget/src/text_input.rs
+++ b/widget/src/text_input.rs
@@ -302,6 +302,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
update(
event,
diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs
index 1b31765f..c8187181 100644
--- a/widget/src/toggler.rs
+++ b/widget/src/toggler.rs
@@ -207,6 +207,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs
index 2dc3da01..ff7f960f 100644
--- a/widget/src/tooltip.rs
+++ b/widget/src/tooltip.rs
@@ -147,6 +147,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ viewport: &Rectangle,
) -> event::Status {
let state = tree.state.downcast_mut::<State>();
@@ -163,6 +164,7 @@ where
renderer,
clipboard,
shell,
+ viewport,
)
}
diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs
index 91f2b466..efca302a 100644
--- a/widget/src/vertical_slider.rs
+++ b/widget/src/vertical_slider.rs
@@ -184,6 +184,7 @@ where
_renderer: &Renderer,
_clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
+ _viewport: &Rectangle,
) -> event::Status {
update(
event,