Get is_dir and size for trash items

This commit is contained in:
Jeremy Soller 2024-01-06 12:59:36 -07:00
parent 8a85899176
commit a43de15627
3 changed files with 144 additions and 92 deletions

74
Cargo.lock generated
View file

@ -311,7 +311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
dependencies = [ dependencies = [
"concurrent-queue", "concurrent-queue",
"event-listener 4.0.2", "event-listener 4.0.3",
"event-listener-strategy", "event-listener-strategy",
"futures-core", "futures-core",
"pin-project-lite", "pin-project-lite",
@ -397,7 +397,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c"
dependencies = [ dependencies = [
"event-listener 4.0.2", "event-listener 4.0.3",
"event-listener-strategy", "event-listener-strategy",
"pin-project-lite", "pin-project-lite",
] ]
@ -941,7 +941,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config" name = "cosmic-config"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"atomicwrites", "atomicwrites",
"cosmic-config-derive", "cosmic-config-derive",
@ -956,7 +956,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config-derive" name = "cosmic-config-derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"quote", "quote",
"syn 1.0.109", "syn 1.0.109",
@ -1007,7 +1007,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-theme" name = "cosmic-theme"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"almost", "almost",
"cosmic-config", "cosmic-config",
@ -1540,9 +1540,9 @@ dependencies = [
[[package]] [[package]]
name = "event-listener" name = "event-listener"
version = "4.0.2" version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "218a870470cce1469024e9fb66b901aa983929d81304a1cdb299f28118e550d5" checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
dependencies = [ dependencies = [
"concurrent-queue", "concurrent-queue",
"parking", "parking",
@ -1555,7 +1555,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
dependencies = [ dependencies = [
"event-listener 4.0.2", "event-listener 4.0.3",
"pin-project-lite", "pin-project-lite",
] ]
@ -2304,7 +2304,7 @@ dependencies = [
"iana-time-zone-haiku", "iana-time-zone-haiku",
"js-sys", "js-sys",
"wasm-bindgen", "wasm-bindgen",
"windows-core", "windows-core 0.52.0",
] ]
[[package]] [[package]]
@ -2319,7 +2319,7 @@ dependencies = [
[[package]] [[package]]
name = "iced" name = "iced"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_accessibility", "iced_accessibility",
"iced_core", "iced_core",
@ -2334,7 +2334,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_accessibility" name = "iced_accessibility"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"accesskit_winit", "accesskit_winit",
@ -2343,7 +2343,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_core" name = "iced_core"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"instant", "instant",
@ -2359,7 +2359,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_futures" name = "iced_futures"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@ -2372,7 +2372,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_graphics" name = "iced_graphics"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"bytemuck", "bytemuck",
@ -2395,7 +2395,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_renderer" name = "iced_renderer"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@ -2408,7 +2408,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_runtime" name = "iced_runtime"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_core", "iced_core",
"iced_futures", "iced_futures",
@ -2418,7 +2418,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_style" name = "iced_style"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_core", "iced_core",
"once_cell", "once_cell",
@ -2428,7 +2428,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_tiny_skia" name = "iced_tiny_skia"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text", "cosmic-text",
@ -2446,7 +2446,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_wgpu" name = "iced_wgpu"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"bytemuck", "bytemuck",
@ -2466,7 +2466,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_widget" name = "iced_widget"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_renderer", "iced_renderer",
"iced_runtime", "iced_runtime",
@ -2480,7 +2480,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_winit" name = "iced_winit"
version = "0.12.0" version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_runtime", "iced_runtime",
@ -2777,7 +2777,7 @@ checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
[[package]] [[package]]
name = "libcosmic" name = "libcosmic"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#4674e4b23e80adcebb9096217dd3ff0a2c5ac15b" source = "git+https://github.com/pop-os/libcosmic.git#0e0aed9bde8c4b0069c01ca5439205d93959af80"
dependencies = [ dependencies = [
"apply", "apply",
"ashpd", "ashpd",
@ -3963,9 +3963,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.75" version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708" checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -4400,18 +4400,18 @@ checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.194" version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.194" version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -5003,8 +5003,7 @@ dependencies = [
[[package]] [[package]]
name = "trash" name = "trash"
version = "3.1.2" version = "3.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/jackpot51/trash-rs#3bea3e2f11d5def136455e7bc2377cb05b80147e"
checksum = "8c646008e5144d988005bec12b1e56f5e0a951e957176686815eba8b025e0418"
dependencies = [ dependencies = [
"chrono", "chrono",
"libc", "libc",
@ -5735,7 +5734,7 @@ version = "0.51.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
dependencies = [ dependencies = [
"windows-core", "windows-core 0.51.1",
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
@ -5748,6 +5747,15 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.0",
]
[[package]] [[package]]
name = "windows-implement" name = "windows-implement"
version = "0.44.0" version = "0.44.0"
@ -6036,9 +6044,9 @@ dependencies = [
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.5.32" version = "0.5.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8434aeec7b290e8da5c3f0d628cb0eac6cabcb31d14bb74f779a08109a5914d6" checksum = "b7520bbdec7211caa7c4e682eb1fbe07abe20cee6756b6e00f537c82c11816aa"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]

View file

@ -34,6 +34,8 @@ wgpu = ["libcosmic/wgpu"]
[patch.crates-io] [patch.crates-io]
smithay-client-toolkit = { git = "https://github.com/pop-os/client-toolkit", branch = "wayland-resize" } smithay-client-toolkit = { git = "https://github.com/pop-os/client-toolkit", branch = "wayland-resize" }
# https://github.com/Byron/trash-rs/pull/95
trash = { git = "https://github.com/jackpot51/trash-rs" }
[profile.release-with-debug] [profile.release-with-debug]
inherits = "release" inherits = "release"

View file

@ -211,7 +211,7 @@ pub fn scan_path(tab_path: &PathBuf) -> Vec<Item> {
items.push(Item { items.push(Item {
name, name,
metadata_opt: Some(metadata), metadata: ItemMetadata::Path(metadata),
hidden, hidden,
path, path,
icon_handle_grid, icon_handle_grid,
@ -224,7 +224,11 @@ pub fn scan_path(tab_path: &PathBuf) -> Vec<Item> {
log::warn!("failed to read directory {:?}: {}", tab_path, err); log::warn!("failed to read directory {:?}: {}", tab_path, err);
} }
} }
items.sort_by(|a, b| lexical_sort::natural_lexical_cmp(&a.name, &b.name)); items.sort_by(|a, b| match (a.metadata.is_dir(), b.metadata.is_dir()) {
(true, false) => Ordering::Less,
(false, true) => Ordering::Greater,
_ => lexical_sort::natural_lexical_cmp(&a.name, &b.name),
});
items items
} }
@ -258,19 +262,33 @@ pub fn scan_trash() -> Vec<Item> {
match trash::os_limited::list() { match trash::os_limited::list() {
Ok(entries) => { Ok(entries) => {
for entry in entries { for entry in entries {
let metadata = match trash::os_limited::metadata(&entry) {
Ok(ok) => ok,
Err(err) => {
log::warn!("failed to get metadata for trash item {:?}: {}", entry, err);
continue;
}
};
let path = entry.original_path(); let path = entry.original_path();
let name = entry.name; let name = entry.name;
//TODO: configurable size //TODO: configurable size
let (icon_handle_grid, icon_handle_list) = ( let (icon_handle_grid, icon_handle_list) = if metadata.is_dir {
mime_icon(&path, ICON_SIZE_GRID), (
mime_icon(&path, ICON_SIZE_LIST), folder_icon(&path, ICON_SIZE_GRID),
); folder_icon(&path, ICON_SIZE_LIST),
)
} else {
(
mime_icon(&path, ICON_SIZE_GRID),
mime_icon(&path, ICON_SIZE_LIST),
)
};
items.push(Item { items.push(Item {
name, name,
//TODO: how will we get proper info on if this is a file or directory? metadata: ItemMetadata::Trash(metadata),
metadata_opt: None,
hidden: false, hidden: false,
path, path,
icon_handle_grid, icon_handle_grid,
@ -283,7 +301,7 @@ pub fn scan_trash() -> Vec<Item> {
log::warn!("failed to read trash items: {}", err); log::warn!("failed to read trash items: {}", err);
} }
} }
items.sort_by(|a, b| match (a.is_dir(), b.is_dir()) { items.sort_by(|a, b| match (a.metadata.is_dir(), b.metadata.is_dir()) {
(true, false) => Ordering::Less, (true, false) => Ordering::Less,
(false, true) => Ordering::Greater, (false, true) => Ordering::Greater,
_ => lexical_sort::natural_lexical_cmp(&a.name, &b.name), _ => lexical_sort::natural_lexical_cmp(&a.name, &b.name),
@ -315,10 +333,25 @@ pub enum Message {
View(View), View(View),
} }
#[derive(Clone, Debug)]
pub enum ItemMetadata {
Path(Metadata),
Trash(trash::TrashItemMetadata),
}
impl ItemMetadata {
pub fn is_dir(&self) -> bool {
match self {
Self::Path(metadata) => metadata.is_dir(),
Self::Trash(metadata) => metadata.is_dir,
}
}
}
#[derive(Clone)] #[derive(Clone)]
pub struct Item { pub struct Item {
pub name: String, pub name: String,
pub metadata_opt: Option<Metadata>, pub metadata: ItemMetadata,
pub hidden: bool, pub hidden: bool,
pub path: PathBuf, pub path: PathBuf,
pub icon_handle_grid: widget::icon::Handle, pub icon_handle_grid: widget::icon::Handle,
@ -327,10 +360,6 @@ pub struct Item {
} }
impl Item { impl Item {
pub fn is_dir(&self) -> bool {
self.metadata_opt.as_ref().map_or(false, |x| x.is_dir())
}
pub fn property_view(&self, core: &Core) -> Element<crate::Message> { pub fn property_view(&self, core: &Core) -> Element<crate::Message> {
let mut section = widget::settings::view_section(""); let mut section = widget::settings::view_section("");
section = section.add(widget::settings::item::item_row(vec![ section = section.add(widget::settings::item::item_row(vec![
@ -342,45 +371,50 @@ impl Item {
//TODO: translate! //TODO: translate!
//TODO: correct display of folder size? //TODO: correct display of folder size?
if let Some(ref metadata) = self.metadata_opt { match &self.metadata {
if !metadata.is_dir() { ItemMetadata::Path(metadata) => {
section = section.add(widget::settings::item::item( if !metadata.is_dir() {
"Size", section = section.add(widget::settings::item::item(
widget::text(format_size(metadata.len())), "Size",
)); widget::text(format_size(metadata.len())),
} ));
}
if let Ok(time) = metadata.accessed() { if let Ok(time) = metadata.accessed() {
section = section.add(widget::settings::item( section = section.add(widget::settings::item(
"Accessed", "Accessed",
widget::text( widget::text(
chrono::DateTime::<chrono::Local>::from(time) chrono::DateTime::<chrono::Local>::from(time)
.format("%c") .format("%c")
.to_string(), .to_string(),
), ),
)); ));
} }
if let Ok(time) = metadata.modified() { if let Ok(time) = metadata.modified() {
section = section.add(widget::settings::item( section = section.add(widget::settings::item(
"Modified", "Modified",
widget::text( widget::text(
chrono::DateTime::<chrono::Local>::from(time) chrono::DateTime::<chrono::Local>::from(time)
.format("%c") .format("%c")
.to_string(), .to_string(),
), ),
)); ));
} }
if let Ok(time) = metadata.created() { if let Ok(time) = metadata.created() {
section = section.add(widget::settings::item( section = section.add(widget::settings::item(
"Created", "Created",
widget::text( widget::text(
chrono::DateTime::<chrono::Local>::from(time) chrono::DateTime::<chrono::Local>::from(time)
.format("%c") .format("%c")
.to_string(), .to_string(),
), ),
)); ));
}
}
ItemMetadata::Trash(metadata) => {
//TODO: trash metadata
} }
} }
@ -392,7 +426,7 @@ impl fmt::Debug for Item {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Item") f.debug_struct("Item")
.field("name", &self.name) .field("name", &self.name)
.field("metadata_opt", &self.metadata_opt) .field("metadata", &self.metadata)
.field("hidden", &self.hidden) .field("hidden", &self.hidden)
.field("path", &self.path) .field("path", &self.path)
// icon_handles // icon_handles
@ -447,7 +481,7 @@ impl Tab {
if Some(i) == click_i_opt { if Some(i) == click_i_opt {
if let Some(select_time) = item.select_time { if let Some(select_time) = item.select_time {
if select_time.elapsed() < DOUBLE_CLICK_DURATION { if select_time.elapsed() < DOUBLE_CLICK_DURATION {
if item.is_dir() { if item.path.is_dir() {
cd = Some(Location::Path(item.path.clone())); cd = Some(Location::Path(item.path.clone()));
} else { } else {
let mut command = open_command(&item.path); let mut command = open_command(&item.path);
@ -616,13 +650,21 @@ impl Tab {
.into(), .into(),
widget::text(item.name.clone()).into(), widget::text(item.name.clone()).into(),
widget::horizontal_space(Length::Fill).into(), widget::horizontal_space(Length::Fill).into(),
widget::text(if item.is_dir() { widget::text(match &item.metadata {
"\u{2014}".to_string() ItemMetadata::Path(metadata) => {
} else { //TODO: directory entry count
if let Some(ref metadata) = item.metadata_opt { if metadata.is_dir() {
format_size(metadata.len()) "\u{2014}".to_string()
} else { } else {
"\u{2014}".to_string() format_size(metadata.len())
}
}
ItemMetadata::Trash(metadata) => {
if metadata.is_dir {
format!("{} items", metadata.size)
} else {
format_size(metadata.size)
}
} }
}) })
.into(), .into(),