Merge pull request #864 from jasonrhansen/context-menu-fixes
Context menu fixes
This commit is contained in:
commit
f82aeafcab
2 changed files with 62 additions and 19 deletions
77
src/app.rs
77
src/app.rs
|
|
@ -50,7 +50,8 @@ use slotmap::Key as SlotMapKey;
|
||||||
use std::{
|
use std::{
|
||||||
any::TypeId,
|
any::TypeId,
|
||||||
collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque},
|
collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque},
|
||||||
env, fmt, fs, io,
|
env,
|
||||||
|
fmt, fs, io,
|
||||||
num::NonZeroU16,
|
num::NonZeroU16,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
process,
|
process,
|
||||||
|
|
@ -1765,11 +1766,13 @@ impl Application for App {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
items.push(cosmic::widget::menu::Item::Divider);
|
items.push(cosmic::widget::menu::Item::Divider);
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
if matches!(location_opt, Some(Location::Path(..))) {
|
||||||
fl!("show-details"),
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
None,
|
fl!("show-details"),
|
||||||
NavMenuAction::Preview(entity),
|
None,
|
||||||
));
|
NavMenuAction::Preview(entity),
|
||||||
|
));
|
||||||
|
}
|
||||||
items.push(cosmic::widget::menu::Item::Divider);
|
items.push(cosmic::widget::menu::Item::Divider);
|
||||||
if favorite_index_opt.is_some() {
|
if favorite_index_opt.is_some() {
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
|
|
@ -1779,11 +1782,13 @@ impl Application for App {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if matches!(location_opt, Some(Location::Trash)) {
|
if matches!(location_opt, Some(Location::Trash)) {
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
if tab::trash_entries() > 0 {
|
||||||
fl!("empty-trash"),
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
None,
|
fl!("empty-trash"),
|
||||||
NavMenuAction::EmptyTrash,
|
None,
|
||||||
));
|
NavMenuAction::EmptyTrash,
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(cosmic::widget::menu::items(&HashMap::new(), items))
|
Some(cosmic::widget::menu::items(&HashMap::new(), items))
|
||||||
|
|
@ -3462,9 +3467,19 @@ impl Application for App {
|
||||||
}
|
}
|
||||||
NavMenuAction::OpenInNewTab(entity) => {
|
NavMenuAction::OpenInNewTab(entity) => {
|
||||||
match self.nav_model.data::<Location>(entity) {
|
match self.nav_model.data::<Location>(entity) {
|
||||||
|
Some(Location::Network(ref uri, ref display_name)) => {
|
||||||
|
return self.open_tab(
|
||||||
|
Location::Network(uri.clone(), display_name.clone()),
|
||||||
|
false,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
}
|
||||||
Some(Location::Path(ref path)) => {
|
Some(Location::Path(ref path)) => {
|
||||||
return self.open_tab(Location::Path(path.clone()), false, None);
|
return self.open_tab(Location::Path(path.clone()), false, None);
|
||||||
}
|
}
|
||||||
|
Some(Location::Recents) => {
|
||||||
|
return self.open_tab(Location::Recents, false, None);
|
||||||
|
}
|
||||||
Some(Location::Trash) => {
|
Some(Location::Trash) => {
|
||||||
return self.open_tab(Location::Trash, false, None);
|
return self.open_tab(Location::Trash, false, None);
|
||||||
}
|
}
|
||||||
|
|
@ -3473,15 +3488,39 @@ impl Application for App {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the selected path in a new cosmic-files window.
|
// Open the selected path in a new cosmic-files window.
|
||||||
NavMenuAction::OpenInNewWindow(entity) => {
|
NavMenuAction::OpenInNewWindow(entity) => 'open_in_new_window: {
|
||||||
if let Some(Location::Path(path)) = self.nav_model.data::<Location>(entity) {
|
if let Some(location) = self.nav_model.data::<Location>(entity) {
|
||||||
match env::current_exe() {
|
match env::current_exe() {
|
||||||
Ok(exe) => match process::Command::new(&exe).arg(path).spawn() {
|
Ok(exe) => {
|
||||||
Ok(_child) => {}
|
let mut command = process::Command::new(&exe);
|
||||||
Err(err) => {
|
match location {
|
||||||
log::error!("failed to execute {:?}: {}", exe, err);
|
Location::Path(path) => {
|
||||||
}
|
command.arg(path);
|
||||||
},
|
}
|
||||||
|
Location::Trash => {
|
||||||
|
command.arg("--trash");
|
||||||
|
}
|
||||||
|
Location::Network(..) => {
|
||||||
|
command.arg("--network");
|
||||||
|
}
|
||||||
|
Location::Recents => {
|
||||||
|
command.arg("--recents");
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
log::error!(
|
||||||
|
"unsupported location for open in new window: {:?}",
|
||||||
|
location
|
||||||
|
);
|
||||||
|
break 'open_in_new_window;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match command.spawn() {
|
||||||
|
Ok(_child) => {}
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("failed to execute {:?}: {}", exe, err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("failed to get current executable path: {}", err);
|
log::error!("failed to get current executable path: {}", err);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,10 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
continue;
|
continue;
|
||||||
} else if &arg == "--trash" {
|
} else if &arg == "--trash" {
|
||||||
Location::Trash
|
Location::Trash
|
||||||
|
} else if &arg == "--recents" {
|
||||||
|
Location::Recents
|
||||||
|
} else if &arg == "--network" {
|
||||||
|
Location::Network("network:///".to_string(), fl!("networks"))
|
||||||
} else {
|
} else {
|
||||||
//TODO: support more URLs
|
//TODO: support more URLs
|
||||||
let path = match url::Url::parse(&arg) {
|
let path = match url::Url::parse(&arg) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue