pub struct SortModel<M, F>(/* private fields */)
where
M: Model + 'static,
F: SortHelper<M::Data> + 'static;Expand description
Provides a sorted view of rows by another Model.
When the other Model is updated, the Sorted is updated accordingly.
Generic parameters:
Mthe type of the wrappedModel.Fa type that provides an order to model rows. It is constrained by the internal traitSortHelper, which is used to sort the model in ascending order if the model data supports it, or by a given sort function.
§Example
Here we have a VecModel holding crate::SharedStrings.
It is then sorted into a SortModel.
let model = VecModel::from(vec![
SharedString::from("Lorem"),
SharedString::from("ipsum"),
SharedString::from("dolor"),
]);
let sorted_model = SortModel::new(model, |lhs, rhs| lhs.to_lowercase().cmp(&rhs.to_lowercase()));
assert_eq!(sorted_model.row_data(0).unwrap(), SharedString::from("dolor"));
assert_eq!(sorted_model.row_data(1).unwrap(), SharedString::from("ipsum"));
assert_eq!(sorted_model.row_data(2).unwrap(), SharedString::from("Lorem"));Alternatively you can use the shortcut ModelExt::sort_by.
let sorted_model = VecModel::from(vec![
SharedString::from("Lorem"),
SharedString::from("ipsum"),
SharedString::from("dolor"),
]).sort_by(|lhs, rhs| lhs.to_lowercase().cmp(&rhs.to_lowercase()));It is also possible to get a ascending sorted SortModel order for core::cmp::Ord type items.
let model = VecModel::from(vec![
5,
1,
3,
]);
let sorted_model = SortModel::new_ascending(model);
assert_eq!(sorted_model.row_data(0).unwrap(), 1);
assert_eq!(sorted_model.row_data(1).unwrap(), 3);
assert_eq!(sorted_model.row_data(2).unwrap(), 5);Alternatively you can use the shortcut ModelExt::sort.
let sorted_model = VecModel::from(vec![
5,
1,
3,
]).sort();If you want to modify the underlying VecModel you can give it a Rc of the SortModel:
let model = Rc::new(VecModel::from(vec![
SharedString::from("Lorem"),
SharedString::from("ipsum"),
SharedString::from("dolor"),
]));
let sorted_model = SortModel::new(model.clone(), |lhs, rhs| lhs.to_lowercase().cmp(&rhs.to_lowercase()));
assert_eq!(sorted_model.row_data(0).unwrap(), SharedString::from("dolor"));
assert_eq!(sorted_model.row_data(1).unwrap(), SharedString::from("ipsum"));
assert_eq!(sorted_model.row_data(2).unwrap(), SharedString::from("Lorem"));
model.set_row_data(1, SharedString::from("opsom"));
assert_eq!(sorted_model.row_data(0).unwrap(), SharedString::from("dolor"));
assert_eq!(sorted_model.row_data(1).unwrap(), SharedString::from("Lorem"));
assert_eq!(sorted_model.row_data(2).unwrap(), SharedString::from("opsom"));Implementations§
Source§impl<M, F> SortModel<M, F>
impl<M, F> SortModel<M, F>
Sourcepub fn new(wrapped_model: M, sort_function: F) -> Self
pub fn new(wrapped_model: M, sort_function: F) -> Self
Creates a new SortModel based on the given wrapped_model and sorted by sort_function.
Alternatively you can use ModelExt::sort_by on your Model.
Sourcepub fn source_model(&self) -> &M
pub fn source_model(&self) -> &M
Returns a reference to the inner model
Source§impl<M> SortModel<M, AscendingSortHelper>
impl<M> SortModel<M, AscendingSortHelper>
Sourcepub fn new_ascending(wrapped_model: M) -> Self
pub fn new_ascending(wrapped_model: M) -> Self
Creates a new SortModel based on the given wrapped_model and sorted in ascending order.
Alternatively you can use ModelExt::sort on your Model.
Sourcepub fn reset(&self)
pub fn reset(&self)
Manually reapply the sorting. You need to run this e.g. if the sort function depends on mutable state and it has changed.
Sourcepub fn unsorted_row(&self, sorted_row: usize) -> usize
pub fn unsorted_row(&self, sorted_row: usize) -> usize
Gets the row index of the underlying unsorted model for a given sorted row index.
Trait Implementations§
Source§impl<M, S> Model for SortModel<M, S>
impl<M, S> Model for SortModel<M, S>
Source§type Data = <M as Model>::Data
type Data = <M as Model>::Data
Source§fn row_data(&self, row: usize) -> Option<Self::Data>
fn row_data(&self, row: usize) -> Option<Self::Data>
Source§fn set_row_data(&self, row: usize, data: Self::Data)
fn set_row_data(&self, row: usize, data: Self::Data)
Source§fn model_tracker(&self) -> &dyn ModelTracker
fn model_tracker(&self) -> &dyn ModelTracker
ModelNotify field. Read moreAuto Trait Implementations§
impl<M, F> Freeze for SortModel<M, F>
impl<M, F> !RefUnwindSafe for SortModel<M, F>
impl<M, F> !Send for SortModel<M, F>
impl<M, F> !Sync for SortModel<M, F>
impl<M, F> Unpin for SortModel<M, F>
impl<M, F> !UnwindSafe for SortModel<M, F>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ModelExt for Twhere
T: Model,
impl<T> ModelExt for Twhere
T: Model,
Source§fn row_data_tracked(&self, row: usize) -> Option<Self::Data>
fn row_data_tracked(&self, row: usize) -> Option<Self::Data>
ModelTracker::track_row_data_changes
before returning Model::row_data. Read moreSource§fn map<F, U>(self, map_function: F) -> MapModel<Self, F>
fn map<F, U>(self, map_function: F) -> MapModel<Self, F>
map_function.
This is a shortcut for MapModel::new().Source§fn filter<F>(self, filter_function: F) -> FilterModel<Self, F>
fn filter<F>(self, filter_function: F) -> FilterModel<Self, F>
filter_function.
This is a shortcut for FilterModel::new().Source§fn sort(self) -> SortModel<Self, AscendingSortHelper>
fn sort(self) -> SortModel<Self, AscendingSortHelper>
SortModel::new_ascending().Source§fn sort_by<F>(self, sort_function: F) -> SortModel<Self, F>
fn sort_by<F>(self, sort_function: F) -> SortModel<Self, F>
sort_function.
This is a shortcut for SortModel::new().Source§fn reverse(self) -> ReverseModel<Self>where
Self: Sized + 'static,
fn reverse(self) -> ReverseModel<Self>where
Self: Sized + 'static,
ReverseModel::new().