Highlight file picker directories with 'ui.text.directory'

This applies the same styling as the parent commit to the file pickers.
This commit is contained in:
Michael Davis 2025-02-18 09:00:54 -05:00
parent 682967d328
commit 7bebe0a70e
No known key found for this signature in database
4 changed files with 37 additions and 16 deletions

View file

@ -157,7 +157,7 @@ impl Application {
// If the first file is a directory, skip it and open a picker
if let Some((first, _)) = files_it.next_if(|(p, _)| p.is_dir()) {
let picker = ui::file_picker(first, &config.load().editor);
let picker = ui::file_picker(&editor, first);
compositor.push(Box::new(overlaid(picker)));
}

View file

@ -1344,7 +1344,7 @@ fn goto_file_impl(cx: &mut Context, action: Action) {
let path = path::expand(&sel);
let path = &rel_path.join(path);
if path.is_dir() {
let picker = ui::file_picker(path.into(), &cx.editor.config());
let picker = ui::file_picker(cx.editor, path.into());
cx.push_layer(Box::new(overlaid(picker)));
} else if let Err(e) = cx.editor.open(path, action) {
cx.editor.set_error(format!("Open file failed: {:?}", e));
@ -1381,7 +1381,7 @@ fn open_url(cx: &mut Context, url: Url, action: Action) {
Ok(_) | Err(_) => {
let path = &rel_path.join(url.path());
if path.is_dir() {
let picker = ui::file_picker(path.into(), &cx.editor.config());
let picker = ui::file_picker(cx.editor, path.into());
cx.push_layer(Box::new(overlaid(picker)));
} else if let Err(e) = cx.editor.open(path, action) {
cx.editor.set_error(format!("Open file failed: {:?}", e));
@ -3001,7 +3001,7 @@ fn file_picker(cx: &mut Context) {
cx.editor.set_error("Workspace directory does not exist");
return;
}
let picker = ui::file_picker(root, &cx.editor.config());
let picker = ui::file_picker(cx.editor, root);
cx.push_layer(Box::new(overlaid(picker)));
}
@ -3018,7 +3018,7 @@ fn file_picker_in_current_buffer_directory(cx: &mut Context) {
}
};
let picker = ui::file_picker(path, &cx.editor.config());
let picker = ui::file_picker(cx.editor, path);
cx.push_layer(Box::new(overlaid(picker)));
}
@ -3029,7 +3029,7 @@ fn file_picker_in_current_directory(cx: &mut Context) {
.set_error("Current working directory does not exist");
return;
}
let picker = ui::file_picker(cwd, &cx.editor.config());
let picker = ui::file_picker(cx.editor, cwd);
cx.push_layer(Box::new(overlaid(picker)));
}

View file

@ -119,7 +119,7 @@ fn open(cx: &mut compositor::Context, args: &[Cow<str>], event: PromptEvent) ->
let callback = async move {
let call: job::Callback = job::Callback::EditorCompositor(Box::new(
move |editor: &mut Editor, compositor: &mut Compositor| {
let picker = ui::file_picker(path.into_owned(), &editor.config());
let picker = ui::file_picker(editor, path.into_owned());
compositor.push(Box::new(overlaid(picker)));
},
));

View file

@ -30,7 +30,7 @@ pub use spinner::{ProgressSpinners, Spinner};
pub use text::Text;
use helix_view::Editor;
use tui::text::Span;
use tui::text::{Span, Spans};
use std::path::Path;
use std::{error::Error, path::PathBuf};
@ -185,12 +185,23 @@ pub fn raw_regex_prompt(
cx.push_layer(Box::new(prompt));
}
type FilePicker = Picker<PathBuf, PathBuf>;
#[derive(Debug)]
pub struct FilePickerData {
root: PathBuf,
directory_style: Style,
}
type FilePicker = Picker<PathBuf, FilePickerData>;
pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePicker {
pub fn file_picker(editor: &Editor, root: PathBuf) -> FilePicker {
use ignore::{types::TypesBuilder, WalkBuilder};
use std::time::Instant;
let config = editor.config();
let data = FilePickerData {
root: root.clone(),
directory_style: editor.theme.get("ui.text.directory"),
};
let now = Instant::now();
let dedup_symlinks = config.file_picker.deduplicate_links;
@ -236,14 +247,24 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
let columns = [PickerColumn::new(
"path",
|item: &PathBuf, root: &PathBuf| {
item.strip_prefix(root)
.unwrap_or(item)
.to_string_lossy()
.into()
|item: &PathBuf, data: &FilePickerData| {
let path = item.strip_prefix(&data.root).unwrap_or(item);
let mut spans = Vec::with_capacity(3);
if let Some(dirs) = path.parent().filter(|p| !p.as_os_str().is_empty()) {
spans.extend([
Span::styled(dirs.to_string_lossy(), data.directory_style),
Span::styled(std::path::MAIN_SEPARATOR_STR, data.directory_style),
]);
}
let filename = path
.file_name()
.expect("normalized paths can't end in `..`")
.to_string_lossy();
spans.push(Span::raw(filename));
Spans::from(spans).into()
},
)];
let picker = Picker::new(columns, 0, [], root, move |cx, path: &PathBuf, action| {
let picker = Picker::new(columns, 0, [], data, move |cx, path: &PathBuf, action| {
if let Err(e) = cx.editor.open(path, action) {
let err = if let Some(err) = e.source() {
format!("{}", err)