summaryrefslogtreecommitdiff
path: root/src/list/state.rs
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-10-17 16:00:10 +0200
committermo8it <mo8it@proton.me>2024-10-17 16:00:10 +0200
commit930a0ea73b74921d687f3389f8dfb99f8fda8cea (patch)
treec02742faa012748309f662cbf794ccfbf12c437b /src/list/state.rs
parent7e2f56f41a89213d3ae60a069402a25b570f0cca (diff)
list: Highlight search match in exercise names
Diffstat (limited to 'src/list/state.rs')
-rw-r--r--src/list/state.rs26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/list/state.rs b/src/list/state.rs
index 5bdbca7..53fe07c 100644
--- a/src/list/state.rs
+++ b/src/list/state.rs
@@ -105,6 +105,28 @@ impl<'a> ListState<'a> {
);
}
+ fn draw_exericse_name(&self, writer: &mut MaxLenWriter, exercise: &Exercise) -> io::Result<()> {
+ if !self.search_query.is_empty() {
+ if let Some((pre_highlight, highlight, post_highlight)) = exercise
+ .name
+ .find(&self.search_query)
+ .and_then(|ind| exercise.name.split_at_checked(ind))
+ .and_then(|(pre_highlight, rest)| {
+ rest.split_at_checked(self.search_query.len())
+ .map(|x| (pre_highlight, x.0, x.1))
+ })
+ {
+ writer.write_str(pre_highlight)?;
+ writer.stdout.queue(SetForegroundColor(Color::Magenta))?;
+ writer.write_str(highlight)?;
+ writer.stdout.queue(ResetColor)?;
+ return writer.write_str(post_highlight);
+ }
+ }
+
+ writer.write_str(exercise.name)
+ }
+
fn draw_rows(
&self,
stdout: &mut StdoutLock,
@@ -147,10 +169,10 @@ impl<'a> ListState<'a> {
writer.stdout.queue(SetForegroundColor(Color::Yellow))?;
writer.write_ascii(b"PENDING ")?;
}
-
writer.stdout.queue(SetForegroundColor(Color::Reset))?;
- writer.write_str(exercise.name)?;
+ self.draw_exericse_name(&mut writer, exercise)?;
+
writer.write_ascii(&self.name_col_padding[exercise.name.len()..])?;
// The list links aren't shown correctly in VS Code on Windows.