aboutsummaryrefslogtreecommitdiff
path: root/src/screens/dashboard.rs
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-06-03 10:47:59 +0200
committerpablu <me@pablu.de>2026-06-03 10:47:59 +0200
commitc5a634bd5408ea5174035abf8713953e7fc48e08 (patch)
treef41267354ca791dbe437a206935f5004e29a4a97 /src/screens/dashboard.rs
parent92b39b19a1c50f9462f7b0b99e8013abf672c533 (diff)
Implement PackageLoader, just for available packages right now
Diffstat (limited to 'src/screens/dashboard.rs')
-rw-r--r--src/screens/dashboard.rs49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/screens/dashboard.rs b/src/screens/dashboard.rs
index 87d2e81..1fcb242 100644
--- a/src/screens/dashboard.rs
+++ b/src/screens/dashboard.rs
@@ -6,7 +6,7 @@ use ratatui::{
};
use crate::{
- gentoo::Portage, screens::screen::Screen, signal::Signal, theme::Theme,
+ app::LoadingState, gentoo::Portage, screens::screen::Screen, signal::Signal, theme::Theme,
widgets::helpers::human_size,
};
@@ -35,6 +35,7 @@ impl Screen for DashboardScreen {
frame: &mut ratatui::Frame,
area: ratatui::prelude::Rect,
repo: &crate::gentoo::Portage,
+ loading_state: &LoadingState,
) {
let logo = "
██████╗ ██╗ ██╗██╗███████╗██╗ ██╗
@@ -76,17 +77,6 @@ impl Screen for DashboardScreen {
let logo = Paragraph::new(Text::styled(logo, Theme::title()));
frame.render_widget(logo, logo_top);
- let keys = Paragraph::new(Span::styled(
- "(q) to quit | (tab) to switch tabs",
- Theme::muted(),
- ))
- .block(
- Block::default()
- .borders(Borders::ALL)
- .border_style(Theme::block()),
- );
- frame.render_widget(keys, key_hints);
-
let installed_packages_len = repo.installed_packages_len().to_string();
let installed_packages =
create_stats("Installed Packages", installed_packages_len.as_str());
@@ -130,6 +120,41 @@ impl Screen for DashboardScreen {
frame.render_widget(installed_size, splits[0]);
frame.render_widget(distfiles_cache, splits[1]);
frame.render_widget(portage_news, splits[2]);
+
+ let keys_text = "(q) to quit | (tab) to cycle tabs";
+
+ let loading_text = match loading_state {
+ LoadingState::Loading => "⟳ Loading available packages...",
+ LoadingState::Error => "⚠ Failed to load available packages",
+ LoadingState::Complete => "✓ Available packages loaded",
+ LoadingState::Idle => "",
+ };
+
+ let full_text = if !loading_text.is_empty() {
+ // Calculate spacing to push loading text to the right
+ vec![Line::from(vec![
+ Span::styled(keys_text, Theme::muted()),
+ Span::raw(" | "),
+ Span::styled(
+ loading_text,
+ match loading_state {
+ crate::app::LoadingState::Loading => Theme::muted(),
+ crate::app::LoadingState::Error => Theme::error(),
+ crate::app::LoadingState::Complete => Theme::success(),
+ crate::app::LoadingState::Idle => Theme::muted(),
+ },
+ ),
+ ])]
+ } else {
+ vec![Line::from(Span::styled(keys_text, Theme::muted()))]
+ };
+
+ let key_notes = Paragraph::new(full_text).block(
+ Block::default()
+ .borders(Borders::ALL)
+ .border_style(Theme::block()),
+ );
+ frame.render_widget(key_notes, key_hints);
}
fn update(&mut self, key: ratatui::crossterm::event::KeyEvent, _: &Portage) -> Option<Signal> {