From 61f22b1db23f3495145a9a4f7255311fe8381998 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 11 Jun 2020 20:41:11 +0200 Subject: Add styling support for `ComboBox` and `Menu` --- native/src/overlay/menu.rs | 31 ++++++++++++++++++++++++------- native/src/widget/combo_box.rs | 33 ++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 12 deletions(-) (limited to 'native') diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 05c41181..9c180671 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -10,6 +10,7 @@ pub struct Menu<'a, Message, Renderer: self::Renderer> { is_open: &'a mut bool, width: u16, target_height: f32, + style: ::Style, } #[derive(Default)] @@ -43,6 +44,7 @@ where target_height: f32, text_size: u16, padding: u16, + style: ::Style, ) -> Self where T: Clone + ToString, @@ -55,6 +57,7 @@ where on_selected, text_size, padding, + style.clone(), )), ) .padding(1); @@ -64,6 +67,7 @@ where is_open: &mut state.is_open, width, target_height, + style, } } } @@ -156,11 +160,16 @@ where self.container .draw(renderer, defaults, layout, cursor_position); - renderer.decorate(layout.bounds(), cursor_position, primitives) + renderer.decorate( + layout.bounds(), + cursor_position, + &self.style, + primitives, + ) } } -struct List<'a, T, Message> +struct List<'a, T, Message, Renderer: self::Renderer> where [T]: ToOwned, { @@ -169,9 +178,10 @@ where on_selected: Box Message>, text_size: u16, padding: u16, + style: ::Style, } -impl<'a, T, Message> List<'a, T, Message> +impl<'a, T, Message, Renderer: self::Renderer> List<'a, T, Message, Renderer> where [T]: ToOwned, { @@ -181,6 +191,7 @@ where on_selected: Box Message>, text_size: u16, padding: u16, + style: ::Style, ) -> Self { List { hovered_option, @@ -188,12 +199,13 @@ where on_selected, text_size, padding, + style, } } } -impl<'a, T, Message, Renderer> Widget<'a, Message, Renderer> - for List<'a, T, Message> +impl<'a, T, Message, Renderer: self::Renderer> Widget<'a, Message, Renderer> + for List<'a, T, Message, Renderer> where T: ToString + Clone, [T]: ToOwned, @@ -286,15 +298,19 @@ where *self.hovered_option, self.text_size, self.padding, + &self.style, ) } } pub trait Renderer: scrollable::Renderer + container::Renderer { + type Style: Default + Clone; + fn decorate( &mut self, bounds: Rectangle, cursor_position: Point, + style: &::Style, primitive: Self::Output, ) -> Self::Output; @@ -306,16 +322,17 @@ pub trait Renderer: scrollable::Renderer + container::Renderer { hovered_option: Option, text_size: u16, padding: u16, + style: &::Style, ) -> Self::Output; } impl<'a, T, Message, Renderer> Into> - for List<'a, T, Message> + for List<'a, T, Message, Renderer> where T: ToString + Clone, [T]: ToOwned, Message: 'static, - Renderer: self::Renderer, + Renderer: 'a + self::Renderer, { fn into(self) -> Element<'a, Message, Renderer> { Element::new(self) diff --git a/native/src/widget/combo_box.rs b/native/src/widget/combo_box.rs index 2adee884..df2a530a 100644 --- a/native/src/widget/combo_box.rs +++ b/native/src/widget/combo_box.rs @@ -6,7 +6,7 @@ use crate::{ }; use std::borrow::Cow; -pub struct ComboBox<'a, T, Message> +pub struct ComboBox<'a, T, Message, Renderer: self::Renderer> where [T]: ToOwned>, { @@ -16,6 +16,7 @@ where width: Length, padding: u16, text_size: Option, + style: ::Style, } #[derive(Default)] @@ -28,7 +29,8 @@ pub struct Internal<'a, T, Message> { on_selected: Box Message>, } -impl<'a, T: 'a, Message> ComboBox<'a, T, Message> +impl<'a, T: 'a, Message, Renderer: self::Renderer> + ComboBox<'a, T, Message, Renderer> where T: ToString, [T]: ToOwned>, @@ -48,7 +50,8 @@ where selected, width: Length::Shrink, text_size: None, - padding: 5, + padding: Renderer::DEFAULT_PADDING, + style: ::Style::default(), } } @@ -72,10 +75,21 @@ where self.text_size = Some(size); self } + + /// Sets the style of the [`ComboBox`]. + /// + /// [`ComboBox`]: struct.ComboBox.html + pub fn style( + mut self, + style: impl Into<::Style>, + ) -> Self { + self.style = style.into(); + self + } } impl<'a, T: 'a, Message, Renderer> Widget<'a, Message, Renderer> - for ComboBox<'a, T, Message> + for ComboBox<'a, T, Message, Renderer> where T: Clone + ToString + Eq, [T]: ToOwned>, @@ -196,6 +210,7 @@ where self.selected.as_ref().map(ToString::to_string), self.text_size.unwrap_or(renderer.default_size()), self.padding, + &self.style, ) } @@ -223,6 +238,7 @@ where bounds.height, self.text_size.unwrap_or(20), self.padding, + Renderer::menu_style(&self.style), )), )) } else { @@ -235,8 +251,14 @@ where } pub trait Renderer: text::Renderer + menu::Renderer { + type Style: Default; + const DEFAULT_PADDING: u16; + fn menu_style( + style: &::Style, + ) -> ::Style; + fn draw( &mut self, bounds: Rectangle, @@ -244,11 +266,12 @@ pub trait Renderer: text::Renderer + menu::Renderer { selected: Option, text_size: u16, padding: u16, + style: &::Style, ) -> Self::Output; } impl<'a, T: 'a, Message, Renderer> Into> - for ComboBox<'a, T, Message> + for ComboBox<'a, T, Message, Renderer> where T: Clone + ToString + Eq, [T]: ToOwned>, -- cgit