summaryrefslogtreecommitdiffstats
path: root/native/src/widget/operation
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2023-01-09 19:23:35 +0100
committerLibravatar GitHub <noreply@github.com>2023-01-09 19:23:35 +0100
commit7ccd87c36b54e0d53f65f5774f140a0528ae4504 (patch)
treebf12f165d43c785adfd4ac906b8f4035035c5d42 /native/src/widget/operation
parent07d755c6a270bd46fe9752ed57b3ceaddda1f081 (diff)
parent2d007474dd002dfc936f75f7379f1bbae72c5ad4 (diff)
downloadiced-7ccd87c36b54e0d53f65f5774f140a0528ae4504.tar.gz
iced-7ccd87c36b54e0d53f65f5774f140a0528ae4504.tar.bz2
iced-7ccd87c36b54e0d53f65f5774f140a0528ae4504.zip
Merge pull request #1550 from bungoboingo/feat/multidirectional-scrolling
[Feature] Multidirectional scrolling
Diffstat (limited to 'native/src/widget/operation')
-rw-r--r--native/src/widget/operation/scrollable.rs41
1 files changed, 30 insertions, 11 deletions
diff --git a/native/src/widget/operation/scrollable.rs b/native/src/widget/operation/scrollable.rs
index 2210137d..3b20631f 100644
--- a/native/src/widget/operation/scrollable.rs
+++ b/native/src/widget/operation/scrollable.rs
@@ -3,25 +3,19 @@ use crate::widget::{Id, Operation};
/// The internal state of a widget that can be scrolled.
pub trait Scrollable {
- /// Snaps the scroll of the widget to the given `percentage`.
- fn snap_to(&mut self, percentage: f32);
+ /// Snaps the scroll of the widget to the given `percentage` along the horizontal & vertical axis.
+ fn snap_to(&mut self, offset: RelativeOffset);
}
/// Produces an [`Operation`] that snaps the widget with the given [`Id`] to
/// the provided `percentage`.
-pub fn snap_to<T>(target: Id, percentage: f32) -> impl Operation<T> {
+pub fn snap_to<T>(target: Id, offset: RelativeOffset) -> impl Operation<T> {
struct SnapTo {
target: Id,
- percentage: f32,
+ offset: RelativeOffset,
}
impl<T> Operation<T> for SnapTo {
- fn scrollable(&mut self, state: &mut dyn Scrollable, id: Option<&Id>) {
- if Some(&self.target) == id {
- state.snap_to(self.percentage);
- }
- }
-
fn container(
&mut self,
_id: Option<&Id>,
@@ -29,7 +23,32 @@ pub fn snap_to<T>(target: Id, percentage: f32) -> impl Operation<T> {
) {
operate_on_children(self)
}
+
+ fn scrollable(&mut self, state: &mut dyn Scrollable, id: Option<&Id>) {
+ if Some(&self.target) == id {
+ state.snap_to(self.offset);
+ }
+ }
}
- SnapTo { target, percentage }
+ SnapTo { target, offset }
+}
+
+/// The amount of offset in each direction of a [`Scrollable`].
+///
+/// A value of `0.0` means start, while `1.0` means end.
+#[derive(Debug, Clone, Copy, PartialEq, Default)]
+pub struct RelativeOffset {
+ /// The amount of horizontal offset
+ pub x: f32,
+ /// The amount of vertical offset
+ pub y: f32,
+}
+
+impl RelativeOffset {
+ /// A relative offset that points to the top-left of a [`Scrollable`].
+ pub const START: Self = Self { x: 0.0, y: 0.0 };
+
+ /// A relative offset that points to the bottom-right of a [`Scrollable`].
+ pub const END: Self = Self { x: 1.0, y: 1.0 };
}