From fd18fd304d734328eae01eb6f34deac074bff029 Mon Sep 17 00:00:00 2001 From: Johann Tuffe Date: Tue, 8 Apr 2025 11:37:24 +0800 Subject: [PATCH] Improve table sort - If the sort is already done, noop - If the sort is on the same category but with a different direction, just reverse the order - I believe this is something that happens a lot - If not, use `contiguous_slice` to avoid reallocating new entities --- src/widget/table/model/mod.rs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/widget/table/model/mod.rs b/src/widget/table/model/mod.rs index 3af94c57..a94cd560 100644 --- a/src/widget/table/model/mod.rs +++ b/src/widget/table/model/mod.rs @@ -347,19 +347,20 @@ where /// Sorts items in the model, this should be called before it is drawn after all items have been added for the view pub fn sort(&mut self, category: Category, ascending: bool) { - self.sort = Some((category, ascending)); - let mut order: Vec = self.order.iter().cloned().collect(); - order.sort_by(|entity_a, entity_b| { - if ascending { - self.item(*entity_a) - .unwrap() - .compare(self.item(*entity_b).unwrap(), category) - } else { - self.item(*entity_b) - .unwrap() - .compare(self.item(*entity_a).unwrap(), category) + match self.sort { + Some((cat, asc)) if cat == category && asc == ascending => return, + Some((cat, asc)) if cat == category => self.order.make_contiguous().reverse(), + _ => { + let items = &self.items; + self.order.make_contiguous().sort_by(|entity_a, entity_b| { + let cmp = items + .get(*entity_a) + .unwrap() + .compare(items.get(*entity_b).unwrap(), category); + if ascending { cmp } else { cmp.reverse() } + }); } - }); - self.order = order.into(); + } + self.sort = Some((category, ascending)); } }