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
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue