summaryrefslogtreecommitdiffstats
path: root/graphics/src/widget/combo_box.rs
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/src/widget/combo_box.rs')
-rw-r--r--graphics/src/widget/combo_box.rs67
1 files changed, 67 insertions, 0 deletions
diff --git a/graphics/src/widget/combo_box.rs b/graphics/src/widget/combo_box.rs
new file mode 100644
index 00000000..27ea762a
--- /dev/null
+++ b/graphics/src/widget/combo_box.rs
@@ -0,0 +1,67 @@
+use crate::backend::{self, Backend};
+use crate::{Primitive, Renderer};
+use iced_native::{
+ mouse, Background, Color, Font, HorizontalAlignment, Point, Rectangle,
+ VerticalAlignment,
+};
+
+pub use iced_native::ComboBox;
+
+impl<B> iced_native::combo_box::Renderer for Renderer<B>
+where
+ B: Backend + backend::Text,
+{
+ const DEFAULT_PADDING: u16 = 5;
+
+ fn draw(
+ &mut self,
+ bounds: Rectangle,
+ cursor_position: Point,
+ selected: Option<String>,
+ text_size: u16,
+ padding: u16,
+ ) -> Self::Output {
+ let is_mouse_over = bounds.contains(cursor_position);
+
+ let background = Primitive::Quad {
+ bounds,
+ background: Background::Color([0.87, 0.87, 0.87].into()),
+ border_color: if is_mouse_over {
+ Color::BLACK
+ } else {
+ [0.7, 0.7, 0.7].into()
+ },
+ border_width: 1,
+ border_radius: 0,
+ };
+
+ (
+ if let Some(label) = selected {
+ let label = Primitive::Text {
+ content: label,
+ size: f32::from(text_size),
+ font: Font::Default,
+ color: Color::BLACK,
+ bounds: Rectangle {
+ x: bounds.x + f32::from(padding),
+ y: bounds.center_y(),
+ ..bounds
+ },
+ horizontal_alignment: HorizontalAlignment::Left,
+ vertical_alignment: VerticalAlignment::Center,
+ };
+
+ Primitive::Group {
+ primitives: vec![background, label],
+ }
+ } else {
+ background
+ },
+ if is_mouse_over {
+ mouse::Interaction::Pointer
+ } else {
+ mouse::Interaction::default()
+ },
+ )
+ }
+}