Render arrow icon in `ComboBox`

This commit is contained in:
Héctor Ramón Jiménez 2020-04-18 19:53:27 +02:00
parent ada8d7c77f
commit e29feef8ba
7 changed files with 51 additions and 22 deletions

View File

@ -193,6 +193,7 @@ impl iced_graphics::Backend for Backend {
impl backend::Text for Backend { impl backend::Text for Backend {
const ICON_FONT: Font = font::ICONS; const ICON_FONT: Font = font::ICONS;
const CHECKMARK_ICON: char = font::CHECKMARK_ICON; const CHECKMARK_ICON: char = font::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON;
fn default_size(&self) -> u16 { fn default_size(&self) -> u16 {
self.default_text_size self.default_text_size

Binary file not shown.

View File

@ -22,9 +22,14 @@ pub trait Text {
/// The `char` representing a ✔ icon in the [`ICON_FONT`]. /// The `char` representing a ✔ icon in the [`ICON_FONT`].
/// ///
/// [`ICON_FONT`]: #associatedconst.ICON_FONt /// [`ICON_FONT`]: #associatedconst.ICON_FONT
const CHECKMARK_ICON: char; 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. /// Returns the default size of text.
fn default_size(&self) -> u16; fn default_size(&self) -> u16;

View File

@ -31,3 +31,9 @@ pub const ICONS: iced_native::Font = iced_native::Font::External {
#[cfg(feature = "font-icons")] #[cfg(feature = "font-icons")]
#[cfg_attr(docsrs, doc(cfg(feature = "font-icons")))] #[cfg_attr(docsrs, doc(cfg(feature = "font-icons")))]
pub const CHECKMARK_ICON: char = '\u{F00C}'; 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}';

View File

@ -35,27 +35,41 @@ where
border_radius: 0, border_radius: 0,
}; };
( let arrow_down = Primitive::Text {
if let Some(label) = selected { content: B::ARROW_DOWN_ICON.to_string(),
let label = Primitive::Text { font: B::ICON_FONT,
content: label, size: bounds.height * 0.7,
size: f32::from(text_size), bounds: Rectangle {
font: Font::Default, x: bounds.x + bounds.width - f32::from(padding) * 2.0,
color: Color::BLACK, y: bounds.center_y(),
bounds: Rectangle { ..bounds
x: bounds.x + f32::from(padding), },
y: bounds.center_y(), color: Color::BLACK,
..bounds horizontal_alignment: HorizontalAlignment::Right,
}, vertical_alignment: VerticalAlignment::Center,
horizontal_alignment: HorizontalAlignment::Left, };
vertical_alignment: VerticalAlignment::Center,
};
Primitive::Group { (
primitives: vec![background, label], Primitive::Group {
} primitives: if let Some(label) = selected {
} else { let label = Primitive::Text {
background 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,
};
vec![background, label, arrow_down]
} else {
vec![background, arrow_down]
},
}, },
if is_mouse_over { if is_mouse_over {
mouse::Interaction::Pointer mouse::Interaction::Pointer

View File

@ -126,7 +126,9 @@ where
let size = { let size = {
let intrinsic = Size::new( let intrinsic = Size::new(
max_width as f32 + f32::from(text_size), max_width as f32
+ f32::from(text_size)
+ f32::from(self.padding),
f32::from(text_size), f32::from(text_size),
); );

View File

@ -248,6 +248,7 @@ impl iced_graphics::Backend for Backend {
impl backend::Text for Backend { impl backend::Text for Backend {
const ICON_FONT: Font = font::ICONS; const ICON_FONT: Font = font::ICONS;
const CHECKMARK_ICON: char = font::CHECKMARK_ICON; const CHECKMARK_ICON: char = font::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON;
fn default_size(&self) -> u16 { fn default_size(&self) -> u16 {
self.default_text_size self.default_text_size