Fix shift click sorting when items sorted by name, fixes #1135

This commit is contained in:
Jeremy Soller 2025-10-20 14:03:45 -06:00
parent 0c081b79fd
commit e2c446b73a
No known key found for this signature in database
GPG key ID: 670FDFB5428E05CA

View file

@ -3007,20 +3007,8 @@ impl Tab {
.select_range .select_range
.map_or(Some((click_i, click_i)), |r| Some((r.0, click_i))); .map_or(Some((click_i, click_i)), |r| Some((r.0, click_i)));
if let Some(range) = self.select_range { if let Some(range) = self.select_range {
let min = range.0.min(range.1); let range_min = range.0.min(range.1);
let max = range.0.max(range.1); let range_max = range.0.max(range.1);
let (sort_name, sort_direction, _) = self.sort_options();
//TODO: this assumes the default sort order!
if sort_name == HeadingOptions::Name && sort_direction {
// A default/unsorted tab's view is consistent with how the
// Items are laid out internally (items_opt), so Items can be
// linearly selected
if let Some(ref mut items) = self.items_opt {
for item in items.iter_mut().skip(min).take(max - min + 1) {
item.selected = true;
}
}
} else {
// A sorted tab's items can't be linearly selected // A sorted tab's items can't be linearly selected
// Let's say we have: // Let's say we have:
// index | file // index | file
@ -3052,13 +3040,13 @@ impl Tab {
// a sorted tab. // a sorted tab.
let min = indices let min = indices
.iter() .iter()
.position(|&offset| offset == min) .position(|&offset| offset == range_min)
.unwrap_or_default(); .unwrap_or_default();
// We can't skip `min_real` elements here because the index of // We can't skip `min_real` elements here because the index of
// `max` may actually be before `min` in a sorted tab // `max` may actually be before `min` in a sorted tab
let max = indices let max = indices
.iter() .iter()
.position(|&offset| offset == max) .position(|&offset| offset == range_max)
.unwrap_or(indices.len()); .unwrap_or(indices.len());
let min_real = min.min(max); let min_real = min.min(max);
let max_real = max.max(min); let max_real = max.max(min);
@ -3075,7 +3063,6 @@ impl Tab {
} }
} }
} }
}
self.clicked = click_i_opt; self.clicked = click_i_opt;
self.select_focus = click_i_opt; self.select_focus = click_i_opt;
self.selected_clicked = true; self.selected_clicked = true;