Update StatefulList implementation

Drop dead functions
Add helper functions to get/set inner data from items/state
This commit is contained in:
2Shirt 2024-11-10 18:39:24 -08:00
parent 14df5b82ce
commit c9e33bb848
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
2 changed files with 31 additions and 39 deletions

View file

@ -108,10 +108,10 @@ impl Component for Left {
// Menu selection sections
let selection: Option<usize>;
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);
}
}
}

View file

@ -13,7 +13,7 @@
// You should have received a copy of the GNU General Public License
// along with Deja-vu. If not, see <https://www.gnu.org/licenses/>.
//
use std::collections::{hash_map, HashMap};
use std::collections::HashMap;
use ratatui::widgets::ListState;
@ -26,31 +26,20 @@ pub struct StatefulList<T> {
}
impl<T: Clone> StatefulList<T> {
#[must_use]
pub fn new() -> StatefulList<T> {
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<T> {
if let Some(item) = self.items.get(index) {
Some(item.clone())
} else {
None
}
}
pub fn pop_selected(&mut self) -> Option<T> {
pub fn get_selected(&self) -> Option<T> {
if let Some(i) = self.state.selected() {
Some(self.items[i].clone())
} else {
@ -58,6 +47,22 @@ impl<T: Clone> StatefulList<T> {
}
}
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<usize> {
self.state.selected()
}
fn select_first_item(&mut self) {
if self.items.is_empty() {
self.state.select(None);
@ -112,17 +117,4 @@ impl<T: Clone> StatefulList<T> {
};
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);
}
}
}
}