From 3b61a704e2d92351e7a995415e612b778292355d Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Wed, 14 Jun 2023 20:47:24 +0000 Subject: [PATCH] feat: Clippy mem drop, re-arrange .lock() ordering, and use `value_capture!`, to satisfy has_significant_drop rule --- src/docker_data/mod.rs | 2 +- src/input_handler/mod.rs | 46 ++++++++++++++++++++++++---------------- src/ui/draw_blocks.rs | 14 ++++++------ src/ui/mod.rs | 3 ++- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 92fd28c..f71a5f7 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -323,8 +323,8 @@ impl DockerData { while !self.app_data.lock().initialised(&all_ids) { tokio::time::sleep(std::time::Duration::from_millis(100)).await; } - self.gui_state.lock().status_del(Status::Init); Self::stop_loading_spin(&self.gui_state, &loading_spin, loading_uuid); + self.gui_state.lock().status_del(Status::Init); } /// Set the global error as the docker error, and set gui_state to error diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index 421f86a..2abb480 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -20,6 +20,7 @@ use crate::{ app_error::AppError, docker_data::DockerMessage, ui::{DeleteButton, GuiState, SelectablePanel, Status, Ui}, + value_capture, }; pub use message::InputMessages; @@ -62,12 +63,11 @@ impl InputHandler { match message { InputMessages::ButtonPress(key) => self.button_press(key.0, key.1).await, InputMessages::MouseEvent(mouse_event) => { - let error_or_help = self.gui_state.lock().status_contains(&[ + if !self.gui_state.lock().status_contains(&[ Status::Error, Status::Help, Status::DeleteConfirm, - ]); - if !error_or_help { + ]) { self.mouse_press(mouse_event); } let delete_confirm = self @@ -160,13 +160,21 @@ impl InputHandler { /// Handle any keyboard button events #[allow(clippy::too_many_lines)] async fn button_press(&mut self, key_code: KeyCode, key_modififer: KeyModifiers) { - // TODO - refactor this to a single call, maybe return Error, Help or Normal - let contains_error = self.gui_state.lock().status_contains(&[Status::Error]); - let contains_help = self.gui_state.lock().status_contains(&[Status::Help]); - let contains_delete = self - .gui_state - .lock() - .status_contains(&[Status::DeleteConfirm]); + value_capture!( + contains_delete, + self.gui_state + .lock() + .status_contains(&[Status::DeleteConfirm]) + ); + + value_capture!( + contains_error, + self.gui_state.lock().status_contains(&[Status::Error]) + ); + value_capture!( + contains_help, + self.gui_state.lock().status_contains(&[Status::Help]) + ); // Always just quit on Ctrl + c/C or q/Q let is_c = || key_code == KeyCode::Char('c') || key_code == KeyCode::Char('C'); @@ -208,10 +216,9 @@ impl InputHandler { KeyCode::Char('m' | 'M') => self.m_key(), KeyCode::Tab => { // Skip control panel if no containers, could be refactored - let has_containers = self.app_data.lock().get_container_len() == 0; let is_containers = self.gui_state.lock().selected_panel == SelectablePanel::Containers; - let count = if has_containers && is_containers { + let count = if self.app_data.lock().get_container_len() == 0 && is_containers { 2 } else { 1 @@ -222,10 +229,9 @@ impl InputHandler { } KeyCode::BackTab => { // Skip control panel if no containers, could be refactored - let has_containers = self.app_data.lock().get_container_len() == 0; let is_containers = self.gui_state.lock().selected_panel == SelectablePanel::Logs; - let count = if has_containers && is_containers { + let count = if self.app_data.lock().get_container_len() == 0 && is_containers { 2 } else { 1 @@ -236,7 +242,8 @@ impl InputHandler { } KeyCode::Home => { let mut locked_data = self.app_data.lock(); - match self.gui_state.lock().selected_panel { + let selected_panel = self.gui_state.lock().selected_panel; + match selected_panel { SelectablePanel::Containers => locked_data.containers_start(), SelectablePanel::Logs => locked_data.log_start(), SelectablePanel::Commands => locked_data.docker_command_start(), @@ -244,7 +251,8 @@ impl InputHandler { } KeyCode::End => { let mut locked_data = self.app_data.lock(); - match self.gui_state.lock().selected_panel { + let selected_panel = self.gui_state.lock().selected_panel; + match selected_panel { SelectablePanel::Containers => locked_data.containers_end(), SelectablePanel::Logs => locked_data.log_end(), SelectablePanel::Commands => locked_data.docker_command_end(), @@ -358,7 +366,8 @@ impl InputHandler { /// Change state to next, depending which panel is currently in focus fn next(&mut self) { let mut locked_data = self.app_data.lock(); - match self.gui_state.lock().selected_panel { + let selected_panel = self.gui_state.lock().selected_panel; + match selected_panel { SelectablePanel::Containers => locked_data.containers_next(), SelectablePanel::Logs => locked_data.log_next(), SelectablePanel::Commands => locked_data.docker_command_next(), @@ -368,7 +377,8 @@ impl InputHandler { /// Change state to previous, depending which panel is currently in focus fn previous(&mut self) { let mut locked_data = self.app_data.lock(); - match self.gui_state.lock().selected_panel { + let selected_panel = self.gui_state.lock().selected_panel; + match selected_panel { SelectablePanel::Containers => locked_data.containers_previous(), SelectablePanel::Logs => locked_data.log_previous(), SelectablePanel::Commands => locked_data.docker_command_previous(), diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 6e0586a..4080966 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -62,7 +62,6 @@ fn generate_block<'a>( gui_state .lock() .update_region_map(Region::Panel(panel), area); - let current_selected_panel = gui_state.lock().selected_panel; let mut title = match panel { SelectablePanel::Containers => { format!("{} {}", panel.title(), app_data.lock().container_title()) @@ -79,7 +78,7 @@ fn generate_block<'a>( .borders(Borders::ALL) .border_type(BorderType::Rounded) .title(title); - if current_selected_panel == panel { + if gui_state.lock().selected_panel == panel { block = block.border_style(Style::default().fg(Color::LightCyan)); } block @@ -819,6 +818,11 @@ pub fn delete_confirm( let no_area = split_buttons[1]; let yes_area = split_buttons[3]; + f.render_widget(Clear, area); + f.render_widget(block, area); + f.render_widget(confirm_para, split_popup[1]); + f.render_widget(no_para, no_area); + f.render_widget(yes_para, yes_area); // Insert button areas into region map, so can interact with them on click gui_state .lock() @@ -827,12 +831,6 @@ pub fn delete_confirm( gui_state .lock() .update_region_map(Region::Delete(DeleteButton::Yes), yes_area); - - f.render_widget(Clear, area); - f.render_widget(block, area); - f.render_widget(confirm_para, split_popup[1]); - f.render_widget(no_para, no_area); - f.render_widget(yes_para, yes_area); } /// Draw an error popup over whole screen diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 94c84d5..c8b8da6 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -197,7 +197,8 @@ impl Ui { } } -// This macro simplifies the definition and evaluation of variables by capturing and immediately evaluating an expression. +#[macro_export] +/// This macro simplifies the definition and evaluation of variables by capturing and immediately evaluating an expression. macro_rules! value_capture { ($name:ident, $lock_expr:expr) => { let $name = || $lock_expr;