diff options
| author | lukeflo | 2025-02-21 21:55:17 +0100 |
|---|---|---|
| committer | lukeflo | 2025-02-21 21:55:17 +0100 |
| commit | c34412d9e3725bed48af925646110f2ca34b1bd4 (patch) | |
| tree | e7f48bb25a605aeccf0c31ed310f1c7a1ae9e067 /src | |
| parent | ddb6326c1896b82b759d930fb08ea46a820e275a (diff) | |
| download | bibiman-c34412d9e3725bed48af925646110f2ca34b1bd4.tar.gz bibiman-c34412d9e3725bed48af925646110f2ca34b1bd4.zip | |
implement working config file construct, error handling should be improved
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 32 | ||||
| -rw-r--r-- | src/bibiman.rs | 6 | ||||
| -rw-r--r-- | src/cliargs.rs | 11 | ||||
| -rw-r--r-- | src/config.rs | 26 | ||||
| -rw-r--r-- | src/main.rs | 13 | ||||
| -rw-r--r-- | src/tui.rs | 6 | ||||
| -rw-r--r-- | src/tui/popup.rs | 33 | ||||
| -rw-r--r-- | src/tui/ui.rs | 266 |
8 files changed, 202 insertions, 191 deletions
@@ -24,7 +24,6 @@ use crate::tui::commands::InputCmdAction; use crate::tui::popup::PopupKind; use crate::tui::{self, Tui}; use crate::{bibiman::Bibiman, tui::commands::CmdAction}; -use core::panic; use std::ffi::OsStr; use std::path::PathBuf; use std::process::{Command, Stdio}; @@ -60,14 +59,14 @@ impl App { }) } - pub async fn run(&mut self, args: &mut CLIArgs, cfg: &BibiConfig) -> Result<()> { + pub async fn run(&mut self, cfg: &BibiConfig) -> Result<()> { let mut tui = tui::Tui::new()?; tui.enter()?; // Start the main loop. while self.running { // Render the user interface. - tui.draw(self, args)?; + tui.draw(self, cfg)?; // Handle events. match tui.next().await? { Event::Tick => self.tick(), @@ -86,10 +85,10 @@ impl App { } else { CmdAction::from(key_event) }; - self.run_command(command, args, cfg, &mut tui)? + self.run_command(command, cfg, &mut tui)? } Event::Mouse(mouse_event) => { - self.run_command(CmdAction::from(mouse_event), args, cfg, &mut tui)? + self.run_command(CmdAction::from(mouse_event), cfg, &mut tui)? } Event::Resize(_, _) => {} @@ -111,13 +110,7 @@ impl App { self.running = false; } - pub fn run_command( - &mut self, - cmd: CmdAction, - args: &mut CLIArgs, - cfg: &BibiConfig, - tui: &mut Tui, - ) -> Result<()> { + pub fn run_command(&mut self, cmd: CmdAction, cfg: &BibiConfig, tui: &mut Tui) -> Result<()> { match cmd { CmdAction::Input(cmd) => match cmd { InputCmdAction::Nothing => {} @@ -149,7 +142,7 @@ impl App { || doi.starts_with("http://doi.org") || doi.starts_with("http://dx.doi.org") { - self.bibiman.handle_new_entry_submission(args, doi); + self.bibiman.handle_new_entry_submission(doi); } else { self.bibiman.popup_area.popup_message( "No valid DOI pattern: ", @@ -278,7 +271,7 @@ impl App { self.bibiman.open_connected_res(cfg)?; } else if let Some(PopupKind::AppendToFile) = self.bibiman.popup_area.popup_kind { - self.bibiman.append_entry_to_file(args)? + self.bibiman.append_entry_to_file()? } } } @@ -310,7 +303,7 @@ impl App { } CmdAction::EditFile => { if let CurrentArea::EntryArea = self.bibiman.current_area { - self.bibiman.run_editor(cfg, args, tui)?; + self.bibiman.run_editor(cfg, tui)?; } } CmdAction::Open => { @@ -419,15 +412,6 @@ pub fn expand_home(path: &PathBuf) -> PathBuf { } } -fn select_opener() -> String { - match std::env::consts::OS { - "linux" => String::from("xdg-open"), - "macos" => String::from("open"), - "windows" => String::from("start"), - _ => panic!("Couldn't detect OS for setting correct opener"), - } -} - #[cfg(test)] mod test { use super::*; diff --git a/src/bibiman.rs b/src/bibiman.rs index b68b0fa..b8ef2c6 100644 --- a/src/bibiman.rs +++ b/src/bibiman.rs @@ -330,7 +330,7 @@ impl Bibiman { self.entry_table.entry_table_state.select(Some(idx_count)); } - pub fn run_editor(&mut self, cfg: &BibiConfig, args: &CLIArgs, tui: &mut Tui) -> Result<()> { + pub fn run_editor(&mut self, cfg: &BibiConfig, tui: &mut Tui) -> Result<()> { // get filecontent and citekey for calculating line number let citekey: &str = &self.entry_table.entry_table_items [self.entry_table.entry_table_state.selected().unwrap()] @@ -418,7 +418,7 @@ impl Bibiman { ///the new entry via `append_to_file()` function. If not, show error popup /// ///The method needs two arguments: the CLIArgs struct and the `str` containing the DOI - pub fn handle_new_entry_submission(&mut self, args: &CLIArgs, doi_string: &str) { + pub fn handle_new_entry_submission(&mut self, doi_string: &str) { let doi_string = if doi_string.starts_with("10.") { "https://doi.org/".to_string() + doi_string } else { @@ -466,7 +466,7 @@ impl Bibiman { self.popup_area.popup_selection(items); } - pub fn append_entry_to_file(&mut self, args: &mut CLIArgs) -> Result<()> { + pub fn append_entry_to_file(&mut self) -> Result<()> { // Index of selected popup field let popup_idx = self.popup_area.popup_state.selected().unwrap(); diff --git a/src/cliargs.rs b/src/cliargs.rs index bb3c8d1..3c302f4 100644 --- a/src/cliargs.rs +++ b/src/cliargs.rs @@ -24,7 +24,6 @@ use std::path::PathBuf; use walkdir::WalkDir; use crate::app; -use crate::tui::colors::AppColors; // struct for CLIArgs #[derive(Debug, Default, Clone)] @@ -32,11 +31,8 @@ pub struct CLIArgs { pub helparg: bool, pub versionarg: bool, pub pos_args: Vec<PathBuf>, - // pub files: Vec<PathBuf>, pub cfg_path: PathBuf, - // INFO: AppColors struct later should be moved to config/app struct - // when config file is implemented - pub colors: AppColors, + pub light_theme: bool, } impl CLIArgs { @@ -56,10 +52,7 @@ impl CLIArgs { Short('h') | Long("help") => args.helparg = true, Short('v') | Long("version") => args.versionarg = true, Short('c') | Long("config-file") => args.cfg_path = parser.value()?.parse()?, - Long("light-terminal") => { - args.colors.light_colors(); - args.colors.toggle_color_scheme() - } + Long("light-terminal") => args.light_theme = true, // Value(pos_arg) => parse_files(&mut args, pos_arg), Value(pos_arg) => args.pos_args.push(pos_arg.into()), _ => return Err(arg.unexpected()), diff --git a/src/config.rs b/src/config.rs index 22873dd..faba5d8 100644 --- a/src/config.rs +++ b/src/config.rs @@ -72,7 +72,7 @@ impl Default for BibiConfig { info_color: Some(Color::Indexed(99)), confirm_color: Some(Color::Indexed(47)), warn_color: Some(Color::Indexed(124)), - bar_bg_color: Some(Color::Indexed(234)), + bar_bg_color: Some(Color::Indexed(235)), popup_bg_color: Some(Color::Indexed(234)), selected_row_bg_color: Some(Color::Indexed(237)), }), @@ -138,17 +138,6 @@ impl BibiConfig { Ok(()) } - pub fn new(args: &CLIArgs) -> Result<Self> { - // let mut cfg = config::Config::builder(); - // cfg = cfg.add_source( - // config::File::from(args.cfg_path.clone()) - // .format(FileFormat::Toml) - // .required(false), - // ); - // cfg.build()?.try_deserialize() - Ok(Self::parse_cfg_file(args)?) - } - fn parse_cfg_file(args: &CLIArgs) -> Result<Self, ConfigError> { let mut cfg = config::Config::builder(); cfg = cfg.add_source( @@ -158,6 +147,19 @@ impl BibiConfig { ); cfg.build()?.try_deserialize() } + + /// Activates the default color scheme for light background terminals + pub fn light_colors(&mut self) { + self.colors.as_mut().unwrap().main_text_color = Some(Color::Indexed(235)); + self.colors.as_mut().unwrap().highlight_text_color = Some(Color::Indexed(232)); + self.colors.as_mut().unwrap().entry_color = Some(Color::Indexed(23)); + self.colors.as_mut().unwrap().keyword_color = Some(Color::Indexed(58)); + self.colors.as_mut().unwrap().info_color = Some(Color::Indexed(57)); + self.colors.as_mut().unwrap().bar_bg_color = Some(Color::Indexed(144)); + self.colors.as_mut().unwrap().popup_bg_color = Some(Color::Indexed(187)); + self.colors.as_mut().unwrap().confirm_color = Some(Color::Indexed(22)); + self.colors.as_mut().unwrap().selected_row_bg_color = Some(Color::Indexed(107)); + } } fn select_opener() -> String { diff --git a/src/main.rs b/src/main.rs index 8ec3b77..3325f80 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,12 +45,13 @@ async fn main() -> Result<()> { std::process::exit(0); } - // let mut cfg = if parsed_args.cfg_path.is_file() { - // BibiConfig::new(&parsed_args)? - // } else { - // BibiConfig::default() - // }; + // Build default config let mut cfg = BibiConfig::default(); + + if parsed_args.light_theme { + cfg.light_colors(); + } + // Merge values from config file if present cfg.parse_config(&parsed_args)?; init_error_hooks()?; @@ -58,6 +59,6 @@ async fn main() -> Result<()> { // Create an application. let mut app = App::new(&mut parsed_args, &mut cfg)?; - app.run(&mut parsed_args, &cfg).await?; + app.run(&cfg).await?; Ok(()) } @@ -20,7 +20,7 @@ pub mod commands; pub mod popup; pub mod ui; -use crate::{cliargs::CLIArgs, App}; +use crate::{config::BibiConfig, App}; use crossterm::{ cursor, event::{ @@ -195,11 +195,11 @@ impl Tui { // // [`Draw`]: ratatui::Terminal::draw // [`rendering`]: crate::ui::render - pub fn draw(&mut self, app: &mut App, args: &CLIArgs) -> Result<()> { + pub fn draw(&mut self, app: &mut App, cfg: &BibiConfig) -> Result<()> { // self.terminal.draw(|frame| ui::render(app, frame))?; self.terminal // .draw(|frame| frame.render_widget(app, frame.area()))?; - .draw(|frame| ui::render_ui(app, args, frame))?; + .draw(|frame| ui::render_ui(app, cfg, frame))?; Ok(()) } diff --git a/src/tui/popup.rs b/src/tui/popup.rs index 4ef9fc3..6a2e8ff 100644 --- a/src/tui/popup.rs +++ b/src/tui/popup.rs @@ -16,12 +16,12 @@ ///// use ratatui::{ - style::{Color, Stylize}, + style::Stylize, text::{Line, Span, Text}, widgets::ListState, }; -use crate::cliargs::CLIArgs; +use crate::config::BibiConfig; #[derive(Debug)] pub enum PopupKind { @@ -47,7 +47,7 @@ pub struct PopupArea { } impl PopupArea { - pub fn popup_help<'a>(args: &CLIArgs) -> Text<'a> { + pub fn popup_help<'a>(cfg: &BibiConfig) -> Text<'a> { let help = [ ("General", "first"), ("TAB: ", "Toggle areas (Entries, Keywords)"), @@ -89,22 +89,31 @@ impl PopupArea { for (keys, help) in help { if help == "first" { helptext.push(Line::from( - Span::raw(keys) - .bold() - .fg(Color::Indexed(args.colors.main_text_color)), + Span::raw(keys).bold().fg(cfg + .colors + .as_ref() + .unwrap() + .main_text_color + .unwrap()), )) } else if help == "sub" { helptext.push(Line::from("")); helptext.push(Line::from( - Span::raw(keys) - .bold() - .fg(Color::Indexed(args.colors.main_text_color)), + Span::raw(keys).bold().fg(cfg + .colors + .as_ref() + .unwrap() + .main_text_color + .unwrap()), )) } else { helptext.push(Line::from(vec![ - Span::raw(keys) - .bold() - .fg(Color::Indexed(args.colors.keyword_color)), + Span::raw(keys).bold().fg(cfg + .colors + .as_ref() + .unwrap() + .main_text_color + .unwrap()), Span::raw(help), ])) } diff --git a/src/tui/ui.rs b/src/tui/ui.rs index 52d2d9a..5fbe283 100644 --- a/src/tui/ui.rs +++ b/src/tui/ui.rs @@ -17,11 +17,11 @@ use std::path::PathBuf; -use super::colors::AppColorScheme; use super::popup::PopupArea; use crate::bibiman::entries::EntryTableColumn; use crate::bibiman::{CurrentArea, FormerArea}; use crate::cliargs::CLIArgs; +use crate::config::BibiConfig; use crate::tui::popup::PopupKind; use crate::App; use ratatui::layout::{Direction, Position}; @@ -52,8 +52,8 @@ pub fn color_list( highlight: u8, max_diff: i32, ) -> Color { - match args.colors.color_scheme { - AppColorScheme::Dark => { + match args.light_theme { + false => { if list_item == sel_item { Color::Indexed(highlight) } else if (list_item - sel_item) > max_diff @@ -68,7 +68,7 @@ pub fn color_list( Color::Indexed(highlight - (list_item - sel_item) as u8) } } - AppColorScheme::Light => { + true => { if list_item == sel_item { Color::Indexed(highlight) } else if (list_item - sel_item) > max_diff @@ -103,7 +103,7 @@ fn count_files(files: &[PathBuf]) -> u16 { count } -pub fn render_ui(app: &mut App, args: &CLIArgs, frame: &mut Frame) { +pub fn render_ui(app: &mut App, cfg: &BibiConfig, frame: &mut Frame) { let [header_area, main_area, footer_area] = Layout::new( Direction::Vertical, [ @@ -128,20 +128,20 @@ pub fn render_ui(app: &mut App, args: &CLIArgs, frame: &mut Frame) { let [tag_area, info_area] = Layout::horizontal([Constraint::Max(25), Constraint::Min(35)]).areas(item_area); - render_header(args, frame, header_area); + render_header(cfg, frame, header_area); if let CurrentArea::SearchArea = app.bibiman.current_area { - render_footer(app, args, frame, footer_area); + render_footer(app, cfg, frame, footer_area); } - render_entrytable(app, args, frame, entry_area); - render_selected_item(app, args, frame, info_area); - render_taglist(app, args, frame, tag_area); - render_file_info(app, args, frame, entry_info_area); + render_entrytable(app, cfg, frame, entry_area); + render_selected_item(app, cfg, frame, info_area); + render_taglist(app, cfg, frame, tag_area); + render_file_info(app, cfg, frame, entry_info_area); if app.bibiman.popup_area.is_popup { - render_popup(app, args, frame); + render_popup(app, cfg, frame); } } -pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { +pub fn render_popup(app: &mut App, cfg: &BibiConfig, frame: &mut Frame) { match app.bibiman.popup_area.popup_kind { Some(PopupKind::Help) => { let block = Block::bordered() @@ -150,13 +150,13 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { .title_alignment(Alignment::Center) .style( Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.popup_bg_color)), + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().popup_bg_color.unwrap()), ) .border_set(symbols::border::THICK) - .border_style(Style::new().fg(Color::Indexed(args.colors.entry_color))); + .border_style(Style::new().fg(cfg.colors.as_ref().unwrap().entry_color.unwrap())); - let text: Text = PopupArea::popup_help(args); + let text: Text = PopupArea::popup_help(cfg); // Calculate max scroll position depending on hight of terminal window // Needed length is number of text lines plus two for borders at bottom and top @@ -191,23 +191,23 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { .title_alignment(Alignment::Center) .style( Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.popup_bg_color)), + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().popup_bg_color.unwrap()), ) .border_set(symbols::border::THICK) - .border_style(Style::new().fg(Color::Indexed(args.colors.entry_color))); + .border_style(Style::new().fg(cfg.colors.as_ref().unwrap().entry_color.unwrap())); // Prepare the input fields let content = vec![Line::from(vec![ Span::styled( "DOI: ", - Style::new().fg(Color::Indexed(args.colors.entry_color)), + Style::new().fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()), ), Span::raw(app.input.value().to_string().clone()), ])]; let paragraph = Paragraph::new(content) .block(block.clone()) - .style(Style::new().fg(Color::Indexed(args.colors.main_text_color))) + .style(Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap())) .wrap(Wrap { trim: false }); let doi_lines = paragraph.line_count(area.width / 2); @@ -228,18 +228,18 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { .title_top( " Message " .bold() - .fg(Color::Indexed(args.colors.confirm_color)), + .fg(cfg.colors.as_ref().unwrap().confirm_color.unwrap()), ) - .border_style(Style::new().fg(Color::Indexed(args.colors.confirm_color))) + .border_style(Style::new().fg(cfg.colors.as_ref().unwrap().confirm_color.unwrap())) .style( Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.popup_bg_color)), + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().popup_bg_color.unwrap()), ); let content = Paragraph::new(app.bibiman.popup_area.popup_message.clone()) .block(block) - .style(Style::new().fg(Color::Indexed(args.colors.confirm_color))); + .style(Style::new().fg(cfg.colors.as_ref().unwrap().confirm_color.unwrap())); // Calculate popup size. Width is number of string chars plus 2 for border let popup_area = popup_area( @@ -259,18 +259,18 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { .title_top( " Warning " .bold() - .fg(Color::Indexed(args.colors.warn_color)), + .fg(cfg.colors.as_ref().unwrap().warn_color.unwrap()), ) .border_style(Style::new().fg(Color::Red)) .style( Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.popup_bg_color)), + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().popup_bg_color.unwrap()), ); let content = Paragraph::new(app.bibiman.popup_area.popup_message.clone()) .block(block) - .style(Style::new().fg(Color::Indexed(args.colors.warn_color))); + .style(Style::new().fg(cfg.colors.as_ref().unwrap().warn_color.unwrap())); // Calculate popup size. Width is number of string chars plus 2 for border let popup_area = popup_area( @@ -306,15 +306,15 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { .title_alignment(Alignment::Center) .style( Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.popup_bg_color)), + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().popup_bg_color.unwrap()), ) .border_set(symbols::border::THICK) - .border_style(Style::new().fg(Color::Indexed(args.colors.keyword_color))); + .border_style(Style::new().fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap())); let list = List::new(list_items).block(block).highlight_style( Style::new() - // .fg(Color::Indexed(args.colors.entry_color)) + // .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD) .add_modifier(Modifier::REVERSED), ); @@ -330,15 +330,15 @@ pub fn render_popup(app: &mut App, args: &CLIArgs, frame: &mut Frame) { } } -pub fn render_header(args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_header(cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { let main_header = Paragraph::new("BIBIMAN – BibLaTeX manager TUI") .bold() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .centered(); frame.render_widget(main_header, rect) } -pub fn render_footer(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_footer(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { let search_title = { match app.bibiman.former_area { Some(FormerArea::EntryArea) => "Search Entries: ".to_string(), @@ -349,29 +349,36 @@ pub fn render_footer(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rec let title_lenght: u16 = search_title.chars().count() as u16; - let block = Block::new() - .padding(Padding::horizontal(1)) - .bg(Color::Indexed(args.colors.bar_bg_color)); + let block = Block::new().padding(Padding::horizontal(1)).bg(cfg + .colors + .as_ref() + .unwrap() + .bar_bg_color + .unwrap()); let search_string = Paragraph::new(Line::from(vec![ Span::styled( search_title, if let Some(FormerArea::EntryArea) = app.bibiman.former_area { Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD) } else if let Some(FormerArea::TagArea) = app.bibiman.former_area { Style::new() - .fg(Color::Indexed(args.colors.keyword_color)) + .fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap()) .add_modifier(Modifier::BOLD) } else { Style::new() - .fg(Color::Indexed(args.colors.highlight_text_color)) + .fg(cfg.colors.as_ref().unwrap().highlight_text_color.unwrap()) .add_modifier(Modifier::BOLD) }, ), - Span::raw(app.bibiman.search_struct.search_string.clone()) - .fg(Color::Indexed(args.colors.highlight_text_color)), + Span::raw(app.bibiman.search_struct.search_string.clone()).fg(cfg + .colors + .as_ref() + .unwrap() + .highlight_text_color + .unwrap()), ])) .block(block); @@ -383,7 +390,7 @@ pub fn render_footer(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rec // 1. Basename of the currently loaded file // 2. Keyword by which the entries are filtered at the moment // 3. Currently selected entry and total count of entries -pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_file_info(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { let block = Block::new() // can also be Block::new // Leave Top empty to simulate one large box with borders of entry list .borders(Borders::LEFT | Borders::RIGHT | Borders::BOTTOM) @@ -393,10 +400,10 @@ pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: symbols::border::PLAIN }) .border_style(if let CurrentArea::EntryArea = app.bibiman.current_area { - Style::new().fg(Color::Indexed(args.colors.highlight_text_color)) + Style::new().fg(cfg.colors.as_ref().unwrap().highlight_text_color.unwrap()) } else { Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD) }); @@ -415,7 +422,7 @@ pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: { Line::from(vec![ Span::raw("File: ") - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), Span::raw( app.bibiman.main_bibfiles[0] @@ -423,28 +430,33 @@ pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: .unwrap() .to_string_lossy(), ) - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), ]) - .bg(Color::Indexed(args.colors.bar_bg_color)) + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()) } else { Line::from(vec![ Span::raw("Multiple files (") - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), Span::raw(count_files(&app.bibiman.main_bibfiles).to_string()) - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), Span::raw(")") - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), ]) - .bg(Color::Indexed(args.colors.bar_bg_color)) + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()) }; let cur_keywords = Line::from(if !app.bibiman.tag_list.selected_keywords.is_empty() { vec![ - Span::raw("Selected keywords: ").fg(Color::Indexed(args.colors.main_text_color)), + Span::raw("Selected keywords: ").fg(cfg + .colors + .as_ref() + .unwrap() + .main_text_color + .unwrap()), // Show all keywords in correct order if list is filtered // successively by multiple keywords Span::raw(app.bibiman.tag_list.selected_keywords.join(" → ")) @@ -454,7 +466,7 @@ pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: } else { vec![Span::raw(" ")] }) - .bg(Color::Indexed(args.colors.bar_bg_color)); + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()); // .render(keyword_area, buf); let item_count = Line::from( @@ -490,38 +502,42 @@ pub fn render_file_info(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: .to_string() }, ) - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .bold(), - Span::raw("/").fg(Color::Indexed(args.colors.main_text_color)), - Span::raw(app.bibiman.entry_table.entry_table_items.len().to_string()) - .fg(Color::Indexed(args.colors.main_text_color)), + Span::raw("/").fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()), + Span::raw(app.bibiman.entry_table.entry_table_items.len().to_string()).fg(cfg + .colors + .as_ref() + .unwrap() + .main_text_color + .unwrap()), ] } else { vec![Span::raw("No entries")] }, ) .right_aligned() - .bg(Color::Indexed(args.colors.bar_bg_color)); + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()); frame.render_widget(file_info, file_area); frame.render_widget(cur_keywords, keyword_area); frame.render_widget(item_count, count_area); } -pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_entrytable(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { let entry_box_selected_border_style: Style = - Style::new().fg(Color::Indexed(args.colors.highlight_text_color)); + Style::new().fg(cfg.colors.as_ref().unwrap().highlight_text_color.unwrap()); let entry_box_selected_title_style: Style = Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD); let entry_box_unselected_border_style: Style = - Style::new().fg(Color::Indexed(args.colors.main_text_color)); + Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()); let entry_box_unselected_title_style: Style = Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD); let selected_table_col_style: Style = Style::new().add_modifier(Modifier::BOLD); let selectec_table_cell_style: Style = Style::new().add_modifier(Modifier::REVERSED); let entry_selected_row_style: Style = Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::BOLD) .add_modifier(Modifier::REVERSED); @@ -551,8 +567,8 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: let header_style = Style::default() .bold() - .fg(Color::Indexed(args.colors.main_text_color)) - .bg(Color::Indexed(args.colors.bar_bg_color)); + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()); let header = Row::new(vec![ Cell::from( @@ -576,9 +592,9 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: if let EntryTableColumn::Authors = app.bibiman.entry_table.entry_table_selected_column { - Color::Indexed(args.colors.selected_row_bg_color) + cfg.colors.as_ref().unwrap().selected_row_bg_color.unwrap() } else { - Color::Indexed(args.colors.bar_bg_color) + cfg.colors.as_ref().unwrap().bar_bg_color.unwrap() }, ), ), @@ -602,9 +618,9 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: .bg( if let EntryTableColumn::Title = app.bibiman.entry_table.entry_table_selected_column { - Color::Indexed(args.colors.selected_row_bg_color) + cfg.colors.as_ref().unwrap().selected_row_bg_color.unwrap() } else { - Color::Indexed(args.colors.bar_bg_color) + cfg.colors.as_ref().unwrap().bar_bg_color.unwrap() }, ), ), @@ -628,9 +644,9 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: .bg( if let EntryTableColumn::Year = app.bibiman.entry_table.entry_table_selected_column { - Color::Indexed(args.colors.selected_row_bg_color) + cfg.colors.as_ref().unwrap().selected_row_bg_color.unwrap() } else { - Color::Indexed(args.colors.bar_bg_color) + cfg.colors.as_ref().unwrap().bar_bg_color.unwrap() }, ), ), @@ -655,9 +671,9 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: if let EntryTableColumn::Pubtype = app.bibiman.entry_table.entry_table_selected_column { - Color::Indexed(args.colors.selected_row_bg_color) + cfg.colors.as_ref().unwrap().selected_row_bg_color.unwrap() } else { - Color::Indexed(args.colors.bar_bg_color) + cfg.colors.as_ref().unwrap().bar_bg_color.unwrap() }, ), ), @@ -672,23 +688,24 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: .entry_table_items .iter_mut() .enumerate() - .map(|(i, data)| { + .map(|(_i, data)| { let item = data.ref_vec(); item.into_iter() .map(|content| Cell::from(Text::from(content.to_string()))) .collect::<Row>() .style( - Style::new().fg(color_list( - args, - i as i32, - app.bibiman - .entry_table - .entry_table_state - .selected() - .unwrap_or(0) as i32, - args.colors.highlight_text_color, - 20, - )), + // Style::new().fg(color_list( + // args, + // i as i32, + // app.bibiman + // .entry_table + // .entry_table_state + // .selected() + // .unwrap_or(0) as i32, + // args.colors.highlight_text_color, + // 20, + // )), + Style::new().fg(cfg.colors.as_ref().unwrap().highlight_text_color.unwrap()), ) .height(1) }); @@ -741,11 +758,11 @@ pub fn render_entrytable(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: } } -pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_selected_item(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { // We get the info depending on the item's state. let style_value = Style::new() .bold() - .fg(Color::Indexed(args.colors.main_text_color)); + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()); let lines = { if app .bibiman @@ -767,7 +784,7 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re // Span::styled(cur_entry.authors.clone(), Style::new().green()), Span::styled( cur_entry.authors(), - Style::new().fg(Color::Indexed(args.colors.info_color)), + Style::new().fg(cfg.colors.as_ref().unwrap().info_color.unwrap()), ), ])); if cur_entry.subtitle.is_some() { @@ -776,19 +793,19 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re Span::styled( cur_entry.title(), Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::ITALIC), ), Span::styled( ": ", Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::ITALIC), ), Span::styled( cur_entry.subtitle(), Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::ITALIC), ), ])); @@ -798,7 +815,7 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re Span::styled( cur_entry.title(), Style::new() - .fg(Color::Indexed(args.colors.entry_color)) + .fg(cfg.colors.as_ref().unwrap().entry_color.unwrap()) .add_modifier(Modifier::ITALIC), ), ])); @@ -807,7 +824,7 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re Span::styled("Year: ", style_value), Span::styled( cur_entry.year(), - Style::new().fg(Color::Indexed(args.colors.keyword_color)), + Style::new().fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap()), ), ])); // Render keywords in info box in Markdown code style @@ -821,11 +838,13 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re let mut content = vec![Span::styled("Keywords: ", style_value)]; for k in kw { // Add half block highlighted in bg color to enlarge block - content.push(Span::raw("▐").fg(Color::Indexed(args.colors.bar_bg_color))); + content.push( + Span::raw("▐").fg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()), + ); content.push(Span::styled( k, Style::default() - .bg(Color::Indexed(args.colors.bar_bg_color)) + .bg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()) .fg( // Highlight selected keyword green if app @@ -837,11 +856,13 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re { Color::Green } else { - Color::Indexed(args.colors.main_text_color) + cfg.colors.as_ref().unwrap().main_text_color.unwrap() }, ), )); - content.push(Span::raw("▌").fg(Color::Indexed(args.colors.bar_bg_color))); + content.push( + Span::raw("▌").fg(cfg.colors.as_ref().unwrap().bar_bg_color.unwrap()), + ); } lines.push(Line::from(content)) } @@ -854,7 +875,7 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re Span::styled( cur_entry.doi_url(), Style::new() - .fg(Color::Indexed(args.colors.main_text_color)) + .fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()) .underlined(), ), ])); @@ -864,14 +885,14 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re Span::styled("File: ", style_value), Span::styled( cur_entry.filepath().to_string_lossy(), - Style::new().fg(Color::Indexed(args.colors.main_text_color)), + Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()), ), ])); } lines.push(Line::from("")); lines.push(Line::from(vec![Span::styled( cur_entry.abstract_text.clone(), - Style::new().fg(Color::Indexed(args.colors.main_text_color)), + Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()), )])); lines } else { @@ -888,7 +909,7 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re let block = Block::bordered() .title(Line::raw(" Entry Information ").centered().bold()) .border_set(symbols::border::PLAIN) - .border_style(Style::new().fg(Color::Indexed(args.colors.main_text_color))) + .border_style(Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap())) .padding(Padding::horizontal(1)); // INFO: '.line_count' method only possible with unstable-rendered-line-info feature -> API might change: https://github.com/ratatui/ratatui/issues/293#ref-pullrequest-2027056434 @@ -941,19 +962,19 @@ pub fn render_selected_item(app: &mut App, args: &CLIArgs, frame: &mut Frame, re frame.render_widget(item_info, rect); } -pub fn render_taglist(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Rect) { +pub fn render_taglist(app: &mut App, cfg: &BibiConfig, frame: &mut Frame, rect: Rect) { let keyword_box_selected_border_style: Style = - Style::new().fg(Color::Indexed(args.colors.highlight_text_color)); + Style::new().fg(cfg.colors.as_ref().unwrap().highlight_text_color.unwrap()); let keyword_box_selected_title_style: Style = Style::new() - .fg(Color::Indexed(args.colors.keyword_color)) + .fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap()) .add_modifier(Modifier::BOLD); let keyword_box_unselected_border_style: Style = - Style::new().fg(Color::Indexed(args.colors.main_text_color)); + Style::new().fg(cfg.colors.as_ref().unwrap().main_text_color.unwrap()); let keyword_box_unselected_title_style: Style = Style::new() - .fg(Color::Indexed(args.colors.keyword_color)) + .fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap()) .add_modifier(Modifier::BOLD); let keyword_selected_row_style: Style = Style::new() - .fg(Color::Indexed(args.colors.keyword_color)) + .fg(cfg.colors.as_ref().unwrap().keyword_color.unwrap()) .add_modifier(Modifier::BOLD) .add_modifier(Modifier::REVERSED); @@ -987,18 +1008,19 @@ pub fn render_taglist(app: &mut App, args: &CLIArgs, frame: &mut Frame, rect: Re .tag_list_items .iter() .enumerate() - .map(|(i, keyword)| { + .map(|(_i, keyword)| { ListItem::from(keyword.to_owned()).style(Style::new().fg( if app.bibiman.tag_list.tag_list_state.selected().is_some() { - color_list( - args, - i as i32, - app.bibiman.tag_list.tag_list_state.selected().unwrap() as i32, - args.colors.highlight_text_color, - 20, - ) + // color_list( + // args, + // i as i32, + // app.bibiman.tag_list.tag_list_state.selected().unwrap() as i32, + // args.colors.highlight_text_color, + // 20, + // ) + cfg.colors.as_ref().unwrap().highlight_text_color.unwrap() } else { - Color::Indexed(args.colors.main_text_color) + cfg.colors.as_ref().unwrap().main_text_color.unwrap() }, )) //.bg(color) }) |
