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);