freya_components/
integration.rs1use 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}