diff options
author | 2021-10-14 17:15:29 +0700 | |
---|---|---|
committer | 2021-10-14 17:15:29 +0700 | |
commit | dfceee99aad9462f09ca61081e68e1decb2fed92 (patch) | |
tree | 2950742377c22cb231e22477a3aab5156cae4783 /native/src/widget | |
parent | 7c4738735b6cd5eafb544de01dbf5dd5091dc188 (diff) | |
download | iced-dfceee99aad9462f09ca61081e68e1decb2fed92.tar.gz iced-dfceee99aad9462f09ca61081e68e1decb2fed92.tar.bz2 iced-dfceee99aad9462f09ca61081e68e1decb2fed92.zip |
Implement `Widget::draw` for `Scrollable`
Rendering the scroller is still WIP
Diffstat (limited to 'native/src/widget')
-rw-r--r-- | native/src/widget/scrollable.rs | 126 |
1 files changed, 88 insertions, 38 deletions
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 1c897dc5..ba3d3dd6 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -381,44 +381,94 @@ where cursor_position: Point, _viewport: &Rectangle, ) { - // TODO - // let bounds = layout.bounds(); - // let content_layout = layout.children().next().unwrap(); - // let content_bounds = content_layout.bounds(); - // let offset = self.state.offset(bounds, content_bounds); - // let scrollbar = renderer.scrollbar( - // bounds, - // content_bounds, - // offset, - // self.scrollbar_width, - // self.scrollbar_margin, - // self.scroller_width, - // ); - - // let is_mouse_over = bounds.contains(cursor_position); - // let is_mouse_over_scrollbar = scrollbar - // .as_ref() - // .map(|scrollbar| scrollbar.is_mouse_over(cursor_position)) - // .unwrap_or(false); - - // let content = { - // let cursor_position = if is_mouse_over && !is_mouse_over_scrollbar { - // Point::new(cursor_position.x, cursor_position.y + offset as f32) - // } else { - // Point::new(cursor_position.x, -1.0) - // }; - - // self.content.draw( - // renderer, - // defaults, - // content_layout, - // cursor_position, - // &Rectangle { - // y: bounds.y + offset as f32, - // ..bounds - // }, - // ) - // }; + let bounds = layout.bounds(); + let content_layout = layout.children().next().unwrap(); + let content_bounds = content_layout.bounds(); + let offset = self.state.offset(bounds, content_bounds); + let scrollbar = renderer.scrollbar( + bounds, + content_bounds, + offset, + self.scrollbar_width, + self.scrollbar_margin, + self.scroller_width, + ); + + let is_mouse_over = bounds.contains(cursor_position); + let is_mouse_over_scrollbar = scrollbar + .as_ref() + .map(|scrollbar| scrollbar.is_mouse_over(cursor_position)) + .unwrap_or(false); + + let cursor_position = if is_mouse_over && !is_mouse_over_scrollbar { + Point::new(cursor_position.x, cursor_position.y + offset as f32) + } else { + Point::new(cursor_position.x, -1.0) + }; + + if let Some(scrollbar) = scrollbar { + renderer.with_layer(bounds, Vector::new(0, offset), |renderer| { + self.content.draw( + renderer, + defaults, + content_layout, + cursor_position, + &Rectangle { + y: bounds.y + offset as f32, + ..bounds + }, + ); + }); + + // TODO: Draw scroller + // let style = if self.state.is_scroller_grabbed() { + // style_sheet.dragging() + // } else if is_mouse_over_scrollbar { + // style_sheet.hovered() + // } else { + // style_sheet.active() + // }; + + // let is_scrollbar_visible = + // style.background.is_some() || style.border_width > 0.0; + + // if is_mouse_over + // || self.state.is_scroller_grabbed() + // || is_scrollbar_visible + // { + // // Primitive::Quad { + // // bounds: scrollbar.scroller.bounds, + // // background: Background::Color(style.scroller.color), + // // border_radius: style.scroller.border_radius, + // // border_width: style.scroller.border_width, + // // border_color: style.scroller.border_color, + // // } + // }; + + // TODO: Draw scrollbar + // if is_scrollbar_visible { + // Primitive::Quad { + // bounds: scrollbar.bounds, + // background: style + // .background + // .unwrap_or(Background::Color(Color::TRANSPARENT)), + // border_radius: style.border_radius, + // border_width: style.border_width, + // border_color: style.border_color, + // } + //} + } else { + self.content.draw( + renderer, + defaults, + content_layout, + cursor_position, + &Rectangle { + y: bounds.y + offset as f32, + ..bounds + }, + ); + } } fn hash_layout(&self, state: &mut Hasher) { |