use cushy::widget::MakeWidget; use cushy::widgets::layers::{OverlayLayer, Overlayable}; use cushy::widgets::menu::{Menu, MenuItem}; use cushy::Run; #[derive(Clone, Copy, Debug)] enum MenuOptions { First, Second, Third, } fn menu_example() -> impl MakeWidget { let overlay = OverlayLayer::default(); "Click Me" .into_button() .on_click({ let overlay = overlay.clone(); move |click| { if let Some(click) = click { menu(true) .overlay_in(&overlay) .at(click.window_location) .show(); } } }) .centered() .expand() .and(overlay) .into_layers() } fn main() -> cushy::Result { menu_example().run() } fn menu(top: bool) -> Menu { let mut third = MenuItem::build(MenuOptions::Third).text("Third"); if top { third = third.submenu(menu(false)); } Menu::new() .on_selected(|selected| { println!("Selected item: {selected:?}"); }) .with(MenuItem::new(MenuOptions::First, "First")) .with(MenuItem::new(MenuOptions::Second, "Second")) .with_separator() .with( MenuItem::build(MenuOptions::Second) .text("Disabled") .disabled(), ) .with_separator() .with(third) } #[test] fn runs() { use std::time::Duration; use cushy::animation::easings::{EaseInCircular, EaseInOutSine, EaseOutCircular}; use cushy::figures::{Point, Px2D}; use kludgine::app::winit::event::MouseButton; cushy::example!(menu_example, 800, 600) .prepare_with(|r| { r.set_cursor_position(Point::px(420, 270)); r.set_cursor_visible(true); r.refresh().unwrap(); }) .animated(|r| { r.animate_cursor_to( Point::px(410, 300), Duration::from_millis(500), EaseInOutSine, ) .unwrap(); r.animate_mouse_button(MouseButton::Left, Duration::from_millis(250)) .unwrap(); r.wait_for(Duration::from_millis(500)).unwrap(); r.animate_cursor_to( Point::px(430, 325), Duration::from_millis(200), EaseInCircular, ) .unwrap(); r.animate_cursor_to( Point::px(480, 480), Duration::from_millis(400), EaseOutCircular, ) .unwrap(); r.wait_for(Duration::from_millis(300)).unwrap(); r.animate_cursor_to( Point::px(620, 460), Duration::from_millis(600), EaseInOutSine, ) .unwrap(); r.animate_cursor_to( Point::px(460, 340), Duration::from_millis(800), EaseInOutSine, ) .unwrap(); r.animate_mouse_button(MouseButton::Left, Duration::from_millis(250)) .unwrap(); r.wait_for(Duration::from_millis(500)).unwrap(); r.animate_cursor_to( Point::px(420, 270), Duration::from_millis(500), EaseInOutSine, ) .unwrap(); r.wait_for(Duration::from_millis(500)).unwrap(); }); }