Make items_opt private

This commit is contained in:
Jeremy Soller 2024-02-29 13:42:13 -07:00
parent bcd5da57ab
commit b9f959a298
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
4 changed files with 61 additions and 47 deletions

View file

@ -428,7 +428,7 @@ impl App {
let mut children = Vec::new(); let mut children = Vec::new();
let entity = self.tab_model.active(); let entity = self.tab_model.active();
if let Some(tab) = self.tab_model.data::<Tab>(entity) { if let Some(tab) = self.tab_model.data::<Tab>(entity) {
if let Some(ref items) = tab.items_opt { if let Some(items) = tab.items_opt() {
for item in items.iter() { for item in items.iter() {
if item.selected { if item.selected {
children.push(item.property_view(tab.config.icon_sizes)); children.push(item.property_view(tab.config.icon_sizes));
@ -672,17 +672,8 @@ impl Application for App {
return Command::none(); return Command::none();
} }
if let Some(ref mut items) = tab.items_opt { if tab.select_none() {
let mut had_selection = false; return Command::none();
for item in items.iter_mut() {
if item.selected {
item.selected = false;
had_selection = true;
}
}
if had_selection {
return Command::none();
}
} }
} }
self.core.window.show_context = false; self.core.window.show_context = false;
@ -804,8 +795,8 @@ impl Application for App {
let mut paths = Vec::new(); let mut paths = Vec::new();
let entity = entity_opt.unwrap_or_else(|| self.tab_model.active()); let entity = entity_opt.unwrap_or_else(|| self.tab_model.active());
if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) { if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) {
if let Some(ref mut items) = tab.items_opt { if let Some(ref items) = tab.items_opt() {
for item in items.iter_mut() { for item in items.iter() {
if item.selected { if item.selected {
paths.push(item.path.clone()); paths.push(item.path.clone());
} }
@ -894,7 +885,7 @@ impl Application for App {
let entity = entity_opt.unwrap_or_else(|| self.tab_model.active()); let entity = entity_opt.unwrap_or_else(|| self.tab_model.active());
if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) { if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) {
if let Location::Path(parent) = &tab.location { if let Location::Path(parent) = &tab.location {
if let Some(items) = &tab.items_opt { if let Some(items) = tab.items_opt() {
let mut selected = Vec::new(); let mut selected = Vec::new();
for item in items.iter() { for item in items.iter() {
if item.selected { if item.selected {
@ -926,8 +917,8 @@ impl Application for App {
let mut paths = Vec::new(); let mut paths = Vec::new();
let entity = entity_opt.unwrap_or_else(|| self.tab_model.active()); let entity = entity_opt.unwrap_or_else(|| self.tab_model.active());
if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) { if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) {
if let Some(ref mut items) = tab.items_opt { if let Some(items) = tab.items_opt() {
for item in items.iter_mut() { for item in items.iter() {
if item.selected { if item.selected {
match &item.metadata { match &item.metadata {
ItemMetadata::Trash { entry, .. } => { ItemMetadata::Trash { entry, .. } => {
@ -948,15 +939,7 @@ impl Application for App {
Message::SelectAll(entity_opt) => { Message::SelectAll(entity_opt) => {
let entity = entity_opt.unwrap_or_else(|| self.tab_model.active()); let entity = entity_opt.unwrap_or_else(|| self.tab_model.active());
if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) { if let Some(tab) = self.tab_model.data_mut::<Tab>(entity) {
if let Some(ref mut items) = tab.items_opt { tab.select_all();
for item in items.iter_mut() {
if !tab.config.show_hidden && item.hidden {
continue;
}
item.selected = true;
item.click_time = None;
}
}
} }
} }
Message::SystemThemeModeChange(_theme_mode) => { Message::SystemThemeModeChange(_theme_mode) => {
@ -1093,7 +1076,7 @@ impl Application for App {
} }
Message::TabRescan(entity, items) => match self.tab_model.data_mut::<Tab>(entity) { Message::TabRescan(entity, items) => match self.tab_model.data_mut::<Tab>(entity) {
Some(tab) => { Some(tab) => {
tab.items_opt = Some(items); tab.set_items(items);
} }
_ => (), _ => (),
}, },
@ -1680,13 +1663,10 @@ pub(crate) mod test_utils {
let location = Location::Path(path.to_owned()); let location = Location::Path(path.to_owned());
let items = location.scan(IconSizes::default()); let items = location.scan(IconSizes::default());
let mut tab = Tab::new(location, TabConfig::default()); let mut tab = Tab::new(location, TabConfig::default());
tab.items_opt = Some(items); tab.set_items(items);
// Ensure correct number of directories as a sanity check // Ensure correct number of directories as a sanity check
let items = tab let items = tab.items_opt().expect("tab should be populated with Items");
.items_opt
.as_deref()
.expect("tab should be populated with Items");
assert_eq!(NUM_DIRS, items.len()); assert_eq!(NUM_DIRS, items.len());
Ok((fs, tab)) Ok((fs, tab))
@ -1748,17 +1728,14 @@ pub(crate) mod test_utils {
// Check lengths. // Check lengths.
// `items_opt` is optional and the directory at `path` may have zero entries // `items_opt` is optional and the directory at `path` may have zero entries
// Therefore, this doesn't panic if `items_opt` is None // Therefore, this doesn't panic if `items_opt` is None
let items_len = tab let items_len = tab.items_opt().map(|items| items.len()).unwrap_or_default();
.items_opt
.as_ref()
.map(|items| items.len())
.unwrap_or_default();
assert_eq!(entries.len(), items_len); assert_eq!(entries.len(), items_len);
let empty = Vec::new();
assert!( assert!(
entries entries
.into_iter() .into_iter()
.zip(tab.items_opt.clone().unwrap_or_default()) .zip(tab.items_opt().clone().unwrap_or(&empty))
.all(|(a, b)| eq_path_item(&a, &b)), .all(|(a, b)| eq_path_item(&a, &b)),
"Path ({}) and Tab path ({}) don't have equal contents", "Path ({}) and Tab path ({}) don't have equal contents",
path.display(), path.display(),

View file

@ -451,7 +451,7 @@ impl Application for App {
} }
// Select based on filename // Select based on filename
if let Some(items) = &mut self.tab.items_opt { if let Some(items) = self.tab.items_opt_mut() {
for item in items.iter_mut() { for item in items.iter_mut() {
item.selected = item.name == new_filename; item.selected = item.name == new_filename;
} }
@ -488,8 +488,8 @@ impl Application for App {
}, },
Message::Open => { Message::Open => {
let mut paths = Vec::new(); let mut paths = Vec::new();
if let Some(ref mut items) = self.tab.items_opt { if let Some(items) = self.tab.items_opt() {
for item in items.iter_mut() { for item in items.iter() {
if item.selected { if item.selected {
paths.push(item.path.clone()); paths.push(item.path.clone());
} }
@ -563,7 +563,7 @@ impl Application for App {
// Update filename box when anything is selected // Update filename box when anything is selected
if let DialogKind::SaveFile { filename } = &mut self.flags.kind { if let DialogKind::SaveFile { filename } = &mut self.flags.kind {
if let Some(click_i) = click_i_opt { if let Some(click_i) = click_i_opt {
if let Some(items) = &self.tab.items_opt { if let Some(items) = self.tab.items_opt() {
if let Some(item) = items.get(click_i) { if let Some(item) = items.get(click_i) {
if item.selected && !item.path.is_dir() { if item.selected && !item.path.is_dir() {
*filename = item.name.clone(); *filename = item.name.clone();
@ -605,7 +605,7 @@ impl Application for App {
} }
} }
self.tab.items_opt = Some(items); self.tab.set_items(items);
// Reset focus on location change // Reset focus on location change
return widget::text_input::focus(self.filename_id.clone()); return widget::text_input::focus(self.filename_id.clone());

View file

@ -58,8 +58,7 @@ pub fn context_menu<'a>(
}; };
let selected = tab let selected = tab
.items_opt .items_opt()
.as_ref()
.map_or(0, |items| items.iter().filter(|x| x.selected).count()); .map_or(0, |items| items.iter().filter(|x| x.selected).count());
let mut children: Vec<Element<_>> = Vec::new(); let mut children: Vec<Element<_>> = Vec::new();

View file

@ -552,7 +552,6 @@ pub enum HeadingOptions {
pub struct Tab { pub struct Tab {
pub location: Location, pub location: Location,
pub context_menu: Option<Point>, pub context_menu: Option<Point>,
pub items_opt: Option<Vec<Item>>,
pub view: View, pub view: View,
pub dialog: Option<DialogKind>, pub dialog: Option<DialogKind>,
pub scroll_opt: Option<Viewport>, pub scroll_opt: Option<Viewport>,
@ -562,6 +561,7 @@ pub struct Tab {
pub history_i: usize, pub history_i: usize,
pub history: Vec<Location>, pub history: Vec<Location>,
pub config: TabConfig, pub config: TabConfig,
items_opt: Option<Vec<Item>>,
sort_name: HeadingOptions, sort_name: HeadingOptions,
sort_direction: bool, sort_direction: bool,
} }
@ -574,7 +574,6 @@ impl Tab {
Self { Self {
location, location,
context_menu: None, context_menu: None,
items_opt: None,
view: View::Grid, view: View::Grid,
dialog: None, dialog: None,
scroll_opt: None, scroll_opt: None,
@ -584,6 +583,7 @@ impl Tab {
history_i: 0, history_i: 0,
history, history,
config, config,
items_opt: None,
sort_name, sort_name,
sort_direction, sort_direction,
} }
@ -601,6 +601,44 @@ impl Tab {
} }
} }
pub fn items_opt(&self) -> Option<&Vec<Item>> {
self.items_opt.as_ref()
}
pub fn items_opt_mut(&mut self) -> Option<&mut Vec<Item>> {
self.items_opt.as_mut()
}
pub fn set_items(&mut self, items: Vec<Item>) {
self.items_opt = Some(items);
}
pub fn select_all(&mut self) {
if let Some(ref mut items) = self.items_opt {
for item in items.iter_mut() {
if !self.config.show_hidden && item.hidden {
item.selected = false;
continue;
}
item.selected = true;
item.click_time = None;
}
}
}
pub fn select_none(&mut self) -> bool {
let mut had_selection = false;
if let Some(ref mut items) = self.items_opt {
for item in items.iter_mut() {
if item.selected {
item.selected = false;
had_selection = true;
}
}
}
had_selection
}
fn select_by_drag(&mut self, rect: Rectangle) { fn select_by_drag(&mut self, rect: Rectangle) {
let items = match &mut self.items_opt { let items = match &mut self.items_opt {
Some(some) => some, Some(some) => some,