From 989e0aef913df27285b15dd7f15f6ace9a86a6e1 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Sun, 8 Mar 2026 19:11:02 +0100 Subject: [PATCH] ui --- src/ui.rs | 97 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 25 deletions(-) diff --git a/src/ui.rs b/src/ui.rs index d2c7c97..cf07d50 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,12 +1,7 @@ -use std::{io::Write, os::unix::net::UnixStream}; - -use crate::{ - app::{App, Mode}, - ipc::IpcRequest, -}; +use crate::app::{App, Mode}; use ratatui::{ Frame, - layout::{Constraint, Direction, Layout}, + layout::{Alignment, Constraint, Direction, Layout}, style::{Color, Modifier, Style}, text::{Line, Span}, widgets::{Block, Borders, List, ListItem, Padding, Paragraph}, @@ -21,17 +16,28 @@ pub fn render(f: &mut Frame, app: &mut App) { let content_chunks = Layout::default() .direction(Direction::Horizontal) - .constraints([Constraint::Length(50), Constraint::Min(0)]) + .constraints([Constraint::Length(40), Constraint::Min(0)]) .split(main_chunks[0]); let items: Vec = app .filtered_items .iter() - .map(|i| ListItem::new(i.as_str())) + .map(|i| { + if i.ends_with(".jpg") || i.ends_with(".png") { + ListItem::new(Line::from(Span::styled( + format!("🖼️ {}", i), + Style::default() + .fg(Color::Magenta) + .add_modifier(Modifier::BOLD), + ))) + } else { + ListItem::new(Line::from(i.as_str())) + } + }) .collect(); let list = List::new(items) - .block(Block::default().borders(Borders::ALL).title(" History ")) + .block(Block::default().borders(Borders::ALL).title(" Historique ")) .highlight_style( Style::default() .bg(Color::DarkGray) @@ -42,9 +48,8 @@ pub fn render(f: &mut Frame, app: &mut App) { let right_panel_block = Block::default() .borders(Borders::ALL) - .title(" Prev ") + .title(" Prévisualisation ") .padding(Padding::uniform(1)); - let inner_right_area = right_panel_block.inner(content_chunks[1]); f.render_widget(right_panel_block, content_chunks[1]); @@ -59,25 +64,67 @@ pub fn render(f: &mut Frame, app: &mut App) { f.render_widget(preview_paragraph, inner_right_area); } - let bottom_text = match app.mode { + let bottom_block = Block::default().borders(Borders::ALL); + let inner_bottom_area = bottom_block.inner(main_chunks[1]); + f.render_widget(bottom_block, main_chunks[1]); + + let bottom_chunks = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Min(0), Constraint::Length(15)]) + .split(inner_bottom_area); + + let mode_text = match app.mode { Mode::Normal => Line::from(vec![Span::styled( - "-- NORMAL --", - Style::default().fg(Color::Green), + " NORMAL ", + Style::default() + .bg(Color::Green) + .fg(Color::Black) + .add_modifier(Modifier::BOLD), + )]), + Mode::ConfirmDelete => Line::from(vec![Span::styled( + " Delete ? (y/n) ", + Style::default() + .bg(Color::Red) + .fg(Color::White) + .add_modifier(Modifier::BOLD), )]), Mode::Command => Line::from(vec![ - Span::styled(":", Style::default().fg(Color::Yellow)), - Span::raw(&app.input_buffer), + Span::styled( + " COMMAND ", + Style::default() + .bg(Color::Yellow) + .fg(Color::Black) + .add_modifier(Modifier::BOLD), + ), + Span::raw(format!(" :{}", app.input_buffer)), ]), Mode::Search => Line::from(vec![ - Span::styled("/", Style::default().fg(Color::Cyan)), - Span::raw(&app.input_buffer), + Span::styled( + " SEARCH ", + Style::default() + .bg(Color::Cyan) + .fg(Color::Black) + .add_modifier(Modifier::BOLD), + ), + Span::raw(format!(" /{}", app.input_buffer)), ]), - Mode::ConfirmDelete => Line::from(vec![Span::styled( - "Delete ? (y/n)", - Style::default().fg(Color::Red).add_modifier(Modifier::BOLD), - )]), + }; + f.render_widget(Paragraph::new(mode_text), bottom_chunks[0]); + + let total = app.filtered_items.len(); + let current = if total == 0 { + 0 + } else { + app.list_state.selected().unwrap_or(0) + 1 }; - let bottom_bar = Paragraph::new(bottom_text).block(Block::default().borders(Borders::ALL)); - f.render_widget(bottom_bar, main_chunks[1]); + let stats_text = Line::from(vec![Span::styled( + format!(" {}/{} ", current, total), + Style::default() + .fg(Color::Yellow) + .add_modifier(Modifier::BOLD), + )]) + .alignment(Alignment::Right); + + f.render_widget(Paragraph::new(stats_text), bottom_chunks[1]); }