summaryrefslogtreecommitdiffstats
path: root/native/src/widget/scrollable.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-06-07 03:26:48 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-06-07 03:26:48 +0200
commitde21a651c0616307bb6bfd36da1a06119e629b10 (patch)
treef565bfa3e75d57f6a4be1369d25dfd701b51c4ea /native/src/widget/scrollable.rs
parentce53d3933c860cd958636cce415ac97c04aee746 (diff)
downloadiced-de21a651c0616307bb6bfd36da1a06119e629b10.tar.gz
iced-de21a651c0616307bb6bfd36da1a06119e629b10.tar.bz2
iced-de21a651c0616307bb6bfd36da1a06119e629b10.zip
Implement theme styling for `Scrollable`
Diffstat (limited to 'native/src/widget/scrollable.rs')
-rw-r--r--native/src/widget/scrollable.rs37
1 files changed, 25 insertions, 12 deletions
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs
index 5c59b8b2..5d550315 100644
--- a/native/src/widget/scrollable.rs
+++ b/native/src/widget/scrollable.rs
@@ -25,7 +25,11 @@ pub mod style {
/// A widget that can vertically display an infinite amount of content with a
/// scrollbar.
#[allow(missing_debug_implementations)]
-pub struct Scrollable<'a, Message, Renderer> {
+pub struct Scrollable<'a, Message, Renderer>
+where
+ Renderer: crate::Renderer,
+ Renderer::Theme: StyleSheet,
+{
state: &'a mut State,
height: Length,
max_height: u32,
@@ -34,10 +38,14 @@ pub struct Scrollable<'a, Message, Renderer> {
scroller_width: u16,
content: Column<'a, Message, Renderer>,
on_scroll: Option<Box<dyn Fn(f32) -> Message + 'a>>,
- style_sheet: Box<dyn StyleSheet + 'a>,
+ style: <Renderer::Theme as StyleSheet>::Style,
}
-impl<'a, Message, Renderer: crate::Renderer> Scrollable<'a, Message, Renderer> {
+impl<'a, Message, Renderer> Scrollable<'a, Message, Renderer>
+where
+ Renderer: crate::Renderer,
+ Renderer::Theme: StyleSheet,
+{
/// Creates a new [`Scrollable`] with the given [`State`].
pub fn new(state: &'a mut State) -> Self {
Scrollable {
@@ -49,7 +57,7 @@ impl<'a, Message, Renderer: crate::Renderer> Scrollable<'a, Message, Renderer> {
scroller_width: 10,
content: Column::new(),
on_scroll: None,
- style_sheet: Default::default(),
+ style: Default::default(),
}
}
@@ -132,9 +140,9 @@ impl<'a, Message, Renderer: crate::Renderer> Scrollable<'a, Message, Renderer> {
/// Sets the style of the [`Scrollable`] .
pub fn style(
mut self,
- style_sheet: impl Into<Box<dyn StyleSheet + 'a>>,
+ style: impl Into<<Renderer::Theme as StyleSheet>::Style>,
) -> Self {
- self.style_sheet = style_sheet.into();
+ self.style = style.into();
self
}
@@ -428,15 +436,17 @@ pub fn mouse_interaction(
pub fn draw<Renderer>(
state: &State,
renderer: &mut Renderer,
+ theme: &Renderer::Theme,
layout: Layout<'_>,
cursor_position: Point,
scrollbar_width: u16,
scrollbar_margin: u16,
scroller_width: u16,
- style_sheet: &dyn StyleSheet,
+ style: <Renderer::Theme as StyleSheet>::Style,
draw_content: impl FnOnce(&mut Renderer, Layout<'_>, Point, &Rectangle),
) where
Renderer: crate::Renderer,
+ Renderer::Theme: StyleSheet,
{
let bounds = layout.bounds();
let content_layout = layout.children().next().unwrap();
@@ -482,11 +492,11 @@ pub fn draw<Renderer>(
});
let style = if state.is_scroller_grabbed() {
- style_sheet.dragging()
+ theme.dragging(style)
} else if is_mouse_over_scrollbar {
- style_sheet.hovered()
+ theme.hovered(style)
} else {
- style_sheet.active()
+ theme.active(style)
};
let is_scrollbar_visible =
@@ -618,6 +628,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Scrollable<'a, Message, Renderer>
where
Renderer: crate::Renderer,
+ Renderer::Theme: StyleSheet,
{
fn width(&self) -> Length {
Widget::<Message, Renderer>::width(&self.content)
@@ -711,12 +722,13 @@ where
draw(
&self.state,
renderer,
+ theme,
layout,
cursor_position,
self.scrollbar_width,
self.scrollbar_margin,
self.scroller_width,
- self.style_sheet.as_ref(),
+ self.style,
|renderer, layout, cursor_position, viewport| {
self.content.draw(
renderer,
@@ -916,8 +928,9 @@ struct Scroller {
impl<'a, Message, Renderer> From<Scrollable<'a, Message, Renderer>>
for Element<'a, Message, Renderer>
where
- Renderer: 'a + crate::Renderer,
Message: 'a,
+ Renderer: 'a + crate::Renderer,
+ Renderer::Theme: StyleSheet,
{
fn from(
scrollable: Scrollable<'a, Message, Renderer>,