Files
komp_ac/client/src/ui/handlers/render.rs
2025-08-30 13:32:45 +02:00

207 lines
6.3 KiB
Rust

// src/ui/handlers/render.rs
use crate::components::{
admin::add_logic::render_add_logic,
admin::render_add_table,
render_background,
};
use crate::pages::login::render_login;
use crate::pages::register::render_register;
use crate::pages::intro::render_intro;
use crate::bottom_panel::{
command_line::render_command_line,
status_line::render_status_line,
find_file_palette,
};
use crate::sidebar::{calculate_sidebar_layout, render_sidebar};
use crate::buffer::render_buffer_list;
use crate::search::render_search_palette;
use crate::config::colors::themes::Theme;
use crate::modes::general::command_navigation::NavigationState;
use crate::buffer::state::BufferState;
use crate::state::app::state::AppState;
use crate::state::pages::auth::AuthState;
use crate::bottom_panel::layout::{bottom_panel_constraints, render_bottom_panel};
use canvas::FormEditor;
use ratatui::{
layout::{Constraint, Direction, Layout},
Frame,
};
use crate::pages::routing::{Router, Page};
use crate::dialog::render_dialog;
use crate::pages::forms::render_form_page;
pub fn render_ui(
f: &mut Frame,
router: &mut Router,
buffer_state: &BufferState,
theme: &Theme,
event_handler_command_input: &str,
event_handler_command_mode_active: bool,
event_handler_command_message: &str,
navigation_state: &NavigationState,
current_dir: &str,
current_fps: f64,
app_state: &AppState,
auth_state: &AuthState,
) {
render_background(f, f.area(), theme);
// Layout: optional buffer list + main content + bottom panel
let mut main_layout_constraints = vec![Constraint::Min(1)];
if app_state.ui.show_buffer_list {
main_layout_constraints.insert(0, Constraint::Length(1));
}
main_layout_constraints.extend(bottom_panel_constraints(
app_state,
navigation_state,
event_handler_command_mode_active,
));
let root_chunks = Layout::default()
.direction(Direction::Vertical)
.constraints(main_layout_constraints)
.split(f.area());
let mut chunk_idx = 0;
let buffer_list_area = if app_state.ui.show_buffer_list {
let area = Some(root_chunks[chunk_idx]);
chunk_idx += 1;
area
} else {
None
};
let main_content_area = root_chunks[chunk_idx];
chunk_idx += 1;
// Page rendering is now fully router-driven
match &mut router.current {
Page::Intro(state) => render_intro(f, state, main_content_area, theme),
Page::Login(page) => render_login(
f,
main_content_area,
theme,
page,
app_state,
),
Page::Register(state) => render_register(
f,
main_content_area,
theme,
state,
app_state,
),
Page::Admin(state) => crate::pages::admin::main::ui::render_admin_panel(
f,
app_state,
auth_state,
state,
main_content_area,
theme,
&app_state.profile_tree,
&app_state.selected_profile,
),
Page::AddLogic(state) => render_add_logic(
f,
main_content_area,
theme,
app_state,
state,
),
Page::AddTable(state) => render_add_table(
f,
main_content_area,
theme,
app_state,
state,
),
Page::Form(path) => {
let (sidebar_area, form_actual_area) =
calculate_sidebar_layout(app_state.ui.show_sidebar, main_content_area);
if let Some(sidebar_rect) = sidebar_area {
render_sidebar(
f,
sidebar_rect,
theme,
&app_state.profile_tree,
&app_state.selected_profile,
);
}
let available_width = form_actual_area.width;
let form_render_area = if available_width >= 80 {
Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Min(0), Constraint::Length(80), Constraint::Min(0)])
.split(form_actual_area)[1]
} else {
Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Min(0),
Constraint::Length(available_width),
Constraint::Min(0),
])
.split(form_actual_area)[1]
};
if let Some(editor) = app_state.editor_for_path_ref(path) {
let (total_count, current_position) =
if let Some(fs) = app_state.form_state_for_path_ref(path) {
(fs.total_count, fs.current_position)
} else {
(0, 1)
};
let table_name = path.split('/').nth(1).unwrap_or("");
render_form_page(
f,
form_render_area,
editor,
table_name,
theme,
total_count,
current_position,
);
}
}
}
// Global overlays (not tied to a page)
if let Some(area) = buffer_list_area {
render_buffer_list(f, area, theme, buffer_state, app_state);
}
if app_state.ui.show_search_palette {
if let Some(search_state) = &app_state.search_state {
render_search_palette(f, f.area(), theme, search_state);
}
} else if app_state.ui.dialog.dialog_show {
render_dialog(
f,
f.area(),
theme,
&app_state.ui.dialog.dialog_title,
&app_state.ui.dialog.dialog_message,
&app_state.ui.dialog.dialog_buttons,
app_state.ui.dialog.dialog_active_button_index,
app_state.ui.dialog.is_loading,
);
}
render_bottom_panel(
f,
&root_chunks,
&mut chunk_idx,
current_dir,
theme,
current_fps,
app_state,
router,
navigation_state,
event_handler_command_input,
event_handler_command_mode_active,
event_handler_command_message,
);
}