summaryrefslogtreecommitdiffstats
path: root/native/src
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
parentce53d3933c860cd958636cce415ac97c04aee746 (diff)
downloadiced-de21a651c0616307bb6bfd36da1a06119e629b10.tar.gz
iced-de21a651c0616307bb6bfd36da1a06119e629b10.tar.bz2
iced-de21a651c0616307bb6bfd36da1a06119e629b10.zip
Implement theme styling for `Scrollable`
Diffstat (limited to 'native/src')
-rw-r--r--native/src/overlay/menu.rs7
-rw-r--r--native/src/widget/pick_list.rs8
-rw-r--r--native/src/widget/scrollable.rs37
3 files changed, 36 insertions, 16 deletions
diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs
index 78d65d13..36dc8f03 100644
--- a/native/src/overlay/menu.rs
+++ b/native/src/overlay/menu.rs
@@ -34,6 +34,7 @@ impl<'a, T, Renderer> Menu<'a, T, Renderer>
where
T: ToString + Clone,
Renderer: text::Renderer + 'a,
+ Renderer::Theme: scrollable::StyleSheet,
{
/// Creates a new [`Menu`] with the given [`State`], a list of options, and
/// the message to produced when an option is selected.
@@ -117,17 +118,19 @@ impl State {
}
}
-struct Overlay<'a, Message, Renderer: text::Renderer> {
+struct Overlay<'a, Message, Renderer> {
container: Container<'a, Message, Renderer>,
width: u16,
target_height: f32,
style: Style,
}
-impl<'a, Message, Renderer: text::Renderer> Overlay<'a, Message, Renderer>
+impl<'a, Message, Renderer> Overlay<'a, Message, Renderer>
where
Message: 'a,
Renderer: 'a,
+ Renderer: text::Renderer,
+ Renderer::Theme: scrollable::StyleSheet,
{
pub fn new<T>(menu: Menu<'a, T, Renderer>, target_height: f32) -> Self
where
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs
index 64a236e7..b19c65ed 100644
--- a/native/src/widget/pick_list.rs
+++ b/native/src/widget/pick_list.rs
@@ -9,6 +9,7 @@ use crate::overlay::menu::{self, Menu};
use crate::renderer;
use crate::text::{self, Text};
use crate::touch;
+use crate::widget::scrollable;
use crate::{
Clipboard, Element, Layout, Length, Padding, Point, Rectangle, Shell, Size,
Widget,
@@ -322,6 +323,7 @@ pub fn overlay<'a, T, Message, Renderer>(
where
Message: 'a,
Renderer: text::Renderer + 'a,
+ Renderer::Theme: scrollable::StyleSheet,
T: Clone + ToString,
{
if state.is_open {
@@ -430,6 +432,7 @@ where
[T]: ToOwned<Owned = Vec<T>>,
Message: 'static,
Renderer: text::Renderer + 'a,
+ Renderer::Theme: scrollable::StyleSheet,
{
fn width(&self) -> Length {
self.width
@@ -490,7 +493,7 @@ where
fn draw(
&self,
renderer: &mut Renderer,
- theme: &Renderer::Theme,
+ _theme: &Renderer::Theme,
_style: &renderer::Style,
layout: Layout<'_>,
cursor_position: Point,
@@ -531,8 +534,9 @@ impl<'a, T: 'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where
T: Clone + ToString + Eq,
[T]: ToOwned<Owned = Vec<T>>,
- Renderer: text::Renderer + 'a,
Message: 'static,
+ Renderer: text::Renderer + 'a,
+ Renderer::Theme: scrollable::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
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>,