Update StatefulList implementation
Drop dead functions Add helper functions to get/set inner data from items/state
This commit is contained in:
parent
14df5b82ce
commit
c9e33bb848
2 changed files with 31 additions and 39 deletions
|
|
@ -108,10 +108,10 @@ impl Component for Left {
|
||||||
// Menu selection sections
|
// Menu selection sections
|
||||||
let selection: Option<usize>;
|
let selection: Option<usize>;
|
||||||
match self.mode {
|
match self.mode {
|
||||||
Mode::InstallDrivers => selection = self.list_drivers.state.selected(),
|
Mode::InstallDrivers => selection = self.list_drivers.selected(),
|
||||||
Mode::SelectDisks => selection = self.list_disks.state.selected(),
|
Mode::SelectDisks => selection = self.list_disks.selected(),
|
||||||
Mode::SelectTableType => selection = self.list_table_types.state.selected(),
|
Mode::SelectTableType => selection = self.list_table_types.selected(),
|
||||||
Mode::SelectParts => selection = self.list_parts.state.selected(),
|
Mode::SelectParts => selection = self.list_parts.selected(),
|
||||||
_ => panic!("This shouldn't happen!"),
|
_ => panic!("This shouldn't happen!"),
|
||||||
}
|
}
|
||||||
if let Some(index) = selection {
|
if let Some(index) = selection {
|
||||||
|
|
@ -143,13 +143,13 @@ impl Component for Left {
|
||||||
match self.mode {
|
match self.mode {
|
||||||
Mode::InstallDrivers => {
|
Mode::InstallDrivers => {
|
||||||
// Only need to select one entry
|
// 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()))?;
|
command_tx.send(Action::SelectDriver(driver.clone()))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mode::SelectTableType => {
|
Mode::SelectTableType => {
|
||||||
// Only need to select one entry
|
// 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());
|
self.table_type = Some(table_type.clone());
|
||||||
command_tx.send(Action::SelectTableType(table_type))?;
|
command_tx.send(Action::SelectTableType(table_type))?;
|
||||||
}
|
}
|
||||||
|
|
@ -189,7 +189,7 @@ impl Component for Left {
|
||||||
self.selections[0] = None;
|
self.selections[0] = None;
|
||||||
self.selections[1] = None;
|
self.selections[1] = None;
|
||||||
self.title_text = String::from("Install Drivers");
|
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() {
|
if let Some(command_tx) = self.command_tx.clone() {
|
||||||
command_tx.send(Action::DisplayPopup(
|
command_tx.send(Action::DisplayPopup(
|
||||||
popup::Type::Error,
|
popup::Type::Error,
|
||||||
|
|
@ -220,7 +220,7 @@ impl Component for Left {
|
||||||
|
|
||||||
// Get list of partitions for destination disk
|
// Get list of partitions for destination disk
|
||||||
if let Some(index) = &self.disk_id_dest {
|
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());
|
self.list_parts.set_items(disk.parts.clone());
|
||||||
|
|
||||||
// Auto-select first partition and highlight likely OS partition
|
// Auto-select first partition and highlight likely OS partition
|
||||||
|
|
@ -229,13 +229,13 @@ impl Component for Left {
|
||||||
PartitionTableType::Guid => {
|
PartitionTableType::Guid => {
|
||||||
if disk.parts.len() >= 3 {
|
if disk.parts.len() >= 3 {
|
||||||
self.selections[0] = Some(0);
|
self.selections[0] = Some(0);
|
||||||
self.list_parts.state.select(Some(2));
|
self.list_parts.select(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PartitionTableType::Legacy => {
|
PartitionTableType::Legacy => {
|
||||||
if disk.parts.len() >= 2 {
|
if disk.parts.len() >= 2 {
|
||||||
self.selections[0] = Some(0);
|
self.selections[0] = Some(0);
|
||||||
self.list_parts.state.select(Some(1));
|
self.list_parts.select(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Deja-vu. If not, see <https://www.gnu.org/licenses/>.
|
// 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;
|
use ratatui::widgets::ListState;
|
||||||
|
|
||||||
|
|
@ -26,31 +26,20 @@ pub struct StatefulList<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> 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) {
|
pub fn clear_items(&mut self) {
|
||||||
// Clear list and rebuild with provided items
|
// Clear list and rebuild with provided items
|
||||||
self.items.clear();
|
self.items.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[must_use]
|
pub fn get(&mut self, index: usize) -> Option<T> {
|
||||||
pub fn get_selected(&self) -> Option<&T> {
|
if let Some(item) = self.items.get(index) {
|
||||||
if let Some(i) = self.state.selected() {
|
Some(item.clone())
|
||||||
self.items.get(i)
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pop_selected(&mut self) -> Option<T> {
|
pub fn get_selected(&self) -> Option<T> {
|
||||||
if let Some(i) = self.state.selected() {
|
if let Some(i) = self.state.selected() {
|
||||||
Some(self.items[i].clone())
|
Some(self.items[i].clone())
|
||||||
} else {
|
} 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) {
|
fn select_first_item(&mut self) {
|
||||||
if self.items.is_empty() {
|
if self.items.is_empty() {
|
||||||
self.state.select(None);
|
self.state.select(None);
|
||||||
|
|
@ -112,17 +117,4 @@ impl<T: Clone> StatefulList<T> {
|
||||||
};
|
};
|
||||||
self.state.select(Some(i));
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue