use super::*;
pub(super) fn clamp_picker_selection(selected: &mut usize, item_count: usize) {
*selected = (*selected).min(item_count.saturating_sub(1));
}
pub(super) fn keep_picker_selection_visible(
selected: usize,
item_count: usize,
visible_rows: usize,
offset: &mut usize,
) {
let visible_rows = visible_rows.max(1);
let max_offset = item_count.saturating_sub(visible_rows);
*offset = (*offset).min(max_offset);
if selected < *offset {
*offset = selected;
} else if selected >= (*offset).saturating_add(visible_rows) {
*offset = selected
.saturating_add(1)
.saturating_sub(visible_rows)
.min(max_offset);
}
}
pub(super) fn picker_selection_after_move(
selected: usize,
item_count: usize,
amount: usize,
down: bool,
visible_rows: usize,
mut offset: usize,
) -> (usize, usize) {
let last = item_count.saturating_sub(1);
let selected = if down {
selected.saturating_add(amount).min(last)
} else {
selected.saturating_sub(amount).min(last)
};
keep_picker_selection_visible(selected, item_count, visible_rows, &mut offset);
(selected, offset)
}
pub(super) fn skill_row_visual_position(
rows: &[SkillToggleRow],
selected: usize,
) -> (usize, usize) {
let mut visual_row: usize = 0;
let mut previous_source: Option<&str> = None;
let mut selected_visual_row: usize = 0;
for (index, row) in rows.iter().enumerate() {
if previous_source != Some(row.source.as_str()) {
if previous_source.is_some() {
visual_row = visual_row.saturating_add(2);
}
visual_row = visual_row.saturating_add(1);
previous_source = Some(&row.source);
}
if index == selected {
selected_visual_row = visual_row;
}
visual_row = visual_row.saturating_add(1);
}
(selected_visual_row, visual_row.saturating_add(1))
}