Make items_opt private
This commit is contained in:
parent
bcd5da57ab
commit
b9f959a298
4 changed files with 61 additions and 47 deletions
53
src/app.rs
53
src/app.rs
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
42
src/tab.rs
42
src/tab.rs
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue