summaryrefslogtreecommitdiff
path: root/helix-term/src/ui/picker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term/src/ui/picker.rs')
-rw-r--r--helix-term/src/ui/picker.rs19
1 files changed, 13 insertions, 6 deletions
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index 2d471aae..aad3f81c 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -12,7 +12,10 @@ use tui::{
use fuzzy_matcher::skim::SkimMatcherV2 as Matcher;
use tui::widgets::Widget;
-use std::{cmp::Ordering, time::Instant};
+use std::{
+ cmp::{self, Ordering},
+ time::Instant,
+};
use std::{collections::HashMap, io::Read, path::PathBuf};
use crate::ui::{Prompt, PromptEvent};
@@ -344,11 +347,17 @@ impl<T: Item + 'static> Component for FilePicker<T> {
#[derive(PartialEq, Eq, Debug)]
struct PickerMatch {
- index: usize,
score: i64,
+ index: usize,
len: usize,
}
+impl PickerMatch {
+ fn key(&self) -> impl Ord {
+ (cmp::Reverse(self.score), self.len, self.index)
+ }
+}
+
impl PartialOrd for PickerMatch {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
@@ -357,10 +366,7 @@ impl PartialOrd for PickerMatch {
impl Ord for PickerMatch {
fn cmp(&self, other: &Self) -> Ordering {
- self.score
- .cmp(&other.score)
- .reverse()
- .then_with(|| self.len.cmp(&other.len))
+ self.key().cmp(&other.key())
}
}
@@ -502,6 +508,7 @@ impl<T: Item> Picker<T> {
})
}),
);
+
self.matches.sort_unstable();
}