-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Ability to pass data / control state of context_menu
#4162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
context_menu
emilk
added a commit
that referenced
this issue
May 31, 2024
Sometimes we need to fix the current state of the application in the moment when you open the context menu, to save it, and to use it during creation of context menu and response handling. Making some structs, related with menu creating, allow us to create functions for this cases. For example, ```rust pub fn context_menu_custom<'a, T>( response: &Response, //variable for fixing state in the moment when you open context menu state: &mut T, //function which allow to get some king of state. //In this case state depends on cursor position, in other cases it may depend on system time or something else get_state: impl FnOnce(Pos2) -> T, //set contents of menu depending on state set_contents: impl 'a + FnOnce(&T) -> Box<dyn 'a + FnOnce(&mut Ui)>, ) -> Option<InnerResponse<()>> { let menu_id = Id::new("__egui::context_menu"); let mut bar_state = BarState::load(&response.ctx, menu_id); let root = &mut bar_state; let menu_response = MenuRoot::context_interaction(response, root); if let egui::menu::MenuResponse::Create(p, _) = &menu_response { *state = get_state(*p); }; let add_contents = set_contents(&state); MenuRoot::handle_menu_response(root, menu_response); let inner_response = bar_state.show(response, add_contents); bar_state.store(&response.ctx, menu_id); inner_response } ``` The example of using such function you may see in [`my repository`](https://github.com/sor-ca/context_menu) It is very simple example, and is this case, the problem may be solved without fn context_menu_custom, but in more complex situations, it may be very useful Related issue: #4162 <!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> --------- Co-authored-by: Emil Ernerfeldt <[email protected]>
hacknus
pushed a commit
to hacknus/egui
that referenced
this issue
Oct 30, 2024
Sometimes we need to fix the current state of the application in the moment when you open the context menu, to save it, and to use it during creation of context menu and response handling. Making some structs, related with menu creating, allow us to create functions for this cases. For example, ```rust pub fn context_menu_custom<'a, T>( response: &Response, //variable for fixing state in the moment when you open context menu state: &mut T, //function which allow to get some king of state. //In this case state depends on cursor position, in other cases it may depend on system time or something else get_state: impl FnOnce(Pos2) -> T, //set contents of menu depending on state set_contents: impl 'a + FnOnce(&T) -> Box<dyn 'a + FnOnce(&mut Ui)>, ) -> Option<InnerResponse<()>> { let menu_id = Id::new("__egui::context_menu"); let mut bar_state = BarState::load(&response.ctx, menu_id); let root = &mut bar_state; let menu_response = MenuRoot::context_interaction(response, root); if let egui::menu::MenuResponse::Create(p, _) = &menu_response { *state = get_state(*p); }; let add_contents = set_contents(&state); MenuRoot::handle_menu_response(root, menu_response); let inner_response = bar_state.show(response, add_contents); bar_state.store(&response.ctx, menu_id); inner_response } ``` The example of using such function you may see in [`my repository`](https://github.com/sor-ca/context_menu) It is very simple example, and is this case, the problem may be solved without fn context_menu_custom, but in more complex situations, it may be very useful Related issue: emilk#4162 <!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> --------- Co-authored-by: Emil Ernerfeldt <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Current API relied on response.rect. When we want to show menu, we associate it with response, e.g. menu call
context_interaction
to get menu events(create, close, stay) internally. All this stuff is private and couldnt be accessed outside egui.This behavior dont work if we want to track entity user clicked inside response.rect in our own.
When I have
map, diagram, timeline
- there is no way to know exact point was clicked on menu creation.I have my own fork with workaround inside:
It is
context_menu
functionadded code is here. we just inject some
inter-frame-object
and pass
my_state
to the render functionBut it requires a lot of doing
pub(crate) -> pub
replacements.Then I forked
menu.rs
, but it couldnt work becauseui.set_menu_state
is private as well.Btw, looks like currently we have
ui.close_menu()
as thismenu_handle
germ.ui.menu_state.response
public.so I could do
(but currently show is earlier that setting the response)
context_menu
and all related stuffpublic
to allow everybody inline it on his own function and add some logic. Current implementation is very easy to do this, except private visibility.personally I like №4
PS:
MenuResponse::Create(**pos**, id)
is not enough, because map could be scrolled after menu was created. we need ability to user make his own associated data.The text was updated successfully, but these errors were encountered: