From b547e6758c635682c94794e5c13070a73c918203 Mon Sep 17 00:00:00 2001 From: pablu Date: Tue, 2 Jun 2026 18:49:48 +0200 Subject: wip: refactor architecture --- src/app.rs | 245 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 145 insertions(+), 100 deletions(-) (limited to 'src/app.rs') 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 crate::gentoo::{InstalledPackage, portage::Portage}; +use color_eyre::eyre::Ok; +use ratatui::{ + Frame, + crossterm::event::{self, Event}, + layout::{Constraint, Layout}, + style::Stylize, + text::Text, + widgets::Block, +}; + +use crate::{ + actions::{Signal, signal}, + gentoo::{InstalledPackage, portage::Portage}, + screens::{installed_packages::InstalledPackagesScreen, screen::Screen}, + theme::Theme, +}; #[derive(Debug)] pub enum ViewState { @@ -11,34 +23,67 @@ 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, - search_indexes: Option>, - pub search_indexes_len: Option, - pub current_search_index: Option, + installed_package_screen: InstalledPackagesScreen, + + // pub search_found: Option, + // search_indexes: Option>, + // pub search_indexes_len: Option, + // pub current_search_index: Option, 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, + + installed_package_screen: InstalledPackagesScreen::default(), + + view: ViewState::InstalledPackages, + } + } + + pub fn draw(&mut self, frame: &mut Frame) { + frame.render_widget(Block::default().bg(Theme::BG), frame.area()); + + let layout = Layout::vertical(vec![Constraint::Length(3), Constraint::Fill(1)]); + let [tab_bar, rest] = frame.area().layout(&layout); + + // render_tab(frame, tab_bar, &app.view); + + match self.view { + crate::app::ViewState::InstalledPackages => { + self.installed_package_screen + .draw(frame, rest, &self.portage) + } + _ => frame.render_widget(Text::from("NOT IMPLEMENTED"), rest), } } + pub fn update(&mut self) -> color_eyre::Result { + if let Event::Key(key) = event::read()? { + let signal = match self.view { + crate::app::ViewState::InstalledPackages => { + self.installed_package_screen.update(key) + } + + _ => None, + }; + + if let Some(signal) = signal { + match signal { + Signal::Quit => return Ok(true), + Signal::CycleTab => todo!(), + } + } + } + + Ok(false) + } + pub fn world_count(&self) -> usize { self.portage.world_packages.len() } @@ -47,20 +92,20 @@ impl App<'_> { &self.portage.installed_packages } - 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 current_package(&self) -> &InstalledPackage { + // let selected_package_index = self.list_state.selected().unwrap_or_default(); + // &self.portage.installed_packages[selected_package_index] + // } pub fn total_installed_size(&self) -> usize { self.portage.installed_packages.iter().map(|p| p.size).sum() } - pub fn toggle_search_window(&mut self) { - self.showing_search_window = !self.showing_search_window; - self.textarea.clear(); - self.search_found = None; - } + // pub fn toggle_search_window(&mut self) { + // self.showing_search_window = !self.showing_search_window; + // self.textarea.clear(); + // self.search_found = None; + // } pub fn cycle_current_tab(&mut self) { match self.view { @@ -70,74 +115,74 @@ impl App<'_> { } } - pub fn search(&mut self) -> bool { - let indexes: Vec = 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); - } + // pub fn search(&mut self) -> bool { + // let indexes: Vec = 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); + // } } -- cgit 1.3.1