From b34612a75cb306c6a0293a97fd47bf9642062577 Mon Sep 17 00:00:00 2001 From: pablu Date: Wed, 3 Jun 2026 18:40:20 +0200 Subject: fix bug where versions for packages were not shown correctly --- src/screens/available_packages.rs | 53 ++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/screens/available_packages.rs b/src/screens/available_packages.rs index 416a847..fc6f961 100644 --- a/src/screens/available_packages.rs +++ b/src/screens/available_packages.rs @@ -79,23 +79,35 @@ impl AvailablePackagesScreen { } } - fn build_pkg_version_list(&mut self, repo: &Portage) { + fn selected_package<'a>(&self, repo: &'a Portage) -> Option<&'a Package> { let packages: Vec<&PackageKey> = repo.available_packages().iter().map(|x| &x.atom).collect(); let Some(selected_package_key) = packages.get(self.pkg_list_state.selected().unwrap_or(0)) else { - return; + return None; }; - let Some(pkg) = repo.get_available_package(selected_package_key) else { - return; + repo.get_available_package(selected_package_key) + } + + fn selected_package_versions<'a>(&self, repo: &'a Portage) -> Option> { + let Some(pkg) = self.selected_package(repo) else { + return None; }; let mut pkg_versions: Vec<&PackageVersion> = pkg.versions.iter().collect(); pkg_versions.sort(); pkg_versions.reverse(); + Some(pkg_versions) + } + + fn build_pkg_version_list(&mut self, repo: &Portage) { + let Some(pkg_versions) = self.selected_package_versions(repo) else { + return; + }; + self.variant_list = Some( List::new(pkg_versions.iter().map(|v| version_to_variant(v))) .style(Color::White) @@ -109,7 +121,7 @@ impl AvailablePackagesScreen { ), ); - self.selected_version = Some(pkg.versions[0].clone()); + self.selected_version = Some(pkg_versions[0].clone()); } } @@ -204,11 +216,7 @@ impl Screen for AvailablePackagesScreen { self.search_popup.draw(frame, area); } - fn update( - &mut self, - event: &Event, - repo: &crate::gentoo::Portage, - ) -> Option { + fn update(&mut self, event: &Event, repo: &Portage) -> Option { match event { Event::KeyEvent(key) => { if self.search_popup.visible { @@ -260,8 +268,29 @@ impl Screen for AvailablePackagesScreen { _ => {} }, CurrentList::VariantList => match key.code { - KeyCode::Char('j') => self.variant_list_state.select_next(), - KeyCode::Char('k') => self.variant_list_state.select_previous(), + KeyCode::Char('j') => { + if let Some(pkg_versions) = self.selected_package_versions(repo) + { + self.variant_list_state.select_next(); + + let index = self.variant_list_state.selected().unwrap_or(0); + if index >= pkg_versions.len() { + self.variant_list_state.select_previous(); + } else { + self.selected_version = + Some(pkg_versions[index].clone()); + } + }; + } + KeyCode::Char('k') => { + if let Some(pkg_versions) = self.selected_package_versions(repo) + { + self.variant_list_state.select_previous(); + + let index = self.variant_list_state.selected().unwrap_or(0); + self.selected_version = Some(pkg_versions[index].clone()); + }; + } _ => {} }, -- cgit 1.3.1