diff options
| author | pablu <me@pablu.de> | 2026-06-02 18:49:48 +0200 |
|---|---|---|
| committer | pablu <me@pablu.de> | 2026-06-02 18:49:48 +0200 |
| commit | b547e6758c635682c94794e5c13070a73c918203 (patch) | |
| tree | 2ca030a7acbe436a304e6b87dd93deb0b2351909 /src/app.rs | |
| parent | afe649e0efc31fcd33a828e54bd6313cd37f1784 (diff) | |
wip: refactor architecture
Diffstat (limited to 'src/app.rs')
| -rw-r--r-- | src/app.rs | 243 |
1 files changed, 144 insertions, 99 deletions
@@ -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); + // } } |
