diff options
author | 2023-02-14 07:09:24 +0100 | |
---|---|---|
committer | 2023-02-14 07:09:24 +0100 | |
commit | 7f1d58aa4591eba40dd6f3e6bc2869dcdc3e9adb (patch) | |
tree | 36171b72b9f918992147f16b5960047a001d54a3 /native/src/widget | |
parent | fee1ab69e2bab01e5d736540be8b253ff62c3e5e (diff) | |
download | iced-7f1d58aa4591eba40dd6f3e6bc2869dcdc3e9adb.tar.gz iced-7f1d58aa4591eba40dd6f3e6bc2869dcdc3e9adb.tar.bz2 iced-7f1d58aa4591eba40dd6f3e6bc2869dcdc3e9adb.zip |
Inline `Handle::content` for simplicity and efficiency
We can avoid downcasting `state` :^)
Diffstat (limited to 'native/src/widget')
-rw-r--r-- | native/src/widget/pick_list.rs | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 8189dd61..b1cdfad4 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -224,7 +224,7 @@ where self.selected.as_ref(), &self.handle, &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`]. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Icon<Font> { @@ -593,7 +567,7 @@ pub fn draw<'a, T, Renderer>( selected: Option<&T>, handle: &Handle<Renderer::Font>, style: &<Renderer::Theme as StyleSheet>::Style, - state: &State<T>, + state: impl FnOnce() -> &'a State<T>, ) where Renderer: text::Renderer, Renderer::Theme: StyleSheet, @@ -619,9 +593,26 @@ pub fn draw<'a, T, Renderer>( style.background, ); - if let Some((font, code_point, size)) = - handle.content::<Renderer>(state.is_open) - { + let handle = match handle { + 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())); renderer.fill_text(Text { |