aboutsummaryrefslogtreecommitdiff
path: root/src/screens
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-06-23 10:22:45 +0200
committerpablu <me@pablu.de>2026-06-23 10:22:45 +0200
commitc008c3fb9612670c9ec0500167a0c83b5215892c (patch)
tree7d39bf9fb20fffa8be7bfc9eb5424593fef083ec /src/screens
parentcf5f4ddbe3deed5d422fd1fd203bf0e71efb38f9 (diff)
Add search next / prev back againmaster
Diffstat (limited to 'src/screens')
-rw-r--r--src/screens/available_packages.rs38
-rw-r--r--src/screens/installed_packages.rs37
2 files changed, 43 insertions, 32 deletions
diff --git a/src/screens/available_packages.rs b/src/screens/available_packages.rs
index a96437b..b16eac1 100644
--- a/src/screens/available_packages.rs
+++ b/src/screens/available_packages.rs
@@ -7,8 +7,8 @@ use ratatui::{
Frame,
crossterm::event::KeyCode,
layout::{Alignment, Constraint, Layout, Rect},
- style::{Color, Style},
- text::{Line, Span, Text},
+ style::Color,
+ text::{Line, Span},
widgets::{Block, Borders, List, ListState, Paragraph},
};
@@ -136,16 +136,16 @@ impl AvailablePackagesScreen {
List::new(pkg_versions.iter().map(|v| version_to_variant(v)))
.style(Color::White)
.highlight_style(Theme::selected())
- .highlight_symbol("> "), // , // .block(
- // Block::default()
- // .borders(Borders::ALL)
- // .border_style(Theme::block())
- // .title("Variants"),
- // ),
+ .highlight_symbol("> "),
);
self.selected_version = Some(pkg_versions[0].clone());
}
+
+ fn select_package_index(&mut self, index: usize, repo: &Portage) {
+ self.pkg_list_state.select(Some(index));
+ self.build_pkg_version_list(repo);
+ }
}
impl Default for AvailablePackagesScreen {
@@ -258,6 +258,10 @@ impl Screen for AvailablePackagesScreen {
let text = if self.search_popup.visible {
"(esc) to quit search | (enter) to search".to_string()
+ } else if let Some((current, total)) = self.search_popup.match_status() {
+ format!(
+ "(q) to quit | (j) down | (k) up | (space) switch panel | (/) to search | Search {current}/{total} | (n) next | (N) previous"
+ )
} else {
"(q) to quit | (j) down | (k) up | (space) switch panel | (/) to search".to_string()
};
@@ -312,6 +316,18 @@ impl Screen for AvailablePackagesScreen {
KeyCode::Char(' ') => self.cycle_list(),
KeyCode::Char('/') => self.search_popup.toggle(),
+ KeyCode::Char('n') => {
+ if let Some(index) = self.search_popup.next_match() {
+ self.select_package_index(index, repo)
+ }
+ }
+
+ KeyCode::Char('N') => {
+ if let Some(index) = self.search_popup.previous_match() {
+ self.select_package_index(index, repo)
+ }
+ }
+
_ => match self.chosen_list {
CurrentList::PackageList => match key.code {
KeyCode::Char('j') => {
@@ -369,12 +385,6 @@ impl Screen for AvailablePackagesScreen {
.style(Color::White)
.highlight_style(Theme::selected())
.highlight_symbol("> ");
- // .block(
- // Block::default()
- // .borders(Borders::ALL)
- // .border_style(Theme::block())
- // .title("Available packages"),
- // );
self.pkg_list = Some(list);
self.loading_state = LoadingState::Complete;
diff --git a/src/screens/installed_packages.rs b/src/screens/installed_packages.rs
index b373cb4..24fab50 100644
--- a/src/screens/installed_packages.rs
+++ b/src/screens/installed_packages.rs
@@ -4,17 +4,17 @@ use crate::{
signal::{Event, Signal},
theme::Theme,
widgets::{
- helpers::search_popup_rect, package_metadata::render_package_metadata,
- search_popup::SearchPopup, use_flags::render_use_flags,
+ package_metadata::render_package_metadata, search_popup::SearchPopup,
+ use_flags::render_use_flags,
},
};
use ratatui::{
Frame,
crossterm::event::{KeyCode, KeyModifiers},
layout::{Constraint, Layout, Rect},
- style::{Color, Modifier, Style},
+ style::Color,
text::{Line, Span},
- widgets::{Block, Borders, Clear, List, ListState, Paragraph},
+ widgets::{Block, Borders, List, ListState, Paragraph},
};
#[derive(Debug)]
@@ -114,7 +114,6 @@ impl Screen for InstalledPackagesScreen {
frame,
split_vert[0],
pkg.iuse.iter().collect(),
- // TODO: Dont use clone here if possible
&pkg.enabled_use_flags,
);
render_package_metadata(
@@ -129,19 +128,13 @@ impl Screen for InstalledPackagesScreen {
let text = if self.search_popup.visible {
"(esc) to quit search | (enter) to search".to_string()
+ } else if let Some((current, total)) = self.search_popup.match_status() {
+ format!(
+ "(q) to quit | (j) down | (k) up | (space) switch panel | (/) to search | Search {current}/{total} | (n) next | (N) previous"
+ )
} else {
let main_key_hint =
"(q) to quit | (j) down | (k) up | (f) filter | (/) to search".to_string();
- // if let (Some(current), Some(total)) = (app.current_search_index, app.search_indexes_len)
- // {
- // let _ = write!(
- // main_key_hint,
- // " | (n) for next search | (N) for previous search | Searches found: {} / {}",
- // current + 1,
- // total
- // );
- // }
-
main_key_hint
};
@@ -215,9 +208,17 @@ impl Screen for InstalledPackagesScreen {
KeyCode::Char('k') => self.list_state.select_previous(),
KeyCode::Char('/') => self.search_popup.toggle(),
- // TODO: Reimplement searchable "spaces"
- // KeyCode::Char('n') => todo!("Next search"),
- // KeyCode::Char('N') => todo!("prev search"),
+ KeyCode::Char('n') => {
+ if let Some(index) = self.search_popup.next_match() {
+ self.list_state.select(Some(index))
+ }
+ }
+
+ KeyCode::Char('N') => {
+ if let Some(index) = self.search_popup.previous_match() {
+ self.list_state.select(Some(index))
+ }
+ }
KeyCode::Char('f') => self.cycle_filter(),
_ => {}