From bf02afcf7942443a01c2464a57dd4b2fda1a8891 Mon Sep 17 00:00:00 2001 From: ClementTsang Date: Wed, 25 Dec 2019 23:30:57 -0500 Subject: [PATCH] Add g and GG logic --- src/app.rs | 78 +++++++++++++++++++++++++++++---------- src/app/process_killer.rs | 2 +- src/main.rs | 1 + 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/app.rs b/src/app.rs index 660a70bb..a8d947b6 100644 --- a/src/app.rs +++ b/src/app.rs @@ -40,7 +40,8 @@ pub struct App { pub previous_disk_position: i64, pub previous_temp_position: i64, pub previous_process_position: i64, - awaiting_second_d: bool, + awaiting_second_char: bool, + second_char: char, pub use_dot: bool, pub show_help: bool, pub is_frozen: bool, @@ -66,7 +67,8 @@ impl App { previous_process_position: 0, previous_disk_position: 0, previous_temp_position: 0, - awaiting_second_d: false, + awaiting_second_char: false, + second_char: ' ', use_dot, show_help: false, is_frozen: false, @@ -79,7 +81,8 @@ impl App { } fn reset_multi_tap_keys(&mut self) { - self.awaiting_second_d = false; + self.awaiting_second_char = false; + self.second_char = ' '; } pub fn on_enter(&mut self) {} @@ -88,11 +91,11 @@ impl App { if self.show_help { self.show_help = false; } - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } // TODO: How should we make it for process panel specific hotkeys? Only if we're on process panel? Or what? - pub fn on_key(&mut self, c: char) { + pub fn on_key(&mut self, caught_char: char) { if !self.show_help { let current_key_press_inst = Instant::now(); if current_key_press_inst.duration_since(self.last_key_press).as_millis() > constants::MAX_KEY_TIMEOUT_IN_MILLISECONDS { @@ -100,13 +103,26 @@ impl App { } self.last_key_press = current_key_press_inst; - match c { + match caught_char { 'd' => { - if self.awaiting_second_d { - self.awaiting_second_d = false; - self.kill_highlighted_process().unwrap_or(()); + if self.awaiting_second_char && self.second_char == 'd' { + self.awaiting_second_char = false; + self.second_char = ' '; + // TODO: Redo this in DD rewrite! + //self.kill_highlighted_process().unwrap_or(()); } else { - self.awaiting_second_d = true; + self.awaiting_second_char = true; + self.second_char = 'd'; + } + } + 'g' => { + if self.awaiting_second_char && self.second_char == 'g' { + self.awaiting_second_char = false; + self.second_char = ' '; + self.skip_to_first(); + } else { + self.awaiting_second_char = true; + self.second_char = 'g'; } } 'f' => { @@ -162,15 +178,15 @@ impl App { _ => {} } - if self.awaiting_second_d && c != 'd' { - self.awaiting_second_d = false; + if self.awaiting_second_char && caught_char != self.second_char { + self.awaiting_second_char = false; } } } - fn kill_highlighted_process(&self) -> crate::utils::error::Result<()> { + fn _kill_highlighted_process(&self) -> crate::utils::error::Result<()> { let current_pid = u64::from(self.data.list_of_processes[self.currently_selected_process_position as usize].pid); - process_killer::kill_process_given_pid(current_pid)?; + process_killer::_kill_process_given_pid(current_pid)?; Ok(()) } @@ -190,7 +206,7 @@ impl App { ApplicationPosition::TEMP => ApplicationPosition::MEM, _ => self.current_application_position, }; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } pub fn on_right(&mut self) { @@ -199,7 +215,7 @@ impl App { ApplicationPosition::NETWORK => ApplicationPosition::PROCESS, _ => self.current_application_position, }; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } pub fn on_up(&mut self) { @@ -211,7 +227,7 @@ impl App { ApplicationPosition::DISK => ApplicationPosition::TEMP, _ => self.current_application_position, }; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } pub fn on_down(&mut self) { @@ -222,7 +238,29 @@ impl App { ApplicationPosition::DISK => ApplicationPosition::PROCESS, _ => self.current_application_position, }; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); + } + + pub fn skip_to_first(&mut self) { + match self.current_application_position { + ApplicationPosition::PROCESS => self.currently_selected_process_position = 0, + ApplicationPosition::TEMP => self.currently_selected_temperature_position = 0, + ApplicationPosition::DISK => self.currently_selected_disk_position = 0, + _ => {} + } + self.scroll_direction = ScrollDirection::DOWN; + self.reset_multi_tap_keys(); + } + + pub fn skip_to_last(&mut self) { + match self.current_application_position { + ApplicationPosition::PROCESS => self.currently_selected_process_position = self.data.list_of_processes.len() as i64 - 1, + ApplicationPosition::TEMP => self.currently_selected_temperature_position = self.data.list_of_temperature_sensor.len() as i64 - 1, + ApplicationPosition::DISK => self.currently_selected_disk_position = self.data.list_of_disks.len() as i64 - 1, + _ => {} + } + self.scroll_direction = ScrollDirection::DOWN; + self.reset_multi_tap_keys(); } pub fn decrement_position_count(&mut self) { @@ -233,7 +271,7 @@ impl App { _ => {} } self.scroll_direction = ScrollDirection::UP; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } pub fn increment_position_count(&mut self) { @@ -244,7 +282,7 @@ impl App { _ => {} } self.scroll_direction = ScrollDirection::DOWN; - self.awaiting_second_d = false; + self.reset_multi_tap_keys(); } fn change_process_position(&mut self, num_to_change_by: i64) { diff --git a/src/app/process_killer.rs b/src/app/process_killer.rs index 160139b2..cab40729 100644 --- a/src/app/process_killer.rs +++ b/src/app/process_killer.rs @@ -33,7 +33,7 @@ impl Process { } /// Kills a process, given a PID. -pub fn kill_process_given_pid(pid: u64) -> crate::utils::error::Result<()> { +pub fn _kill_process_given_pid(pid: u64) -> crate::utils::error::Result<()> { if cfg!(target_os = "linux") { // Linux Command::new("kill").arg(pid.to_string()).output()?; diff --git a/src/main.rs b/src/main.rs index 5c24670b..116eb5f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -190,6 +190,7 @@ fn main() -> error::Result<()> { // If only a code, and no modifiers, don't bother... match event.code { KeyCode::Char('q') => break, + KeyCode::Char('G') => app.skip_to_last(), KeyCode::Char('h') => app.on_left(), KeyCode::Char('l') => app.on_right(), KeyCode::Char('k') => app.on_up(),