Fix crash when clicked a menu sub-menu button form the code editor context menu.

This commit is contained in:
Martín Lucas Golini
2026-06-08 13:56:29 -03:00
parent 05e81c23de
commit 785fd41bd5
3 changed files with 26 additions and 6 deletions

View File

@@ -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 );
};

View File

@@ -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<UIMenuItem>();
std::string txt( item->getId() );
mDoc->execute( txt, editor );

View File

@@ -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