| 335 | } |
| 336 | |
| 337 | fn render_skill_line( |
| 338 | &self, |
| 339 | skill: &SkillItem, |
| 340 | theme: &Theme, |
| 341 | include_checkbox: bool, |
| 342 | ) -> ListItem<'static> { |
| 343 | let level_marker = match skill.level.as_str() { |
| 344 | "project" => "P", |
| 345 | "user" => "U", |
| 346 | _ => "?", |
| 347 | }; |
| 348 | let level_style = match skill.level.as_str() { |
| 349 | "project" => theme.style(StyleKind::Info), |
| 350 | _ => theme.style(StyleKind::Muted), |
| 351 | }; |
| 352 | let name_style = theme.style(StyleKind::Primary).add_modifier(Modifier::BOLD); |
| 353 | let desc_style = theme.style(StyleKind::Muted); |
| 354 | let status = if skill.is_shadowed { |
| 355 | " shadowed" |
| 356 | } else if include_checkbox && skill.enabled && !skill.selected_for_runtime { |
| 357 | " enabled" |
| 358 | } else { |
| 359 | "" |
| 360 | }; |
| 361 | |
| 362 | let mut spans = Vec::new(); |
| 363 | if include_checkbox { |
| 364 | spans.push(Span::styled( |
| 365 | if skill.enabled { "[x] " } else { "[ ] " }, |
| 366 | if skill.enabled { |
| 367 | theme.style(StyleKind::Success) |
| 368 | } else { |
| 369 | theme.style(StyleKind::Muted) |
| 370 | }, |
| 371 | )); |
| 372 | } |
| 373 | spans.push(Span::styled(format!("[{}] ", level_marker), level_style)); |
| 374 | spans.push(Span::styled(skill.name.clone(), name_style)); |
| 375 | if !status.is_empty() { |
| 376 | spans.push(Span::styled( |
| 377 | status.to_string(), |
| 378 | theme.style(StyleKind::Muted), |
| 379 | )); |
| 380 | } |
| 381 | spans.push(Span::raw(" ")); |
| 382 | spans.push(Span::styled(skill.description.clone(), desc_style)); |
| 383 | |
| 384 | ListItem::new(Line::from(spans)) |
| 385 | } |
| 386 | } |