use crate::AppModel;
use crate::cli_outbound::Cli;
use crate::ui_state::Panel;
use super::ShellState;
const GOAL_FLOOR: f32 = 96.0;
pub(super) fn render(
ui: &mut egui::Ui,
model: &mut AppModel,
state: &mut ShellState,
clis: (&Cli, &Cli, &Cli),
window: egui::Vec2,
settled: bool,
) {
let (lernie, bl, bz) = clis;
let conversation = super::center::conversation_open(state);
let composer_open = conversation
&& state.start.pending.is_none()
&& model.focused_workspace().is_some()
&& !model.focused_is_replay();
let pane = ui.available_height();
let goal = composer_open || state.start.pending.is_some();
if let Some(cap) =
crate::layout::share(pane, ui.available_height(), GOAL_FLOOR).filter(|_| conversation)
{
super::settings::render(ui, cap, model, state, lernie, bl, bz);
}
if let Some(cap) = crate::layout::share(pane, ui.available_height(), 0.0).filter(|_| goal) {
if let Some(height) = start_box(ui, model, state, (lernie, bl), (cap, window.y)) {
model.settle_panel_size(Panel::StartGoal, height, window.y, settled);
} else {
egui::TopBottomPanel::bottom("composer")
.default_height(GOAL_FLOOR)
.show_inside(ui, |ui| {
ui.set_max_height(cap);
super::input_bar::composer(ui, model, state, lernie, bl, cap);
});
}
}
if conversation && crate::layout::share(pane, ui.available_height(), 0.0).is_some() {
super::flight_strip::render(ui, model);
}
body(ui, model, state, clis);
}
fn start_box(
ui: &mut egui::Ui,
model: &mut AppModel,
state: &mut ShellState,
clis: (&Cli, &Cli),
bounds: (f32, f32),
) -> Option<f32> {
let (lernie, bl) = clis;
let (cap, window_y) = bounds;
state.start.pending.as_ref()?;
Some(
egui::TopBottomPanel::bottom("start-composer")
.resizable(true)
.default_height(model.panel_size(Panel::StartGoal, window_y))
.height_range(Panel::StartGoal.min_size().min(cap)..=cap)
.show_inside(ui, |ui| {
super::pin_to_panel(ui);
super::start_pane::composer(ui, model, state, lernie, bl);
})
.response
.rect
.height(),
)
}
fn body(ui: &mut egui::Ui, model: &mut AppModel, state: &mut ShellState, clis: (&Cli, &Cli, &Cli)) {
let (lernie, bl, bz) = clis;
ui.set_clip_rect(ui.clip_rect().intersect(ui.available_rect_before_wrap()));
egui::ScrollArea::vertical()
.id_salt("center-body")
.show(ui, |ui| {
super::center::render(ui, model, state, lernie, bl, bz);
});
}