diff --git a/data/resources/ui/sidebar.ui b/data/resources/ui/sidebar.ui index ae7e0f49..e644a4ec 100644 --- a/data/resources/ui/sidebar.ui +++ b/data/resources/ui/sidebar.ui @@ -43,7 +43,7 @@ - + diff --git a/src/session/sidebar/sidebar.rs b/src/session/sidebar/sidebar.rs index 5ddf2a9d..feba712c 100644 --- a/src/session/sidebar/sidebar.rs +++ b/src/session/sidebar/sidebar.rs @@ -21,6 +21,8 @@ mod imp { pub headerbar: TemplateChild, #[template_child] pub listview: TemplateChild, + #[template_child] + pub room_search_entry: TemplateChild, } #[glib::object_subclass] @@ -115,8 +117,32 @@ impl Sidebar { item.clone().downcast::().ok() }); - // TODO: set filter based on the text in the search entry - let filter_model = gtk::FilterListModel::new(Some(&tree_model), gtk::NONE_FILTER); + let room_expression = gtk::ClosureExpression::new( + String::static_type(), + |value| { + Some( + value[0] + .get::() + .unwrap() + .item() + .and_then(|o| o.downcast::().ok()) + .map_or(String::new(), |o| o.display_name()) + .to_value(), + ) + }, + &[], + ); + let filter = gtk::StringFilterBuilder::new() + .match_mode(gtk::StringFilterMatchMode::Substring) + .expression(&room_expression) + .ignore_case(true) + .build(); + let filter_model = gtk::FilterListModel::new(Some(&tree_model), Some(&filter)); + priv_ + .room_search_entry + .bind_property("text", &filter, "search") + .flags(glib::BindingFlags::SYNC_CREATE) + .build(); let selection = gtk::SingleSelection::new(Some(&filter_model)); selection.connect_notify_local(Some("selected-item"), clone!(@weak self as obj => move |model, _| {