summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Friz64 <friz64mc@gmail.com>2019-11-30 17:30:42 +0100
committerLibravatar Friz64 <friz64mc@gmail.com>2019-12-02 19:10:07 +0100
commitf8fac432c665e57267243a9ee3920208b2724e6e (patch)
treee680ec54395a0d9082b948ce653580a7e41858fa
parent5eec3a8867f4fbd54e2e28e5d984c2ca7ec0fea4 (diff)
downloadiced-f8fac432c665e57267243a9ee3920208b2724e6e.tar.gz
iced-f8fac432c665e57267243a9ee3920208b2724e6e.tar.bz2
iced-f8fac432c665e57267243a9ee3920208b2724e6e.zip
Finalize work
-rw-r--r--examples/tour.rs2
-rw-r--r--native/src/widget/scrollable.rs69
-rw-r--r--wgpu/src/renderer/widget/scrollable.rs32
3 files changed, 60 insertions, 43 deletions
diff --git a/examples/tour.rs b/examples/tour.rs
index 6b366957..0121c3bd 100644
--- a/examples/tour.rs
+++ b/examples/tour.rs
@@ -145,7 +145,7 @@ impl Steps {
Step::Debugger,
Step::End,
],
- current: 6,
+ current: 0,
}
}
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index fed7f54e..17a1363e 100644
--- a/native/src/widget/scrollable.rs
+++ b/native/src/widget/scrollable.rs
@@ -151,10 +151,13 @@ where
let content_bounds = content.bounds();
let offset = self.state.offset(bounds, content_bounds);
+ let (background_bounds, scroller_bounds) =
+ renderer.scrollbar_bounds(bounds, content_bounds, offset);
let scrollbar_grab = renderer.scrollbar_grab(
bounds,
content_bounds,
- offset,
+ background_bounds,
+ scroller_bounds,
cursor_position,
);
@@ -183,10 +186,8 @@ where
state,
}) => match state {
ButtonState::Pressed => {
- let (scrollbar_grab, scroller_bounds) =
- scrollbar_grab.unwrap();
-
- let scroller_grabbed_at = match scrollbar_grab {
+ let scroller_grabbed_at = match scrollbar_grab.unwrap()
+ {
ScrollbarGrab::Background => 0.5,
ScrollbarGrab::Scroller => {
(cursor_position.y - scroller_bounds.y)
@@ -194,18 +195,15 @@ where
}
};
- let scroll_percentage = (cursor_position.y
- - (scroller_bounds.height * scroller_grabbed_at))
- / (bounds.height
- - (scroller_bounds.height
- * scroller_grabbed_at));
+ let scroll_percentage = (cursor_position.y + bounds.y
+ - scroller_bounds.height * scroller_grabbed_at)
+ / (bounds.height - scroller_bounds.height);
- dbg!((scroll_percentage, scroller_grabbed_at));
- /*self.state.scroll_to(
+ self.state.scroll_to(
scroll_percentage,
bounds,
content_bounds,
- );*/
+ );
self.state.scroller_grabbed_at =
Some(scroller_grabbed_at);
@@ -214,24 +212,21 @@ where
self.state.scroller_grabbed_at = None;
}
},
- /* TODO: Implement dragging to scroll
Event::Mouse(mouse::Event::CursorMoved { .. }) => {
- if let Some(scrollbar_grabbed_at) =
- self.state.scrollbar_grabbed_at
+ if let Some(scroller_grabbed_at) =
+ self.state.scroller_grabbed_at
{
- let ratio = content_bounds.height / bounds.height;
- let delta = scrollbar_grabbed_at.y - cursor_position.y;
+ let scroll_percentage = (cursor_position.y + bounds.y
+ - scroller_bounds.height * scroller_grabbed_at)
+ / (bounds.height - scroller_bounds.height);
- self.state.scroll(
- delta * ratio,
+ self.state.scroll_to(
+ scroll_percentage,
bounds,
content_bounds,
);
-
- self.state.scrollbar_grabbed_at = Some(cursor_position);
}
}
- */
_ => {}
}
}
@@ -273,8 +268,16 @@ where
let offset = self.state.offset(bounds, content_bounds);
let is_mouse_over = bounds.contains(cursor_position);
+ let (background_bounds, scroller_bounds) =
+ renderer.scrollbar_bounds(bounds, content_bounds, offset);
let is_mouse_over_scrollbar = renderer
- .scrollbar_grab(bounds, content_bounds, offset, cursor_position)
+ .scrollbar_grab(
+ bounds,
+ content_bounds,
+ background_bounds,
+ scroller_bounds,
+ cursor_position,
+ )
.is_some();
let content = {
@@ -399,18 +402,28 @@ pub enum ScrollbarGrab {
/// [`Scrollable`]: struct.Scrollable.html
/// [renderer]: ../../renderer/index.html
pub trait Renderer: crate::Renderer + Sized {
+ /// Returns the bounds of the scrollbar
+ /// - Background
+ /// - Movable Scroller
+ fn scrollbar_bounds(
+ &self,
+ bounds: Rectangle,
+ content_bounds: Rectangle,
+ offset: u32,
+ ) -> (Rectangle, Rectangle);
+
/// Returns what part of the scrollbar is being grabbed by the mouse
- /// given the bounds of the [`Scrollable`] and its contents together
- /// with the current scroller bounds.
+ /// given the bounds of the [`Scrollable`] and its contents.
///
/// [`Scrollable`]: struct.Scrollable.html
fn scrollbar_grab(
&self,
bounds: Rectangle,
content_bounds: Rectangle,
- offset: u32,
+ background_bounds: Rectangle,
+ scroller_bounds: Rectangle,
cursor_position: Point,
- ) -> Option<(ScrollbarGrab, Rectangle)>;
+ ) -> Option<ScrollbarGrab>;
/// Draws the [`Scrollable`].
///
diff --git a/wgpu/src/renderer/widget/scrollable.rs b/wgpu/src/renderer/widget/scrollable.rs
index d069b799..175fac11 100644
--- a/wgpu/src/renderer/widget/scrollable.rs
+++ b/wgpu/src/renderer/widget/scrollable.rs
@@ -36,31 +36,35 @@ fn scroller_bounds(
}
impl scrollable::Renderer for Renderer {
- fn scrollbar_grab(
+ fn scrollbar_bounds(
&self,
bounds: Rectangle,
content_bounds: Rectangle,
offset: u32,
- cursor_position: Point,
- ) -> Option<(ScrollbarGrab, Rectangle)> {
+ ) -> (Rectangle, Rectangle) {
let background_bounds = background_bounds(bounds);
+ let scroller_bounds =
+ scroller_bounds(bounds, content_bounds, background_bounds, offset);
+
+ (background_bounds, scroller_bounds)
+ }
+
+ fn scrollbar_grab(
+ &self,
+ bounds: Rectangle,
+ content_bounds: Rectangle,
+ background_bounds: Rectangle,
+ scroller_bounds: Rectangle,
+ cursor_position: Point,
+ ) -> Option<ScrollbarGrab> {
if content_bounds.height > bounds.height
&& background_bounds.contains(cursor_position)
{
- let scroller_bounds = scroller_bounds(
- bounds,
- content_bounds,
- background_bounds,
- offset,
- );
-
- let scrollbar_grab = if scroller_bounds.contains(cursor_position) {
+ Some(if scroller_bounds.contains(cursor_position) {
ScrollbarGrab::Scroller
} else {
ScrollbarGrab::Background
- };
-
- Some((scrollbar_grab, scroller_bounds))
+ })
} else {
None
}