Inline Handle::content for simplicity and efficiency

We can avoid downcasting `state` :^)
This commit is contained in:
Héctor Ramón Jiménez 2023-02-14 07:09:24 +01:00
parent fee1ab69e2
commit 7f1d58aa45
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -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 {