use crate::state::{AppState, LOG_CAP, RELAYS};
pub(crate) fn clear_logs(state: &mut AppState) {
state.logs.clear();
state.log_state.select(None);
add_log(state, "日志已清空");
}
pub(crate) fn add_log(state: &mut AppState, msg: &str) {
state.logs.push(msg.to_string());
if state.logs.len() > LOG_CAP {
let to_drop = state.logs.len() - LOG_CAP;
state.logs.drain(0..to_drop);
}
state
.log_state
.select(Some(state.logs.len().saturating_sub(1)));
}
pub(crate) fn next_log(state: &mut AppState) {
if state.logs.is_empty() {
state.log_state.select(None);
return;
}
let next = match state.log_state.selected() {
Some(i) if i + 1 < state.logs.len() => i + 1,
Some(i) => i,
None => 0,
};
state.log_state.select(Some(next));
}
pub(crate) fn prev_log(state: &mut AppState) {
if state.logs.is_empty() {
state.log_state.select(None);
return;
}
let prev = match state.log_state.selected() {
Some(0) => 0,
Some(i) => i - 1,
None => 0,
};
state.log_state.select(Some(prev));
}
pub(crate) fn next_relay_selection(state: &mut AppState) {
let next = match state.relay_state.selected() {
Some(i) if i + 1 < RELAYS.len() => i + 1,
Some(i) => i,
None => 0,
};
state.relay_state.select(Some(next));
}
pub(crate) fn prev_relay_selection(state: &mut AppState) {
let prev = match state.relay_state.selected() {
Some(0) | None => 0,
Some(i) => i - 1,
};
state.relay_state.select(Some(prev));
}