freya_components/
context_menu.rs

1use 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}