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
.map_or(Some((click_i, click_i)), |r| Some((r.0, click_i)));
if let Some(range) = self.select_range {
let min = range.0.min(range.1);
let 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 {
let range_min = range.0.min(range.1);
let range_max = range.0.max(range.1);
// A sorted tab's items can't be linearly selected
// Let's say we have:
// index | file
@ -3052,13 +3040,13 @@ impl Tab {
// a sorted tab.
let min = indices
.iter()
.position(|&offset| offset == min)
.position(|&offset| offset == range_min)
.unwrap_or_default();
// We can't skip `min_real` elements here because the index of
// `max` may actually be before `min` in a sorted tab
let max = indices
.iter()
.position(|&offset| offset == max)
.position(|&offset| offset == range_max)
.unwrap_or(indices.len());
let min_real = min.min(max);
let max_real = max.max(min);
@ -3075,7 +3063,6 @@ impl Tab {
}
}
}
}
self.clicked = click_i_opt;
self.select_focus = click_i_opt;
self.selected_clicked = true;