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};