Small upd
This commit is contained in:
parent
d63296d7b4
commit
6b8b4ef355
74
src/component.rs
Normal file
74
src/component.rs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
pub mod table {
|
||||||
|
use ratatui::layout::{Constraint, Rect};
|
||||||
|
use ratatui::prelude::{Color, Style};
|
||||||
|
use ratatui::widgets::{Block, Borders, Row, Table};
|
||||||
|
use ratatui::Frame;
|
||||||
|
|
||||||
|
pub struct SmartTable {
|
||||||
|
header: Vec<String>,
|
||||||
|
data: Vec<Vec<String>>,
|
||||||
|
constraints: Vec<Constraint>,
|
||||||
|
selected_row: i32,
|
||||||
|
title: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SmartTable {
|
||||||
|
pub fn new(header: Vec<String>, constraints: Vec<Constraint>) -> Self {
|
||||||
|
Self {
|
||||||
|
header,
|
||||||
|
data: Vec::new(),
|
||||||
|
constraints,
|
||||||
|
selected_row: 0,
|
||||||
|
title: String::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_data(&mut self, data: Vec<Vec<String>>) {
|
||||||
|
self.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_title(&mut self, title: String) {
|
||||||
|
self.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn previous_row(&mut self) {
|
||||||
|
self.selected_row = (self.selected_row - 1).max(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn next_row(&mut self) {
|
||||||
|
self.selected_row = (self.selected_row + 1).min(self.data.len() as i32 - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn selected_row(&self) -> usize {
|
||||||
|
self.selected_row as usize
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render(&self, frame: &mut Frame, area: Rect) {
|
||||||
|
let mut v = vec![Row::new(self.header.clone()).style(Style::default().fg(Color::Gray))];
|
||||||
|
|
||||||
|
for (i, entry) in self.data.iter().enumerate() {
|
||||||
|
v.push(
|
||||||
|
Row::new(entry.clone()).style(if self.selected_row as usize == i {
|
||||||
|
Style::default().bg(Color::LightBlue).fg(Color::White)
|
||||||
|
} else {
|
||||||
|
Style::default()
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.selected_row as usize > area.rows().count() - 4 {
|
||||||
|
v = v[(self.selected_row as usize - (area.rows().count() - 4))..].to_vec();
|
||||||
|
}
|
||||||
|
|
||||||
|
let table = Table::new(v, self.constraints.clone())
|
||||||
|
.block(
|
||||||
|
Block::default()
|
||||||
|
.borders(Borders::ALL)
|
||||||
|
.title(self.title.as_ref()),
|
||||||
|
)
|
||||||
|
.style(Style::default().fg(Color::Black));
|
||||||
|
|
||||||
|
frame.render_widget(table, area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,10 @@
|
|||||||
|
use crate::component::table::SmartTable;
|
||||||
use crate::{screen::AppScreen, theme::Theme};
|
use crate::{screen::AppScreen, theme::Theme};
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use crossterm::event::KeyCode;
|
||||||
use ratatui::layout::{Constraint, Direction, Layout, Rect};
|
use ratatui::layout::{Constraint, Direction, Layout, Rect};
|
||||||
use ratatui::prelude::{Color, Line, Style, Stylize};
|
use ratatui::prelude::{Line, Stylize};
|
||||||
use ratatui::widgets::{Block, Borders, Paragraph, Row, Table};
|
use ratatui::widgets::Paragraph;
|
||||||
use ratatui::Frame;
|
use ratatui::Frame;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::fs::DirEntry;
|
use std::fs::DirEntry;
|
||||||
@ -10,19 +12,38 @@ use std::os::unix::fs::MetadataExt;
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub struct FileSystem {
|
pub struct FileSystem {
|
||||||
dir: Vec<DirEntry>,
|
table: SmartTable,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for FileSystem {
|
impl Default for FileSystem {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let mut a = Self { dir: Vec::new() };
|
let table = SmartTable::new(
|
||||||
|
["Name", "Type", "Size", "Modified"]
|
||||||
|
.iter_mut()
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.collect(),
|
||||||
|
vec![
|
||||||
|
Constraint::Percentage(50),
|
||||||
|
Constraint::Length(5),
|
||||||
|
Constraint::Percentage(20),
|
||||||
|
Constraint::Percentage(30),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut a = Self { table };
|
||||||
a.get_path(dirs::document_dir().unwrap());
|
a.get_path(dirs::document_dir().unwrap());
|
||||||
a
|
a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppScreen for FileSystem {
|
impl AppScreen for FileSystem {
|
||||||
fn handle_key_event(&mut self, key_event: crossterm::event::KeyEvent) {}
|
fn handle_key_event(&mut self, key_event: crossterm::event::KeyEvent) {
|
||||||
|
match key_event.code {
|
||||||
|
KeyCode::Up => self.table.previous_row(),
|
||||||
|
KeyCode::Down => self.table.next_row(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn render(&self, frame: &mut ratatui::Frame, theme: &Theme) {
|
fn render(&self, frame: &mut ratatui::Frame, theme: &Theme) {
|
||||||
let chunks = Layout::default()
|
let chunks = Layout::default()
|
||||||
@ -58,52 +79,41 @@ impl AppScreen for FileSystem {
|
|||||||
|
|
||||||
impl FileSystem {
|
impl FileSystem {
|
||||||
fn get_path(&mut self, p: PathBuf) {
|
fn get_path(&mut self, p: PathBuf) {
|
||||||
let paths = std::fs::read_dir(p).unwrap();
|
let paths = std::fs::read_dir(&p).unwrap();
|
||||||
self.dir = paths
|
let mut dir = paths
|
||||||
.filter_map(|res| res.ok())
|
.filter_map(|res| res.ok())
|
||||||
.filter(|p| p.path().extension().map_or(false, |ext| ext == "mp3") || p.path().is_dir())
|
.filter(|p| p.path().extension().map_or(false, |ext| ext == "mp3") || p.path().is_dir())
|
||||||
.collect();
|
.collect::<Vec<DirEntry>>();
|
||||||
self.dir.sort_by(|a, b| {
|
dir.sort_by(|a, _b| {
|
||||||
if a.file_type().unwrap().is_dir() {
|
if a.file_type().unwrap().is_dir() {
|
||||||
Ordering::Less
|
Ordering::Less
|
||||||
} else {
|
} else {
|
||||||
Ordering::Greater
|
Ordering::Greater
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
fn render_main(&self, frame: &mut Frame, area: Rect) {
|
let dir = dir
|
||||||
let mut v = vec![Row::new(vec!["Name", "Type", "Size", "Modified"])
|
.iter()
|
||||||
.style(Style::default().fg(Color::Gray))];
|
.map(|entry| {
|
||||||
|
let datetime: DateTime<Utc> = entry.metadata().unwrap().modified().unwrap().into();
|
||||||
for entry in self.dir.iter() {
|
let datetime = datetime.format("%d/%m/%Y %T").to_string();
|
||||||
let datetime: DateTime<Utc> = entry.metadata().unwrap().modified().unwrap().into();
|
let size = entry.metadata().unwrap().size().to_string();
|
||||||
let datetime = datetime.format("%d/%m/%Y %T").to_string();
|
let file_type = entry.file_type().unwrap().is_file().to_string();
|
||||||
let size = entry.metadata().unwrap().size().to_string();
|
vec![
|
||||||
let file_type = entry.file_type().unwrap().is_file().to_string();
|
|
||||||
v.push(
|
|
||||||
Row::new(vec![
|
|
||||||
entry.file_name().to_str().unwrap().to_string(),
|
entry.file_name().to_str().unwrap().to_string(),
|
||||||
file_type,
|
file_type,
|
||||||
size,
|
size,
|
||||||
datetime,
|
datetime,
|
||||||
])
|
]
|
||||||
.style(Style::default()),
|
})
|
||||||
);
|
.collect::<Vec<Vec<String>>>();
|
||||||
}
|
|
||||||
|
|
||||||
let table = Table::new(
|
self.table.set_data(dir);
|
||||||
v,
|
self.table
|
||||||
&[
|
.set_title(p.iter().last().unwrap().to_str().unwrap().to_string());
|
||||||
Constraint::Percentage(50),
|
}
|
||||||
Constraint::Length(5),
|
|
||||||
Constraint::Percentage(20),
|
|
||||||
Constraint::Percentage(30),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.block(Block::default().borders(Borders::ALL).title(" Documents "))
|
|
||||||
.style(Style::default().fg(Color::Black));
|
|
||||||
|
|
||||||
frame.render_widget(table, area);
|
fn render_main(&self, frame: &mut Frame, area: Rect) {
|
||||||
|
self.table.render(frame, area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ use tokio::sync::mpsc::{self, Receiver, UnboundedSender};
|
|||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use wait_screen::WaitScreen;
|
use wait_screen::WaitScreen;
|
||||||
|
|
||||||
|
mod component;
|
||||||
mod config;
|
mod config;
|
||||||
mod dlp;
|
mod dlp;
|
||||||
mod file_system;
|
mod file_system;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user