chore: reduce component overhead (#3)

Reviewed-on: reya/gpui-native-kit#3
This commit is contained in:
2026-11-09 10:09:56 +00:00
parent 6815585528
commit 1c091db699
44 changed files with 1376 additions and 1241 deletions
+42 -6
View File
@@ -166,14 +166,49 @@ impl RenderOnce for Tree {
.clone()
.unwrap_or_else(|| SharedString::from(self.id.to_string()));
let sibling_sets: Vec<(usize, usize)> = {
let mut sets = vec![(0usize, 0usize); items.len()];
let mut start = 0usize;
while start < items.len() {
let depth = items[start].depth;
let mut end = start + 1;
while end < items.len() && items[end].depth > depth {
end += 1;
}
let mut position = 0usize;
for index in start..end {
if items[index].depth == depth {
position += 1;
sets[index] = (position, 0);
}
}
for index in start..end {
if items[index].depth == depth {
sets[index].1 = position;
}
}
start = end;
}
sets
};
let rows: Vec<AnyElement> = items
.iter()
.enumerate()
.map(|(index, _item)| {
let (position_in_set, size_of_set) = sibling_sets[index];
render_row(
cx,
&items,
&items[index],
index,
position_in_set,
size_of_set,
self.selected == Some(index),
&self.on_change,
&self.on_disclosure,
@@ -228,21 +263,21 @@ impl RenderOnce for Tree {
}
}
#[allow(clippy::too_many_arguments)]
fn render_row(
cx: &App,
items: &[TreeItem],
item: &TreeItem,
index: usize,
position_in_set: usize,
size_of_set: usize,
selected: bool,
on_change: &Option<ChangeHandler>,
on_disclosure: &Option<DisclosureHandler>,
focus: &FocusHandle,
) -> AnyElement {
let theme = cx.theme();
let item = &items[index];
let count = items.len();
let label_color = selectable_label_color(cx, selected, item.disabled);
let disabled = item.disabled;
// One indent step per depth level, on the theme's horizontal padding.
let indent = theme.sizes.medium.padding_x * (item.depth as f32 + 1.0);
@@ -258,7 +293,8 @@ fn render_row(
.role(Role::TreeItem)
.aria_selected(selected)
.aria_level(item.depth + 1)
.aria_size_of_set(count)
.aria_position_in_set(position_in_set)
.aria_size_of_set(size_of_set)
.when(item.expandable, |row| row.aria_expanded(item.expanded))
.map(|row| paint_selectable_row(cx, row, selected, disabled))
.when(!disabled, |row| {