Nav Bar

COSMIC's Nav Bar is a common element found in most applications with navigatable interfaces. The cosmic::Application trait comes with some predefined methods that can be optionally set to enable integration with the Nav Bar with minimal setup.

First, it is necessary to add the nav_bar::Model to your application's model.

struct AppModel { /// A model that contains all of the pages assigned to the nav bar panel. nav: nav_bar::Model, }

The nav bar can then be enabled by implementing these methods in your cosmic::Application trait.

/// Enable the nav bar to appear in your application when `Some`. fn nav_model(&self) -> Option<&nav_bar::Model> { Some(&self.nav) } /// Activate the nav item when selected. fn on_nav_select(&mut self, id: nav_bar::Id) -> Command<Self::Message> { // Activate the page in the model. self.nav.activate(id); }

Items can be added and modified from the init or update methods.

fn init(core: Core, _flags: Self::Flags) -> (Self, Command<Self::Message>) { let mut nav = nav_bar::Model::default(); nav.insert() .text("Page 1") .data::<Page>(Page::Page1) .icon(icon::from_name("applications-science-symbolic")) .activate(); nav.insert() .text("Page 2") .data::<Page>(Page::Page2) .icon(icon::from_name("applications-system-symbolic")); nav.insert() .text("Page 3") .data::<Page>(Page::Page3) .icon(icon::from_name("applications-games-symbolic")); let mut app = YourApp { core, nav, }; (app, Command::none()) }

Each item in the model can hold any number of custom data types, which can be fetched by their type.

if let Some(page) = self.nav.data::<Page>().copied() { eprintln!("the current page is {page}"); }