use std::path::PathBuf;
use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use std::thread::JoinHandle;
use hjkl_buffer::Buffer;
use crate::preview::PreviewSpans;
pub enum PickerAction {
OpenPath(PathBuf),
OpenPathAtLine(PathBuf, u32),
SwitchSlot(usize),
None,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum RequeryMode {
FilterInMemory,
Spawn,
}
pub trait PickerLogic: Send + 'static {
fn title(&self) -> &str;
fn item_count(&self) -> usize;
fn label(&self, idx: usize) -> String;
fn match_text(&self, idx: usize) -> String;
fn has_preview(&self) -> bool {
true
}
fn preview(&self, idx: usize) -> (Buffer, String, PreviewSpans) {
let _ = idx;
(Buffer::new(), String::new(), PreviewSpans::default())
}
fn preview_top_row(&self, idx: usize) -> usize {
let _ = idx;
0
}
fn preview_match_row(&self, idx: usize) -> Option<usize> {
let _ = idx;
None
}
fn preview_line_offset(&self, idx: usize) -> usize {
let _ = idx;
0
}
fn select(&self, idx: usize) -> PickerAction;
fn requery_mode(&self) -> RequeryMode {
RequeryMode::FilterInMemory
}
fn label_match_positions(&self, idx: usize, query: &str, label: &str) -> Option<Vec<usize>> {
let _ = (idx, query, label);
None
}
fn enumerate(&mut self, query: Option<&str>, cancel: Arc<AtomicBool>)
-> Option<JoinHandle<()>>;
}
pub enum PickerEvent {
None,
Cancel,
Select(PickerAction),
}
pub(crate) struct FilteredEntry {
pub idx: usize,
pub matches: Vec<usize>,
}