From 47cfdc37183a8ccd8e9bdfef193f2696fb049686 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 27 Sep 2024 09:15:32 -0600 Subject: [PATCH] Disable menu items when not available, fixes #185 --- Cargo.lock | 108 ++++++++++++++++++++++++++-------------------------- src/menu.rs | 47 ++++++++++++++++++----- 2 files changed, 92 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ae9078f..ebed273 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -573,9 +573,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -913,9 +913,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" dependencies = [ "jobserver", "libc", @@ -1212,7 +1212,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1231,7 +1231,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "quote", "syn 1.0.109", @@ -1340,7 +1340,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "almost", "cosmic-config", @@ -1928,9 +1928,9 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] @@ -1966,9 +1966,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -2382,9 +2382,9 @@ checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "gio" -version = "0.20.1" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcacaa37401cad0a95aadd266bc39c72a131d454fc012f6dfd217f891d76cc52" +checksum = "b8d999e8fb09583e96080867e364bc1e701284ad206c76a5af480d63833ad43c" dependencies = [ "futures-channel", "futures-core", @@ -2399,9 +2399,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.20.1" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5237611e97e9b86ab5768adc3eef853ae713ea797aa3835404acdfacffc9fb38" +checksum = "4f7efc368de04755344f0084104835b6bb71df2c1d41e37d863947392a894779" dependencies = [ "glib-sys", "gobject-sys", @@ -2429,9 +2429,9 @@ checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" [[package]] name = "glib" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95648aac01b75503000bb3bcaa5ec7a7a2dd61e43636b8b1814854de94dd80e4" +checksum = "adcf1ec6d3650bf9fdbc6cee242d4fcebc6f6bfd9bea5b929b6a8b7344eb85ff" dependencies = [ "bitflags 2.6.0", "futures-channel", @@ -2450,9 +2450,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302f1d633c9cdef4350330e7b68fd8016e2834bb106c93fdf9789fcde753c1ab" +checksum = "a6bf88f70cd5720a6197639dcabcb378dd528d0cb68cb1f45e3b358bcb841cd7" dependencies = [ "heck 0.5.0", "proc-macro-crate 3.2.0", @@ -2463,9 +2463,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.20.2" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92eee4531c1c9abba945d19378b205031b5890e1f99c319ba0503b6e0c06a163" +checksum = "5f9eca5d88cfa6a453b00d203287c34a2b7cac3a7831779aa2bb0b3c7233752b" dependencies = [ "libc", "system-deps", @@ -2524,9 +2524,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.20.1" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3d1dcd8a1eb2e7c22be3d5e792b14b186f3524f79b25631730f9a8c169d49a" +checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" dependencies = [ "glib-sys", "libc", @@ -2783,7 +2783,7 @@ dependencies = [ [[package]] name = "iced" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "dnd", "iced_accessibility", @@ -2802,7 +2802,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "accesskit", "accesskit_unix", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "bitflags 2.6.0", "dnd", @@ -2834,7 +2834,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "futures", "iced_core", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "bitflags 2.6.0", "bytemuck", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2883,7 +2883,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "dnd", "iced_accessibility", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "iced_sctk" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "enum-repr", "float-cmp", @@ -2924,7 +2924,7 @@ dependencies = [ [[package]] name = "iced_style" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "iced_core", "once_cell", @@ -2934,7 +2934,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "bytemuck", "cosmic-text", @@ -2951,7 +2951,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "as-raw-xcb-connection", "bitflags 2.6.0", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "dnd", "iced_accessibility", @@ -2998,7 +2998,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.12.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "dnd", "iced_accessibility", @@ -3514,7 +3514,7 @@ checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#701638009df09a254b7d077ddc4d1076cd87a147" +source = "git+https://github.com/pop-os/libcosmic.git#cf6a35474e7f3b02032b56db1e3035040a93e1ef" dependencies = [ "apply", "ashpd 0.9.1", @@ -3622,7 +3622,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.5.4", + "redox_syscall 0.5.6", ] [[package]] @@ -4457,7 +4457,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.4", + "redox_syscall 0.5.6", "smallvec", "windows-targets 0.52.6", ] @@ -4654,7 +4654,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] @@ -4868,9 +4868,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" dependencies = [ "bitflags 2.6.0", ] @@ -5232,9 +5232,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -5615,9 +5615,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" dependencies = [ "filetime", "libc", @@ -5896,7 +5896,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] @@ -5921,15 +5921,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.21" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow 0.6.20", ] [[package]] @@ -7136,9 +7136,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] diff --git a/src/menu.rs b/src/menu.rs index 9b17419..46c54f8 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -368,6 +368,31 @@ pub fn menu_bar<'a>( }; let in_trash = tab_opt.map_or(false, |tab| tab.location == Location::Trash); + let mut selected_dir = 0; + let mut selected = 0; + tab_opt.and_then(|tab| tab.items_opt()).map(|items| { + for item in items.iter() { + if item.selected { + selected += 1; + if item.metadata.is_dir() { + selected_dir += 1; + } + } + } + }); + + fn menu_button_optional( + label: String, + action: Action, + enabled: bool, + ) -> menu::Item { + if enabled { + menu::Item::Button(label, action) + } else { + menu::Item::ButtonDisabled(label, action) + } + } + MenuBar::new(vec![ menu::Tree::with_children( menu::root(fl!("file")), @@ -378,16 +403,20 @@ pub fn menu_bar<'a>( menu::Item::Button(fl!("new-window"), Action::WindowNew), menu::Item::Button(fl!("new-folder"), Action::NewFolder), menu::Item::Button(fl!("new-file"), Action::NewFile), - menu::Item::Button(fl!("open"), Action::Open), - menu::Item::Button(fl!("open-with"), Action::OpenWith), + menu_button_optional( + fl!("open"), + Action::Open, + (selected > 0 && selected_dir == 0) || (selected_dir == 1 && selected == 1), + ), + menu_button_optional(fl!("open-with"), Action::OpenWith, selected == 1), menu::Item::Divider, - menu::Item::Button(fl!("rename"), Action::Rename), + menu_button_optional(fl!("rename"), Action::Rename, selected > 0), menu::Item::Divider, - menu::Item::Button(fl!("menu-show-details"), Action::Preview), + menu_button_optional(fl!("menu-show-details"), Action::Preview, selected > 0), menu::Item::Divider, - menu::Item::Button(fl!("add-to-sidebar"), Action::AddToSidebar), + menu_button_optional(fl!("add-to-sidebar"), Action::AddToSidebar, selected > 0), menu::Item::Divider, - menu::Item::Button(fl!("move-to-trash"), Action::MoveToTrash), + menu_button_optional(fl!("move-to-trash"), Action::MoveToTrash, selected > 0), menu::Item::Divider, menu::Item::Button(fl!("close-tab"), Action::TabClose), menu::Item::Button(fl!("quit"), Action::WindowClose), @@ -399,9 +428,9 @@ pub fn menu_bar<'a>( menu::items( key_binds, vec![ - menu::Item::Button(fl!("cut"), Action::Cut), - menu::Item::Button(fl!("copy"), Action::Copy), - menu::Item::Button(fl!("paste"), Action::Paste), + menu_button_optional(fl!("cut"), Action::Cut, selected > 0), + menu_button_optional(fl!("copy"), Action::Copy, selected > 0), + menu_button_optional(fl!("paste"), Action::Paste, selected > 0), menu::Item::Button(fl!("select-all"), Action::SelectAll), menu::Item::Divider, menu::Item::Button(fl!("history"), Action::EditHistory),