From e425c7dcdf444de1151ab3f5347e6503cd0452b9 Mon Sep 17 00:00:00 2001 From: lukeflo Date: Mon, 7 Oct 2024 16:44:26 +0200 Subject: working func for opening PDFs, needs refinement (MacOS) --- src/frontend/entries.rs | 25 +++++++++++++++++++++++-- src/frontend/handler.rs | 3 +++ src/frontend/ui.rs | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) (limited to 'src/frontend') diff --git a/src/frontend/entries.rs b/src/frontend/entries.rs index 8eadfa2..b1312ec 100644 --- a/src/frontend/entries.rs +++ b/src/frontend/entries.rs @@ -18,11 +18,14 @@ use super::app::App; use super::tui::Tui; use crate::backend::search::BibiSearch; -use color_eyre::eyre::Result; +use color_eyre::eyre::{Context, Ok, Result}; use editor_command::EditorBuilder; use itertools::Itertools; use ratatui::widgets::TableState; -use std::process::Command; +use std::{ + io::Stderr, + process::{Command, Stdio}, +}; impl FromIterator> for EntryTable { fn from_iter>>(iter: T) -> Self { @@ -214,4 +217,22 @@ impl App { // self.search_struct.filtered_entry_list = filtered_list.clone(); self.entry_table = EntryTable::from_iter(filtered_list) } + + // Open file connected with entry through 'file' or 'pdf' field + pub fn open_connected_file(&mut self) -> Result<()> { + let idx = self.entry_table.entry_table_state.selected().unwrap(); + let filepath = &self.entry_table.entry_table_items[idx].filepath.clone(); + + // Build command to execute pdf-reader. 'xdg-open' is Linux standard + // TODO: need to implement for MacOS ('opener'). Windows, I don't know... + let _ = Command::new("xdg-open") + .arg(&filepath) + // Pipe output produced by opener to /dev/null + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .wrap_err("Opening file not possible"); + + Ok(()) + } } diff --git a/src/frontend/handler.rs b/src/frontend/handler.rs index a718a87..5bb52d5 100644 --- a/src/frontend/handler.rs +++ b/src/frontend/handler.rs @@ -99,6 +99,9 @@ pub fn handle_key_events(key_event: KeyEvent, app: &mut App, tui: &mut Tui) -> R KeyCode::Char('e') => { app.run_editor(tui)?; } + KeyCode::Char('o') => { + app.open_connected_file()?; + } KeyCode::Char('/') => { app.enter_search_area(); } diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 4920b81..ed6171e 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -27,7 +27,7 @@ use ratatui::{ }, }; -use crate::{backend::bib::BibiEntry, frontend::app::App, frontend::keywords::TagListItem}; +use crate::{frontend::app::App, frontend::keywords::TagListItem}; use super::app::{CurrentArea, FormerArea}; -- cgit v1.2.3