feat(tasks): allow jumping to task anywhere by exact name match
This commit is contained in:
parent
a0f5d62c81
commit
38fd00b150
19
src/tasks.rs
19
src/tasks.rs
|
@ -563,12 +563,20 @@ impl Tasks {
|
|||
}
|
||||
|
||||
/// Returns ids of tasks starting with the given string.
|
||||
///
|
||||
/// Tries, in order:
|
||||
/// - single case-insensitive exact name match in visible tasks
|
||||
/// - single case-insensitive exact name match in all tasks
|
||||
/// - visible tasks starting with given arg case-sensitive
|
||||
/// - visible tasks where any word starts with given arg case-insensitive
|
||||
pub(crate) fn get_filtered(&self, position: Option<&EventId>, arg: &str) -> Vec<EventId> {
|
||||
if let Ok(id) = EventId::parse(arg) {
|
||||
return vec![id];
|
||||
}
|
||||
let mut filtered: Vec<EventId> = Vec::with_capacity(32);
|
||||
let lowercase_arg = arg.to_ascii_lowercase();
|
||||
let has_space = lowercase_arg.split_ascii_whitespace().count() > 1;
|
||||
|
||||
let mut filtered: Vec<EventId> = Vec::with_capacity(32);
|
||||
let mut filtered_more: Vec<EventId> = Vec::with_capacity(32);
|
||||
for task in self.filtered_tasks(position) {
|
||||
let lowercase = task.event.content.to_ascii_lowercase();
|
||||
|
@ -576,11 +584,16 @@ impl Tasks {
|
|||
return vec![task.event.id];
|
||||
} else if task.event.content.starts_with(arg) {
|
||||
filtered.push(task.event.id)
|
||||
} else if lowercase.starts_with(&lowercase_arg) {
|
||||
} else if if has_space { lowercase.starts_with(&lowercase_arg) } else { lowercase.split_ascii_whitespace().any(|word| word.starts_with(&lowercase_arg)) } {
|
||||
filtered_more.push(task.event.id)
|
||||
}
|
||||
}
|
||||
if filtered.len() == 0 {
|
||||
for task in self.tasks.values() {
|
||||
if task.event.content.to_ascii_lowercase() == lowercase_arg {
|
||||
return vec![task.event.id];
|
||||
}
|
||||
}
|
||||
if filtered.is_empty() {
|
||||
return filtered_more;
|
||||
}
|
||||
return filtered;
|
||||
|
|
Loading…
Reference in New Issue