iced_aw/widget/menu.rs
1#![allow(clippy::doc_markdown)]
2
3//! A [`MenuBar`] widget for displaying menu trees created with [`Item`]s and [`Menu`]s
4//!
5//! *This API requires the following crate features to be activated: `menu`*
6//!
7//! ## Example 1
8//!
9//! ```ignore
10//! use iced_widget::button;
11//! use iced_aw::menu::{Item, Menu, MenuBar};
12//!
13//! let sub_2 = Item::with_menu(
14//! button("Sub Menu 2"),
15//! Menu::new([
16//! Item::new(button("item_1")),
17//! Item::new(button("item_2")),
18//! Item::new(button("item_3")),
19//! ].into())
20//! );
21//!
22//! let sub_1 = Item::with_menu(
23//! button("Sub Menu 1"),
24//! Menu::new([
25//! Item::new(button("item_1")),
26//! sub_2,
27//! Item::new(button("item_2")),
28//! Item::new(button("item_3")),
29//! ].into())
30//! );
31//!
32//! let root_1 = Item::with_menu(
33//! button("Menu 1"),
34//! Menu::new([
35//! Item::new(button("item_1")),
36//! Item::new(button("item_2")),
37//! sub_1,
38//! Item::new(button("item_3")),
39//! ].into())
40//! );
41//!
42//! let root_2 = Item::with_menu(
43//! button("Menu 2"),
44//! Menu::new([
45//! Item::new(button("item_1")),
46//! Item::new(button("item_2")),
47//! Item::new(button("item_3")),
48//! ].into())
49//! );
50//!
51//! let menu_bar = MenuBar::new(vec![root_1, root_2]);
52//!
53//! ```
54//!
55//! Alterwidgetly you can use the helper macros
56//!
57//! ## Example 2
58//! ```
59//! use iced_widget::button;
60//! use iced_aw::menu::{Menu, Item, MenuBar};
61//! use iced_aw::{menu_bar, menu_items};
62//!
63//! let menu_template = |items| Menu::new(items).max_width(180.0).offset(6.0);
64//!
65//! let menu_bar: MenuBar<'_, (), iced_widget::Theme, iced::Renderer> = menu_bar!(
66//! (button("Menu 1"),menu_template(menu_items!(
67//! (button("item_1"))
68//! (button("item_2"))
69//! (button("Sub Menu 1"), menu_template(menu_items!(
70//! (button("item_1"))
71//! (button("Sub Menu 2"), menu_template(menu_items!(
72//! (button("item_1"))
73//! (button("item_2"))
74//! (button("item_3"))
75//! )))
76//! (button("item_2"))
77//! (button("item_3"))
78//! )))
79//! (button("item_3"))
80//! )))
81//! (button("Menu 2"), menu_template(menu_items!(
82//! (button("item_1"))
83//! (button("item_2"))
84//! (button("item_3"))
85//! )))
86//! );
87//! ```
88//!
89//! Here a menu_template function/closure is used in example 2,
90//! usually some properties are sync across all menus while others are not,
91//! using template functions can reduce the repeated code.
92//! If you find writing menu_template(menu_items!()) too cumbersome,
93//! there's a menu! macro you can use to create template macros
94//!
95//! ## Example 3
96//!
97//! ```
98//! use iced_widget::button;
99//! use iced_aw::{menu, Menu};
100//!
101//! macro_rules! menu_template {
102//! ($($x:tt)+) => {
103//! menu!($($x)+).max_width(180.0).offset(6.0)
104//! };
105//! }
106//!
107//! // then you can just write
108//! let m: Menu<'_, (), iced_widget::Theme, iced::Renderer> = menu_template!(
109//! (button("item_1"))
110//! (button("item_2"))
111//! (button("sub menu"), menu_template!(
112//! (button("item_1"))
113//! (button("item_2"))
114//! ))
115//! (button("item_3"))
116//! );
117//! ```
118//!
119//! Technically you can create menu template functions with the menu! macro,
120//! but turns out closures can't infer the proper generic types in this case,
121//! and creating a function for it you have to write a bunch of generic annotations
122//!
123//! ## Example 4
124//!
125//! ```
126//! use iced_aw::{menu, Menu};
127//! use iced_widget::button;
128//!
129//! fn menu_template<'a, Message, Theme, Renderer>(
130//! menu: Menu<'a, Message, Theme, Renderer>
131//! ) -> Menu<'a, Message, Theme, Renderer>
132//! where
133//! Theme: iced_aw::menu::Catalog,
134//! Renderer: iced_core::Renderer,
135//! {
136//! menu.max_width(180.0).offset(6.0)
137//! }
138//!
139//! let m: Menu<'_, (), iced_widget::Theme, iced::Renderer> = menu_template(menu!(
140//! (button("item_1"))
141//! (button("item_2"))
142//! (button("item_3"))
143//! ));
144//! ```
145//!
146//! For a more detailed example please
147//! take a look at the menu example in the iced_aw repo
148//!
149
150mod common;
151mod flex;
152mod menu_bar;
153mod menu_bar_overlay;
154mod menu_tree;
155
156pub use crate::style::menu_bar::{Catalog, Style, primary};
157pub use common::{DrawPath, ScrollSpeed};
158pub use menu_bar::MenuBar;
159pub use menu_tree::{Item, Menu};