146 lines
4.4 KiB
Rust
146 lines
4.4 KiB
Rust
// src/ui/handlers/render.rs
|
|
|
|
use crate::components::{
|
|
render_background,
|
|
render_command_line,
|
|
render_status_line,
|
|
handlers::sidebar::{self, calculate_sidebar_layout},
|
|
form::form::render_form,
|
|
admin::{admin_panel::AdminPanelState},
|
|
auth::login::render_login,
|
|
};
|
|
use crate::config::colors::themes::Theme;
|
|
use ratatui::layout::{Constraint, Direction, Layout};
|
|
use ratatui::Frame;
|
|
use crate::state::pages::form::FormState;
|
|
use crate::state::pages::auth::AuthState;
|
|
use crate::state::state::AppState;
|
|
|
|
pub fn render_ui(
|
|
f: &mut Frame,
|
|
form_state: &mut FormState,
|
|
auth_state: &mut AuthState,
|
|
theme: &Theme,
|
|
is_edit_mode: bool,
|
|
total_count: u64,
|
|
current_position: u64,
|
|
current_dir: &str,
|
|
command_input: &str,
|
|
command_mode: bool,
|
|
command_message: &str,
|
|
app_state: &AppState,
|
|
// intro_state parameter removed
|
|
) {
|
|
render_background(f, f.area(), theme);
|
|
|
|
let root = Layout::default()
|
|
.direction(Direction::Vertical)
|
|
.constraints([
|
|
Constraint::Min(1),
|
|
Constraint::Length(1),
|
|
Constraint::Length(1),
|
|
])
|
|
.split(f.area());
|
|
|
|
let main_content_area = root[0];
|
|
if app_state.ui.show_intro {
|
|
// Use app_state's intro_state directly
|
|
app_state.ui.intro_state.render(f, main_content_area, theme);
|
|
}else if app_state.ui.show_login {
|
|
render_login(
|
|
f,
|
|
main_content_area,
|
|
theme,
|
|
auth_state,
|
|
app_state, // Add AppState reference here
|
|
auth_state.current_field < 2
|
|
);
|
|
} else if app_state.ui.show_admin {
|
|
// Create temporary AdminPanelState for rendering
|
|
let mut admin_state = AdminPanelState::new(
|
|
app_state.profile_tree.profiles
|
|
.iter()
|
|
.map(|p| p.name.clone())
|
|
.collect()
|
|
);
|
|
|
|
// Set the selected item - FIXED
|
|
if !admin_state.profiles.is_empty() {
|
|
let selected_index = std::cmp::min(
|
|
app_state.general.selected_item,
|
|
admin_state.profiles.len() - 1
|
|
);
|
|
admin_state.list_state.select(Some(selected_index));
|
|
}
|
|
|
|
admin_state.render(
|
|
f,
|
|
main_content_area,
|
|
theme,
|
|
&app_state.profile_tree,
|
|
&app_state.selected_profile,
|
|
);
|
|
} else if app_state.ui.show_form {
|
|
let (sidebar_area, form_area) = calculate_sidebar_layout(
|
|
app_state.ui.show_sidebar,
|
|
main_content_area
|
|
);
|
|
|
|
if let Some(sidebar_rect) = sidebar_area {
|
|
sidebar::render_sidebar(
|
|
f,
|
|
sidebar_rect,
|
|
theme,
|
|
&app_state.profile_tree,
|
|
&app_state.selected_profile
|
|
);
|
|
}
|
|
|
|
// This change makes the form stay stationary when toggling sidebar
|
|
let available_width = form_area.width;
|
|
let form_constraint = if available_width >= 80 {
|
|
// Use main_content_area for centering when enough space
|
|
Layout::default()
|
|
.direction(Direction::Horizontal)
|
|
.constraints([
|
|
Constraint::Min(0),
|
|
Constraint::Length(80),
|
|
Constraint::Min(0),
|
|
])
|
|
.split(main_content_area)[1]
|
|
} else {
|
|
// Use form_area (post sidebar) when limited space
|
|
Layout::default()
|
|
.direction(Direction::Horizontal)
|
|
.constraints([
|
|
Constraint::Min(0),
|
|
Constraint::Length(80.min(available_width)),
|
|
Constraint::Min(0),
|
|
])
|
|
.split(form_area)[1]
|
|
};
|
|
|
|
// Convert fields to &[&str] and values to &[&String]
|
|
let fields: Vec<&str> = form_state.fields.iter().map(|s| s.as_str()).collect();
|
|
let values: Vec<&String> = form_state.values.iter().collect();
|
|
|
|
render_form(
|
|
f,
|
|
form_constraint,
|
|
form_state,
|
|
&fields,
|
|
&form_state.current_field,
|
|
&values,
|
|
theme,
|
|
is_edit_mode,
|
|
total_count,
|
|
current_position,
|
|
);
|
|
} else{
|
|
|
|
}
|
|
|
|
render_status_line(f, root[1], current_dir, theme, is_edit_mode);
|
|
render_command_line(f, root[2], command_input, command_mode, theme, command_message);
|
|
}
|