use std::{io::Write, os::unix::net::UnixStream}; use crate::{ app::{App, Mode}, ipc::IpcRequest, }; use ratatui::{ Frame, layout::{Constraint, Direction, Layout}, style::{Color, Modifier, Style}, text::{Line, Span}, widgets::{Block, Borders, List, ListItem, Padding, Paragraph}, }; use ratatui_image::StatefulImage; pub fn render(f: &mut Frame, app: &mut App) { let main_chunks = Layout::default() .direction(Direction::Vertical) .constraints([Constraint::Min(0), Constraint::Length(3)]) .split(f.area()); let content_chunks = Layout::default() .direction(Direction::Horizontal) .constraints([Constraint::Length(50), Constraint::Min(0)]) .split(main_chunks[0]); let items: Vec = app .filtered_items .iter() .map(|i| ListItem::new(i.as_str())) .collect(); let list = List::new(items) .block(Block::default().borders(Borders::ALL).title(" History ")) .highlight_style( Style::default() .bg(Color::DarkGray) .add_modifier(Modifier::BOLD), ) .highlight_symbol(">> "); f.render_stateful_widget(list, content_chunks[0], &mut app.list_state); let right_panel_block = Block::default() .borders(Borders::ALL) .title(" Prev ") .padding(Padding::uniform(1)); let inner_right_area = right_panel_block.inner(content_chunks[1]); f.render_widget(right_panel_block, content_chunks[1]); if let Some(state) = &mut app.current_image { let image_widget = StatefulImage::default(); f.render_stateful_widget(image_widget, inner_right_area, state); } else { let preview_text = app.get_selected_item().cloned().unwrap_or_default(); let preview_paragraph = Paragraph::new(preview_text).wrap(ratatui::widgets::Wrap { trim: true }); f.render_widget(preview_paragraph, inner_right_area); } let bottom_text = match app.mode { Mode::Normal => Line::from(vec![Span::styled( "-- NORMAL --", Style::default().fg(Color::Green), )]), Mode::Command => Line::from(vec![ Span::styled(":", Style::default().fg(Color::Yellow)), Span::raw(&app.input_buffer), ]), Mode::Search => Line::from(vec![ Span::styled("/", Style::default().fg(Color::Cyan)), Span::raw(&app.input_buffer), ]), Mode::ConfirmDelete => Line::from(vec![Span::styled( "Delete ? (y/n)", Style::default().fg(Color::Red).add_modifier(Modifier::BOLD), )]), }; let bottom_bar = Paragraph::new(bottom_text).block(Block::default().borders(Borders::ALL)); f.render_widget(bottom_bar, main_chunks[1]); }