75 lines · 2.2 KB · Rust
RawDownload
use ui::{prelude::*, HighlightedLabel}; #[derive(Clone)]pub struct HighlightedMatchWithPaths {    pub match_label: HighlightedMatch,    pub paths: Vec<HighlightedMatch>,} #[derive(Debug, Clone, IntoElement)]pub struct HighlightedMatch {    pub text: String,    pub highlight_positions: Vec<usize>,    pub char_count: usize,    pub color: Color,} impl HighlightedMatch {    pub fn join(components: impl Iterator<Item = Self>, separator: &str) -> Self {        let mut char_count = 0;        let separator_char_count = separator.chars().count();        let mut text = String::new();        let mut highlight_positions = Vec::new();        for component in components {            if char_count != 0 {                text.push_str(separator);                char_count += separator_char_count;            }             highlight_positions.extend(                component                    .highlight_positions                    .iter()                    .map(|position| position + char_count),            );            text.push_str(&component.text);            char_count += component.text.chars().count();        }         Self {            text,            highlight_positions,            char_count,            color: Color::Default,        }    }     pub fn color(self, color: Color) -> Self {        Self { color, ..self }    }}impl RenderOnce for HighlightedMatch {    fn render(self, _window: &mut Window, _: &mut App) -> impl IntoElement {        HighlightedLabel::new(self.text, self.highlight_positions).color(self.color)    }} impl HighlightedMatchWithPaths {    pub fn render_paths_children(&mut self, element: Div) -> Div {        element.children(self.paths.clone().into_iter().map(|path| {            HighlightedLabel::new(path.text, path.highlight_positions)                .size(LabelSize::Small)                .color(Color::Muted)        }))    }} impl RenderOnce for HighlightedMatchWithPaths {    fn render(mut self, _window: &mut Window, _: &mut App) -> impl IntoElement {        v_flex()            .child(self.match_label.clone())            .when(!self.paths.is_empty(), |this| {                self.render_paths_children(this)            })    }}