freya_components/
context_menu.rs1use freya_core::{
2 integration::ScopeId,
3 prelude::*,
4};
5use torin::prelude::CursorPoint;
6
7use crate::menu::Menu;
8
9#[derive(Clone, Copy, PartialEq)]
10pub struct ContextMenu {
11 pub(crate) location: State<CursorPoint>,
12 pub(crate) menu: State<Option<(CursorPoint, Menu)>>,
13}
14
15impl ContextMenu {
16 pub fn get() -> Self {
17 match try_consume_root_context() {
18 Some(rt) => rt,
19 None => {
20 let context_menu_state = ContextMenu {
21 location: State::create_in_scope(CursorPoint::default(), ScopeId::ROOT),
22 menu: State::create_in_scope(None, ScopeId::ROOT),
23 };
24 provide_context_for_scope_id(context_menu_state, ScopeId::ROOT);
25 context_menu_state
26 }
27 }
28 }
29
30 pub fn is_open() -> bool {
31 Self::get().menu.read().is_some()
32 }
33
34 pub fn open(menu: Menu) {
35 let mut this = Self::get();
36 this.menu.set(Some(((this.location)(), menu)));
37 }
38
39 pub fn close() {
40 Self::get().menu.set(None);
41 }
42}