chore: update for navbar popup

This commit is contained in:
Ashley Wulber 2026-06-12 14:29:48 -04:00
parent 0e761ba811
commit e00725a450

View file

@ -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> {