| 186 | } |
| 187 | |
| 188 | pub fn render(&self, frame: &mut Frame, area: Rect, theme: &Theme) { |
| 189 | if !self.is_open { |
| 190 | return; |
| 191 | } |
| 192 | |
| 193 | let question = match &self.current_question { |
| 194 | Some(q) => q, |
| 195 | None => return, |
| 196 | }; |
| 197 | |
| 198 | let mut content = vec![ |
| 199 | Line::from(Span::styled( |
| 200 | "Question:", |
| 201 | Style::default().fg(theme.primary).bold(), |
| 202 | )), |
| 203 | Line::from(""), |
| 204 | Line::from(Span::styled( |
| 205 | &question.question, |
| 206 | Style::default().fg(theme.text), |
| 207 | )), |
| 208 | Line::from(""), |
| 209 | ]; |
| 210 | |
| 211 | if !question.options.is_empty() { |
| 212 | for (i, opt) in question.options.iter().enumerate() { |
| 213 | let is_selected = self.selected_options.get(i).copied().unwrap_or(false); |
| 214 | let is_highlighted = i == self.selected_index; |
| 215 | let marker = if is_selected { "[x]" } else { "[ ]" }; |
| 216 | let key = (b'a' + i as u8) as char; |
| 217 | let label_style = if is_highlighted { |
| 218 | Style::default().fg(theme.primary).bold() |
| 219 | } else { |
| 220 | Style::default().fg(theme.text) |
| 221 | }; |
| 222 | content.push(Line::from(vec![ |
| 223 | Span::styled( |
| 224 | format!("{} ({}) ", marker, key), |
| 225 | Style::default().fg(theme.primary), |
| 226 | ), |
| 227 | Span::styled(&opt.label, label_style), |
| 228 | ])); |
| 229 | } |
| 230 | content.push(Line::from("")); |
| 231 | content.push(Line::from(Span::styled( |
| 232 | "Up/Down to navigate, Space to toggle, Enter to confirm", |
| 233 | Style::default().fg(theme.text_muted), |
| 234 | ))); |
| 235 | } else { |
| 236 | // Text input mode |
| 237 | let input_display = if self.text_input.is_empty() { |
| 238 | "Type your answer...".to_string() |
| 239 | } else { |
| 240 | format!("> {}", self.text_input) |
| 241 | }; |
| 242 | let input_style = if self.text_input.is_empty() { |
| 243 | Style::default().fg(theme.text_muted) |
| 244 | } else { |
| 245 | Style::default().fg(theme.text) |