Skip to main content

danceinterpreter_rs/ui/config_window/
search_bar.rs

1use crate::dataloading::displayable_data::DisplayableData;
2use crate::ui::widgets::buttons::material_symbol_message_button;
3use crate::ui::widgets::material_symbol;
4use crate::{Message, SearchMessage};
5use fuzzy_matcher::FuzzyMatcher;
6use fuzzy_matcher::skim::SkimMatcherV2 as Matcher;
7use iced::alignment::Vertical;
8use iced::widget::{Row, TextInput, row};
9use iced::{Alignment, Length};
10
11pub fn build_search_bar<'a>(search_query: &str) -> Row<'a, Message> {
12    row![
13        material_symbol("search", false)
14            .width(Length::Fixed(24.0))
15            .align_y(Vertical::Center),
16        TextInput::new("Search...", search_query)
17            .on_input(|v| Message::Search(SearchMessage::Changed(v)))
18            .on_submit(Message::Noop)
19            .width(Length::Fill)
20            .padding([4, 8]),
21        material_symbol_message_button("backspace", false, Message::Search(SearchMessage::Clear)),
22        material_symbol_message_button("close", false, Message::Search(SearchMessage::Toggle)),
23    ]
24    .spacing(5)
25    .padding([5, 5])
26    .align_y(Alignment::Center)
27}
28
29pub fn data_matches_search_query(search_query: &str, data: DisplayableData) -> bool {
30    let matcher = Matcher::default();
31
32    !search_query.is_empty()
33        && matcher
34            .fuzzy_match(
35                format!(
36                    "{} {} {}",
37                    data.headline.to_lowercase(),
38                    data.subline_upper.to_lowercase(),
39                    data.subline_lower.to_lowercase()
40                )
41                .trim(),
42                &search_query.to_lowercase(),
43            )
44            .is_some()
45}