summaryrefslogtreecommitdiffstats
path: root/native/src/widget
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-10-28 15:49:05 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-10-28 15:49:05 +0700
commit8740891feb4439e700276a851dcfb660475ed047 (patch)
tree11f275df4ba404365630caf15a453ce44fd8c14a /native/src/widget
parentfe4dfeafdbc8f427bd351f394d27f606a3843b44 (diff)
downloadiced-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.rs62
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(