perf(stack): reduce allocations in Tabs::new

This commit is contained in:
Michael Aaron Murphy 2024-03-01 15:13:43 +01:00 • committed by Victoria Brekenfeld
parent 26400b5fcd
commit a6c26b0bde

View file

@ -114,15 +114,12 @@ where
Message: TabMessage + 'static, Message: TabMessage + 'static,
{ {
pub fn new( pub fn new(
tabs: impl IntoIterator<Item = Tab<Message>>, tabs: impl ExactSizeIterator<Item = Tab<Message>>,
active: usize, active: usize,
activated: bool, activated: bool,
group_focused: bool, group_focused: bool,
) -> Self { ) -> Self {
let mut tabs = tabs let tabs = tabs.into_iter().enumerate().map(|(i, tab)| {
.into_iter()
.enumerate()
.map(|(i, tab)| {
let rule = if activated { let rule = if activated {
TabRuleTheme::ActiveActivated TabRuleTheme::ActiveActivated
} else { } else {
@ -145,12 +142,9 @@ where
}; };
Element::new(tab.internal(i)) Element::new(tab.internal(i))
}) });
.collect::<Vec<_>>();
tabs.push( let tabs_rule = widget::vertical_rule(4).style(if tabs.len() - 1 == active {
widget::vertical_rule(4)
.style(if tabs.len() - 1 == active {
if activated { if activated {
TabRuleTheme::ActiveActivated TabRuleTheme::ActiveActivated
} else { } else {
@ -158,48 +152,41 @@ where
} }
} else { } else {
TabRuleTheme::Default TabRuleTheme::Default
}) });
.into(),
); let rule_style = if group_focused {
TabRuleTheme::ActiveActivated
} else {
TabRuleTheme::Default
};
let prev_button = from_name("go-previous-symbolic")
.size(16)
.prefer_svg(true)
.icon()
.apply(widget::button)
.style(theme::iced::Button::Text)
.on_press(Message::scroll_back());
let next_button = from_name("go-next-symbolic")
.size(16)
.prefer_svg(true)
.icon()
.apply(widget::button)
.style(theme::iced::Button::Text)
.on_press(Message::scroll_further());
let mut elements = Vec::with_capacity(tabs.len() + 5);
elements.push(widget::vertical_rule(4).style(rule_style).into());
elements.push(prev_button.into());
elements.extend(tabs);
elements.push(tabs_rule.into());
elements.push(next_button.into());
elements.push(widget::vertical_rule(4).style(rule_style).into());
Tabs { Tabs {
elements: vec![ elements,
widget::vertical_rule(4)
.style(if group_focused {
TabRuleTheme::ActiveActivated
} else {
TabRuleTheme::Default
})
.into(),
from_name("go-previous-symbolic")
.size(16)
.prefer_svg(true)
.icon()
.apply(widget::button)
.style(theme::iced::Button::Text)
.on_press(Message::scroll_back())
.into(),
]
.into_iter()
.chain(tabs)
.chain(vec![
from_name("go-next-symbolic")
.size(16)
.prefer_svg(true)
.icon()
.apply(widget::button)
.style(theme::iced::Button::Text)
.on_press(Message::scroll_further())
.into(),
widget::vertical_rule(4)
.style(if group_focused {
TabRuleTheme::ActiveActivated
} else {
TabRuleTheme::Default
})
.into(),
])
.collect(),
id: None, id: None,
width: Length::Fill, width: Length::Fill,
height: Length::Shrink, height: Length::Shrink,
@ -332,7 +319,7 @@ where
} }
fn children(&self) -> Vec<Tree> { fn children(&self) -> Vec<Tree> {
self.elements.iter().map(|elem| Tree::new(elem)).collect() self.elements.iter().map(Tree::new).collect()
} }
fn diff(&mut self, tree: &mut Tree) { fn diff(&mut self, tree: &mut Tree) {