mod activity;
mod alerts;
mod ball_bar;
mod banner;
mod birth;
mod board;
mod bootstrap;
mod center;
mod clock;
mod config_edit;
mod config_marks;
mod conv_ball;
mod conv_list;
mod conv_row;
mod delete;
mod delete_agent;
mod dispatch;
mod fire;
mod flight_strip;
mod focus;
mod inbox_queue;
mod input_bar;
mod inspector;
mod keys;
mod login_pane;
mod menus;
mod modal;
mod model_pick;
mod navigator;
mod new_ws;
mod pane;
mod ram;
pub(super) mod row;
mod search_pane;
mod settings;
mod slash;
mod start_pane;
mod start_rows;
mod top_bar;
mod verb_row;
mod workspace;
#[cfg(test)]
mod acceptance;
pub(crate) use config_edit::BrazenPane;
pub use config_edit::ConfigState;
pub use delete::DeleteState;
pub use delete_agent::DeleteAgentState;
pub use model_pick::PickerState;
pub use new_ws::NewWsState;
pub use ram::{InspectorState, LoginHolder, ShellState, StartState, WallRam};
pub use clock::now_ts;
pub(super) use clock::{entropy_seed, now_unix};
use crate::AppModel;
use crate::cli_outbound::Cli;
use crate::ui_state::Panel;
fn pin_to_panel(ui: &mut egui::Ui) {
ui.set_min_height(ui.available_height());
}
pub fn render(
ctx: &egui::Context,
model: &mut AppModel,
state: &mut ShellState,
lernie: &Cli,
bl: &Cli,
bz: &Cli,
) {
state.focus_wall(model.focused_workspace());
alerts::escalate(ctx, model, state);
keys::handle(ctx, model, state, lernie, bl);
let settled = !ctx.input(|i| i.pointer.any_down());
let window = ctx.screen_rect().size();
egui::TopBottomPanel::top("top-bar").show(ctx, |ui| {
row::bounded(ui);
top_bar::render(ui, model, state, lernie, bl);
});
activity_panel(ctx, model, state, window.y, settled);
let width = egui::SidePanel::left("conversations")
.resizable(true)
.default_width(model.panel_size(Panel::Conversations, window.x))
.width_range(Panel::Conversations.min_size()..=Panel::Conversations.max_size(window.x))
.show(ctx, |ui| {
navigator::side_panel(ui, model, state, lernie, bl);
})
.response
.rect
.width();
model.settle_panel_size(Panel::Conversations, width, window.x, settled);
egui::CentralPanel::default().show(ctx, |ui| {
row::bounded(ui);
pane::render(ui, model, state, (lernie, bl, bz), window, settled);
});
modal::backdrop(ctx, state);
delete::dialog(ctx, model, state, lernie, bl);
delete_agent::dialog(ctx, model, state, lernie, bl);
new_ws::dialog(ctx, model, state, lernie, bl);
}
fn activity_panel(
ctx: &egui::Context,
model: &mut AppModel,
state: &mut ShellState,
window: f32,
settled: bool,
) {
let trail = state.activity_open;
let mut panel = egui::TopBottomPanel::bottom(if trail { "activity-trail" } else { "activity" });
if trail {
panel = panel
.resizable(true)
.default_height(model.panel_size(Panel::ActivityTrail, window))
.height_range(Panel::ActivityTrail.min_size()..=Panel::ActivityTrail.max_size(window));
}
let height = panel
.show(ctx, |ui| {
row::bounded(ui);
if trail {
pin_to_panel(ui);
}
activity::accessory(ui, model, &mut state.activity_open);
})
.response
.rect
.height();
if trail {
model.settle_panel_size(Panel::ActivityTrail, height, window, settled);
}
}