kptui: Unread indicator, highlight vs selected state
This commit is contained in:
@@ -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<_>>();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user