Struct SortModel
pub struct SortModel<M, F>(/* private fields */)
where
M: Model + 'static,
F: SortHelper<<M as Model>::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§
§impl<M, F> SortModel<M, F>
impl<M, F> SortModel<M, F>
pub fn new(wrapped_model: M, sort_function: F) -> SortModel<M, F>
pub fn new(wrapped_model: M, sort_function: F) -> SortModel<M, F>
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.
pub fn source_model(&self) -> &M
pub fn source_model(&self) -> &M
Returns a reference to the inner model
§impl<M> SortModel<M, AscendingSortHelper>
impl<M> SortModel<M, AscendingSortHelper>
pub fn new_ascending(wrapped_model: M) -> SortModel<M, AscendingSortHelper>
pub fn new_ascending(wrapped_model: M) -> SortModel<M, AscendingSortHelper>
Creates a new SortModel based on the given wrapped_model and sorted in ascending order.
Alternatively you can use ModelExt::sort on your Model.
pub 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.
pub 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§
§impl<M, S> Model for SortModel<M, S>
impl<M, S> Model for SortModel<M, S>
§fn row_data(&self, row: usize) -> Option<<SortModel<M, S> as Model>::Data>
fn row_data(&self, row: usize) -> Option<<SortModel<M, S> as Model>::Data>
§fn set_row_data(&self, row: usize, data: <SortModel<M, S> as Model>::Data)
fn set_row_data(&self, row: usize, data: <SortModel<M, S> as Model>::Data)
§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
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> ModelExt for Twhere
T: Model,
impl<T> ModelExt for Twhere
T: Model,
§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 more§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().§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().§fn sort(self) -> SortModel<Self, AscendingSortHelper>
fn sort(self) -> SortModel<Self, AscendingSortHelper>
SortModel::new_ascending().§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().§fn reverse(self) -> ReverseModel<Self>where
Self: Sized + 'static,
fn reverse(self) -> ReverseModel<Self>where
Self: Sized + 'static,
ReverseModel::new().§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.