feat: select_*() returns whether it changed

This commit is contained in:
EdJoPaTo
2024-01-26 05:24:17 +01:00
parent 632a95f853
commit 969b78ab06
+25 -12
View File
@@ -71,13 +71,27 @@ where
self.selected.clone() self.selected.clone()
} }
pub fn select(&mut self, identifier: Vec<Identifier>) { /// Selects the given identifier.
///
/// Returns `true` when the selection changed.
///
/// Clear the selection by passing an empty identifier vector:
///
/// ```rust
/// # use tui_tree_widget::TreeState;
/// # let mut state = TreeState::<usize>::default();
/// state.select(Vec::new());
/// ```
pub fn select(&mut self, identifier: Vec<Identifier>) -> bool {
let changed = self.selected != identifier;
self.selected = identifier; self.selected = identifier;
// TODO: ListState does this. Is this relevant? // TODO: ListState does this. Is this relevant?
if self.selected.is_empty() { if self.selected.is_empty() {
self.offset = 0; self.offset = 0;
} }
changed
} }
/// Open a tree node. /// Open a tree node.
@@ -119,22 +133,26 @@ where
} }
/// Select the first node. /// Select the first node.
pub fn select_first(&mut self, items: &[TreeItem<Identifier>]) { ///
/// Returns `true` when the selection changed.
pub fn select_first(&mut self, items: &[TreeItem<Identifier>]) -> bool {
let identifier = items let identifier = items
.first() .first()
.map(|o| vec![o.identifier.clone()]) .map(|o| vec![o.identifier.clone()])
.unwrap_or_default(); .unwrap_or_default();
self.select(identifier); self.select(identifier)
} }
/// Select the last visible node. /// Select the last visible node.
pub fn select_last(&mut self, items: &[TreeItem<Identifier>]) { ///
/// Returns `true` when the selection changed.
pub fn select_last(&mut self, items: &[TreeItem<Identifier>]) -> bool {
let visible = self.flatten(items); let visible = self.flatten(items);
let new_identifier = visible let new_identifier = visible
.last() .last()
.map(|o| o.identifier.clone()) .map(|o| o.identifier.clone())
.unwrap_or_default(); .unwrap_or_default();
self.select(new_identifier); self.select(new_identifier)
} }
/// Select the node visible on the given index. /// Select the node visible on the given index.
@@ -147,16 +165,13 @@ where
items: &[TreeItem<Identifier>], items: &[TreeItem<Identifier>],
new_index: usize, new_index: usize,
) -> bool { ) -> bool {
let current_identifier = self.selected();
let visible = self.flatten(items); let visible = self.flatten(items);
let new_index = new_index.min(visible.len().saturating_sub(1)); let new_index = new_index.min(visible.len().saturating_sub(1));
let new_identifier = visible let new_identifier = visible
.get(new_index) .get(new_index)
.map(|o| o.identifier.clone()) .map(|o| o.identifier.clone())
.unwrap_or_default(); .unwrap_or_default();
let changed = current_identifier != new_identifier; self.select(new_identifier)
self.select(new_identifier);
changed
} }
/// Move the current selection with the direction/amount by the given function. /// Move the current selection with the direction/amount by the given function.
@@ -192,9 +207,7 @@ where
.get(new_index) .get(new_index)
.map(|o| o.identifier.clone()) .map(|o| o.identifier.clone())
.unwrap_or_default(); .unwrap_or_default();
let changed = current_index != Some(new_index); self.select(new_identifier)
self.select(new_identifier);
changed
} }
/// Handles the up arrow key. /// Handles the up arrow key.