Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion arca-gui/src/controller/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,17 @@ use crate::archive_ops::*;
use crate::i18n::Lang;
use crate::model::*;
use crate::tree::{parent_of, Kind, Row};
use arca_core::Entry;
use arca_core::{Codec, Entry};
use std::path::{Path, PathBuf};

/// What the create and settings dialogs offer for the compressor of the
/// chosen format.
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub(crate) enum Compressor {
Fixed(&'static str),
Codec { codec: Codec, editable: bool },
}

pub(crate) enum Message {
Listing(
PathBuf,
Expand Down
58 changes: 29 additions & 29 deletions arca-gui/src/controller/disk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,7 @@ impl AppController {

pub(crate) fn create_disk_folder(&mut self, name: &str) -> Option<String> {
let s = self.s();
let dir = format!("{}{name}/", self.state.current_dir);
let dir = format!("{}{name}/", self.state.active_pane().directory);
let path = disk_path(&dir);
if path.exists() {
self.state.notice = fill(s.name_taken, &[("name", name)]);
Expand Down Expand Up @@ -810,7 +810,7 @@ impl AppController {
.unwrap_or_default(),
many => fill(s.items_carried, &[("n", &many.len().to_string())]),
};
let here = disk_path(&self.state.current_dir);
let here = disk_path(&self.state.active_pane().directory);
let sources = picked.clone();
let task = Task::new(
if trash {
Expand Down Expand Up @@ -870,7 +870,7 @@ impl AppController {
.unwrap_or_default(),
many => fill(s.items_carried, &[("n", &many.len().to_string())]),
};
let here = disk_path(&self.state.current_dir);
let here = disk_path(&self.state.active_pane().directory);
let sources = picked.clone();
let task = Task::new(
s.duplicating_files,
Expand Down Expand Up @@ -1066,7 +1066,7 @@ impl AppController {

pub(crate) fn folder_total(&self) -> usize {
if self.on_disk() {
children_of(&self.state.entries, &self.state.current_dir).len()
children_of(&self.state.entries, &self.state.active_pane().directory).len()
} else {
self.state.entries.len()
}
Expand All @@ -1078,12 +1078,12 @@ impl AppController {
}

pub(crate) fn can_go_up(&self) -> bool {
!self.state.current_dir.is_empty() || self.can_close_archive()
!self.state.active_pane().directory.is_empty() || self.can_close_archive()
}

pub(crate) fn go_up(&mut self) {
if !self.state.current_dir.is_empty() {
self.go_to(parent_of(&self.state.current_dir));
if !self.state.active_pane().directory.is_empty() {
self.go_to(parent_of(&self.state.active_pane().directory));
} else if self.can_close_archive() {
self.close_archive();
}
Expand Down Expand Up @@ -1116,8 +1116,8 @@ impl AppController {
self.state.archive = None;
self.state.origin = None;
self.state.entries.clear();
self.state.checked.clear();
self.state.cursor = None;
self.state.active_pane_mut().checked.clear();
self.state.active_pane_mut().cursor = None;
self.state.folders = tree::folders_of(&[]);
self.state.history.clear();
self.state.here = 0;
Expand All @@ -1136,7 +1136,7 @@ impl AppController {
};
// The panes still point into the archive that was open; rebuilding
// them from that path would try to read it off the disk.
self.state.current_dir.clear();
self.state.active_pane_mut().directory.clear();
self.reset_browser_panes();
self.navigate_panes(dir);
self.record_pane_history();
Expand All @@ -1149,7 +1149,8 @@ impl AppController {
}
let leaf = self
.state
.current_dir
.active_pane()
.directory
.trim_end_matches('/')
.rsplit('/')
.next()
Expand Down Expand Up @@ -1196,7 +1197,8 @@ impl AppController {
disk.loaded.insert(ancestor);
}
}
self.state.checked.resize(self.state.entries.len(), false);
let entries = self.state.entries.len();
self.state.active_pane_mut().checked.resize(entries, false);
}

/// Reads the folders being shown again, for a disk that changed under
Expand All @@ -1205,16 +1207,17 @@ impl AppController {
if !self.on_disk() {
return;
}
self.snapshot_active_pane();
let dir = self.state.current_dir.clone();
let dir = self.state.active_pane().directory.clone();
let remembered: Vec<(Vec<String>, Option<String>)> = (0..self.state.browser.panes.len())
.map(|pane| {
let rows = self.pane_rows(pane);
let state = &self.state.browser.panes[pane];
let selected = state
.selected
.checked
.iter()
.filter_map(|i| self.state.entries.get(*i))
.enumerate()
.filter(|(_, on)| **on)
.filter_map(|(i, _)| self.state.entries.get(i))
.map(|entry| entry.name.clone())
.collect();
let cursor = state
Expand All @@ -1225,7 +1228,7 @@ impl AppController {
})
.collect();
self.state.entries.clear();
self.state.checked.clear();
self.state.active_pane_mut().checked.clear();
self.state.disk = Some(DiskState::default());
self.load_disk_ancestors(&dir);
let by_name: HashMap<String, usize> = self
Expand All @@ -1235,32 +1238,29 @@ impl AppController {
.enumerate()
.map(|(i, entry)| (entry.name.clone(), i))
.collect();
let entries = self.state.entries.len();
for (pane, (selected, cursor)) in remembered.into_iter().enumerate() {
let rows = self.pane_rows(pane);
let state = &mut self.state.browser.panes[pane];
state.selected = selected
let picked: HashSet<usize> = selected
.iter()
.filter_map(|name| by_name.get(name).copied())
.collect();
let state = &mut self.state.browser.panes[pane];
state.checked = (0..entries).map(|i| picked.contains(&i)).collect();
state.cursor = cursor.and_then(|path| rows.iter().position(|row| row.path == path));
}
let active = &self.state.browser.panes[self.state.browser.active];
self.state.cursor = active.cursor;
self.state.checked = (0..self.state.entries.len())
.map(|i| active.selected.contains(&i))
.collect();
self.navigate_panes(dir);
}

pub(crate) fn remember_folder(&mut self) {
if !self.on_disk() {
return;
}
let path = disk_path(&self.state.current_dir);
let path = disk_path(&self.state.active_pane().directory);
let text = (!path.as_os_str().is_empty()).then(|| path.to_string_lossy().to_string());
if self.state.settings.last_folder != text {
self.state.settings.last_folder = text;
self.state.settings.save();
self.save_settings();
}
}

Expand All @@ -1278,7 +1278,7 @@ impl AppController {
}
if detect(&path).is_some() {
let origin = Origin {
directory: self.state.current_dir.clone(),
directory: self.state.active_pane().directory.clone(),
path: entry.name.clone(),
};
self.open(path);
Expand Down Expand Up @@ -1550,15 +1550,15 @@ impl AppController {
} else {
self.state.settings.pinned.push(text);
}
self.state.settings.save();
self.save_settings();
}

pub(crate) fn set_show_hidden(&mut self, show: bool) {
if self.state.settings.show_hidden == show {
return;
}
self.state.settings.show_hidden = show;
self.state.settings.save();
self.save_settings();
self.refresh_disk();
}
}
Expand Down
22 changes: 14 additions & 8 deletions arca-gui/src/controller/disk_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ fn browsing_lists_folders_as_they_are_entered() {
app.browse_disk(&room.0);
assert!(app.on_disk());
assert!(!app.state.busy);
assert_eq!(app.state.current_dir, disk_dir(&room.0));
assert_eq!(app.state.active_pane().directory, disk_dir(&room.0));
assert_eq!(names(&app), vec!["nested", "top.txt"]);

let nested = disk_dir(&room.path("nested"));
Expand All @@ -98,7 +98,7 @@ fn browsing_lists_folders_as_they_are_entered() {
assert_eq!(names(&app), vec!["deeper", "note.txt"]);
assert!(app.can_go_up());
app.go_up();
assert_eq!(app.state.current_dir, disk_dir(&room.0));
assert_eq!(app.state.active_pane().directory, disk_dir(&room.0));
assert_eq!(names(&app), vec!["nested", "top.txt"]);
assert_eq!(
app.state
Expand Down Expand Up @@ -153,7 +153,7 @@ fn an_archive_on_disk_opens_in_place_and_closes_back_onto_its_row() {
app.go_up();
assert!(app.on_disk());
assert!(app.state.archive.is_none());
assert_eq!(app.state.current_dir, disk_dir(&room.0));
assert_eq!(app.state.active_pane().directory, disk_dir(&room.0));
let cursor = app.state.browser.panes[app.state.browser.active].cursor;
let rows = app.visible_rows();
let under_cursor = cursor
Expand Down Expand Up @@ -183,7 +183,7 @@ fn a_folder_opened_from_the_disk_is_remembered_for_the_next_start() {
let mut next = AppController::new(settings);
next.start_browsing();
assert!(next.on_disk());
assert_eq!(next.state.current_dir, nested);
assert_eq!(next.state.active_pane().directory, nested);

let gone = Settings {
last_folder: Some(room.path("missing").to_string_lossy().to_string()),
Expand All @@ -192,7 +192,10 @@ fn a_folder_opened_from_the_disk_is_remembered_for_the_next_start() {
let mut fallback = AppController::new(gone);
fallback.start_browsing();
assert!(fallback.on_disk());
assert_ne!(fallback.state.current_dir, disk_dir(&room.path("missing")));
assert_ne!(
fallback.state.active_pane().directory,
disk_dir(&room.path("missing"))
);
}

#[test]
Expand Down Expand Up @@ -306,15 +309,18 @@ fn refreshing_the_disk_keeps_the_selection_by_name() {
.expect("top.txt listed");
app.set_pane_cursor(app.state.browser.active, Some(top));
let entry = rows[top].entry.expect("a file row has an entry");
app.state.checked[entry] = true;
app.snapshot_active_pane();
app.state.active_pane_mut().checked[entry] = true;
assert_eq!(app.selected_disk_paths(), vec![room.path("top.txt")]);

std::fs::write(room.path("aaa.txt"), b"sorts first").unwrap();
app.refresh_disk();
assert_eq!(app.selected_disk_paths(), vec![room.path("top.txt")]);
let rows = app.visible_rows();
let cursor = app.state.cursor.expect("cursor survives a refresh");
let cursor = app
.state
.active_pane()
.cursor
.expect("cursor survives a refresh");
assert_eq!(rows[cursor].label, "top.txt");
assert!(names(&app).contains(&"aaa.txt".to_string()));
}
Expand Down
Loading
Loading