Inline Handle::content for simplicity and efficiency
We can avoid downcasting `state` :^)
This commit is contained in:
parent
fee1ab69e2
commit
7f1d58aa45
1 changed files with 22 additions and 31 deletions
|
|
@ -224,7 +224,7 @@ where
|
||||||
self.selected.as_ref(),
|
self.selected.as_ref(),
|
||||||
&self.handle,
|
&self.handle,
|
||||||
&self.style,
|
&self.style,
|
||||||
tree.state.downcast_ref::<State<T>>(),
|
|| tree.state.downcast_ref::<State<T>>(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -325,32 +325,6 @@ impl<Font> Default for Handle<Font> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Font: Clone> Handle<Font> {
|
|
||||||
fn content<Renderer: text::Renderer<Font = Font>>(
|
|
||||||
&self,
|
|
||||||
is_open: bool,
|
|
||||||
) -> Option<(Font, char, Option<u16>)> {
|
|
||||||
match self {
|
|
||||||
Self::Arrow { size } => {
|
|
||||||
Some((Renderer::ICON_FONT, Renderer::ARROW_DOWN_ICON, *size))
|
|
||||||
}
|
|
||||||
Self::Static(Icon {
|
|
||||||
font,
|
|
||||||
code_point,
|
|
||||||
size,
|
|
||||||
}) => Some((font.clone(), *code_point, *size)),
|
|
||||||
Self::Dynamic { open, closed } => {
|
|
||||||
if is_open {
|
|
||||||
Some((open.font.clone(), open.code_point, open.size))
|
|
||||||
} else {
|
|
||||||
Some((closed.font.clone(), closed.code_point, closed.size))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Self::None => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The icon of a [`Handle`].
|
/// The icon of a [`Handle`].
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Icon<Font> {
|
pub struct Icon<Font> {
|
||||||
|
|
@ -593,7 +567,7 @@ pub fn draw<'a, T, Renderer>(
|
||||||
selected: Option<&T>,
|
selected: Option<&T>,
|
||||||
handle: &Handle<Renderer::Font>,
|
handle: &Handle<Renderer::Font>,
|
||||||
style: &<Renderer::Theme as StyleSheet>::Style,
|
style: &<Renderer::Theme as StyleSheet>::Style,
|
||||||
state: &State<T>,
|
state: impl FnOnce() -> &'a State<T>,
|
||||||
) where
|
) where
|
||||||
Renderer: text::Renderer,
|
Renderer: text::Renderer,
|
||||||
Renderer::Theme: StyleSheet,
|
Renderer::Theme: StyleSheet,
|
||||||
|
|
@ -619,9 +593,26 @@ pub fn draw<'a, T, Renderer>(
|
||||||
style.background,
|
style.background,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some((font, code_point, size)) =
|
let handle = match handle {
|
||||||
handle.content::<Renderer>(state.is_open)
|
Handle::Arrow { size } => {
|
||||||
{
|
Some((Renderer::ICON_FONT, Renderer::ARROW_DOWN_ICON, *size))
|
||||||
|
}
|
||||||
|
Handle::Static(Icon {
|
||||||
|
font,
|
||||||
|
code_point,
|
||||||
|
size,
|
||||||
|
}) => Some((font.clone(), *code_point, *size)),
|
||||||
|
Handle::Dynamic { open, closed } => {
|
||||||
|
if state().is_open {
|
||||||
|
Some((open.font.clone(), open.code_point, open.size))
|
||||||
|
} else {
|
||||||
|
Some((closed.font.clone(), closed.code_point, closed.size))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Handle::None => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some((font, code_point, size)) = handle {
|
||||||
let size = f32::from(size.unwrap_or_else(|| renderer.default_size()));
|
let size = f32::from(size.unwrap_or_else(|| renderer.default_size()));
|
||||||
|
|
||||||
renderer.fill_text(Text {
|
renderer.fill_text(Text {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue