From e29feef8ba4f95f286039fcc1ca2e53bfe5019c5 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Sat, 18 Apr 2020 19:53:27 +0200
Subject: Render arrow icon in `ComboBox`

---
 graphics/fonts/Icons.ttf         | Bin 4912 -> 5032 bytes
 graphics/src/backend.rs          |   7 +++++-
 graphics/src/font.rs             |   6 +++++
 graphics/src/widget/combo_box.rs |  52 +++++++++++++++++++++++++--------------
 4 files changed, 45 insertions(+), 20 deletions(-)

(limited to 'graphics')

diff --git a/graphics/fonts/Icons.ttf b/graphics/fonts/Icons.ttf
index 1c832f86..5e455b69 100644
Binary files a/graphics/fonts/Icons.ttf and b/graphics/fonts/Icons.ttf differ
diff --git a/graphics/src/backend.rs b/graphics/src/backend.rs
index b73c636e..dd7dbbc2 100644
--- a/graphics/src/backend.rs
+++ b/graphics/src/backend.rs
@@ -22,9 +22,14 @@ pub trait Text {
 
     /// The `char` representing a ✔ icon in the [`ICON_FONT`].
     ///
-    /// [`ICON_FONT`]: #associatedconst.ICON_FONt
+    /// [`ICON_FONT`]: #associatedconst.ICON_FONT
     const CHECKMARK_ICON: char;
 
+    /// The `char` representing a ▼ icon in the built-in [`ICONS`] font.
+    ///
+    /// [`ICON_FONT`]: #associatedconst.ICON_FONT
+    const ARROW_DOWN_ICON: char;
+
     /// Returns the default size of text.
     fn default_size(&self) -> u16;
 
diff --git a/graphics/src/font.rs b/graphics/src/font.rs
index bcc28857..5c62681c 100644
--- a/graphics/src/font.rs
+++ b/graphics/src/font.rs
@@ -31,3 +31,9 @@ pub const ICONS: iced_native::Font = iced_native::Font::External {
 #[cfg(feature = "font-icons")]
 #[cfg_attr(docsrs, doc(cfg(feature = "font-icons")))]
 pub const CHECKMARK_ICON: char = '\u{F00C}';
+
+/// The `char` representing a ▼ icon in the built-in [`ICONS`] font.
+///
+/// [`ICONS`]: const.ICONS.html
+#[cfg(feature = "font-icons")]
+pub const ARROW_DOWN_ICON: char = '\u{E800}';
diff --git a/graphics/src/widget/combo_box.rs b/graphics/src/widget/combo_box.rs
index 27ea762a..92024c6c 100644
--- a/graphics/src/widget/combo_box.rs
+++ b/graphics/src/widget/combo_box.rs
@@ -35,27 +35,41 @@ where
             border_radius: 0,
         };
 
+        let arrow_down = Primitive::Text {
+            content: B::ARROW_DOWN_ICON.to_string(),
+            font: B::ICON_FONT,
+            size: bounds.height * 0.7,
+            bounds: Rectangle {
+                x: bounds.x + bounds.width - f32::from(padding) * 2.0,
+                y: bounds.center_y(),
+                ..bounds
+            },
+            color: Color::BLACK,
+            horizontal_alignment: HorizontalAlignment::Right,
+            vertical_alignment: VerticalAlignment::Center,
+        };
+
         (
-            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: 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
+                    vec![background, label, arrow_down]
+                } else {
+                    vec![background, arrow_down]
+                },
             },
             if is_mouse_over {
                 mouse::Interaction::Pointer
-- 
cgit