TypedColumnView

Struct TypedColumnView 

Source
pub struct TypedColumnView<T, S> {
    pub view: ColumnView,
    pub selection_model: S,
    /* private fields */
}
Expand description

A high-level wrapper around gio::ListStore, gtk::SignalListItemFactory and gtk::ColumnView.

TypedColumnView aims at keeping nearly the same functionality and flexibility of the raw bindings while introducing a more idiomatic and type-safe interface.

Fields§

§view: ColumnView

The internal list view.

§selection_model: S

The internal selection model.

Implementations§

Source§

impl<T, S> TypedColumnView<T, S>
where T: Any, S: RelmSelectionExt,

Source

pub fn new() -> Self

Create a new, empty TypedColumnView.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 149)
143    fn init(
144        counter: Self::Init,
145        root: Self::Root,
146        sender: ComponentSender<Self>,
147    ) -> ComponentParts<Self> {
148        // Initialize the ListView wrapper
149        let mut view_wrapper = TypedColumnView::<MyListItem, gtk::SingleSelection>::new();
150        view_wrapper.append_column::<Label1Column>();
151        view_wrapper.append_column::<Label2Column>();
152        view_wrapper.append_column::<ButtonColumn>();
153
154        // Add a filter and disable it
155        view_wrapper.add_filter(|item| item.value % 2 == 0);
156        view_wrapper.set_filter_status(0, false);
157
158        let model = App {
159            counter,
160            view_wrapper,
161        };
162
163        let my_view = &model.view_wrapper.view;
164
165        let widgets = view_output!();
166
167        ComponentParts { model, widgets }
168    }
Source

pub fn append_column<C>(&mut self)
where C: RelmColumn<Item = T>,

Append column to this typed view

Examples found in repository?
relm4/examples/typed_column_view.rs (line 150)
143    fn init(
144        counter: Self::Init,
145        root: Self::Root,
146        sender: ComponentSender<Self>,
147    ) -> ComponentParts<Self> {
148        // Initialize the ListView wrapper
149        let mut view_wrapper = TypedColumnView::<MyListItem, gtk::SingleSelection>::new();
150        view_wrapper.append_column::<Label1Column>();
151        view_wrapper.append_column::<Label2Column>();
152        view_wrapper.append_column::<ButtonColumn>();
153
154        // Add a filter and disable it
155        view_wrapper.add_filter(|item| item.value % 2 == 0);
156        view_wrapper.set_filter_status(0, false);
157
158        let model = App {
159            counter,
160            view_wrapper,
161        };
162
163        let my_view = &model.view_wrapper.view;
164
165        let widgets = view_output!();
166
167        ComponentParts { model, widgets }
168    }
Source

pub fn add_filter<F: Fn(&T) -> bool + 'static>(&mut self, f: F)

Add a function to filter the stored items. Returning false will simply hide the item.

Note that several filters can be added on top of each other.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 155)
143    fn init(
144        counter: Self::Init,
145        root: Self::Root,
146        sender: ComponentSender<Self>,
147    ) -> ComponentParts<Self> {
148        // Initialize the ListView wrapper
149        let mut view_wrapper = TypedColumnView::<MyListItem, gtk::SingleSelection>::new();
150        view_wrapper.append_column::<Label1Column>();
151        view_wrapper.append_column::<Label2Column>();
152        view_wrapper.append_column::<ButtonColumn>();
153
154        // Add a filter and disable it
155        view_wrapper.add_filter(|item| item.value % 2 == 0);
156        view_wrapper.set_filter_status(0, false);
157
158        let model = App {
159            counter,
160            view_wrapper,
161        };
162
163        let my_view = &model.view_wrapper.view;
164
165        let widgets = view_output!();
166
167        ComponentParts { model, widgets }
168    }
Source

pub fn get_columns(&self) -> &HashMap<&'static str, ColumnViewColumn>

Get columns currently associated with this view.

Source

pub fn filters_len(&self) -> usize

Returns the amount of filters that were added.

Source

pub fn set_filter_status(&mut self, idx: usize, active: bool) -> bool

