aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-06-02 18:49:48 +0200
committerpablu <me@pablu.de>2026-06-02 18:49:48 +0200
commitb547e6758c635682c94794e5c13070a73c918203 (patch)
tree2ca030a7acbe436a304e6b87dd93deb0b2351909 /src/app.rs
parentafe649e0efc31fcd33a828e54bd6313cd37f1784 (diff)
wip: refactor architecture
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs243
1 files changed, 144 insertions, 99 deletions
diff --git a/src/app.rs b/src/app.rs
index 6e9e8ab..c014a49 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1,7 +1,19 @@
-use ratatui::widgets::ListState;
-use ratatui_textarea::TextArea;
+use color_eyre::eyre::Ok;
+use ratatui::{
+ Frame,
+ crossterm::event::{self, Event},
+ layout::{Constraint, Layout},
+ style::Stylize,
+ text::Text,
+ widgets::Block,
+};
-use crate::gentoo::{InstalledPackage, portage::Portage};
+use crate::{
+ actions::{Signal, signal},
+ gentoo::{InstalledPackage, portage::Portage},
+ screens::{installed_packages::InstalledPackagesScreen, screen::Screen},
+ theme::Theme,
+};
#[derive(Debug)]
pub enum ViewState {
@@ -11,133 +23,166 @@ pub enum ViewState {
}
#[derive(Debug)]
-pub struct App<'a> {
+pub struct App {
portage: Portage,
- pub list_state: ListState,
- pub showing_search_window: bool,
- pub textarea: TextArea<'a>,
- pub search_found: Option<bool>,
- search_indexes: Option<Vec<usize>>,
- pub search_indexes_len: Option<usize>,
- pub current_search_index: Option<usize>,
+ installed_package_screen: InstalledPackagesScreen,
+
+ // pub search_found: Option<bool>,
+ // search_indexes: Option<Vec<usize>>,
+ // pub search_indexes_len: Option<usize>,
+ // pub current_search_index: Option<usize>,
pub view: ViewState,
}
-impl App<'_> {
+impl App {
pub fn new(portage: Portage) -> Self {
App {
portage,
- list_state: ListState::default().with_selected(Some(0)),
- showing_search_window: false,
- textarea: TextArea::default(),
- search_found: None,
- search_indexes: None,
- current_search_index: None,
- search_indexes_len: None,
- view: ViewState::Dashboard,
- }
- }
- pub fn world_count(&self) -> usize {
- self.portage.world_packages.len()
- }
+ installed_package_screen: InstalledPackagesScreen::default(),
- pub fn installed_packages(&self) -> &[InstalledPackage] {
- &self.portage.installed_packages
+ view: ViewState::InstalledPackages,
+ }
}
- pub fn current_package(&self) -> &InstalledPackage {
- let selected_package_index = self.list_state.selected().unwrap_or_default();
- &self.portage.installed_packages[selected_package_index]
- }
+ pub fn draw(&mut self, frame: &mut Frame) {
+ frame.render_widget(Block::default().bg(Theme::BG), frame.area());
- pub fn total_installed_size(&self) -> usize {
- self.portage.installed_packages.iter().map(|p| p.size).sum()
- }
+ let layout = Layout::vertical(vec![Constraint::Length(3), Constraint::Fill(1)]);
+ let [tab_bar, rest] = frame.area().layout(&layout);
- pub fn toggle_search_window(&mut self) {
- self.showing_search_window = !self.showing_search_window;
- self.textarea.clear();
- self.search_found = None;
- }
+ // render_tab(frame, tab_bar, &app.view);
- pub fn cycle_current_tab(&mut self) {
match self.view {
- ViewState::Dashboard => self.view = ViewState::InstalledPackages,
- ViewState::InstalledPackages => self.view = ViewState::AvailablePackages,
- ViewState::AvailablePackages => self.view = ViewState::Dashboard,
+ crate::app::ViewState::InstalledPackages => {
+ self.installed_package_screen
+ .draw(frame, rest, &self.portage)
+ }
+ _ => frame.render_widget(Text::from("NOT IMPLEMENTED"), rest),
}
}
- pub fn search(&mut self) -> bool {
- let indexes: Vec<usize> = self
- .portage
- .installed_packages
- .iter()
- .enumerate()
- .filter(|(_, s)| {
- s.atom
- .qualified_name()
- .to_lowercase()
- .contains(&self.textarea.lines()[0].to_lowercase())
- })
- .map(|(i, _)| i)
- .collect();
+ pub fn update(&mut self) -> color_eyre::Result<bool> {
+ if let Event::Key(key) = event::read()? {
+ let signal = match self.view {
+ crate::app::ViewState::InstalledPackages => {
+ self.installed_package_screen.update(key)
+ }
- if let Some(index) = indexes.first() {
- self.list_state.select(Some(*index));
- self.search_indexes_len = Some(indexes.len());
- self.search_indexes = Some(indexes);
- self.current_search_index = Some(0);
+ _ => None,
+ };
- return true;
+ if let Some(signal) = signal {
+ match signal {
+ Signal::Quit => return Ok(true),
+ Signal::CycleTab => todo!(),
+ }
+ }
}
- self.search_indexes = None;
-
- false
+ Ok(false)
}
- pub fn next_search(&mut self) {
- let Some(mut current_index) = self.current_search_index else {
- return;
- };
-
- let Some(search_indexes) = &self.search_indexes else {
- return;
- };
+ pub fn world_count(&self) -> usize {
+ self.portage.world_packages.len()
+ }
- if current_index + 1 >= search_indexes.len() {
- current_index = 0;
- } else {
- current_index += 1;
- }
+ pub fn installed_packages(&self) -> &[InstalledPackage] {
+ &self.portage.installed_packages
+ }
- let list_index = search_indexes[current_index];
+ // pub fn current_package(&self) -> &InstalledPackage {
+ // let selected_package_index = self.list_state.selected().unwrap_or_default();
+ // &self.portage.installed_packages[selected_package_index]
+ // }
- self.list_state.select(Some(list_index));
- self.current_search_index = Some(current_index);
+ pub fn total_installed_size(&self) -> usize {
+ self.portage.installed_packages.iter().map(|p| p.size).sum()
}
- pub fn prev_search(&mut self) {
- let Some(mut current_index) = self.current_search_index else {
- return;
- };
+ // pub fn toggle_search_window(&mut self) {
+ // self.showing_search_window = !self.showing_search_window;
+ // self.textarea.clear();
+ // self.search_found = None;
+ // }
- let Some(search_indexes) = &self.search_indexes else {
- return;
- };
-
- if current_index == 0 {
- current_index = search_indexes.len() - 1;
- } else {
- current_index -= 1;
+ pub fn cycle_current_tab(&mut self) {
+ match self.view {
+ ViewState::Dashboard => self.view = ViewState::InstalledPackages,
+ ViewState::InstalledPackages => self.view = ViewState::AvailablePackages,
+ ViewState::AvailablePackages => self.view = ViewState::Dashboard,
}
-
- let list_index = search_indexes[current_index];
-
- self.list_state.select(Some(list_index));
- self.current_search_index = Some(current_index);
}
+
+ // pub fn search(&mut self) -> bool {
+ // let indexes: Vec<usize> = self
+ // .portage
+ // .installed_packages
+ // .iter()
+ // .enumerate()
+ // .filter(|(_, s)| {
+ // s.atom
+ // .qualified_name()
+ // .to_lowercase()
+ // .contains(&self.textarea.lines()[0].to_lowercase())
+ // })
+ // .map(|(i, _)| i)
+ // .collect();
+ //
+ // if let Some(index) = indexes.first() {
+ // 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;
+ //
+ // false
+ // }
+ //
+ // pub fn next_search(&mut self) {
+ // let Some(mut current_index) = self.current_search_index else {
+ // return;
+ // };
+ //
+ // let Some(search_indexes) = &self.search_indexes else {
+ // return;
+ // };
+ //
+ // if current_index + 1 >= search_indexes.len() {
+ // current_index = 0;
+ // } else {
+ // current_index += 1;
+ // }
+ //
+ // let list_index = search_indexes[current_index];
+ //
+ // self.list_state.select(Some(list_index));
+ // self.current_search_index = Some(current_index);
+ // }
+ //
+ // pub fn prev_search(&mut self) {
+ // let Some(mut current_index) = self.current_search_index else {
+ // return;
+ // };
+ //
+ // let Some(search_indexes) = &self.search_indexes else {
+ // return;
+ // };
+ //
+ // if current_index == 0 {
+ // current_index = search_indexes.len() - 1;
+ // } else {
+ // current_index -= 1;
+ // }
+ //
+ // let list_index = search_indexes[current_index];
+ //
+ // self.list_state.select(Some(list_index));
+ // self.current_search_index = Some(current_index);
+ // }
}