freya_components/
integration.rs

1use freya_core::{
2    element::FpRender,
3    layers::Layer,
4    prelude::*,
5};
6use torin::prelude::Position;
7
8use crate::context_menu::ContextMenu;
9
10pub fn integration(app: FpRender) -> impl IntoElement {
11    let platform = use_hook(Platform::get);
12    let mut context = use_hook(ContextMenu::get);
13
14    let on_global_key_down = move |e: Event<KeyboardEventData>| match e.key {
15        Key::Tab if e.modifiers.contains(Modifiers::SHIFT) => {
16            platform.send(UserEvent::FocusAccessibilityNode(
17                AccessibilityFocusStrategy::Backward(AccessibilityFocusMovement::OutsideGroup),
18            ));
19        }
20        Key::Tab => {
21            platform.send(UserEvent::FocusAccessibilityNode(
22                AccessibilityFocusStrategy::Forward(AccessibilityFocusMovement::OutsideGroup),
23            ));
24        }
25        Key::ArrowUp => {
26            platform.send(UserEvent::FocusAccessibilityNode(
27                AccessibilityFocusStrategy::Backward(AccessibilityFocusMovement::InsideGroup),
28            ));
29        }
30        Key::ArrowDown => {
31            platform.send(UserEvent::FocusAccessibilityNode(
32                AccessibilityFocusStrategy::Forward(AccessibilityFocusMovement::InsideGroup),
33            ));
34        }
35        _ => {}
36    };
37
38    let on_global_mouse_move = move |e: Event<MouseEventData>| {
39        context.location.set(e.global_location);
40    };
41
42    rect()
43        .on_global_mouse_move(on_global_mouse_move)
44        .on_global_key_down(on_global_key_down)
45        .child(app)
46        .maybe_child(context.menu.read().clone().map(|(location, menu)| {
47            let location = location.to_f32();
48            rect()
49                .layer(Layer::Overlay)
50                .position(Position::new_global().left(location.x).top(location.y))
51                .child(menu.on_close(move |_| context.menu.set(None)))
52        }))
53}