use crate::app::App;
use crate::config::ConnectionMode;
use crate::fl;
use crossterm::event::MouseEvent;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use std::io;
pub struct AppLayout {
pub list_area: Rect,
pub tabs_area: Rect,
}
pub fn get_layout(size: Rect) -> AppLayout {
let chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Length(3), Constraint::Length(3), Constraint::Min(0), Constraint::Length(1), ])
.split(size);
let main_chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage(67), Constraint::Min(0), ])
.split(chunks[2]);
AppLayout {
tabs_area: chunks[1],
list_area: main_chunks[0],
}
}
pub fn is_in_rect(x: u16, y: u16, rect: Rect) -> bool {
x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height
}
pub fn handle_mouse_event(mouse: MouseEvent, app: &mut App, size: Rect) -> io::Result<bool> {
let layout = get_layout(size);
if is_in_rect(mouse.column, mouse.row, layout.tabs_area) {
let tab_direct = fl!("tab-direct");
let tab_jump = fl!("tab-jump");
let tab_wallix = fl!("tab-wallix");
let titles = [tab_direct, tab_jump, tab_wallix];
let separator_width = 1;
let start_x = layout.tabs_area.x + 1;
if mouse.column < start_x {
return Ok(false);
}
let rel_x = (mouse.column - start_x) as usize;
let mut current_x = 0;
for (i, title) in titles.iter().enumerate() {
let width = title.chars().count();
if rel_x >= current_x && rel_x < current_x + width {
app.connection_mode = ConnectionMode::from_index(i);
return Ok(true);
}
current_x += width + separator_width;
}
return Ok(true);
} else if is_in_rect(mouse.column, mouse.row, layout.list_area) {
let inner_y = layout.list_area.y + 1;
let inner_h = layout.list_area.height.saturating_sub(2);
if mouse.row >= inner_y && mouse.row < inner_y + inner_h {
let row_idx = (mouse.row - inner_y) as usize;
let offset = app.list_state.offset();
let target_index = offset + row_idx;
if target_index < app.get_visible_items().len() {
app.select(target_index);
app.toggle_expansion();
return Ok(true);
}
}
}
Ok(false)
}