(&mut self, frame: &mut Frame)
| 420 | // ======================== Rendering ======================== |
| 421 | |
| 422 | fn render(&mut self, frame: &mut Frame) { |
| 423 | let size = frame.area(); |
| 424 | frame.render_widget( |
| 425 | Block::default().style(Style::default().bg(self.theme.background)), |
| 426 | size, |
| 427 | ); |
| 428 | |
| 429 | let chunks = Layout::default() |
| 430 | .direction(Direction::Vertical) |
| 431 | .constraints([ |
| 432 | Constraint::Min(1), // main content |
| 433 | Constraint::Length(1), // bottom bar |
| 434 | ]) |
| 435 | .split(size); |
| 436 | |
| 437 | let main_area = chunks[0]; |
| 438 | let input_area = self.render_main(frame, main_area); |
| 439 | self.render_bottom_bar(frame, chunks[1]); |
| 440 | |
| 441 | // Overlay: command menu (above input area) |
| 442 | if self.command_menu.is_visible() { |
| 443 | let menu_area = Rect { |
| 444 | x: input_area.x, |
| 445 | y: main_area.y, |
| 446 | width: input_area.width, |
| 447 | height: input_area.y.saturating_sub(main_area.y), |
| 448 | }; |
| 449 | self.command_menu.render(frame, menu_area, &self.theme); |
| 450 | } |
| 451 | |
| 452 | // Overlay: selector popups (centered on full screen) |
| 453 | self.model_selector.render(frame, size, &self.theme); |
| 454 | self.agent_selector.render(frame, size, &self.theme); |
| 455 | self.session_selector.render(frame, size, &self.theme); |
| 456 | self.skill_selector.render(frame, size, &self.theme); |
| 457 | self.subagent_selector.render(frame, size, &self.theme); |
| 458 | self.theme_selector.render(frame, size, &self.theme); |
| 459 | self.provider_selector.render(frame, size, &self.theme); |
| 460 | self.model_config_form.render_mut(frame, size, &self.theme); |
| 461 | |
| 462 | // Overlay: command palette (Ctrl+P) |
| 463 | self.command_palette.render(frame, size, &self.theme); |
| 464 | |
| 465 | // Overlay: info popup (highest priority) |
| 466 | if let Some(ref msg) = self.info_popup { |
| 467 | super::widgets::render_info_popup(frame, size, msg, self.theme.primary); |
| 468 | } |
| 469 | } |
| 470 | |
| 471 | /// Render main content, returns the input box area (for command menu positioning) |
| 472 | fn render_main(&mut self, frame: &mut Frame, area: Rect) -> Rect { |
nothing calls this directly
no test coverage detected