1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use crate::menu::create_menu_item;
use fyrox::{
    animation::machine::{Machine, MachineLayer},
    core::pool::Handle,
    gui::{menu::MenuItemMessage, message::UiMessage, BuildContext, UiNode},
    scene::{
        animation::{absm::AnimationBlendingStateMachineBuilder, AnimationPlayerBuilder},
        base::BaseBuilder,
        node::Node,
    },
};

pub struct AnimationMenu {
    pub menu: Handle<UiNode>,
    create_animation_player: Handle<UiNode>,
    create_absm: Handle<UiNode>,
}

impl AnimationMenu {
    pub fn new(ctx: &mut BuildContext) -> Self {
        let create_animation_player;
        let create_absm;

        let menu = create_menu_item(
            "Animation",
            vec![
                {
                    create_animation_player = create_menu_item("Animation Player", vec![], ctx);
                    create_animation_player
                },
                {
                    create_absm = create_menu_item("Animation Blending State Machine", vec![], ctx);
                    create_absm
                },
            ],
            ctx,
        );

        Self {
            menu,
            create_animation_player,
            create_absm,
        }
    }

    pub fn handle_ui_message(&mut self, message: &UiMessage) -> Option<Node> {
        if let Some(MenuItemMessage::Click) = message.data::<MenuItemMessage>() {
            if message.destination() == self.create_animation_player {
                let node =
                    AnimationPlayerBuilder::new(BaseBuilder::new().with_name("Animation Player"))
                        .build_node();
                Some(node)
            } else if message.destination() == self.create_absm {
                let mut machine = Machine::default();

                let mut layer = MachineLayer::new();
                layer.set_name("Base Layer");

                machine.add_layer(layer);

                let node = AnimationBlendingStateMachineBuilder::new(
                    BaseBuilder::new().with_name("Animation Blending State Machine"),
                )
                .with_machine(machine)
                .build_node();
                Some(node)
            } else {
                None
            }
        } else {
            None
        }
    }
}