diff --git a/modules/core_lib/util.lua b/modules/core_lib/util.lua index 31610e84..4d3fef0c 100644 --- a/modules/core_lib/util.lua +++ b/modules/core_lib/util.lua @@ -22,7 +22,7 @@ function connect(object, signalsAndSlots, pushFront) for signal,slot in pairs(signalsAndSlots) do if not object[signal] then local mt = getmetatable(object) - if mt then + if mt and type(object) == 'userdata' then object[signal] = function(...) return signalcall(mt[signal], ...) end diff --git a/modules/core_widgets/uipopupmenu.lua b/modules/core_widgets/uipopupmenu.lua index 6318728e..e149eb70 100644 --- a/modules/core_widgets/uipopupmenu.lua +++ b/modules/core_widgets/uipopupmenu.lua @@ -1,6 +1,6 @@ UIPopupMenu = extends(UIWidget) -local displayedMenuList = {} +local currentMenu function UIPopupMenu.create() local menu = UIPopupMenu.internalCreate() @@ -17,10 +17,14 @@ function UIPopupMenu:display(pos) return end + if currentMenu then + currentMenu:destroy() + end + displayUI(self, {x = pos.x, y = pos.y}) self:grabMouse() self:grabKeyboard() - table.insert(displayedMenuList, self) + currentMenu = self end function UIPopupMenu:onGeometryChange() @@ -44,7 +48,9 @@ function UIPopupMenu:addSeparator() end function UIPopupMenu:onDestroy() - table.removevalue(displayedMenuList, self) + if currentMenu == self then + currentMenu = nil + end end function UIPopupMenu:onMousePress(mousePos, mouseButton) @@ -65,8 +71,8 @@ end -- close all menus when the window is resized local function onRootGeometryUpdate() - for i,menu in ipairs(displayedMenuList) do - menu:destroy() + if currentMenu then + currentMenu:destroy() end end connect(rootWidget, { onGeometryChange = onRootGeometryUpdate} ) diff --git a/src/framework/ui/uimanager.cpp b/src/framework/ui/uimanager.cpp index 957f9db3..9d25b947 100644 --- a/src/framework/ui/uimanager.cpp +++ b/src/framework/ui/uimanager.cpp @@ -79,7 +79,7 @@ void UIManager::inputEvent(const InputEvent& event) case Fw::MousePressInputEvent: m_mouseReceiver->propagateOnMousePress(event.mousePos, event.mouseButton); if(event.mouseButton == Fw::MouseLeftButton) - updatePressedWidget(m_rootWidget->recursiveGetChildByPos(event.mousePos), event.mousePos); + updatePressedWidget(m_mouseReceiver->recursiveGetChildByPos(event.mousePos), event.mousePos); break; case Fw::MouseReleaseInputEvent: m_mouseReceiver->propagateOnMouseRelease(event.mousePos, event.mouseButton);