From c9e33bb8484fa9b9f5e822e54976a0a85b7feffc Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sun, 10 Nov 2024 18:39:24 -0800 Subject: [PATCH] Update StatefulList implementation Drop dead functions Add helper functions to get/set inner data from items/state --- src/components/left.rs | 20 ++++++++--------- src/components/state.rs | 50 +++++++++++++++++------------------------ 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/components/left.rs b/src/components/left.rs index fc59e4c..0507c36 100644 --- a/src/components/left.rs +++ b/src/components/left.rs @@ -108,10 +108,10 @@ impl Component for Left { // Menu selection sections let selection: Option; match self.mode { - Mode::InstallDrivers => selection = self.list_drivers.state.selected(), - Mode::SelectDisks => selection = self.list_disks.state.selected(), - Mode::SelectTableType => selection = self.list_table_types.state.selected(), - Mode::SelectParts => selection = self.list_parts.state.selected(), + Mode::InstallDrivers => selection = self.list_drivers.selected(), + Mode::SelectDisks => selection = self.list_disks.selected(), + Mode::SelectTableType => selection = self.list_table_types.selected(), + Mode::SelectParts => selection = self.list_parts.selected(), _ => panic!("This shouldn't happen!"), } if let Some(index) = selection { @@ -143,13 +143,13 @@ impl Component for Left { match self.mode { Mode::InstallDrivers => { // Only need to select one entry - if let Some(driver) = self.list_drivers.pop_selected() { + if let Some(driver) = self.list_drivers.get_selected() { command_tx.send(Action::SelectDriver(driver.clone()))?; } } Mode::SelectTableType => { // Only need to select one entry - if let Some(table_type) = self.list_table_types.pop_selected() { + if let Some(table_type) = self.list_table_types.get_selected() { self.table_type = Some(table_type.clone()); command_tx.send(Action::SelectTableType(table_type))?; } @@ -189,7 +189,7 @@ impl Component for Left { self.selections[0] = None; self.selections[1] = None; self.title_text = String::from("Install Drivers"); - if self.list_drivers.items.is_empty() { + if self.list_drivers.is_empty() { if let Some(command_tx) = self.command_tx.clone() { command_tx.send(Action::DisplayPopup( popup::Type::Error, @@ -220,7 +220,7 @@ impl Component for Left { // Get list of partitions for destination disk if let Some(index) = &self.disk_id_dest { - if let Some(disk) = self.list_disks.items.get(*index).to_owned() { + if let Some(disk) = self.list_disks.get(*index).to_owned() { self.list_parts.set_items(disk.parts.clone()); // Auto-select first partition and highlight likely OS partition @@ -229,13 +229,13 @@ impl Component for Left { PartitionTableType::Guid => { if disk.parts.len() >= 3 { self.selections[0] = Some(0); - self.list_parts.state.select(Some(2)); + self.list_parts.select(2); } } PartitionTableType::Legacy => { if disk.parts.len() >= 2 { self.selections[0] = Some(0); - self.list_parts.state.select(Some(1)); + self.list_parts.select(1); } } } diff --git a/src/components/state.rs b/src/components/state.rs index 95a303a..fbd858b 100644 --- a/src/components/state.rs +++ b/src/components/state.rs @@ -13,7 +13,7 @@ // You should have received a copy of the GNU General Public License // along with Deja-vu. If not, see . // -use std::collections::{hash_map, HashMap}; +use std::collections::HashMap; use ratatui::widgets::ListState; @@ -26,31 +26,20 @@ pub struct StatefulList { } impl StatefulList { - #[must_use] - pub fn new() -> StatefulList { - StatefulList { - state: ListState::default(), - items: Vec::new(), - last_selected: None, - selected: HashMap::new(), - } - } - pub fn clear_items(&mut self) { // Clear list and rebuild with provided items self.items.clear(); } - #[must_use] - pub fn get_selected(&self) -> Option<&T> { - if let Some(i) = self.state.selected() { - self.items.get(i) + pub fn get(&mut self, index: usize) -> Option { + if let Some(item) = self.items.get(index) { + Some(item.clone()) } else { None } } - pub fn pop_selected(&mut self) -> Option { + pub fn get_selected(&self) -> Option { if let Some(i) = self.state.selected() { Some(self.items[i].clone()) } else { @@ -58,6 +47,22 @@ impl StatefulList { } } + pub fn is_empty(&self) -> bool { + self.items.is_empty() + } + + pub fn select(&mut self, index: usize) { + if self.items.is_empty() { + self.state.select(None); + } else { + self.state.select(Some(index)); + } + } + + pub fn selected(&self) -> Option { + self.state.selected() + } + fn select_first_item(&mut self) { if self.items.is_empty() { self.state.select(None); @@ -112,17 +117,4 @@ impl StatefulList { }; self.state.select(Some(i)); } - pub fn toggle_selected(&mut self) { - if let Some(i) = self.state.selected() { - if let hash_map::Entry::Vacant(e) = self.selected.entry(i) { - // Was NOT selected, WILL be shortly - self.last_selected = Some(i); - e.insert(true); - } else { - // WAS selected, will NOT be shortly - self.last_selected = None; - self.selected.remove(&i); - } - } - } }