summaryrefslogtreecommitdiffstats
path: root/native/src/widget
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/widget')
-rw-r--r--native/src/widget/pick_list.rs97
1 files changed, 83 insertions, 14 deletions
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs
index 52cb1ad1..c2853314 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 handle to the right side of the [`PickList`].
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum Handle<Renderer>
+where
+ Renderer: text::Renderer,
+{
+ /// Displays an arrow icon (▼).
+ ///
+ /// This is the default.
+ Arrow {
+ /// Font size of the content.
+ size: Option<u16>,
+ },
+ /// A custom handle.
+ Custom {
+ /// Font that will be used to display the `text`,
+ font: Renderer::Font,
+ /// Text that will be shown.
+ text: String,
+ /// Font size of the content.
+ size: Option<u16>,
+ },
+ /// No handle will be shown.
+ None,
+}
+
+impl<Renderer> Default for Handle<Renderer>
+where
+ Renderer: text::Renderer,
+{
+ fn default() -> Self {
+ Self::Arrow { size: None }
+ }
+}
+
+impl<Renderer> Handle<Renderer>
+where
+ Renderer: text::Renderer,
+{
+ fn content(&self) -> Option<(Renderer::Font, String, Option<u16>)> {
+ match self {
+ Self::Arrow { size } => Some((
+ Renderer::ICON_FONT,
+ Renderer::ARROW_DOWN_ICON.to_string(),
+ *size,
+ )),
+ Self::Custom { font, text, size } => {
+ Some((font.clone(), text.clone(), *size))
+ }
+ Self::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<u16>,
font: Renderer::Font,
+ handle: Handle<Renderer>,
style: <Renderer::Theme as StyleSheet>::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(),
+ handle: Default::default(),
style: Default::default(),
}
}
@@ -104,6 +160,12 @@ where
self
}
+ /// Sets the [`Handle`] of the [`PickList`].
+ pub fn handle(mut self, handle: Handle<Renderer>) -> Self {
+ self.handle = handle;
+ self
+ }
+
/// Sets the style of the [`PickList`].
pub fn style(
mut self,
@@ -214,6 +276,7 @@ where
&self.font,
self.placeholder.as_deref(),
self.selected.as_ref(),
+ &self.handle,
&self.style,
)
}
@@ -515,6 +578,7 @@ pub fn draw<T, Renderer>(
font: &Renderer::Font,
placeholder: Option<&str>,
selected: Option<&T>,
+ handle: &Handle<Renderer>,
style: &<Renderer::Theme as StyleSheet>::Style,
) where
Renderer: text::Renderer,
@@ -541,19 +605,24 @@ pub fn draw<T, Renderer>(
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, text, size)) = handle.content() {
+ let size = f32::from(size.unwrap_or_else(|| renderer.default_size()));
+
+ renderer.fill_text(Text {
+ content: &text,
+ size,
+ font,
+ color: style.handle_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);