mirror of
https://github.com/danbulant/cushy
synced 2026-05-19 04:08:38 +00:00
120 lines
3.4 KiB
Rust
120 lines
3.4 KiB
Rust
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<MenuOptions> {
|
|
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();
|
|
});
|
|
}
|