perf(stack): reduce allocations in Tabs::new
This commit is contained in:
parent
26400b5fcd
commit
a6c26b0bde
1 changed files with 66 additions and 79 deletions
|
|
@ -114,92 +114,79 @@ 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()
|
let rule = if activated {
|
||||||
.enumerate()
|
TabRuleTheme::ActiveActivated
|
||||||
.map(|(i, tab)| {
|
} else {
|
||||||
let rule = if activated {
|
TabRuleTheme::ActiveDeactivated
|
||||||
TabRuleTheme::ActiveActivated
|
};
|
||||||
} else {
|
|
||||||
TabRuleTheme::ActiveDeactivated
|
|
||||||
};
|
|
||||||
|
|
||||||
let tab = if i == active {
|
let tab = if i == active {
|
||||||
tab.rule_style(rule)
|
tab.rule_style(rule)
|
||||||
.background_style(if activated {
|
.background_style(if activated {
|
||||||
TabBackgroundTheme::ActiveActivated
|
TabBackgroundTheme::ActiveActivated
|
||||||
} else {
|
|
||||||
TabBackgroundTheme::ActiveDeactivated
|
|
||||||
})
|
|
||||||
.font(cosmic::font::FONT_SEMIBOLD)
|
|
||||||
.active()
|
|
||||||
} else if i.checked_sub(1) == Some(active) {
|
|
||||||
tab.rule_style(rule).non_active()
|
|
||||||
} else {
|
|
||||||
tab.non_active()
|
|
||||||
};
|
|
||||||
|
|
||||||
Element::new(tab.internal(i))
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
tabs.push(
|
|
||||||
widget::vertical_rule(4)
|
|
||||||
.style(if tabs.len() - 1 == active {
|
|
||||||
if activated {
|
|
||||||
TabRuleTheme::ActiveActivated
|
|
||||||
} else {
|
} else {
|
||||||
TabRuleTheme::ActiveDeactivated
|
TabBackgroundTheme::ActiveDeactivated
|
||||||
}
|
})
|
||||||
} else {
|
.font(cosmic::font::FONT_SEMIBOLD)
|
||||||
TabRuleTheme::Default
|
.active()
|
||||||
})
|
} else if i.checked_sub(1) == Some(active) {
|
||||||
.into(),
|
tab.rule_style(rule).non_active()
|
||||||
);
|
} else {
|
||||||
|
tab.non_active()
|
||||||
|
};
|
||||||
|
|
||||||
|
Element::new(tab.internal(i))
|
||||||
|
});
|
||||||
|
|
||||||
|
let tabs_rule = widget::vertical_rule(4).style(if tabs.len() - 1 == active {
|
||||||
|
if activated {
|
||||||
|
TabRuleTheme::ActiveActivated
|
||||||
|
} else {
|
||||||
|
TabRuleTheme::ActiveDeactivated
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TabRuleTheme::Default
|
||||||
|
});
|
||||||
|
|
||||||
|
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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue