diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/src/vector.rs | 11 | ||||
| -rw-r--r-- | core/src/widget/operation.rs | 46 | ||||
| -rw-r--r-- | core/src/widget/operation/scrollable.rs | 45 | 
3 files changed, 97 insertions, 5 deletions
| diff --git a/core/src/vector.rs b/core/src/vector.rs index 1380c3b3..ff848c4f 100644 --- a/core/src/vector.rs +++ b/core/src/vector.rs @@ -20,6 +20,17 @@ impl Vector {      pub const ZERO: Self = Self::new(0.0, 0.0);  } +impl<T> std::ops::Neg for Vector<T> +where +    T: std::ops::Neg<Output = T>, +{ +    type Output = Self; + +    fn neg(self) -> Self::Output { +        Self::new(-self.x, -self.y) +    } +} +  impl<T> std::ops::Add for Vector<T>  where      T: std::ops::Add<Output = T>, diff --git a/core/src/widget/operation.rs b/core/src/widget/operation.rs index 4ee4b4a7..097c3601 100644 --- a/core/src/widget/operation.rs +++ b/core/src/widget/operation.rs @@ -38,6 +38,7 @@ pub trait Operation<T = ()>: Send {          _state: &mut dyn Scrollable,          _id: Option<&Id>,          _bounds: Rectangle, +        _content_bounds: Rectangle,          _translation: Vector,      ) {      } @@ -76,9 +77,16 @@ where          state: &mut dyn Scrollable,          id: Option<&Id>,          bounds: Rectangle, +        content_bounds: Rectangle,          translation: Vector,      ) { -        self.as_mut().scrollable(state, id, bounds, translation); +        self.as_mut().scrollable( +            state, +            id, +            bounds, +            content_bounds, +            translation, +        );      }      fn text_input(&mut self, state: &mut dyn TextInput, id: Option<&Id>) { @@ -151,9 +159,16 @@ where              state: &mut dyn Scrollable,              id: Option<&Id>,              bounds: Rectangle, +            content_bounds: Rectangle,              translation: Vector,          ) { -            self.operation.scrollable(state, id, bounds, translation); +            self.operation.scrollable( +                state, +                id, +                bounds, +                content_bounds, +                translation, +            );          }          fn text_input(&mut self, state: &mut dyn TextInput, id: Option<&Id>) { @@ -222,9 +237,16 @@ where                      state: &mut dyn Scrollable,                      id: Option<&Id>,                      bounds: Rectangle, +                    content_bounds: Rectangle,                      translation: Vector,                  ) { -                    self.operation.scrollable(state, id, bounds, translation); +                    self.operation.scrollable( +                        state, +                        id, +                        bounds, +                        content_bounds, +                        translation, +                    );                  }                  fn focusable( @@ -262,9 +284,16 @@ where              state: &mut dyn Scrollable,              id: Option<&Id>,              bounds: Rectangle, +            content_bounds: Rectangle,              translation: Vector,          ) { -            self.operation.scrollable(state, id, bounds, translation); +            self.operation.scrollable( +                state, +                id, +                bounds, +                content_bounds, +                translation, +            );          }          fn text_input(&mut self, state: &mut dyn TextInput, id: Option<&Id>) { @@ -341,9 +370,16 @@ where              state: &mut dyn Scrollable,              id: Option<&Id>,              bounds: Rectangle, +            content_bounds: Rectangle,              translation: crate::Vector,          ) { -            self.operation.scrollable(state, id, bounds, translation); +            self.operation.scrollable( +                state, +                id, +                bounds, +                content_bounds, +                translation, +            );          }          fn text_input(&mut self, state: &mut dyn TextInput, id: Option<&Id>) { diff --git a/core/src/widget/operation/scrollable.rs b/core/src/widget/operation/scrollable.rs index 12161255..c2fecf56 100644 --- a/core/src/widget/operation/scrollable.rs +++ b/core/src/widget/operation/scrollable.rs @@ -9,6 +9,14 @@ pub trait Scrollable {      /// Scroll the widget to the given [`AbsoluteOffset`] along the horizontal & vertical axis.      fn scroll_to(&mut self, offset: AbsoluteOffset); + +    /// Scroll the widget by the given [`AbsoluteOffset`] along the horizontal & vertical axis. +    fn scroll_by( +        &mut self, +        offset: AbsoluteOffset, +        bounds: Rectangle, +        content_bounds: Rectangle, +    );  }  /// Produces an [`Operation`] that snaps the widget with the given [`Id`] to @@ -34,6 +42,7 @@ pub fn snap_to<T>(target: Id, offset: RelativeOffset) -> impl Operation<T> {              state: &mut dyn Scrollable,              id: Option<&Id>,              _bounds: Rectangle, +            _content_bounds: Rectangle,              _translation: Vector,          ) {              if Some(&self.target) == id { @@ -68,6 +77,7 @@ pub fn scroll_to<T>(target: Id, offset: AbsoluteOffset) -> impl Operation<T> {              state: &mut dyn Scrollable,              id: Option<&Id>,              _bounds: Rectangle, +            _content_bounds: Rectangle,              _translation: Vector,          ) {              if Some(&self.target) == id { @@ -79,6 +89,41 @@ pub fn scroll_to<T>(target: Id, offset: AbsoluteOffset) -> impl Operation<T> {      ScrollTo { target, offset }  } +/// Produces an [`Operation`] that scrolls the widget with the given [`Id`] by +/// the provided [`AbsoluteOffset`]. +pub fn scroll_by<T>(target: Id, offset: AbsoluteOffset) -> impl Operation<T> { +    struct ScrollBy { +        target: Id, +        offset: AbsoluteOffset, +    } + +    impl<T> Operation<T> for ScrollBy { +        fn container( +            &mut self, +            _id: Option<&Id>, +            _bounds: Rectangle, +            operate_on_children: &mut dyn FnMut(&mut dyn Operation<T>), +        ) { +            operate_on_children(self); +        } + +        fn scrollable( +            &mut self, +            state: &mut dyn Scrollable, +            id: Option<&Id>, +            bounds: Rectangle, +            content_bounds: Rectangle, +            _translation: Vector, +        ) { +            if Some(&self.target) == id { +                state.scroll_by(self.offset, bounds, content_bounds); +            } +        } +    } + +    ScrollBy { target, offset } +} +  /// The amount of absolute offset in each direction of a [`Scrollable`].  #[derive(Debug, Clone, Copy, PartialEq, Default)]  pub struct AbsoluteOffset { | 
