diff options
| author | 2023-06-09 21:53:54 +0200 | |
|---|---|---|
| committer | 2023-06-09 21:53:54 +0200 | |
| commit | 60cd864d43be877a5eaee4f5ca32f41b9fb70b79 (patch) | |
| tree | 01a7758d3b8a4d2434bba113df85c6cb2c3e2ca2 /widget/src/pane_grid | |
| parent | c15f1b5f6575792cc89bb5fba2e613428397e46a (diff) | |
| parent | 27639c4ce6161fa07986c2f1d472a8a259ae2129 (diff) | |
| download | iced-60cd864d43be877a5eaee4f5ca32f41b9fb70b79.tar.gz iced-60cd864d43be877a5eaee4f5ca32f41b9fb70b79.tar.bz2 iced-60cd864d43be877a5eaee4f5ca32f41b9fb70b79.zip | |
Merge pull request #1904 from iced-rs/cursor-availability
Cursor availability
Diffstat (limited to '')
| -rw-r--r-- | widget/src/pane_grid.rs | 160 | ||||
| -rw-r--r-- | widget/src/pane_grid/content.rs | 72 | ||||
| -rw-r--r-- | widget/src/pane_grid/draggable.rs | 6 | ||||
| -rw-r--r-- | widget/src/pane_grid/title_bar.rs | 18 | 
4 files changed, 132 insertions, 124 deletions
| diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 7bddc4a6..040d6bb3 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -313,7 +313,7 @@ where          tree: &mut Tree,          event: Event,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          renderer: &Renderer,          clipboard: &mut dyn Clipboard,          shell: &mut Shell<'_, Message>, @@ -331,7 +331,7 @@ where              self.contents.layout(),              &event,              layout, -            cursor_position, +            cursor,              shell,              self.spacing,              self.contents.iter(), @@ -353,7 +353,7 @@ where                      tree,                      event.clone(),                      layout, -                    cursor_position, +                    cursor,                      renderer,                      clipboard,                      shell, @@ -367,7 +367,7 @@ where          &self,          tree: &Tree,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,          renderer: &Renderer,      ) -> mouse::Interaction { @@ -375,7 +375,7 @@ where              tree.state.downcast_ref(),              self.contents.layout(),              layout, -            cursor_position, +            cursor,              self.spacing,              self.on_resize.as_ref().map(|(leeway, _)| *leeway),          ) @@ -388,7 +388,7 @@ where                      content.mouse_interaction(                          tree,                          layout, -                        cursor_position, +                        cursor,                          viewport,                          renderer,                          self.drag_enabled(), @@ -406,14 +406,14 @@ where          theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,      ) {          draw(              tree.state.downcast_ref(),              self.contents.layout(),              layout, -            cursor_position, +            cursor,              renderer,              theme,              style, @@ -425,20 +425,9 @@ where                  .iter()                  .zip(&tree.children)                  .map(|((pane, content), tree)| (pane, (content, tree))), -            |(content, tree), -             renderer, -             style, -             layout, -             cursor_position, -             rectangle| { +            |(content, tree), renderer, style, layout, cursor, rectangle| {                  content.draw( -                    tree, -                    renderer, -                    theme, -                    style, -                    layout, -                    cursor_position, -                    rectangle, +                    tree, renderer, theme, style, layout, cursor, rectangle,                  );              },          ) @@ -520,7 +509,7 @@ pub fn update<'a, Message, T: Draggable>(      node: &Node,      event: &Event,      layout: Layout<'_>, -    cursor_position: Point, +    cursor: mouse::Cursor,      shell: &mut Shell<'_, Message>,      spacing: f32,      contents: impl Iterator<Item = (Pane, T)>, @@ -535,7 +524,7 @@ pub fn update<'a, Message, T: Draggable>(          | Event::Touch(touch::Event::FingerPressed { .. }) => {              let bounds = layout.bounds(); -            if bounds.contains(cursor_position) { +            if let Some(cursor_position) = cursor.position_over(bounds) {                  event_status = event::Status::Captured;                  match on_resize { @@ -592,14 +581,18 @@ pub fn update<'a, Message, T: Draggable>(          | Event::Touch(touch::Event::FingerLost { .. }) => {              if let Some((pane, _)) = action.picked_pane() {                  if let Some(on_drag) = on_drag { -                    let mut dropped_region = contents -                        .zip(layout.children()) -                        .filter_map(|(target, layout)| { -                            layout_region(layout, cursor_position) -                                .map(|region| (target, region)) +                    let dropped_region = +                        cursor.position().and_then(|cursor_position| { +                            contents +                                .zip(layout.children()) +                                .filter_map(|(target, layout)| { +                                    layout_region(layout, cursor_position) +                                        .map(|region| (target, region)) +                                }) +                                .next()                          }); -                    let event = match dropped_region.next() { +                    let event = match dropped_region {                          Some(((target, _), region)) if pane != target => {                              DragEvent::Dropped {                                  pane, @@ -634,24 +627,32 @@ pub fn update<'a, Message, T: Draggable>(                      );                      if let Some((axis, rectangle, _)) = splits.get(&split) { -                        let ratio = match axis { -                            Axis::Horizontal => { -                                let position = -                                    cursor_position.y - bounds.y - rectangle.y; - -                                (position / rectangle.height).clamp(0.1, 0.9) -                            } -                            Axis::Vertical => { -                                let position = -                                    cursor_position.x - bounds.x - rectangle.x; - -                                (position / rectangle.width).clamp(0.1, 0.9) -                            } -                        }; - -                        shell.publish(on_resize(ResizeEvent { split, ratio })); - -                        event_status = event::Status::Captured; +                        if let Some(cursor_position) = cursor.position() { +                            let ratio = match axis { +                                Axis::Horizontal => { +                                    let position = cursor_position.y +                                        - bounds.y +                                        - rectangle.y; + +                                    (position / rectangle.height) +                                        .clamp(0.1, 0.9) +                                } +                                Axis::Vertical => { +                                    let position = cursor_position.x +                                        - bounds.x +                                        - rectangle.x; + +                                    (position / rectangle.width).clamp(0.1, 0.9) +                                } +                            }; + +                            shell.publish(on_resize(ResizeEvent { +                                split, +                                ratio, +                            })); + +                            event_status = event::Status::Captured; +                        }                      }                  }              } @@ -724,7 +725,7 @@ pub fn mouse_interaction(      action: &state::Action,      node: &Node,      layout: Layout<'_>, -    cursor_position: Point, +    cursor: mouse::Cursor,      spacing: f32,      resize_leeway: Option<f32>,  ) -> Option<mouse::Interaction> { @@ -735,6 +736,7 @@ pub fn mouse_interaction(      let resize_axis =          action.picked_split().map(|(_, axis)| axis).or_else(|| {              resize_leeway.and_then(|leeway| { +                let cursor_position = cursor.position()?;                  let bounds = layout.bounds();                  let splits = node.split_regions(spacing, bounds.size()); @@ -764,7 +766,7 @@ pub fn draw<Renderer, T>(      action: &state::Action,      node: &Node,      layout: Layout<'_>, -    cursor_position: Point, +    cursor: mouse::Cursor,      renderer: &mut Renderer,      theme: &Renderer::Theme,      default_style: &renderer::Style, @@ -778,7 +780,7 @@ pub fn draw<Renderer, T>(          &mut Renderer,          &renderer::Style,          Layout<'_>, -        Point, +        mouse::Cursor,          &Rectangle,      ),  ) where @@ -802,6 +804,7 @@ pub fn draw<Renderer, T>(          })          .or_else(|| match resize_leeway {              Some(leeway) => { +                let cursor_position = cursor.position()?;                  let bounds = layout.bounds();                  let relative_cursor = Point::new( @@ -822,12 +825,10 @@ pub fn draw<Renderer, T>(              None => None,          }); -    let pane_cursor_position = if picked_pane.is_some() { -        // TODO: Remove once cursor availability is encoded in the type -        // system -        Point::new(-1.0, -1.0) +    let pane_cursor = if picked_pane.is_some() { +        mouse::Cursor::Unavailable      } else { -        cursor_position +        cursor      };      let mut render_picked_pane = None; @@ -843,12 +844,15 @@ pub fn draw<Renderer, T>(                      renderer,                      default_style,                      layout, -                    pane_cursor_position, +                    pane_cursor,                      viewport,                  );                  if picked_pane.is_some() { -                    if let Some(region) = layout_region(layout, cursor_position) +                    if let Some(region) = +                        cursor.position().and_then(|cursor_position| { +                            layout_region(layout, cursor_position) +                        })                      {                          let bounds = layout_region_bounds(layout, region);                          let hovered_region_style = theme.hovered_region(style); @@ -872,7 +876,7 @@ pub fn draw<Renderer, T>(                      renderer,                      default_style,                      layout, -                    pane_cursor_position, +                    pane_cursor,                      viewport,                  );              } @@ -881,25 +885,27 @@ pub fn draw<Renderer, T>(      // Render picked pane last      if let Some((pane, origin, layout)) = render_picked_pane { -        let bounds = layout.bounds(); - -        renderer.with_translation( -            cursor_position -                - Point::new(bounds.x + origin.x, bounds.y + origin.y), -            |renderer| { -                renderer.with_layer(bounds, |renderer| { -                    draw_pane( -                        pane, -                        renderer, -                        default_style, -                        layout, -                        pane_cursor_position, -                        viewport, -                    ); -                }); -            }, -        ); -    }; +        if let Some(cursor_position) = cursor.position() { +            let bounds = layout.bounds(); + +            renderer.with_translation( +                cursor_position +                    - Point::new(bounds.x + origin.x, bounds.y + origin.y), +                |renderer| { +                    renderer.with_layer(bounds, |renderer| { +                        draw_pane( +                            pane, +                            renderer, +                            default_style, +                            layout, +                            pane_cursor, +                            viewport, +                        ); +                    }); +                }, +            ); +        } +    }      if let Some((axis, split_region, is_picked)) = picked_split {          let highlight = if is_picked { diff --git a/widget/src/pane_grid/content.rs b/widget/src/pane_grid/content.rs index 035ef05b..c28ae6e3 100644 --- a/widget/src/pane_grid/content.rs +++ b/widget/src/pane_grid/content.rs @@ -95,7 +95,7 @@ where          theme: &Renderer::Theme,          style: &renderer::Style,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,      ) {          use container::StyleSheet; @@ -113,7 +113,7 @@ where              let title_bar_layout = children.next().unwrap();              let body_layout = children.next().unwrap(); -            let show_controls = bounds.contains(cursor_position); +            let show_controls = cursor.is_over(bounds);              self.body.as_widget().draw(                  &tree.children[0], @@ -121,7 +121,7 @@ where                  theme,                  style,                  body_layout, -                cursor_position, +                cursor,                  viewport,              ); @@ -131,7 +131,7 @@ where                  theme,                  style,                  title_bar_layout, -                cursor_position, +                cursor,                  viewport,                  show_controls,              ); @@ -142,7 +142,7 @@ where                  theme,                  style,                  layout, -                cursor_position, +                cursor,                  viewport,              );          } @@ -218,7 +218,7 @@ where          tree: &mut Tree,          event: Event,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          renderer: &Renderer,          clipboard: &mut dyn Clipboard,          shell: &mut Shell<'_, Message>, @@ -233,7 +233,7 @@ where                  &mut tree.children[1],                  event.clone(),                  children.next().unwrap(), -                cursor_position, +                cursor,                  renderer,                  clipboard,                  shell, @@ -251,7 +251,7 @@ where                  &mut tree.children[0],                  event,                  body_layout, -                cursor_position, +                cursor,                  renderer,                  clipboard,                  shell, @@ -265,42 +265,48 @@ where          &self,          tree: &Tree,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,          renderer: &Renderer,          drag_enabled: bool,      ) -> mouse::Interaction { -        let (body_layout, title_bar_interaction) = -            if let Some(title_bar) = &self.title_bar { -                let mut children = layout.children(); -                let title_bar_layout = children.next().unwrap(); - -                let is_over_pick_area = title_bar -                    .is_over_pick_area(title_bar_layout, cursor_position); - -                if is_over_pick_area && drag_enabled { -                    return mouse::Interaction::Grab; -                } - -                let mouse_interaction = title_bar.mouse_interaction( -                    &tree.children[1], -                    title_bar_layout, -                    cursor_position, -                    viewport, -                    renderer, -                ); +        let (body_layout, title_bar_interaction) = if let Some(title_bar) = +            &self.title_bar +        { +            let mut children = layout.children(); +            let title_bar_layout = children.next().unwrap(); + +            let is_over_pick_area = cursor +                .position() +                .map(|cursor_position| { +                    title_bar +                        .is_over_pick_area(title_bar_layout, cursor_position) +                }) +                .unwrap_or_default(); + +            if is_over_pick_area && drag_enabled { +                return mouse::Interaction::Grab; +            } -                (children.next().unwrap(), mouse_interaction) -            } else { -                (layout, mouse::Interaction::default()) -            }; +            let mouse_interaction = title_bar.mouse_interaction( +                &tree.children[1], +                title_bar_layout, +                cursor, +                viewport, +                renderer, +            ); + +            (children.next().unwrap(), mouse_interaction) +        } else { +            (layout, mouse::Interaction::default()) +        };          self.body              .as_widget()              .mouse_interaction(                  &tree.children[0],                  body_layout, -                cursor_position, +                cursor,                  viewport,                  renderer,              ) diff --git a/widget/src/pane_grid/draggable.rs b/widget/src/pane_grid/draggable.rs index a9274dad..9d31feb5 100644 --- a/widget/src/pane_grid/draggable.rs +++ b/widget/src/pane_grid/draggable.rs @@ -4,9 +4,5 @@ use crate::core::{Layout, Point};  pub trait Draggable {      /// Returns whether the [`Draggable`] with the given [`Layout`] can be picked      /// at the provided cursor position. -    fn can_be_dragged_at( -        &self, -        layout: Layout<'_>, -        cursor_position: Point, -    ) -> bool; +    fn can_be_dragged_at(&self, layout: Layout<'_>, cursor: Point) -> bool;  } diff --git a/widget/src/pane_grid/title_bar.rs b/widget/src/pane_grid/title_bar.rs index 2129937b..2fe79f80 100644 --- a/widget/src/pane_grid/title_bar.rs +++ b/widget/src/pane_grid/title_bar.rs @@ -122,7 +122,7 @@ where          theme: &Renderer::Theme,          inherited_style: &renderer::Style,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,          show_controls: bool,      ) { @@ -158,7 +158,7 @@ where                      theme,                      &inherited_style,                      controls_layout, -                    cursor_position, +                    cursor,                      viewport,                  );              } @@ -171,7 +171,7 @@ where                  theme,                  &inherited_style,                  title_layout, -                cursor_position, +                cursor,                  viewport,              );          } @@ -300,7 +300,7 @@ where          tree: &mut Tree,          event: Event,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          renderer: &Renderer,          clipboard: &mut dyn Clipboard,          shell: &mut Shell<'_, Message>, @@ -324,7 +324,7 @@ where                  &mut tree.children[1],                  event.clone(),                  controls_layout, -                cursor_position, +                cursor,                  renderer,                  clipboard,                  shell, @@ -338,7 +338,7 @@ where                  &mut tree.children[0],                  event,                  title_layout, -                cursor_position, +                cursor,                  renderer,                  clipboard,                  shell, @@ -354,7 +354,7 @@ where          &self,          tree: &Tree,          layout: Layout<'_>, -        cursor_position: Point, +        cursor: mouse::Cursor,          viewport: &Rectangle,          renderer: &Renderer,      ) -> mouse::Interaction { @@ -367,7 +367,7 @@ where          let title_interaction = self.content.as_widget().mouse_interaction(              &tree.children[0],              title_layout, -            cursor_position, +            cursor,              viewport,              renderer,          ); @@ -377,7 +377,7 @@ where              let controls_interaction = controls.as_widget().mouse_interaction(                  &tree.children[1],                  controls_layout, -                cursor_position, +                cursor,                  viewport,                  renderer,              ); | 
