mirror of
https://github.com/kristoferssolo/traxor.git
synced 2025-10-21 20:10:35 +00:00
feat: add popup
This commit is contained in:
parent
7dac02029d
commit
a8c160222b
@ -15,6 +15,7 @@ pub struct App<'a> {
|
|||||||
tabs: &'a [Tab],
|
tabs: &'a [Tab],
|
||||||
pub state: TableState,
|
pub state: TableState,
|
||||||
pub torrents: Torrents,
|
pub torrents: Torrents,
|
||||||
|
pub show_popup: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> App<'a> {
|
impl<'a> App<'a> {
|
||||||
@ -27,6 +28,7 @@ impl<'a> App<'a> {
|
|||||||
index: 0,
|
index: 0,
|
||||||
state: TableState::default(),
|
state: TableState::default(),
|
||||||
torrents: Torrents::new(),
|
torrents: Torrents::new(),
|
||||||
|
show_popup: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,4 +98,8 @@ impl<'a> App<'a> {
|
|||||||
pub fn tabs(&self) -> &[Tab] {
|
pub fn tabs(&self) -> &[Tab] {
|
||||||
self.tabs
|
self.tabs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn toggle_popup(&mut self) {
|
||||||
|
self.show_popup = !self.show_popup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> Result<()> {
|
|||||||
KeyCode::Char('2') => app.switch_tab(1),
|
KeyCode::Char('2') => app.switch_tab(1),
|
||||||
KeyCode::Char('3') => app.switch_tab(2),
|
KeyCode::Char('3') => app.switch_tab(2),
|
||||||
KeyCode::Char('4') => app.switch_tab(3),
|
KeyCode::Char('4') => app.switch_tab(3),
|
||||||
|
KeyCode::Char('t') => app.toggle_popup(),
|
||||||
// Other handlers you could add here.
|
// Other handlers you could add here.
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,51 +3,15 @@ use ratatui::{
|
|||||||
prelude::{Constraint, Direction, Layout},
|
prelude::{Constraint, Direction, Layout},
|
||||||
style::{Color, Style},
|
style::{Color, Style},
|
||||||
text::Line,
|
text::Line,
|
||||||
widgets::{Block, BorderType, Borders, Row, Table, Tabs},
|
widgets::{Block, BorderType, Borders, Clear, Tabs},
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
|
mod popup;
|
||||||
|
mod table;
|
||||||
|
|
||||||
use crate::app::{utils::Wrapper, App, Tab};
|
use crate::app::{App, Tab};
|
||||||
|
|
||||||
fn render_table<'a>(app: &mut App, tab: Tab) -> Table<'a> {
|
use self::{popup::render_popup, table::render_table};
|
||||||
let fields = tab.fields();
|
|
||||||
let torrents = app.torrents.set_fields(None).torrents();
|
|
||||||
|
|
||||||
let rows: Vec<Row<'_>> = torrents
|
|
||||||
.iter()
|
|
||||||
.map(|torrent| {
|
|
||||||
Row::new(
|
|
||||||
fields
|
|
||||||
.iter()
|
|
||||||
.map(|&field| field.value(torrent.clone()))
|
|
||||||
.collect::<Vec<_>>(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let widths = fields
|
|
||||||
.iter()
|
|
||||||
.map(|&field| Constraint::Length(field.width()))
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
let header = Row::new(
|
|
||||||
fields
|
|
||||||
.iter()
|
|
||||||
.map(|&field| field.title())
|
|
||||||
.collect::<Vec<_>>(),
|
|
||||||
)
|
|
||||||
.style(Style::default().fg(Color::Yellow));
|
|
||||||
Table::new(rows, widths)
|
|
||||||
.block(
|
|
||||||
Block::default()
|
|
||||||
.borders(Borders::ALL)
|
|
||||||
.border_type(BorderType::Rounded),
|
|
||||||
)
|
|
||||||
.header(header)
|
|
||||||
.highlight_style(Style::default().fg(Color::Red))
|
|
||||||
.highlight_symbol(">> ")
|
|
||||||
.column_spacing(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Renders the user interface widgets.
|
/// Renders the user interface widgets.
|
||||||
pub fn render(app: &mut App, frame: &mut Frame) {
|
pub fn render(app: &mut App, frame: &mut Frame) {
|
||||||
@ -88,5 +52,12 @@ pub fn render(app: &mut App, frame: &mut Frame) {
|
|||||||
2 => render_table(app, Tab::Downloading),
|
2 => render_table(app, Tab::Downloading),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
frame.render_stateful_widget(table, chunks[1], &mut app.state) // renders table
|
frame.render_stateful_widget(table, chunks[1], &mut app.state); // renders table
|
||||||
|
|
||||||
|
if app.show_popup {
|
||||||
|
let block = Block::default().title("Popup").borders(Borders::ALL);
|
||||||
|
let size = render_popup(60, 20, size);
|
||||||
|
frame.render_widget(Clear, size);
|
||||||
|
frame.render_widget(block, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
21
src/ui/popup.rs
Normal file
21
src/ui/popup.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use ratatui::layout::{Constraint, Direction, Layout, Rect};
|
||||||
|
|
||||||
|
pub fn render_popup(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
|
||||||
|
let popup_layput = Layout::default()
|
||||||
|
.direction(Direction::Vertical)
|
||||||
|
.constraints([
|
||||||
|
Constraint::Percentage((100 - percent_y) / 2),
|
||||||
|
Constraint::Percentage(percent_y),
|
||||||
|
Constraint::Percentage((100 - percent_y) / 2),
|
||||||
|
])
|
||||||
|
.split(r);
|
||||||
|
|
||||||
|
Layout::default()
|
||||||
|
.direction(Direction::Horizontal)
|
||||||
|
.constraints([
|
||||||
|
Constraint::Percentage((100 - percent_y) / 2),
|
||||||
|
Constraint::Percentage(percent_y),
|
||||||
|
Constraint::Percentage((100 - percent_y) / 2),
|
||||||
|
])
|
||||||
|
.split(popup_layput[1])[1]
|
||||||
|
}
|
||||||
47
src/ui/table.rs
Normal file
47
src/ui/table.rs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
use ratatui::{
|
||||||
|
layout::Constraint,
|
||||||
|
style::{Color, Style},
|
||||||
|
widgets::{Block, BorderType, Borders, Row, Table},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::app::{utils::Wrapper, App, Tab};
|
||||||
|
|
||||||
|
pub fn render_table<'a>(app: &mut App, tab: Tab) -> Table<'a> {
|
||||||
|
let fields = tab.fields();
|
||||||
|
let torrents = app.torrents.set_fields(None).torrents();
|
||||||
|
|
||||||
|
let rows: Vec<Row<'_>> = torrents
|
||||||
|
.iter()
|
||||||
|
.map(|torrent| {
|
||||||
|
Row::new(
|
||||||
|
fields
|
||||||
|
.iter()
|
||||||
|
.map(|&field| field.value(torrent.clone()))
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let widths = fields
|
||||||
|
.iter()
|
||||||
|
.map(|&field| Constraint::Length(field.width()))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let header = Row::new(
|
||||||
|
fields
|
||||||
|
.iter()
|
||||||
|
.map(|&field| field.title())
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
)
|
||||||
|
.style(Style::default().fg(Color::Yellow));
|
||||||
|
Table::new(rows, widths)
|
||||||
|
.block(
|
||||||
|
Block::default()
|
||||||
|
.borders(Borders::ALL)
|
||||||
|
.border_type(BorderType::Rounded),
|
||||||
|
)
|
||||||
|
.header(header)
|
||||||
|
.highlight_style(Style::default().fg(Color::Red))
|
||||||
|
.highlight_symbol(">> ")
|
||||||
|
.column_spacing(1)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user