Set a certain filter as active or inactive.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 156)
143    fn init(
144        counter: Self::Init,
145        root: Self::Root,
146        sender: ComponentSender<Self>,
147    ) -> ComponentParts<Self> {
148        // Initialize the ListView wrapper
149        let mut view_wrapper = TypedColumnView::<MyListItem, gtk::SingleSelection>::new();
150        view_wrapper.append_column::<Label1Column>();
151        view_wrapper.append_column::<Label2Column>();
152        view_wrapper.append_column::<ButtonColumn>();
153
154        // Add a filter and disable it
155        view_wrapper.add_filter(|item| item.value % 2 == 0);
156        view_wrapper.set_filter_status(0, false);
157
158        let model = App {
159            counter,
160            view_wrapper,
161        };
162
163        let my_view = &model.view_wrapper.view;
164
165        let widgets = view_output!();
166
167        ComponentParts { model, widgets }
168    }
169
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }
Source

pub fn notify_filter_changed(&self, idx: usize) -> bool

Notify that a certain filter has changed. This causes the filter expression to be re-evaluated.

Returns true if a filter was notified.

Source

pub fn pop_filter(&mut self)

Remove the last filter.

Source

pub fn clear_filters(&mut self)

Remove all filters.

Source

pub fn append(&mut self, value: T)

Add a new item at the end of the list.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 176)
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }
Source

pub fn extend_from_iter<I: IntoIterator<Item = T>>(&mut self, init: I)

Add new items from an iterator the the end of the list.

Source

pub fn find<F: FnMut(&T) -> bool>(&self, equal_func: F) -> Option<u32>

Available on crate feature gnome_43 only.

Find the index of the first item that matches a certain function.

Source

pub fn is_empty(&self) -> bool

Returns true if the list is empty.

Source

pub fn len(&self) -> u32

Returns the length of the list (without filters).

Source

pub fn get(&self, position: u32) -> Option<TypedListItem<T>>

Get the TypedListItem at the specified position.

Returns None if the position is invalid.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 184)
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }
Source

pub fn get_visible(&self, position: u32) -> Option<TypedListItem<T>>

Get the visible TypedListItem at the specified position, (the item at the given position after filtering and sorting).

Returns None if the position is invalid.

Source

pub fn insert(&mut self, position: u32, value: T)

Insert an item at a specific position.

Source

pub fn insert_sorted<F>(&self, value: T, compare_func: F) -> u32
where F: FnMut(&T, &T) -> Ordering,

Insert an item into the list and calculate its position from a sorting function.

Source

pub fn remove(&mut self, position: u32)

Remove an item at a specific position.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 191)
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }
Source

pub fn clear(&mut self)

Remove all items.

Source

pub fn iter(&self) -> TypedIterator<'_, TypedColumnView<T, S>>

Returns an iterator that allows modifying each TypedListItem.

Examples found in repository?
relm4/examples/typed_column_view.rs (line 180)
170    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
171        match msg {
172            Msg::Append => {
173                // Add 10 items
174                for _ in 0..10 {
175                    self.counter = self.counter.wrapping_add(1);
176                    self.view_wrapper.append(MyListItem::new(self.counter));
177                }
178
179                self.view_wrapper
180                    .iter()
181                    .for_each(|row| println!("item {}", row.borrow().value));
182
183                // Count up the first item
184                let first_item = self.view_wrapper.get(0).unwrap();
185                let first_binding = &mut first_item.borrow_mut().binding;
186                let mut guard = first_binding.guard();
187                *guard += 1;
188            }
189            Msg::Remove => {
190                // Remove the second item
191                self.view_wrapper.remove(1);
192            }
193            Msg::OnlyShowEven(show_only_even) => {
194                // Disable or enable the first filter
195                self.view_wrapper.set_filter_status(0, show_only_even);
196            }
197        }
198    }

Trait Implementations§

Source§

impl<T, S> Debug for TypedColumnView<T, S>
where T: Debug, S: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, S> Default for TypedColumnView<T, S>
where T: Any, S: RelmSelectionExt,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T, S> Freeze for TypedColumnView<T, S>
where S: Freeze,

§

impl<T, S> RefUnwindSafe for TypedColumnView<T, S>

§

impl<T, S> !Send for TypedColumnView<T, S>

§

impl<T, S> !Sync for TypedColumnView<T, S>

§

impl<T, S> Unpin for TypedColumnView<T, S>
where S: Unpin,

§

impl<T, S> UnwindSafe for TypedColumnView<T, S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<C> AsyncPosition<()> for C

Source§

fn position(_index: usize)

Returns the position. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<C, I> Position<(), I> for C

Source§

fn position(&self, _index: &I)

Returns the position. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more