From 2811a797138fbd5e48f95cc49fb3fd2e57a6e29f Mon Sep 17 00:00:00 2001 From: EdJoPaTo Date: Wed, 15 May 2024 12:48:53 +0200 Subject: [PATCH] perf(state): less clones on handling the selection --- src/tree_state.rs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/tree_state.rs b/src/tree_state.rs index c1c274a..38e67bd 100644 --- a/src/tree_state.rs +++ b/src/tree_state.rs @@ -47,10 +47,16 @@ where } #[must_use] + #[deprecated = "use self.get_selected"] pub fn selected(&self) -> Vec { self.selected.clone() } + #[must_use] + pub fn get_selected(&self) -> &[Identifier] { + &self.selected + } + /// Get a flat list of all visible (= below open) [`TreeItem`]s with this `TreeState`. #[must_use] pub fn flatten<'a>( @@ -117,8 +123,19 @@ where /// Returns `true` when a node is opened / closed. /// As toggle always changes something, this only returns `false` when nothing is selected. pub fn toggle_selected(&mut self) -> bool { + if self.selected.is_empty() { + return false; + } + self.ensure_selected_in_view_on_next_render = true; - self.toggle(self.selected()) + + // Reimplement self.close because of multiple different borrows + let was_open = self.open.remove(&self.selected); + if was_open { + return true; + } + + self.open(self.selected.clone()) } /// Closes all open nodes. @@ -272,9 +289,13 @@ where /// Opens the currently selected. /// /// Returns `true` when it was closed and has been opened. - /// Returns `false` when it was already open. + /// Returns `false` when it was already open or nothing being selected. pub fn key_right(&mut self) -> bool { - self.ensure_selected_in_view_on_next_render = true; - self.open(self.selected()) + if self.selected.is_empty() { + false + } else { + self.ensure_selected_in_view_on_next_render = true; + self.open(self.selected.clone()) + } } }