use super::{
super::{backend::*, model::*},
tree::*,
};
use {cursive::*, std::cmp::*};
impl<BackendT> TreeView<BackendT>
where
BackendT: TreeBackend,
{
pub fn selected_row(&self) -> Option<usize> {
self.selected_row
}
pub fn selected_node(&self) -> Option<&Node<BackendT>> {
self.selected_row.and_then(|selected_row| self.model.at_row(selected_row))
}
pub fn selected_node_mut(&mut self) -> Option<&mut Node<BackendT>> {
self.selected_path().and_then(|path| self.model.at_path_mut(path))
}
pub fn selected_path(&self) -> Option<NodePath> {
self.selected_node().and_then(|node| self.model.path(node))
}
pub fn is_selected(&self, row: usize) -> bool {
self.selected_row.map(|selected_row| selected_row == row).unwrap_or_default()
}
pub fn select(&mut self, row: usize, cursive: &mut Cursive)
where
BackendT::Context: Clone,
{
let last_selected_row = self.selected_row;
self.selected_row = if self.model.is_empty() || row >= self.model.extents().y { None } else { Some(row) };
if self.selected_row != last_selected_row {
BackendT::handle_selection_changed(cursive, self.model.context.clone());
}
}
pub fn select_top(&mut self, cursive: &mut Cursive)
where
BackendT::Context: Clone,
{
let last_selected_row = self.selected_row;
self.select_top_();
if self.selected_row != last_selected_row {
BackendT::handle_selection_changed(cursive, self.model.context.clone());
}
}
pub fn select_bottom(&mut self, cursive: &mut Cursive)
where
BackendT::Context: Clone,
{
let last_selected_row = self.selected_row;
self.select_bottom_();
if self.selected_row != last_selected_row {
BackendT::handle_selection_changed(cursive, self.model.context.clone());
}
}
pub fn move_selection(&mut self, delta: isize, cursive: &mut Cursive)
where
BackendT::Context: Clone,
{
let last_selected_row = self.selected_row;
self.move_selection_(delta);
if self.selected_row != last_selected_row {
BackendT::handle_selection_changed(cursive, self.model.context.clone());
}
}
pub(crate) fn select_top_(&mut self) {
self.selected_row = if self.model.is_empty() || self.model.extents().y == 0 { None } else { Some(0) }
}
pub(crate) fn select_bottom_(&mut self) {
self.selected_row = if self.model.is_empty() {
None
} else {
let height = self.model.extents().y;
if height == 0 { None } else { Some(height - 1) }
};
}
pub(crate) fn move_selection_(&mut self, delta: isize) {
if delta == 0 {
return;
}
self.selected_row = if self.model.is_empty() {
None
} else {
let height = self.model.extents().y;
if height == 0 {
None
} else {
Some(
self.selected_row
.map(|selected_row| min(selected_row.checked_add_signed(delta).unwrap_or_default(), height - 1))
.unwrap_or_default(),
)
}
};
}
}