summaryrefslogtreecommitdiffstats
path: root/native/src/widget/mouse_area.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/widget/mouse_area.rs')
-rw-r--r--native/src/widget/mouse_area.rs311
1 files changed, 0 insertions, 311 deletions
diff --git a/native/src/widget/mouse_area.rs b/native/src/widget/mouse_area.rs
deleted file mode 100644
index 69cfddbf..00000000
--- a/native/src/widget/mouse_area.rs
+++ /dev/null
@@ -1,311 +0,0 @@
-//! A container for capturing mouse events.
-
-use crate::event::{self, Event};
-use crate::layout;
-use crate::mouse;
-use crate::overlay;
-use crate::renderer;
-use crate::touch;
-use crate::widget::{tree, Operation, Tree};
-use crate::{
- Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Widget,
-};
-
-/// Emit messages on mouse events.
-#[allow(missing_debug_implementations)]
-pub struct MouseArea<'a, Message, Renderer> {
- content: Element<'a, Message, Renderer>,
- on_press: Option<Message>,
- on_release: Option<Message>,
- on_right_press: Option<Message>,
- on_right_release: Option<Message>,
- on_middle_press: Option<Message>,
- on_middle_release: Option<Message>,
-}
-
-impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> {
- /// The message to emit on a left button press.
- #[must_use]
- pub fn on_press(mut self, message: Message) -> Self {
- self.on_press = Some(message);
- self
- }
-
- /// The message to emit on a left button release.
- #[must_use]
- pub fn on_release(mut self, message: Message) -> Self {
- self.on_release = Some(message);
- self
- }
-
- /// The message to emit on a right button press.
- #[must_use]
- pub fn on_right_press(mut self, message: Message) -> Self {
- self.on_right_press = Some(message);
- self
- }
-
- /// The message to emit on a right button release.
- #[must_use]
- pub fn on_right_release(mut self, message: Message) -> Self {
- self.on_right_release = Some(message);
- self
- }
-
- /// The message to emit on a middle button press.
- #[must_use]
- pub fn on_middle_press(mut self, message: Message) -> Self {
- self.on_middle_press = Some(message);
- self
- }
-
- /// The message to emit on a middle button release.
- #[must_use]
- pub fn on_middle_release(mut self, message: Message) -> Self {
- self.on_middle_release = Some(message);
- self
- }
-}
-
-/// Local state of the [`MouseArea`].
-#[derive(Default)]
-struct State {
- // TODO: Support on_mouse_enter and on_mouse_exit
-}
-
-impl<'a, Message, Renderer> MouseArea<'a, Message, Renderer> {
- /// Creates a [`MouseArea`] with the given content.
- pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self {
- MouseArea {
- content: content.into(),
- on_press: None,
- on_release: None,
- on_right_press: None,
- on_right_release: None,
- on_middle_press: None,
- on_middle_release: None,
- }
- }
-}
-
-impl<'a, Message, Renderer> Widget<Message, Renderer>
- for MouseArea<'a, Message, Renderer>
-where
- Renderer: crate::Renderer,
- Message: Clone,
-{
- fn tag(&self) -> tree::Tag {
- tree::Tag::of::<State>()
- }
-
- fn state(&self) -> tree::State {
- tree::State::new(State::default())
- }
-
- fn children(&self) -> Vec<Tree> {
- vec![Tree::new(&self.content)]
- }
-
- fn diff(&self, tree: &mut Tree) {
- tree.diff_children(std::slice::from_ref(&self.content));
- }
-
- fn width(&self) -> Length {
- self.content.as_widget().width()
- }
-
- fn height(&self) -> Length {
- self.content.as_widget().height()
- }
-
- fn layout(
- &self,
- renderer: &Renderer,
- limits: &layout::Limits,
- ) -> layout::Node {
- self.content.as_widget().layout(renderer, limits)
- }
-
- fn operate(
- &self,
- tree: &mut Tree,
- layout: Layout<'_>,
- renderer: &Renderer,
- operation: &mut dyn Operation<Message>,
- ) {
- self.content.as_widget().operate(
- &mut tree.children[0],
- layout,
- renderer,
- operation,
- );
- }
-
- fn on_event(
- &mut self,
- tree: &mut Tree,
- event: Event,
- layout: Layout<'_>,
- cursor_position: Point,
- renderer: &Renderer,
- clipboard: &mut dyn Clipboard,
- shell: &mut Shell<'_, Message>,
- ) -> event::Status {
- if let event::Status::Captured = self.content.as_widget_mut().on_event(
- &mut tree.children[0],
- event.clone(),
- layout,
- cursor_position,
- renderer,
- clipboard,
- shell,
- ) {
- return event::Status::Captured;
- }
-
- update(self, &event, layout, cursor_position, shell)
- }
-
- fn mouse_interaction(
- &self,
- tree: &Tree,
- layout: Layout<'_>,
- cursor_position: Point,
- viewport: &Rectangle,
- renderer: &Renderer,
- ) -> mouse::Interaction {
- self.content.as_widget().mouse_interaction(
- &tree.children[0],
- layout,
- cursor_position,
- viewport,
- renderer,
- )
- }
-
- fn draw(
- &self,
- tree: &Tree,
- renderer: &mut Renderer,
- theme: &Renderer::Theme,
- renderer_style: &renderer::Style,
- layout: Layout<'_>,
- cursor_position: Point,
- viewport: &Rectangle,
- ) {
- self.content.as_widget().draw(
- &tree.children[0],
- renderer,
- theme,
- renderer_style,
- layout,
- cursor_position,
- viewport,
- );
- }
-
- fn overlay<'b>(
- &'b mut self,
- tree: &'b mut Tree,
- layout: Layout<'_>,
- renderer: &Renderer,
- ) -> Option<overlay::Element<'b, Message, Renderer>> {
- self.content.as_widget_mut().overlay(
- &mut tree.children[0],
- layout,
- renderer,
- )
- }
-}
-
-impl<'a, Message, Renderer> From<MouseArea<'a, Message, Renderer>>
- for Element<'a, Message, Renderer>
-where
- Message: 'a + Clone,
- Renderer: 'a + crate::Renderer,
-{
- fn from(
- area: MouseArea<'a, Message, Renderer>,
- ) -> Element<'a, Message, Renderer> {
- Element::new(area)
- }
-}
-
-/// Processes the given [`Event`] and updates the [`State`] of an [`MouseArea`]
-/// accordingly.
-fn update<Message: Clone, Renderer>(
- widget: &mut MouseArea<'_, Message, Renderer>,
- event: &Event,
- layout: Layout<'_>,
- cursor_position: Point,
- shell: &mut Shell<'_, Message>,
-) -> event::Status {
- if !layout.bounds().contains(cursor_position) {
- return event::Status::Ignored;
- }
-
- if let Some(message) = widget.on_press.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
- | Event::Touch(touch::Event::FingerPressed { .. }) = event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- if let Some(message) = widget.on_release.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
- | Event::Touch(touch::Event::FingerLifted { .. }) = event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- if let Some(message) = widget.on_right_press.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Right)) =
- event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- if let Some(message) = widget.on_right_release.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonReleased(
- mouse::Button::Right,
- )) = event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- if let Some(message) = widget.on_middle_press.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonPressed(
- mouse::Button::Middle,
- )) = event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- if let Some(message) = widget.on_middle_release.as_ref() {
- if let Event::Mouse(mouse::Event::ButtonReleased(
- mouse::Button::Middle,
- )) = event
- {
- shell.publish(message.clone());
-
- return event::Status::Captured;
- }
- }
-
- event::Status::Ignored
-}