From 2cd9e38f401b8f35051ccba1bb9ab37efd13529f Mon Sep 17 00:00:00 2001 From: ItsEthra <107059409+ItsEthra@users.noreply.github.com> Date: Fri, 28 Oct 2022 14:03:11 +0300 Subject: [PATCH 1/2] Fixed menu popups going outside of the screen --- crates/egui/src/menu.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs index 1950cb8330f..a629aa3042f 100644 --- a/crates/egui/src/menu.rs +++ b/crates/egui/src/menu.rs @@ -288,7 +288,23 @@ impl MenuRoot { { // menu not open and button clicked // or button hovered while other menu is open - let pos = response.rect.left_bottom(); + drop(input); + + let mut pos = response.rect.left_bottom(); + if let Some(root) = root.inner.as_mut() { + let menu_rect = root.menu_state.read().rect; + let screen_rect = response.ctx.input().screen_rect; + + if pos.y + menu_rect.height() > screen_rect.max.y { + pos.y = screen_rect.max.y - menu_rect.height(); + pos.x += response.rect.width(); + } + + if pos.x + menu_rect.width() > screen_rect.max.x { + pos.x = screen_rect.max.x - menu_rect.width(); + } + } + return MenuResponse::Create(pos, id); } else if input.pointer.any_pressed() && input.pointer.primary_down() { if let Some(pos) = input.pointer.interact_pos() { From bd34b292fd513dee1175274d59a92cdc72c963f8 Mon Sep 17 00:00:00 2001 From: ItsEthra <107059409+ItsEthra@users.noreply.github.com> Date: Mon, 31 Oct 2022 15:53:01 +0300 Subject: [PATCH 2/2] Made menu appear above above the button instead --- crates/egui/src/menu.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs index a629aa3042f..a697e2dac8c 100644 --- a/crates/egui/src/menu.rs +++ b/crates/egui/src/menu.rs @@ -296,8 +296,7 @@ impl MenuRoot { let screen_rect = response.ctx.input().screen_rect; if pos.y + menu_rect.height() > screen_rect.max.y { - pos.y = screen_rect.max.y - menu_rect.height(); - pos.x += response.rect.width(); + pos.y = screen_rect.max.y - menu_rect.height() - response.rect.height(); } if pos.x + menu_rect.width() > screen_rect.max.x {