perf(state): less clones on handling the selection
This commit is contained in:
+25
-4
@@ -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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user