Private
Public Access
1
0

kptui: Unread indicator, highlight vs selected state

This commit is contained in:
2026-02-12 13:06:01 -08:00
parent 1febd91c2c
commit 7c117eb52e

View File

@@ -179,21 +179,32 @@ fn ui(frame: &mut Frame, app: &AppState, requested_view: ViewMode) {
fn render_conversations(frame: &mut Frame, app: &AppState, area: Rect, in_split: bool) { fn render_conversations(frame: &mut Frame, app: &AppState, area: Rect, in_split: bool) {
let title = if in_split { let title = if in_split {
"Conversations (↑/↓, Enter)" "Conversations (↑/↓ move, ▸ cursor, ● unread)"
} else { } else {
"Conversations (↑/↓, Enter to open)" "Conversations (↑/↓ move, Enter open, ● unread)"
}; };
let items = app let items = app
.conversations .conversations
.iter() .iter()
.map(|c| { .map(|c| {
let is_active = app.active_conversation_id.as_deref() == Some(c.id.as_str());
let unread = if c.unread_count > 0 { let unread = if c.unread_count > 0 {
format!(" ({})", c.unread_count) format!(" ({})", c.unread_count)
} else { } else {
String::new() String::new()
}; };
let header = Line::from(vec![ let header = Line::from(vec![
Span::styled(
if c.unread_count > 0 { "" } else { " " },
Style::default()
.fg(if c.unread_count > 0 {
Color::LightYellow
} else {
Color::DarkGray
})
.add_modifier(Modifier::BOLD),
),
Span::styled( Span::styled(
c.title.clone(), c.title.clone(),
Style::default().add_modifier(Modifier::BOLD), Style::default().add_modifier(Modifier::BOLD),
@@ -202,9 +213,17 @@ fn render_conversations(frame: &mut Frame, app: &AppState, area: Rect, in_split:
]); ]);
let preview = Line::from(Span::styled( let preview = Line::from(Span::styled(
c.preview.clone(), c.preview.clone(),
Style::default().fg(Color::DarkGray), Style::default().fg(if is_active {
Color::Gray
} else {
Color::DarkGray
}),
)); ));
ListItem::new(vec![header, preview]) ListItem::new(vec![header, preview]).style(if is_active {
Style::default().bg(Color::DarkGray)
} else {
Style::default()
})
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();