Move layout metrics into theme and apply audit cleanups
This commit is contained in:
@@ -197,16 +197,31 @@ impl RenderOnce for Sidebar {
|
||||
|
||||
let scroll_area_id = (self.id.clone(), "entries");
|
||||
|
||||
// Entry paint reads the theme through this borrow.
|
||||
let row_count = entries
|
||||
.iter()
|
||||
.filter(|entry| matches!(entry, SidebarEntry::Row { .. }))
|
||||
.count();
|
||||
|
||||
let mut row_position = 0usize;
|
||||
let children: Vec<AnyElement> = entries
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(index, entry)| {
|
||||
let is_row = matches!(entry, SidebarEntry::Row { .. });
|
||||
if is_row {
|
||||
row_position += 1;
|
||||
}
|
||||
let (position_in_set, size_of_set) = if is_row {
|
||||
(row_position, row_count)
|
||||
} else {
|
||||
(0, 0)
|
||||
};
|
||||
render_entry(
|
||||
cx,
|
||||
entry,
|
||||
index,
|
||||
entries.len(),
|
||||
position_in_set,
|
||||
size_of_set,
|
||||
self.selected == Some(index),
|
||||
material,
|
||||
&self.on_change,
|
||||
@@ -258,7 +273,8 @@ fn render_entry(
|
||||
cx: &App,
|
||||
entry: &SidebarEntry,
|
||||
index: usize,
|
||||
count: usize,
|
||||
position_in_set: usize,
|
||||
size_of_set: usize,
|
||||
selected: bool,
|
||||
material: bool,
|
||||
on_change: &Option<ChangeHandler>,
|
||||
@@ -294,8 +310,8 @@ fn render_entry(
|
||||
.rounded(theme.radius.sm)
|
||||
.role(Role::ListItem)
|
||||
.aria_selected(selected)
|
||||
.aria_position_in_set(index + 1)
|
||||
.aria_size_of_set(count)
|
||||
.aria_position_in_set(position_in_set)
|
||||
.aria_size_of_set(size_of_set)
|
||||
.map(|row| {
|
||||
if material && !*row_disabled {
|
||||
if selected {
|
||||
|
||||
@@ -214,7 +214,6 @@ impl RenderOnce for Tabs {
|
||||
cx,
|
||||
tab,
|
||||
index,
|
||||
self.selected == index,
|
||||
self.selected,
|
||||
self.variant,
|
||||
&self.on_change,
|
||||
@@ -272,7 +271,6 @@ fn render_tab(
|
||||
cx: &App,
|
||||
tab: Tab,
|
||||
index: usize,
|
||||
selected: bool,
|
||||
selected_index: usize,
|
||||
variant: TabsVariant,
|
||||
on_change: &Option<ChangeHandler>,
|
||||
@@ -280,6 +278,7 @@ fn render_tab(
|
||||
focus: &gpui::FocusHandle,
|
||||
) -> AnyElement {
|
||||
let mut tab = tab;
|
||||
let selected = index == selected_index;
|
||||
|
||||
let theme = cx.theme();
|
||||
let metrics = theme.sizes.resolve(Size::default());
|
||||
|
||||
+42
-6
@@ -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| {
|
||||
|
||||
Reference in New Issue
Block a user