use crate::model::{Column, TreeNode, TuiMessage, TuiModel};
pub fn handle(model: &mut TuiModel, msg: TuiMessage) {
match msg {
TuiMessage::CursorDown => {
let (cursor, tree_len, next) = {
let tree = active_tree(model);
let cursor = *active_cursor(model);
let next = (cursor + 1..tree.len()).find(|&i| tree[i].kind.is_navigable());
(cursor, tree.len(), next)
};
let _ = (cursor, tree_len); if let Some(next_idx) = next {
*active_cursor_mut(model) = next_idx;
}
}
TuiMessage::CursorUp => {
let (cursor, prev) = {
let tree = active_tree(model);
let cursor = *active_cursor(model);
let prev = (0..cursor).rev().find(|&i| tree[i].kind.is_navigable());
(cursor, prev)
};
let _ = cursor;
if let Some(prev_idx) = prev {
*active_cursor_mut(model) = prev_idx;
}
}
TuiMessage::JumpTop => {
let first = {
let tree = active_tree(model);
(0..tree.len()).find(|&i| tree[i].kind.is_navigable())
};
if let Some(first_idx) = first {
*active_cursor_mut(model) = first_idx;
}
}
TuiMessage::JumpBottom => {
let last = {
let tree = active_tree(model);
(0..tree.len()).rev().find(|&i| tree[i].kind.is_navigable())
};
if let Some(last_idx) = last {
*active_cursor_mut(model) = last_idx;
}
}
TuiMessage::SwitchColumn => {
if matches!(model.mode, crate::model::Mode::Transfer(_)) {
model.active_column = match model.active_column {
Column::Left => Column::Right,
Column::Right => Column::Left,
};
}
}
_ => {}
}
}
pub fn active_tree(model: &TuiModel) -> &[TreeNode] {
match model.active_column {
Column::Left => &model.tree,
Column::Right => &model.dest_tree,
}
}
pub fn active_cursor(model: &TuiModel) -> &usize {
match model.active_column {
Column::Left => &model.cursor,
Column::Right => &model.dest_cursor,
}
}
pub fn active_cursor_mut(model: &mut TuiModel) -> &mut usize {
match model.active_column {
Column::Left => &mut model.cursor,
Column::Right => &mut model.dest_cursor,
}
}