perf(state): less clones on handling the selection

This commit is contained in:
EdJoPaTo
2024-05-15 12:48:53 +02:00
parent bba94dcf88
commit 2811a79713
+25 -4
View File
@@ -47,10 +47,16 @@ where
} }
#[must_use] #[must_use]
#[deprecated = "use self.get_selected"]
pub fn selected(&self) -> Vec<Identifier> { pub fn selected(&self) -> Vec<Identifier> {
self.selected.clone() 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`. /// Get a flat list of all visible (= below open) [`TreeItem`]s with this `TreeState`.
#[must_use] #[must_use]
pub fn flatten<'a>( pub fn flatten<'a>(
@@ -117,8 +123,19 @@ where
/// Returns `true` when a node is opened / closed. /// Returns `true` when a node is opened / closed.
/// As toggle always changes something, this only returns `false` when nothing is selected. /// As toggle always changes something, this only returns `false` when nothing is selected.
pub fn toggle_selected(&mut self) -> bool { pub fn toggle_selected(&mut self) -> bool {
if self.selected.is_empty() {
return false;
}
self.ensure_selected_in_view_on_next_render = true; 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. /// Closes all open nodes.
@@ -272,9 +289,13 @@ where
/// Opens the currently selected. /// Opens the currently selected.
/// ///
/// Returns `true` when it was closed and has been opened. /// 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 { pub fn key_right(&mut self) -> bool {
self.ensure_selected_in_view_on_next_render = true; if self.selected.is_empty() {
self.open(self.selected()) false
} else {
self.ensure_selected_in_view_on_next_render = true;
self.open(self.selected.clone())
}
} }
} }