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, _| {