From 0974e9e86523174e7a07d992b48d681aa07d4a7e Mon Sep 17 00:00:00 2001 From: Casper Rogild Storm <2248455+casperstorm@users.noreply.github.com> Date: Tue, 29 Nov 2022 11:36:00 +0100 Subject: Added ability to customize accessory content. --- native/src/widget/pick_list.rs | 98 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 14 deletions(-) (limited to 'native/src/widget') diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index a6459cd6..9fc92496 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -20,6 +20,60 @@ use std::borrow::Cow; pub use iced_style::pick_list::{Appearance, StyleSheet}; +/// The content to the right side of the [`PickList`]. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum AccessoryContent +where + Renderer: text::Renderer, +{ + /// Default accessory content. + Default { + /// Font size of the content. + size: Option, + }, + /// Custom accessory content. + Custom { + /// Font which will be used in the accessory content. + font: Renderer::Font, + /// Content which will be shown. + content: String, + /// Font size of the content. + size: Option, + }, + /// No accessory content will be shown. + None, +} + +impl Default for AccessoryContent +where + Renderer: text::Renderer, +{ + fn default() -> Self { + Self::Default { size: None } + } +} + +impl AccessoryContent +where + Renderer: text::Renderer, +{ + fn content(&self) -> Option<(Renderer::Font, String, Option)> { + match self { + AccessoryContent::Default { size } => Some(( + Renderer::ICON_FONT, + Renderer::ARROW_DOWN_ICON.to_string(), + *size, + )), + AccessoryContent::Custom { + font, + content, + size, + } => Some((font.clone(), content.clone(), *size)), + AccessoryContent::None => None, + } + } +} + /// A widget for selecting a single value from a list of options. #[allow(missing_debug_implementations)] pub struct PickList<'a, T, Message, Renderer> @@ -36,6 +90,7 @@ where padding: Padding, text_size: Option, font: Renderer::Font, + accessory_content: AccessoryContent, style: ::Style, } @@ -67,9 +122,10 @@ where placeholder: None, selected, width: Length::Shrink, - text_size: None, padding: Self::DEFAULT_PADDING, + text_size: None, font: Default::default(), + accessory_content: Default::default(), style: Default::default(), } } @@ -104,6 +160,15 @@ where self } + /// Sets the [`AccessoryContent`] of the [`PickList`]. + pub fn accessory_content( + mut self, + accessory_content: AccessoryContent, + ) -> Self { + self.accessory_content = accessory_content; + self + } + /// Sets the style of the [`PickList`]. pub fn style( mut self, @@ -541,19 +606,24 @@ pub fn draw( style.background, ); - renderer.fill_text(Text { - content: &Renderer::ARROW_DOWN_ICON.to_string(), - font: Renderer::ICON_FONT, - size: bounds.height * style.icon_size, - bounds: Rectangle { - x: bounds.x + bounds.width - f32::from(padding.horizontal()), - y: bounds.center_y(), - ..bounds - }, - color: style.text_color, - horizontal_alignment: alignment::Horizontal::Right, - vertical_alignment: alignment::Vertical::Center, - }); + if let Some((font, content, size)) = accessory_content.content() { + let size = f32::from(size.unwrap_or_else(|| renderer.default_size())); + + renderer.fill_text(Text { + content: &content, + size, + font, + color: style.text_color, + bounds: Rectangle { + x: bounds.x + bounds.width - f32::from(padding.horizontal()), + y: bounds.center_y() - size / 2.0, + height: size, + ..bounds + }, + horizontal_alignment: alignment::Horizontal::Right, + vertical_alignment: alignment::Vertical::Top, + }); + } let label = selected.map(ToString::to_string); -- cgit