diff options
| author | pablu <me@pablu.de> | 2026-05-08 16:14:36 +0200 |
|---|---|---|
| committer | pablu <me@pablu.de> | 2026-05-08 16:14:36 +0200 |
| commit | fe377f4d850ece44c691b4cb48da5f529ec08dd1 (patch) | |
| tree | fdd7b603346e48175a29e1e1e3321142c6dc2782 /src | |
| parent | b6487e2009cb2191ef70fc6feefb38a0b6db1543 (diff) | |
improve code quality
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 25 | ||||
| -rw-r--r-- | src/event.rs | 119 | ||||
| -rw-r--r-- | src/gentoo/package.rs | 16 | ||||
| -rw-r--r-- | src/gentoo/portage.rs | 8 | ||||
| -rw-r--r-- | src/ui.rs | 20 |
5 files changed, 105 insertions, 83 deletions
@@ -5,12 +5,11 @@ use crate::gentoo::{Package, portage::Portage}; #[derive(Debug)] pub enum ViewState { - Dashboard, - InstalledPackages, + Dashboard = 0, + InstalledPackages = 1, } #[derive(Debug)] -#[allow(dead_code)] pub struct App<'a> { portage: Portage, pub list_state: ListState, @@ -23,7 +22,6 @@ pub struct App<'a> { pub view: ViewState, } -#[allow(dead_code)] impl<'a> App<'a> { pub fn new(portage: Portage) -> Self { App { @@ -43,26 +41,21 @@ impl<'a> App<'a> { self.portage.world_packages.len() } - pub fn installed_packages(&self) -> Vec<Package> { - self.portage.installed_packages.clone() + pub fn installed_packages(&self) -> &[Package] { + &self.portage.installed_packages } - pub fn current_package(&self) -> Package { + pub fn current_package(&self) -> &Package { let selected_package_index = match self.list_state.selected() { Some(selected) => selected, None => 0, }; - self.portage.installed_packages[selected_package_index].clone() + &self.portage.installed_packages[selected_package_index] } pub fn total_installed_size(&self) -> usize { - self.portage - .installed_packages - .clone() - .into_iter() - .map(|p| p.size) - .sum() + self.portage.installed_packages.iter().map(|p| p.size).sum() } pub fn toggle_search_window(&mut self) { @@ -93,14 +86,16 @@ impl<'a> App<'a> { .collect(); if let Some(index) = indexes.first() { - self.list_state.select(Some(index.clone())); + self.list_state.select(Some(*index)); self.search_indexes_len = Some(indexes.len()); self.search_indexes = Some(indexes); self.current_search_index = Some(0); + return true; } self.search_indexes = None; + return false; } diff --git a/src/event.rs b/src/event.rs index 7045d6d..b3a0e8f 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,62 +1,89 @@ use std::io; -use ratatui::crossterm::event::{self, Event, KeyCode, KeyModifiers}; +use ratatui::crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers}; use crate::app::App; pub fn handle_event(app: &mut App) -> io::Result<bool> { if let Event::Key(key) = event::read()? { - if !app.showing_search_window { - match key.code { - KeyCode::Char('q') => return Ok(true), - KeyCode::Char('j') => app.list_state.select_next(), - KeyCode::Char('k') => app.list_state.select_previous(), - KeyCode::Char('/') => app.toggle_search_window(), - KeyCode::Char('n') => app.next_search(), - KeyCode::Char('N') => app.prev_search(), - - KeyCode::Tab => app.cycle_current_tab(), + match app.view { + crate::app::ViewState::Dashboard => { + if handle_dashboard_keybinds(key, app) { + return Ok(true); + } + } + crate::app::ViewState::InstalledPackages => { + if app.showing_search_window { + handle_search_keybinds(key, app); + } else { + if handle_installed_packages_keybinds(key, app) { + return Ok(true); + } + } + } + } + } - KeyCode::Char('d') => match key.modifiers { - KeyModifiers::CONTROL => app - .list_state - .select(Some(app.list_state.selected().unwrap_or(0) + 30)), + Ok(false) +} - _ => return Ok(false), - }, +fn handle_search_keybinds(key: KeyEvent, app: &mut App) { + match key.code { + KeyCode::Esc => app.toggle_search_window(), + KeyCode::Enter => { + app.search(); + app.toggle_search_window(); + () + } + _ => { + app.textarea.input_without_shortcuts(key); + app.search_found = Some(app.search()); + () + } + } +} - KeyCode::Char('u') => match key.modifiers { - KeyModifiers::CONTROL => { - if let Some(selected) = app.list_state.selected() { - if selected < 30 { - app.list_state.select(Some(0)); - } else { - app.list_state.select(Some(selected - 30)) - } - } +fn handle_installed_packages_keybinds(key: KeyEvent, app: &mut App) -> bool { + match key.modifiers { + KeyModifiers::CONTROL => match key.code { + KeyCode::Char('d') => app + .list_state + .select(Some(app.list_state.selected().unwrap_or(0) + 30)), + KeyCode::Char('u') => { + if let Some(selected) = app.list_state.selected() { + if selected < 30 { + app.list_state.select(Some(0)); + } else { + app.list_state.select(Some(selected - 30)) } - - _ => return Ok(false), - }, - - _ => return Ok(false), - } - } else { - match key.code { - KeyCode::Esc => app.toggle_search_window(), - KeyCode::Enter => { - app.search(); - app.toggle_search_window(); - () - } - _ => { - app.textarea.input_without_shortcuts(key); - app.search_found = Some(app.search()); - () } } - } + _ => {} + }, + _ => match key.code { + KeyCode::Char('q') => return true, + KeyCode::Char('j') => app.list_state.select_next(), + KeyCode::Char('k') => app.list_state.select_previous(), + KeyCode::Char('/') => app.toggle_search_window(), + KeyCode::Char('n') => app.next_search(), + KeyCode::Char('N') => app.prev_search(), + + KeyCode::Tab => app.cycle_current_tab(), + + _ => {} + }, } - Ok(false) + false +} + +fn handle_dashboard_keybinds(key: KeyEvent, app: &mut App) -> bool { + match key.code { + KeyCode::Char('q') => return true, + KeyCode::Tab => app.cycle_current_tab(), + + _ => {} + } + + return false; } diff --git a/src/gentoo/package.rs b/src/gentoo/package.rs index 3ead2a4..d23b40b 100644 --- a/src/gentoo/package.rs +++ b/src/gentoo/package.rs @@ -28,14 +28,14 @@ impl Package { use_flags: Vec<UseFlag>, ) -> Self { Package { - name: name, - use_flags: use_flags, - version: version, - repository: repository, - maintainer: maintainer, - description: description, - homepage: homepage, - license: license, + name, + use_flags, + version, + repository, + maintainer, + description, + homepage, + license, size, } } diff --git a/src/gentoo/portage.rs b/src/gentoo/portage.rs index 28d05da..f199cbf 100644 --- a/src/gentoo/portage.rs +++ b/src/gentoo/portage.rs @@ -4,7 +4,7 @@ use quick_xml::{Reader, events::Event}; use crate::gentoo::{Package, UseFlag}; -#[derive(Debug)] +#[derive(Debug, Default)] pub struct Portage { pub installed_packages: Vec<Package>, pub world_packages: Vec<String>, @@ -111,9 +111,9 @@ impl Portage { let use_flags: Vec<UseFlag> = iuse_flags .iter() .filter(|x| !x.trim().is_empty()) - .map(|&iuse| { - let is_default = iuse.starts_with("+"); - let iuse = iuse.strip_prefix("+").unwrap_or(iuse); + .map(|&original_iuse| { + let iuse = original_iuse.strip_prefix("+").unwrap_or(original_iuse); + let is_default = iuse != original_iuse; let is_active = use_flags.contains(&iuse); @@ -63,8 +63,8 @@ fn render_dashboard(frame: &mut Frame, app: &mut App) { let installed_packages_len = app.installed_packages().len().to_string(); let installed_packages = create_stats("Installed Packages", installed_packages_len.as_str()); - let global_use_flags = create_stats("Global USE Flags", "126"); - let repository_state = create_stats("Repository state", "synced 2h ago"); + let global_use_flags = create_stats("Global USE Flags", "COMING SOON"); + let repository_state = create_stats("Repository state", "COMING SOON"); frame.render_widget(installed_packages, splits[0]); frame.render_widget(global_use_flags, splits[1]); frame.render_widget(repository_state, splits[2]); @@ -79,8 +79,8 @@ fn render_dashboard(frame: &mut Frame, app: &mut App) { let world_package_count = app.world_count().to_string(); let world_packages = create_stats("World Packages", &world_package_count); - let pending_updates = create_stats("Pending Updates", "16"); - let last_emerge = create_stats("Last Emerge", "11:24 today"); + let pending_updates = create_stats("Pending Updates", "COMING SOON"); + let last_emerge = create_stats("Last Emerge", "COMING SOON"); frame.render_widget(world_packages, splits[0]); frame.render_widget(pending_updates, splits[1]); @@ -97,8 +97,8 @@ fn render_dashboard(frame: &mut Frame, app: &mut App) { let installed_size = human_size(app.total_installed_size()); let installed_size = create_stats("Installed Size", &installed_size); - let distfiles_cache = create_stats("Distfiles Cache", "12.8 GB"); - let portage_news = create_stats("Portage News", "3 unread"); + let distfiles_cache = create_stats("Distfiles Cache", "COMING SOON"); + let portage_news = create_stats("Portage News", "COMING SOON"); frame.render_widget(installed_size, splits[0]); frame.render_widget(distfiles_cache, splits[1]); @@ -254,7 +254,7 @@ fn homepage_lines(pkg: &Package, bold_style: Style) -> Vec<Line<'_>> { ])); if let Some(homepages) = &pkg.homepage { - for url in homepages.into_iter().filter(|s| !s.is_empty()) { + for url in homepages.iter().filter(|s| !s.is_empty()) { lines.push(Line::from(vec![ Span::raw(" - "), // indentation Span::styled( @@ -272,7 +272,7 @@ fn homepage_lines(pkg: &Package, bold_style: Style) -> Vec<Line<'_>> { ])); } - return lines; + lines } fn search_popup_rect(percent_x: u16, r: Rect) -> Rect { @@ -311,7 +311,7 @@ fn render_packages(frame: &mut Frame, area: Rect, app: &mut App) { fn render_use_flags(frame: &mut Frame, area: Rect, app: &mut App) { let selected_package = app.current_package(); - let items = selected_package.use_flags.into_iter().map(|x| { + let items = selected_package.use_flags.iter().map(|x| { let color = if x.enabled { Color::Green } else if x.default { @@ -326,7 +326,7 @@ fn render_use_flags(frame: &mut Frame, area: Rect, app: &mut App) { Style::default().fg(color) }; - ListItem::new(x.name).style(text_style) + ListItem::new(x.name.clone()).style(text_style) }); let list = List::new(items) .style(Color::White) |
