danceinterpreter_rs/ui/config_window/
search_bar.rs1use 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}