84 lines
2.8 KiB
Rust
84 lines
2.8 KiB
Rust
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<ListItem> = 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]);
|
|
}
|