diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 76d68c0..a96b0e8 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -457,7 +457,10 @@ impl AppData { .as_ref() .map_or("".to_owned(), |f| f.trim().to_owned()); - let image = i.image.as_ref().map_or("".to_owned(), std::clone::Clone::clone); + let image = i + .image + .as_ref() + .map_or("".to_owned(), std::clone::Clone::clone); if let Some(current_container) = self.get_container_by_id(id) { if current_container.name != name { diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index f874aa1..60f030c 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -33,18 +33,18 @@ enum SpawnId { /// Cpu & Mem stats take twice as long as the update interval to get a value, so will have two being executed at the same time /// SpawnId::Stats takes container_id and binate value to enable both cycles of the same container_id to be inserted into the hashmap /// Binate value is toggled when all join handles have been spawned off -#[derive(Debug, Hash, Clone, PartialEq, Eq)] +#[derive(Debug, Hash, Clone, PartialEq, Eq, Copy)] enum Binate { One, Two } impl Binate { - fn toggle(&mut self) { - *self = match self { + const fn toggle(self) -> Self { + match self { Self::One => Self::Two, Self::Two => Self::One, - }; + } } } @@ -155,10 +155,9 @@ impl DockerData { let docker = Arc::clone(&self.docker); let app_data = Arc::clone(&self.app_data); let spawns = Arc::clone(&self.spawns); - let is_running = *is_running; let id = id.clone(); - let key = SpawnId::Stats((id.clone(), self.binate.clone())); + let key = SpawnId::Stats((id.clone(), self.binate)); let spawn_key = key.clone(); self.spawns.lock().entry(key).or_insert_with(|| { @@ -166,13 +165,13 @@ impl DockerData { docker, id.clone(), app_data, - is_running, + *is_running, spawns, spawn_key )) }); } - self.binate.toggle(); + self.binate = self.binate.toggle(); } /// Get all current containers, handle into ContainerItem in the app_data struct rather than here @@ -382,12 +381,15 @@ impl DockerData { self.stop_loading_spin(&loading_spin); } DockerMessage::Unpause(id) => { + // gen uuid, leading_spin(uuid) let loading_spin = self.loading_spin().await; if docker.unpause_container(&id).await.is_err() { app_data .lock() .set_error(AppError::DockerCommand(DockerControls::Unpause)); }; + // loading sping take uuid to remove + // stop_loading_sping(uuid) self.stop_loading_spin(&loading_spin); self.update_everything().await; } diff --git a/src/ui/gui_state.rs b/src/ui/gui_state.rs index cf634af..a9ddeb2 100644 --- a/src/ui/gui_state.rs +++ b/src/ui/gui_state.rs @@ -10,6 +10,30 @@ pub enum SelectablePanel { Logs, } +impl SelectablePanel { + pub const fn title(self) -> &'static str { + match self { + Self::Containers => "Containers", + Self::Logs => "Logs", + Self::Commands => "", + } + } + pub fn next(self) -> Self { + match self { + Self::Containers => Self::Commands, + Self::Commands => Self::Logs, + Self::Logs => Self::Containers, + } + } + pub fn prev(self) -> Self { + match self { + Self::Containers => Self::Logs, + Self::Commands => Self::Containers, + Self::Logs => Self::Commands, + } + } +} + pub enum Region { Panel(SelectablePanel), Header(Header), @@ -93,7 +117,8 @@ impl BoxLocation { } } -#[derive(Debug, Clone)] +/// State for the loading animation +#[derive(Debug, Clone, Copy)] pub enum Loading { One, Two, @@ -108,7 +133,7 @@ pub enum Loading { } impl Loading { - pub const fn next(&self) -> Self { + pub const fn next(self) -> Self { match self { Self::One => Self::Two, Self::Two => Self::Three, @@ -127,44 +152,21 @@ impl Loading { impl fmt::Display for Loading { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let disp = match self { - Self::One => "⠋", - Self::Two => "⠙", - Self::Three => "⠹", - Self::Four => "⠸", - Self::Five => "⠼", - Self::Six => "⠴", - Self::Seven => "⠦", - Self::Eight => "⠧", - Self::Nine => "⠇", - Self::Ten => "⠏", + Self::One => '⠋', + Self::Two => '⠙', + Self::Three => '⠹', + Self::Four => '⠸', + Self::Five => '⠼', + Self::Six => '⠴', + Self::Seven => '⠦', + Self::Eight => '⠧', + Self::Nine => '⠇', + Self::Ten => '⠏', }; write!(f, "{}", disp) } } -impl SelectablePanel { - pub const fn title(self) -> &'static str { - match self { - Self::Containers => "Containers", - Self::Logs => "Logs", - Self::Commands => "", - } - } - pub const fn next(self) -> Self { - match self { - Self::Containers => Self::Commands, - Self::Commands => Self::Logs, - Self::Logs => Self::Containers, - } - } - pub const fn prev(self) -> Self { - match self { - Self::Containers => Self::Logs, - Self::Commands => Self::Containers, - Self::Logs => Self::Commands, - } - } -} /// Global gui_state, stored in an Arc #[derive(Debug, Clone)] @@ -244,7 +246,7 @@ impl GuiState { /// Change to previous selectable panel pub fn previous_panel(&mut self) { - self.selected_panel = self.selected_panel.prev(); + self.selected_panel = self.selected_panel.prev(); } /// Advance loading animation diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 589f918..3f5fc07 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -57,7 +57,7 @@ pub async fn create_ui( ) .await; - disable_raw_mode().unwrap_or(()); + disable_raw_mode()?; execute!( terminal.backend_mut(), LeaveAlternateScreen, @@ -85,28 +85,25 @@ async fn run_app( // Check for docker connect errors before attempting to draw the gui let e = app_data.lock().get_error(); - if let Some(error) = e { - if let AppError::DockerConnect = error { - let mut seconds = 5; - loop { - if seconds < 1 { - is_running.store(false, Ordering::SeqCst); - break; - } - if terminal - .draw(|f| draw_blocks::error(f, &AppError::DockerConnect, Some(seconds))) - .is_err() - { - return Err(AppError::Terminal); - } - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - seconds -= 1; + if let Some(AppError::DockerConnect) = e { + let mut seconds = 5; + loop { + if seconds < 1 { + is_running.store(false, Ordering::SeqCst); + break; } + if terminal + .draw(|f| draw_blocks::error(f, &AppError::DockerConnect, Some(seconds))) + .is_err() + { + return Err(AppError::Terminal); + } + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + seconds -= 1; } } else { let mut now = Instant::now(); loop { - if terminal.draw(|f| ui(f, &app_data, &gui_state)).is_err() { return Err(AppError::Terminal); }