Show toast on moving to trash

This commit is contained in:
Jeremy Soller 2024-07-11 14:11:43 -06:00
parent 45711e1734
commit 5c82e72c80
No known key found for this signature in database
GPG key ID: D02FD439211AF56F
4 changed files with 67 additions and 21 deletions

38
Cargo.lock generated
View file

@ -1132,7 +1132,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"atomicwrites", "atomicwrites",
"cosmic-config-derive", "cosmic-config-derive",
@ -1151,7 +1151,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"quote", "quote",
"syn 1.0.109", "syn 1.0.109",
@ -1240,7 +1240,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"almost", "almost",
"cosmic-config", "cosmic-config",
@ -2655,7 +2655,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -2674,7 +2674,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"accesskit_unix", "accesskit_unix",
@ -2684,7 +2684,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"dnd", "dnd",
@ -2706,7 +2706,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@ -2719,7 +2719,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"bytemuck", "bytemuck",
@ -2743,7 +2743,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@ -2755,7 +2755,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -2769,7 +2769,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_sctk" name = "iced_sctk"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"enum-repr", "enum-repr",
"float-cmp", "float-cmp",
@ -2796,7 +2796,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"iced_core", "iced_core",
"once_cell", "once_cell",
@ -2806,7 +2806,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text", "cosmic-text",
@ -2823,7 +2823,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"bytemuck", "bytemuck",
@ -2849,7 +2849,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -2867,7 +2867,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#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -3615,7 +3615,7 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]] [[package]]
name = "libcosmic" name = "libcosmic"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic.git#c9a2265ab192af4d1270e96b0d73cb06163ece96" source = "git+https://github.com/pop-os/libcosmic.git#1e566c13aaa86a48695876a8badda38c8b828596"
dependencies = [ dependencies = [
"apply", "apply",
"ashpd", "ashpd",
@ -4328,9 +4328,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]] [[package]]
name = "open" name = "open"
version = "5.2.0" version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d2c909a3fce3bd80efef4cd1c6c056bd9376a8fe06fcfdbebaf32cb485a7e37" checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3"
dependencies = [ dependencies = [
"is-wsl", "is-wsl",
"libc", "libc",

View file

@ -65,6 +65,12 @@ pending = Pending
failed = Failed failed = Failed
complete = Complete complete = Complete
copy_noun = Copy copy_noun = Copy
moved-to-trash =
{$items ->
[one] 1 item has been moved to {trash}.
*[other] {$items} items have been moved to {trash}.
}
undo = Undo
## Open with ## Open with
open-with = Open with open-with = Open with

View file

@ -249,7 +249,9 @@ pub enum Message {
TabMessage(Option<Entity>, tab::Message), TabMessage(Option<Entity>, tab::Message),
TabNew, TabNew,
TabRescan(Entity, Location, Vec<tab::Item>), TabRescan(Entity, Location, Vec<tab::Item>),
Toast(widget::toaster::ToastMessage),
ToggleContextPage(ContextPage), ToggleContextPage(ContextPage),
Undo(u64),
WindowClose, WindowClose,
WindowNew, WindowNew,
DndHoverLocTimeout(Location), DndHoverLocTimeout(Location),
@ -262,6 +264,12 @@ pub enum Message {
DndDropNav(Entity, Option<ClipboardPaste>, DndAction), DndDropNav(Entity, Option<ClipboardPaste>, DndAction),
} }
impl From<widget::toaster::ToastMessage> for Message {
fn from(toast_message: widget::toaster::ToastMessage) -> Self {
Self::Toast(toast_message)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ContextPage { pub enum ContextPage {
About, About,
@ -359,6 +367,7 @@ pub struct App {
search_active: bool, search_active: bool,
search_id: widget::Id, search_id: widget::Id,
search_input: String, search_input: String,
toasts: widget::toaster::Toasts<Message>,
watcher_opt: Option<(Debouncer<RecommendedWatcher, FileIdMap>, HashSet<PathBuf>)>, watcher_opt: Option<(Debouncer<RecommendedWatcher, FileIdMap>, HashSet<PathBuf>)>,
nav_dnd_hover: Option<(Location, Instant)>, nav_dnd_hover: Option<(Location, Instant)>,
tab_dnd_hover: Option<(Entity, Instant)>, tab_dnd_hover: Option<(Entity, Instant)>,
@ -980,6 +989,7 @@ impl Application for App {
search_active: false, search_active: false,
search_id: widget::Id::unique(), search_id: widget::Id::unique(),
search_input: String::new(), search_input: String::new(),
toasts: widget::toaster::Toasts::default(),
watcher_opt: None, watcher_opt: None,
nav_dnd_hover: None, nav_dnd_hover: None,
tab_dnd_hover: None, tab_dnd_hover: None,
@ -1530,11 +1540,27 @@ impl Application for App {
} }
} }
Message::PendingComplete(id) => { Message::PendingComplete(id) => {
let mut commands = Vec::with_capacity(2);
if let Some((op, _)) = self.pending_operations.remove(&id) { if let Some((op, _)) = self.pending_operations.remove(&id) {
if let Some(description) = op.toast() {
commands.push(
self.toasts.push(
widget::toaster::Toast::new(description)
/*TODO
.action(widget::toaster::ToastAction {
description: fl!("undo"),
message: Message::Undo(id),
})
*/
.duration(widget::toaster::ToastDuration::Long),
),
);
}
self.complete_operations.insert(id, op); self.complete_operations.insert(id, op);
} }
// Manually rescan any trash tabs after any operation is completed // Manually rescan any trash tabs after any operation is completed
return self.rescan_trash(); commands.push(self.rescan_trash());
return Command::batch(commands);
} }
Message::PendingError(id, err) => { Message::PendingError(id, err) => {
if let Some((op, _)) = self.pending_operations.remove(&id) { if let Some((op, _)) = self.pending_operations.remove(&id) {
@ -1869,6 +1895,9 @@ impl Application for App {
} }
} }
//TODO: TABRELOAD //TODO: TABRELOAD
Message::Toast(toast_message) => {
self.toasts.handle_message(&toast_message);
}
Message::ToggleContextPage(context_page) => { Message::ToggleContextPage(context_page) => {
//TODO: ensure context menus are closed //TODO: ensure context menus are closed
if self.context_page == context_page { if self.context_page == context_page {
@ -1879,6 +1908,9 @@ impl Application for App {
} }
self.set_context_title(context_page.title()); self.set_context_title(context_page.title());
} }
Message::Undo(id) => {
log::error!("TODO: Undo {id}");
}
Message::WindowClose => { Message::WindowClose => {
return window::close(window::Id::MAIN); return window::close(window::Id::MAIN);
} }
@ -2376,7 +2408,7 @@ impl Application for App {
} }
} }
let content: Element<_> = tab_column.into(); let content: Element<_> = widget::toaster::toaster(&self.toasts, tab_column).into();
// Uncomment to debug layout: // Uncomment to debug layout:
//content.explain(cosmic::iced::Color::WHITE) //content.explain(cosmic::iced::Color::WHITE)

View file

@ -198,6 +198,14 @@ fn copy_unique_path(from: &Path, to: &Path) -> PathBuf {
} }
impl Operation { impl Operation {
pub fn toast(&self) -> Option<String> {
match self {
Self::Delete { paths } => Some(fl!("moved-to-trash", items = paths.len())),
//TODO: more toasts
_ => None,
}
}
/// Perform the operation /// Perform the operation
pub async fn perform( pub async fn perform(
self, self,