relm4/typed_view/
selection_ext.rs

1use gtk::{gio, prelude::IsA};
2
3/// Allows to create new or change existing [`gtk::SelectionModel`](gtk::SelectionModel)
4/// for Relm's type safe abstractions
5/// over [`gtk::ColumnView`](gtk::ColumnView)
6/// (i.e. [`TypedColumnView`](crate::typed_view::column::TypedColumnView)),
7/// [`gtk::ListView`](gtk::ListView)
8/// (i.e. [`TypedListView`](crate::typed_view::list::TypedListView))
9/// and [`gtk::GridView`](gtk::GridView)
10/// (i.e. [`TypedGridView`](crate::typed_view::grid::TypedGridView)).
11pub trait RelmSelectionExt: IsA<gtk::SelectionModel> {
12    /// Creates new [`gtk::SelectionModel`](gtk::SelectionModel) to view it is implemented on
13    ///
14    /// Typically called during `init`
15    /// phase of [`TypedColumnView`](crate::typed_view::column::TypedColumnView),
16    /// [`TypedListView`](crate::typed_view::list::TypedListView)
17    /// or [`TypedGridView`](crate::typed_view::grid::TypedGridView)
18    /// to provide a chosen selection model for view instantiation.
19    fn new_model(model: gio::ListModel) -> Self;
20
21    /// Set provided [`gio::ListModel`](gio::ListModel) on the chosen (i.e. [`Self`]) selection model
22    ///
23    /// Usually it is useful to do during the addition of new filters,
24    /// in that case the existing model has to be replaced with provided [`gtk::FilterListModel`](gtk::FilterListModel).
25    fn set_list_model(&mut self, model: &gio::ListModel);
26}
27
28macro_rules! impl_selection (
29    ($ty:ty) => {
30        impl RelmSelectionExt for $ty {
31            fn new_model(model: gio::ListModel) -> Self {
32                Self::new(Some(model))
33            }
34            fn set_list_model(&mut self, model: &gio::ListModel) {
35                self.set_model(Some(model));
36            }
37        }
38    }
39);
40
41impl_selection!(gtk::SingleSelection);
42impl_selection!(gtk::MultiSelection);
43impl_selection!(gtk::NoSelection);