Compare commits
2 Commits
54ddc9851c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 20f33f5694 | |||
| 989e0aef91 |
150
src/ui.rs
150
src/ui.rs
@ -1,15 +1,10 @@
|
||||
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},
|
||||
widgets::{Block, BorderType, Borders, List, ListItem, Padding, Paragraph},
|
||||
};
|
||||
use ratatui_image::StatefulImage;
|
||||
|
||||
@ -21,32 +16,64 @@ 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(45), Constraint::Min(0)])
|
||||
.split(main_chunks[0]);
|
||||
|
||||
let items: Vec<ListItem> = 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(format!(" {}", i)))
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let list = List::new(items)
|
||||
.block(Block::default().borders(Borders::ALL).title(" History "))
|
||||
.block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.border_type(BorderType::Rounded)
|
||||
.border_style(Style::default().fg(Color::DarkGray))
|
||||
.title(Span::styled(
|
||||
" History ",
|
||||
Style::default()
|
||||
.fg(Color::White)
|
||||
.add_modifier(Modifier::BOLD),
|
||||
))
|
||||
.title_alignment(Alignment::Center),
|
||||
)
|
||||
.highlight_style(
|
||||
Style::default()
|
||||
.bg(Color::DarkGray)
|
||||
.bg(Color::Rgb(40, 44, 52))
|
||||
.fg(Color::White)
|
||||
.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 ")
|
||||
.border_type(BorderType::Rounded)
|
||||
.border_style(Style::default().fg(Color::DarkGray))
|
||||
.title(Span::styled(
|
||||
" Previsualisation ",
|
||||
Style::default()
|
||||
.fg(Color::White)
|
||||
.add_modifier(Modifier::BOLD),
|
||||
))
|
||||
.title_alignment(Alignment::Center)
|
||||
.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 {
|
||||
@ -59,25 +86,82 @@ pub fn render(f: &mut Frame, app: &mut App) {
|
||||
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 current_color = match app.mode {
|
||||
Mode::Normal => Color::Green,
|
||||
Mode::ConfirmDelete => Color::Red,
|
||||
Mode::Command => Color::Yellow,
|
||||
Mode::Search => Color::Cyan,
|
||||
};
|
||||
|
||||
let bottom_bar = Paragraph::new(bottom_text).block(Block::default().borders(Borders::ALL));
|
||||
f.render_widget(bottom_bar, main_chunks[1]);
|
||||
let bottom_block = Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.border_type(BorderType::Rounded)
|
||||
.border_style(Style::default().fg(current_color));
|
||||
|
||||
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()
|
||||
.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(
|
||||
" 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(
|
||||
" SEARCH ",
|
||||
Style::default()
|
||||
.bg(Color::Cyan)
|
||||
.fg(Color::Black)
|
||||
.add_modifier(Modifier::BOLD),
|
||||
),
|
||||
Span::raw(format!(" /{}", app.input_buffer)),
|
||||
]),
|
||||
};
|
||||
|
||||
f.render_widget(
|
||||
Paragraph::new(mode_text).block(Block::default().padding(Padding::horizontal(1))),
|
||||
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 stats_text = Line::from(vec![Span::styled(
|
||||
format!("{}/{} ", current, total),
|
||||
Style::default()
|
||||
.fg(Color::DarkGray)
|
||||
.add_modifier(Modifier::BOLD),
|
||||
)])
|
||||
.alignment(Alignment::Right);
|
||||
|
||||
f.render_widget(Paragraph::new(stats_text), bottom_chunks[1]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user