diff options
| author | pablu <me@pablu.de> | 2026-06-19 10:09:50 +0200 |
|---|---|---|
| committer | pablu <me@pablu.de> | 2026-06-19 10:09:50 +0200 |
| commit | c9f78161118ac467427a2635813c4af1136fd325 (patch) | |
| tree | 8e6cd65c9ca1470eaf318c81902fdf3f269ce309 /src/screens/available_packages.rs | |
| parent | b597ce828e81e93b067b223549295cb1f57c22c9 (diff) | |
Add loading spinner to available_packages
Diffstat (limited to 'src/screens/available_packages.rs')
| -rw-r--r-- | src/screens/available_packages.rs | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/screens/available_packages.rs b/src/screens/available_packages.rs index 2e47792..73d17a6 100644 --- a/src/screens/available_packages.rs +++ b/src/screens/available_packages.rs @@ -1,9 +1,12 @@ -use std::collections::HashSet; +use std::{ + collections::HashSet, + time::{SystemTime, UNIX_EPOCH}, +}; use ratatui::{ Frame, crossterm::event::KeyCode, - layout::{Constraint, Layout, Rect}, + layout::{Alignment, Constraint, Layout, Rect}, style::Color, text::{Line, Span, Text}, widgets::{Block, Borders, List, ListState, Paragraph}, @@ -151,6 +154,17 @@ impl Default for AvailablePackagesScreen { } } +fn loading_spinner() -> &'static str { + const FRAMES: [&str; 8] = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧"]; + + let millis = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis(); + + FRAMES[((millis / 100) as usize) % FRAMES.len()] +} + impl Screen for AvailablePackagesScreen { fn draw( &mut self, @@ -159,8 +173,32 @@ impl Screen for AvailablePackagesScreen { _repo: &crate::gentoo::Portage, ) { if !matches!(self.loading_state, LoadingState::Complete) { - // TODO: Implement loading screen - frame.render_widget(Text::styled("Not implemented yet :P", Theme::text()), area); + let text = match self.loading_state { + LoadingState::Loading => Line::from(vec![ + Span::styled(loading_spinner(), Theme::muted()), + Span::raw(" "), + Span::styled("Loading available packages...", Theme::text()), + ]), + LoadingState::Error => Line::from(Span::styled( + "Failed to load available packages", + Theme::error(), + )), + LoadingState::Idle => Line::from(Span::styled( + "Waiting to load available packages...", + Theme::muted(), + )), + LoadingState::Complete => unreachable!(), + }; + + frame.render_widget( + Paragraph::new(text).alignment(Alignment::Center).block( + Block::default() + .borders(Borders::ALL) + .border_style(Theme::block()) + .title("Available packages"), + ), + area, + ); return; } |
