aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-05-08 16:14:36 +0200
committerpablu <me@pablu.de>2026-05-08 16:14:36 +0200
commitfe377f4d850ece44c691b4cb48da5f529ec08dd1 (patch)
treefdd7b603346e48175a29e1e1e3321142c6dc2782 /src
parentb6487e2009cb2191ef70fc6feefb38a0b6db1543 (diff)
improve code quality
Diffstat (limited to 'src')
-rw-r--r--src/app.rs25
-rw-r--r--src/event.rs119
-rw-r--r--src/gentoo/package.rs16
-rw-r--r--src/gentoo/portage.rs8
-rw-r--r--src/ui.rs20
5 files changed, 105 insertions, 83 deletions
diff --git a/src/app.rs b/src/app.rs
index 522998f..7c5018d 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -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);
diff --git a/src/ui.rs b/src/ui.rs
index d0a5f9e..32e10fd 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -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)