chore: update for navbar popup
This commit is contained in:
parent
0e761ba811
commit
e00725a450
1 changed files with 99 additions and 88 deletions
187
src/app.rs
187
src/app.rs
|
|
@ -2525,9 +2525,17 @@ impl Application for App {
|
||||||
.on_middle_press(|entity| {
|
.on_middle_press(|entity| {
|
||||||
cosmic::Action::App(Message::NavMenuAction(NavMenuAction::OpenInNewTab(entity)))
|
cosmic::Action::App(Message::NavMenuAction(NavMenuAction::OpenInNewTab(entity)))
|
||||||
})
|
})
|
||||||
.context_menu(self.nav_context_menu(self.nav_bar_context_id))
|
.context_menu(self.nav_context_menu())
|
||||||
.close_icon(icon::from_name("media-eject-symbolic").size(16).icon())
|
.close_icon(icon::from_name("media-eject-symbolic").size(16).icon());
|
||||||
.into_container();
|
|
||||||
|
#[cfg(feature = "wayland")]
|
||||||
|
{
|
||||||
|
nav = nav
|
||||||
|
.window_id_maybe(self.core().main_window_id())
|
||||||
|
.on_surface_action(|m| cosmic::Action::Cosmic(cosmic::app::Action::Surface(m)))
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut nav = nav.into_container();
|
||||||
|
|
||||||
if !self.core.is_condensed() {
|
if !self.core.is_condensed() {
|
||||||
nav = nav.max_width(280);
|
nav = nav.max_width(280);
|
||||||
|
|
@ -2538,97 +2546,100 @@ impl Application for App {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn nav_context_menu(
|
fn nav_context_menu(&self) -> Option<Vec<widget::menu::Tree<cosmic::Action<Self::Message>>>> {
|
||||||
&self,
|
let items = self.nav_model.iter().map(|entity| {
|
||||||
entity: widget::nav_bar::Id,
|
let favorite_index_opt = self.nav_model.data::<FavoriteIndex>(entity);
|
||||||
) -> Option<Vec<widget::menu::Tree<cosmic::Action<Self::Message>>>> {
|
let location_opt = self.nav_model.data::<Location>(entity);
|
||||||
let favorite_index_opt = self.nav_model.data::<FavoriteIndex>(entity);
|
|
||||||
let location_opt = self.nav_model.data::<Location>(entity);
|
|
||||||
|
|
||||||
let mut items = Vec::with_capacity(7);
|
let mut items: Vec<widget::menu::Item<NavMenuAction, String>> = Vec::with_capacity(7);
|
||||||
|
|
||||||
if location_opt
|
if location_opt
|
||||||
.and_then(Location::path_opt)
|
.and_then(Location::path_opt)
|
||||||
.is_some_and(|x| x.is_file())
|
.is_some_and(|x| x.is_file())
|
||||||
{
|
{
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
fl!("open"),
|
fl!("open"),
|
||||||
None,
|
None,
|
||||||
NavMenuAction::Open(entity),
|
NavMenuAction::Open(entity),
|
||||||
));
|
));
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
fl!("menu-open-with"),
|
fl!("menu-open-with"),
|
||||||
None,
|
None,
|
||||||
NavMenuAction::OpenWith(entity),
|
NavMenuAction::OpenWith(entity),
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
fl!("open-in-new-tab"),
|
fl!("open-in-new-tab"),
|
||||||
None,
|
None,
|
||||||
NavMenuAction::OpenInNewTab(entity),
|
NavMenuAction::OpenInNewTab(entity),
|
||||||
));
|
));
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
fl!("open-in-new-window"),
|
fl!("open-in-new-window"),
|
||||||
None,
|
None,
|
||||||
NavMenuAction::OpenInNewWindow(entity),
|
NavMenuAction::OpenInNewWindow(entity),
|
||||||
));
|
));
|
||||||
}
|
|
||||||
if let Some(path) = location_opt.and_then(Location::path_opt) {
|
|
||||||
let selected_dir = usize::from(path.is_dir());
|
|
||||||
let action_items: Vec<_> = self
|
|
||||||
.config
|
|
||||||
.context_actions
|
|
||||||
.iter()
|
|
||||||
.enumerate()
|
|
||||||
.filter(|(_, action)| action.matches_selection(1, selected_dir))
|
|
||||||
.map(|(i, action)| {
|
|
||||||
cosmic::widget::menu::Item::Button(
|
|
||||||
action.name.clone(),
|
|
||||||
None,
|
|
||||||
NavMenuAction::RunContextAction(entity, i),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
if !action_items.is_empty() {
|
|
||||||
items.push(cosmic::widget::menu::Item::Divider);
|
|
||||||
items.extend(action_items);
|
|
||||||
}
|
}
|
||||||
}
|
if let Some(path) = location_opt.and_then(Location::path_opt) {
|
||||||
items.push(cosmic::widget::menu::Item::Divider);
|
let selected_dir = usize::from(path.is_dir());
|
||||||
if matches!(location_opt, Some(Location::Path(..))) {
|
let action_items: Vec<_> = self
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
.config
|
||||||
fl!("show-details"),
|
.context_actions
|
||||||
None,
|
.iter()
|
||||||
NavMenuAction::Preview(entity),
|
.enumerate()
|
||||||
));
|
.filter(|(_, action)| action.matches_selection(1, selected_dir))
|
||||||
}
|
.map(|(i, action)| {
|
||||||
items.push(cosmic::widget::menu::Item::Divider);
|
cosmic::widget::menu::Item::Button(
|
||||||
if favorite_index_opt.is_some() {
|
action.name.clone(),
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
None,
|
||||||
fl!("remove-from-sidebar"),
|
NavMenuAction::RunContextAction(entity, i),
|
||||||
None,
|
)
|
||||||
NavMenuAction::RemoveFromSidebar(entity),
|
})
|
||||||
));
|
.collect();
|
||||||
}
|
|
||||||
|
|
||||||
if matches!(location_opt, Some(Location::Recents)) && tab::has_recents() {
|
if !action_items.is_empty() {
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Divider);
|
||||||
fl!("clear-recents-history"),
|
items.extend(action_items);
|
||||||
None,
|
}
|
||||||
NavMenuAction::ClearRecents,
|
}
|
||||||
));
|
items.push(cosmic::widget::menu::Item::Divider);
|
||||||
}
|
if matches!(location_opt, Some(Location::Path(..))) {
|
||||||
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
|
fl!("show-details"),
|
||||||
|
None,
|
||||||
|
NavMenuAction::Preview(entity),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
items.push(cosmic::widget::menu::Item::Divider);
|
||||||
|
if favorite_index_opt.is_some() {
|
||||||
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
|
fl!("remove-from-sidebar"),
|
||||||
|
None,
|
||||||
|
NavMenuAction::RemoveFromSidebar(entity),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
if matches!(location_opt, Some(Location::Trash)) && !Trash::is_empty() {
|
if matches!(location_opt, Some(Location::Recents)) && tab::has_recents() {
|
||||||
items.push(cosmic::widget::menu::Item::Button(
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
fl!("empty-trash"),
|
fl!("clear-recents-history"),
|
||||||
None,
|
None,
|
||||||
NavMenuAction::EmptyTrash,
|
NavMenuAction::ClearRecents,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(cosmic::widget::menu::items(&HashMap::new(), items))
|
if matches!(location_opt, Some(Location::Trash)) && !Trash::is_empty() {
|
||||||
|
items.push(cosmic::widget::menu::Item::Button(
|
||||||
|
fl!("empty-trash"),
|
||||||
|
None,
|
||||||
|
NavMenuAction::EmptyTrash,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
items
|
||||||
|
});
|
||||||
|
|
||||||
|
Some(cosmic::widget::menu::nav_context(
|
||||||
|
&HashMap::new(),
|
||||||
|
items.collect(),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn nav_model(&self) -> Option<&segmented_button::SingleSelectModel> {
|
fn nav_model(&self) -> Option<&segmented_button::SingleSelectModel> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue