From f9c2db4d96a6d8260ac8a9a0f2feb21c9b552ddf Mon Sep 17 00:00:00 2001 From: Ian Harrigan Date: Sat, 6 Apr 2024 11:32:33 +0200 Subject: [PATCH] cancellable before_close event for menus --- haxe/ui/containers/menus/Menu.hx | 7 +++++++ haxe/ui/containers/menus/MenuBar.hx | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/haxe/ui/containers/menus/Menu.hx b/haxe/ui/containers/menus/Menu.hx index aabaef4d5..0e010690c 100644 --- a/haxe/ui/containers/menus/Menu.hx +++ b/haxe/ui/containers/menus/Menu.hx @@ -172,6 +172,13 @@ class MenuEvents extends haxe.ui.events.Events { event.menuItem = item; findRootMenu().dispatch(event); + var beforeCloseEvent = new UIEvent(UIEvent.BEFORE_CLOSE); + beforeCloseEvent.relatedComponent = item; + findRootMenu().dispatch(beforeCloseEvent); + if (beforeCloseEvent.canceled) { + return; + } + hideMenu(); removeScreenMouseDown(); _menu.dispatch(new UIEvent(UIEvent.CLOSE)); diff --git a/haxe/ui/containers/menus/MenuBar.hx b/haxe/ui/containers/menus/MenuBar.hx index f038342b5..c1be71f4e 100644 --- a/haxe/ui/containers/menus/MenuBar.hx +++ b/haxe/ui/containers/menus/MenuBar.hx @@ -117,11 +117,11 @@ private class Events extends haxe.ui.events.Events { var menu = builder._menus[index]; if (menu != _currentMenu) { - showMenu(index); + showMenu(index, true); } } - private function showMenu(index:Int) { + private function showMenu(index:Int, force:Bool = false) { var builder:Builder = cast(_menubar._compositeBuilder, Builder); var menu:Menu = builder._menus[index]; menu.addClass("primary-menu"); @@ -140,7 +140,7 @@ private class Events extends haxe.ui.events.Events { target.selected = true; - hideCurrentMenu(); + hideCurrentMenu(force); cast(menu._internalEvents, MenuEvents).button = target; if (menu.hasEvent(UIEvent.CLOSE, onMenuClose) == false) { @@ -215,7 +215,7 @@ private class Events extends haxe.ui.events.Events { } } - private function hideCurrentMenu() { + private function hideCurrentMenu(force:Bool = false) { if (_currentMenu != null) { var builder:Builder = cast(_menubar._compositeBuilder, Builder); for (button in builder._buttons) { @@ -223,6 +223,15 @@ private class Events extends haxe.ui.events.Events { button.swapClass("menubar-button-no-children", "menubar-button-no-children-active"); } } + + if (!force && _currentMenu.hitTest(Screen.instance.currentMouseX, Screen.instance.currentMouseY)) { + var beforeCloseEvent = new UIEvent(UIEvent.BEFORE_CLOSE); + beforeCloseEvent.relatedComponent = _currentMenu.findComponentsUnderPoint(Screen.instance.currentMouseX, Screen.instance.currentMouseY, MenuItem)[0]; + _currentMenu.dispatch(beforeCloseEvent); + if (beforeCloseEvent.canceled) { + return; + } + } var menuEvent = new MenuEvent(MenuEvent.MENU_CLOSED); menuEvent.menu = _currentMenu;