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

View file

@ -451,7 +451,7 @@ impl Application for App {
}
// 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() {
item.selected = item.name == new_filename;
}
@ -488,8 +488,8 @@ impl Application for App {
},
Message::Open => {
let mut paths = Vec::new();
if let Some(ref mut items) = self.tab.items_opt {
for item in items.iter_mut() {
if let Some(items) = self.tab.items_opt() {
for item in items.iter() {
if item.selected {
paths.push(item.path.clone());
}
@ -563,7 +563,7 @@ impl Application for App {
// Update filename box when anything is selected
if let DialogKind::SaveFile { filename } = &mut self.flags.kind {
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 item.selected && !item.path.is_dir() {
*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
return widget::text_input::focus(self.filename_id.clone());

View file

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

View file

@ -552,7 +552,6 @@ pub enum HeadingOptions {
pub struct Tab {
pub location: Location,
pub context_menu: Option<Point>,
pub items_opt: Option<Vec<Item>>,
pub view: View,
pub dialog: Option<DialogKind>,
pub scroll_opt: Option<Viewport>,
@ -562,6 +561,7 @@ pub struct Tab {
pub history_i: usize,
pub history: Vec<Location>,
pub config: TabConfig,
items_opt: Option<Vec<Item>>,
sort_name: HeadingOptions,
sort_direction: bool,
}
@ -574,7 +574,6 @@ impl Tab {
Self {
location,
context_menu: None,
items_opt: None,
view: View::Grid,
dialog: None,
scroll_opt: None,
@ -584,6 +583,7 @@ impl Tab {
history_i: 0,
history,
config,
items_opt: None,
sort_name,
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) {
let items = match &mut self.items_opt {
Some(some) => some,