diff options
author | 2021-10-28 15:49:05 +0700 | |
---|---|---|
committer | 2021-10-28 15:49:05 +0700 | |
commit | 8740891feb4439e700276a851dcfb660475ed047 (patch) | |
tree | 11f275df4ba404365630caf15a453ce44fd8c14a /native/src/widget | |
parent | fe4dfeafdbc8f427bd351f394d27f606a3843b44 (diff) | |
download | iced-8740891feb4439e700276a851dcfb660475ed047.tar.gz iced-8740891feb4439e700276a851dcfb660475ed047.tar.bz2 iced-8740891feb4439e700276a851dcfb660475ed047.zip |
Implement `Widget::draw` for `PickList`
Diffstat (limited to 'native/src/widget')
-rw-r--r-- | native/src/widget/pick_list.rs | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 81bd41c4..57375a72 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -1,4 +1,5 @@ //! Display a dropdown list of selectable values. +use crate::alignment; use crate::event::{self, Event}; use crate::keyboard; use crate::layout; @@ -6,6 +7,7 @@ use crate::mouse; use crate::overlay; use crate::overlay::menu::{self, Menu}; use crate::renderer; +use crate::renderer::text; use crate::touch; use crate::{ Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, @@ -327,11 +329,69 @@ where fn draw( &self, renderer: &mut Renderer, - style: &renderer::Style, + _style: &renderer::Style, layout: Layout<'_>, cursor_position: Point, _viewport: &Rectangle, ) { + let bounds = layout.bounds(); + let is_mouse_over = bounds.contains(cursor_position); + let is_selected = self.selected.is_some(); + + let style = if is_mouse_over { + self.style_sheet.hovered() + } else { + self.style_sheet.active() + }; + + renderer.fill_rectangle(renderer::Quad { + bounds, + background: style.background, + border_color: style.border_color, + border_width: style.border_width, + border_radius: style.border_radius, + }); + + renderer.fill_text(text::Section { + 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(self.padding.horizontal()), + y: bounds.center_y(), + ..bounds + }, + color: style.text_color, + horizontal_alignment: alignment::Horizontal::Right, + vertical_alignment: alignment::Vertical::Center, + }); + + if let Some(label) = self + .selected + .as_ref() + .map(ToString::to_string) + .as_ref() + .or_else(|| self.placeholder.as_ref()) + { + renderer.fill_text(text::Section { + content: label, + size: f32::from( + self.text_size.unwrap_or(renderer.default_size()), + ), + font: self.font, + color: is_selected + .then(|| style.text_color) + .unwrap_or(style.placeholder_color), + bounds: Rectangle { + x: bounds.x + f32::from(self.padding.left), + y: bounds.center_y(), + ..bounds + }, + horizontal_alignment: alignment::Horizontal::Left, + vertical_alignment: alignment::Vertical::Center, + }) + } } fn overlay( |