Draft ComboBox and Menu layer
This commit is contained in:
parent
b1afadf1a2
commit
afd9274de2
22 changed files with 966 additions and 150 deletions
|
|
@ -1,4 +1,6 @@
|
|||
//! Organize rendering primitives into a flattened list of layers.
|
||||
mod menu;
|
||||
|
||||
use crate::image;
|
||||
use crate::svg;
|
||||
use crate::triangle;
|
||||
|
|
|
|||
102
graphics/src/layer/menu.rs
Normal file
102
graphics/src/layer/menu.rs
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
use crate::backend::Backend;
|
||||
use crate::{Primitive, Renderer};
|
||||
use iced_native::{
|
||||
layer, mouse, Background, Color, Font, HorizontalAlignment, Point,
|
||||
Rectangle, VerticalAlignment,
|
||||
};
|
||||
|
||||
impl<B> layer::menu::Renderer for Renderer<B>
|
||||
where
|
||||
B: Backend,
|
||||
{
|
||||
fn decorate(
|
||||
&mut self,
|
||||
bounds: Rectangle,
|
||||
_cursor_position: Point,
|
||||
(primitives, mouse_cursor): Self::Output,
|
||||
) -> Self::Output {
|
||||
(
|
||||
Primitive::Group {
|
||||
primitives: vec![
|
||||
Primitive::Quad {
|
||||
bounds,
|
||||
background: Background::Color(
|
||||
[0.87, 0.87, 0.87].into(),
|
||||
),
|
||||
border_color: [0.7, 0.7, 0.7].into(),
|
||||
border_width: 1,
|
||||
border_radius: 0,
|
||||
},
|
||||
primitives,
|
||||
],
|
||||
},
|
||||
mouse_cursor,
|
||||
)
|
||||
}
|
||||
|
||||
fn draw<T: ToString>(
|
||||
&mut self,
|
||||
bounds: Rectangle,
|
||||
cursor_position: Point,
|
||||
options: &[T],
|
||||
hovered_option: Option<usize>,
|
||||
text_size: u16,
|
||||
padding: u16,
|
||||
) -> Self::Output {
|
||||
use std::f32;
|
||||
|
||||
let is_mouse_over = bounds.contains(cursor_position);
|
||||
|
||||
let mut primitives = Vec::new();
|
||||
|
||||
for (i, option) in options.iter().enumerate() {
|
||||
let is_selected = hovered_option == Some(i);
|
||||
|
||||
let bounds = Rectangle {
|
||||
x: bounds.x,
|
||||
y: bounds.y
|
||||
+ ((text_size as usize + padding as usize * 2) * i) as f32,
|
||||
width: bounds.width,
|
||||
height: f32::from(text_size + padding * 2),
|
||||
};
|
||||
|
||||
if is_selected {
|
||||
primitives.push(Primitive::Quad {
|
||||
bounds,
|
||||
background: Background::Color([0.4, 0.4, 1.0].into()),
|
||||
border_color: Color::TRANSPARENT,
|
||||
border_width: 0,
|
||||
border_radius: 0,
|
||||
});
|
||||
}
|
||||
|
||||
primitives.push(Primitive::Text {
|
||||
content: option.to_string(),
|
||||
bounds: Rectangle {
|
||||
x: bounds.x + f32::from(padding),
|
||||
y: bounds.center_y(),
|
||||
width: f32::INFINITY,
|
||||
..bounds
|
||||
},
|
||||
size: f32::from(text_size),
|
||||
font: Font::Default,
|
||||
color: if is_selected {
|
||||
Color::WHITE
|
||||
} else {
|
||||
Color::BLACK
|
||||
},
|
||||
horizontal_alignment: HorizontalAlignment::Left,
|
||||
vertical_alignment: VerticalAlignment::Center,
|
||||
});
|
||||
}
|
||||
|
||||
(
|
||||
Primitive::Group { primitives },
|
||||
if is_mouse_over {
|
||||
mouse::Interaction::Pointer
|
||||
} else {
|
||||
mouse::Interaction::default()
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
//! for [`iced`].
|
||||
//!
|
||||
//! [`iced`]: https://github.com/hecrj/iced
|
||||
#![deny(missing_docs)]
|
||||
//#![deny(missing_docs)]
|
||||
#![deny(missing_debug_implementations)]
|
||||
#![deny(unused_results)]
|
||||
#![deny(unsafe_code)]
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
//! ```
|
||||
pub mod button;
|
||||
pub mod checkbox;
|
||||
pub mod combo_box;
|
||||
pub mod container;
|
||||
pub mod image;
|
||||
pub mod pane_grid;
|
||||
|
|
|
|||
67
graphics/src/widget/combo_box.rs
Normal file
67
graphics/src/widget/combo_box.rs
Normal file
|
|
@ -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()
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue