From 785fd41bd5ff70cdd79f77ad05e7d341f33f7cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Mon, 8 Jun 2026 13:56:29 -0300 Subject: [PATCH] Fix crash when clicked a menu sub-menu button form the code editor context menu. --- include/eepp/ui/uimenusubmenu.hpp | 9 ++++++--- src/eepp/ui/uicodeeditor.cpp | 4 +++- src/eepp/ui/uimenusubmenu.cpp | 19 +++++++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/include/eepp/ui/uimenusubmenu.hpp b/include/eepp/ui/uimenusubmenu.hpp index 87251f4ca..03bf707f9 100644 --- a/include/eepp/ui/uimenusubmenu.hpp +++ b/include/eepp/ui/uimenusubmenu.hpp @@ -34,10 +34,11 @@ class EE_API UIMenuSubMenu : public UIMenuItem { virtual UIWidget* getExtraInnerWidget() const; protected: - UIMenu* mSubMenu; - UIWidget* mArrow; + UIMenu* mSubMenu{ nullptr }; + UIWidget* mArrow{ nullptr }; Time mMaxTime; - Action* mCurWait; + Action* mCurWait{ nullptr }; + Uint32 mSubMenuCloseCb{ 0 }; UIMenuSubMenu(); @@ -55,6 +56,8 @@ class EE_API UIMenuSubMenu : public UIMenuItem { virtual void onAlphaChange(); + virtual void onClose(); + void onSubMenuFocusLoss( const Event* Event ); }; diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 95a7a5ca4..56791ca73 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -1481,8 +1481,10 @@ bool UICodeEditor::onCreateContextMenu( const Vector2i& position, const Uint32& UICodeEditor* editor = this; const auto registerMenu = [editor, this]( UIMenu* menu ) { menu->on( Event::OnItemClicked, [this, menu, editor]( const Event* event ) { - if ( !event->getNode()->isType( UI_TYPE_MENUITEM ) ) + if ( !event->getNode()->isType( UI_TYPE_MENUITEM ) || + event->getNode()->isType( UI_TYPE_MENUSUBMENU ) ) { return; + } UIMenuItem* item = event->getNode()->asType(); std::string txt( item->getId() ); mDoc->execute( txt, editor ); diff --git a/src/eepp/ui/uimenusubmenu.cpp b/src/eepp/ui/uimenusubmenu.cpp index 9e8be0ba3..439b4d31d 100644 --- a/src/eepp/ui/uimenusubmenu.cpp +++ b/src/eepp/ui/uimenusubmenu.cpp @@ -25,7 +25,13 @@ UIMenuSubMenu::UIMenuSubMenu() : mArrow->setEnabled( false ); } -UIMenuSubMenu::~UIMenuSubMenu() {} +UIMenuSubMenu::~UIMenuSubMenu() { + if ( mSubMenu ) { + if ( mSubMenuCloseCb ) + mSubMenu->removeEventListener( mSubMenuCloseCb ); + mSubMenu->setOwnerNode( nullptr ); + } +} Uint32 UIMenuSubMenu::getType() const { return UI_TYPE_MENUSUBMENU; @@ -77,11 +83,15 @@ UIWidget* UIMenuSubMenu::getExtraInnerWidget() const { void UIMenuSubMenu::setSubMenu( UIMenu* subMenu ) { if ( nullptr != mSubMenu && mSubMenu != subMenu ) { getActionManager()->removeActionsByTagFromTarget( this, String::hash( "subMenu" ) ); + if ( mSubMenuCloseCb ) + mSubMenu->removeEventListener( mSubMenuCloseCb ); mSubMenu->setOwnerNode( nullptr ); } mSubMenu = subMenu; - if ( nullptr != mSubMenu ) + if ( nullptr != mSubMenu ) { mSubMenu->setOwnerNode( this ); + mSubMenuCloseCb = mSubMenu->on( Event::OnClose, [this]( auto ) { mSubMenu = nullptr; } ); + } } UIMenu* UIMenuSubMenu::getSubMenu() const { @@ -148,4 +158,9 @@ void UIMenuSubMenu::setMouseOverTimeShowMenu( const Time& maxTime ) { mMaxTime = maxTime; } +void UIMenuSubMenu::onClose() { + if ( mSubMenu ) + mSubMenu->setOwnerNode( nullptr ); +} + }} // namespace EE::UI