highlight search query matches in listviews
This commit is contained in:
@@ -198,6 +198,7 @@ statusbar_progress = "green"
|
|||||||
statusbar_bg = "green"
|
statusbar_bg = "green"
|
||||||
cmdline = "light white"
|
cmdline = "light white"
|
||||||
cmdline_bg = "black"
|
cmdline_bg = "black"
|
||||||
|
search_match = "light red"
|
||||||
```
|
```
|
||||||
|
|
||||||
More examples can be found in pull request
|
More examples can be found in pull request
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ pub struct ConfigTheme {
|
|||||||
pub statusbar_bg: Option<String>,
|
pub statusbar_bg: Option<String>,
|
||||||
pub cmdline: Option<String>,
|
pub cmdline: Option<String>,
|
||||||
pub cmdline_bg: Option<String>,
|
pub cmdline_bg: Option<String>,
|
||||||
|
pub search_match: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ pub fn load(cfg: &Config) -> Theme {
|
|||||||
);
|
);
|
||||||
palette.set_color("cmdline", load_color!(cfg, cmdline, TerminalDefault));
|
palette.set_color("cmdline", load_color!(cfg, cmdline, TerminalDefault));
|
||||||
palette.set_color("cmdline_bg", load_color!(cfg, cmdline_bg, TerminalDefault));
|
palette.set_color("cmdline_bg", load_color!(cfg, cmdline_bg, TerminalDefault));
|
||||||
|
palette.set_color("search_match", load_color!(cfg, search_match, Light(Red)));
|
||||||
|
|
||||||
Theme {
|
Theme {
|
||||||
shadow: false,
|
shadow: false,
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ pub struct ListView<I: ListItem> {
|
|||||||
content: Arc<RwLock<Vec<I>>>,
|
content: Arc<RwLock<Vec<I>>>,
|
||||||
last_content_len: usize,
|
last_content_len: usize,
|
||||||
selected: usize,
|
selected: usize,
|
||||||
|
search_query: String,
|
||||||
search_indexes: Vec<usize>,
|
search_indexes: Vec<usize>,
|
||||||
search_selected_index: usize,
|
search_selected_index: usize,
|
||||||
last_size: Vec2,
|
last_size: Vec2,
|
||||||
@@ -110,6 +111,7 @@ impl<I: ListItem> ListView<I> {
|
|||||||
content,
|
content,
|
||||||
last_content_len: 0,
|
last_content_len: 0,
|
||||||
selected: 0,
|
selected: 0,
|
||||||
|
search_query: String::new(),
|
||||||
search_indexes: Vec::new(),
|
search_indexes: Vec::new(),
|
||||||
search_selected_index: 0,
|
search_selected_index: 0,
|
||||||
last_size: Vec2::new(0, 0),
|
last_size: Vec2::new(0, 0),
|
||||||
@@ -237,6 +239,25 @@ impl<I: ListItem> View for ListView<I> {
|
|||||||
printer.print((0, 0), &left);
|
printer.print((0, 0), &left);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// if line contains search query match, draw on top with
|
||||||
|
// highlight color
|
||||||
|
if self.search_indexes.contains(&i) {
|
||||||
|
let fg = *printer.theme.palette.custom("search_match").unwrap();
|
||||||
|
let matched_style = ColorStyle::new(fg, style.back);
|
||||||
|
|
||||||
|
let matches: Vec<(usize, usize)> = left
|
||||||
|
.to_lowercase()
|
||||||
|
.match_indices(&self.search_query)
|
||||||
|
.map(|i| (i.0, i.0 + i.1.len()))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
for m in matches {
|
||||||
|
printer.with_color(matched_style, |printer| {
|
||||||
|
printer.print((m.0, 0), &left[m.0..m.1]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// left string cut off indicator
|
// left string cut off indicator
|
||||||
let max_length = center_offset.saturating_sub(1);
|
let max_length = center_offset.saturating_sub(1);
|
||||||
if max_length < left.width() {
|
if max_length < left.width() {
|
||||||
@@ -421,6 +442,7 @@ impl<I: ListItem + Clone> ViewExt for ListView<I> {
|
|||||||
}
|
}
|
||||||
Command::Jump(mode) => match mode {
|
Command::Jump(mode) => match mode {
|
||||||
JumpMode::Query(query) => {
|
JumpMode::Query(query) => {
|
||||||
|
self.search_query = query.to_lowercase();
|
||||||
self.search_indexes = self.get_indexes_of(query);
|
self.search_indexes = self.get_indexes_of(query);
|
||||||
self.search_selected_index = 0;
|
self.search_selected_index = 0;
|
||||||
match self.search_indexes.get(0) {
|
match self.search_indexes.get(0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user