Add filter_format field for Column in pickers

Add the option to provide a formatting function for the filtering of
picker columns that is separate from the formatting function for
displaying it in the view.
Use this new option for the "path" column of the workspace diagnostics
picker, so that we are filtering on the full (relative) file path,
instead of the truncated value.

Fixes #13608
pull/13912/head
Peter Retzlaff 2025-07-08 09:38:31 +02:00
parent 479c3b5584
commit 9206f0a876
No known key found for this signature in database
2 changed files with 22 additions and 3 deletions

View File

@ -281,6 +281,16 @@ fn diag_picker(
} else { } else {
Default::default() Default::default()
} }
})
.with_filter_format(|item: &PickerDiagnostic, _| {
if let Some(path) = item.location.uri.as_path() {
path::get_relative_path(path)
.to_string_lossy()
.to_string()
.into()
} else {
Default::default()
}
}), }),
); );
primary_column += 1; primary_column += 1;

View File

@ -137,7 +137,7 @@ fn inject_nucleo_item<T, D>(
) { ) {
injector.push(item, |item, dst| { injector.push(item, |item, dst| {
for (column, text) in columns.iter().filter(|column| column.filter).zip(dst) { for (column, text) in columns.iter().filter(|column| column.filter).zip(dst) {
*text = column.format_text(item, editor_data).into() *text = column.format_filter_text(item, editor_data).into()
} }
}); });
} }
@ -189,6 +189,7 @@ type ColumnFormatFn<T, D> = for<'a> fn(&'a T, &'a D) -> Cell<'a>;
pub struct Column<T, D> { pub struct Column<T, D> {
name: Arc<str>, name: Arc<str>,
format: ColumnFormatFn<T, D>, format: ColumnFormatFn<T, D>,
filter_format: ColumnFormatFn<T, D>,
/// Whether the column should be passed to nucleo for matching and filtering. /// Whether the column should be passed to nucleo for matching and filtering.
/// `DynamicPicker` uses this so that the dynamic column (for example regex in /// `DynamicPicker` uses this so that the dynamic column (for example regex in
/// global search) is not used for filtering twice. /// global search) is not used for filtering twice.
@ -201,6 +202,7 @@ impl<T, D> Column<T, D> {
Self { Self {
name: name.into(), name: name.into(),
format, format,
filter_format: format,
filter: true, filter: true,
hidden: false, hidden: false,
} }
@ -213,6 +215,7 @@ impl<T, D> Column<T, D> {
Self { Self {
name: name.into(), name: name.into(),
format, format,
filter_format: format,
filter: false, filter: false,
hidden: true, hidden: true,
} }
@ -223,12 +226,18 @@ impl<T, D> Column<T, D> {
self self
} }
pub fn with_filter_format(mut self, format_fn: ColumnFormatFn<T, D>) -> Self {
self.filter_format = format_fn;
self
}
fn format<'a>(&self, item: &'a T, data: &'a D) -> Cell<'a> { fn format<'a>(&self, item: &'a T, data: &'a D) -> Cell<'a> {
(self.format)(item, data) (self.format)(item, data)
} }
fn format_text<'a>(&self, item: &'a T, data: &'a D) -> Cow<'a, str> { fn format_filter_text<'a>(&self, item: &'a T, data: &'a D) -> Cow<'a, str> {
let text: String = self.format(item, data).content.into(); let cell = (self.filter_format)(item, data);
let text: String = cell.content.into();
text.into() text.into()
} }
} }