diff --git a/modules/core/constants.lua b/modules/core/constants.lua index 1f142e74..b40cbb10 100644 --- a/modules/core/constants.lua +++ b/modules/core/constants.lua @@ -130,4 +130,9 @@ KeyF12 = 140 KeyboardNoModifier = 0 KeyboardCtrlModifier = 1 KeyboardAltModifier = 2 -KeyboardShiftModifier = 4 \ No newline at end of file +KeyboardShiftModifier = 4 + +MouseNoButton = 0 +MouseLeftButton = 1 +MouseRightButton = 2 +MouseMidButton = 3 \ No newline at end of file diff --git a/modules/core_styles/styles/buttons.otui b/modules/core_styles/styles/buttons.otui index 4551809c..6d4eaa9c 100644 --- a/modules/core_styles/styles/buttons.otui +++ b/modules/core_styles/styles/buttons.otui @@ -48,4 +48,19 @@ TopButton < UIButton border: 3 state.disabled: - background-color: #ffffff66 \ No newline at end of file + background-color: #ffffff66 + +MenuButton < UIButton + color: white + size: 40 18 + align: center + border-image: + source: /core_styles/images/menu.png + size: 64 24 + + state.hover: + border-image: + source: /core_styles/images/menu.png + offset: 0 24 + size: 64 24 + color: black diff --git a/modules/core_styles/styles/items.otui b/modules/core_styles/styles/items.otui index 3ba2a364..d72df36e 100644 --- a/modules/core_styles/styles/items.otui +++ b/modules/core_styles/styles/items.otui @@ -1,6 +1,6 @@ Item < UIItem size: 34 34 - item margin: 1 + item margin: 1 border-image: source: /core_styles/images/panel_flat.png border: 4 diff --git a/modules/inventory/inventory.otui b/modules/inventory/inventory.otui index 71826014..892ab678 100644 --- a/modules/inventory/inventory.otui +++ b/modules/inventory/inventory.otui @@ -4,67 +4,68 @@ UIWindow margin.left: 6 margin.right: 6 move policy: free updated - + Item id: head anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter - + popup menu: /inventory/itempopupmenu.otui + Item id: armor anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: legs anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: feet anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: necklace anchors.top: parent.top anchors.right: head.left margin.top: 15 margin.right: 10 - + Item id: left anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: ring anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: backpack anchors.top: parent.top anchors.left: head.right margin.top: 15 margin.left: 10 - + Item id: right anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + Item id: ammo anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin.top: 10 - + diff --git a/modules/playground/filemenu.otui b/modules/inventory/itempopupmenu.otui similarity index 72% rename from modules/playground/filemenu.otui rename to modules/inventory/itempopupmenu.otui index 9c7c10a6..c6c0e869 100644 --- a/modules/playground/filemenu.otui +++ b/modules/inventory/itempopupmenu.otui @@ -3,7 +3,7 @@ Panel size: 64 48 MenuButton - text: New + text: Foo MenuButton text: Quit diff --git a/modules/playground/menubar.otui b/modules/playground/menubar.otui deleted file mode 100644 index 06b45d2e..00000000 --- a/modules/playground/menubar.otui +++ /dev/null @@ -1,29 +0,0 @@ -MenuButton < UIButton - color: white - size: 40 18 - align: center - border-image: - source: /core_styles/images/menu.png - size: 64 24 - - state.hover: - border-image: - source: /core_styles/images/menu.png - offset: 0 24 - size: 64 24 - color: black - -TopMenuButton < MenuButton - onMousePress: | - function(self, mousePos, mouseButton) - local popupMenu = UI.loadAndDisplay(self:getStyle()['popup menu']) - if popupMenu then - popupMenu:moveTo({ x = self:getX(), y = self:getY() + self:getHeight()}) - popupMenu.onMouseRelease = function(self) self:destroy() end - end - end - -TopMenuButton - text: File - position: 80 0 - popup menu: /playground/filemenu.otui \ No newline at end of file diff --git a/modules/playground/playground.lua b/modules/playground/playground.lua index 758f66a2..a593de0a 100644 --- a/modules/playground/playground.lua +++ b/modules/playground/playground.lua @@ -1,10 +1,24 @@ -- place any code for testing purposes here -function displayMenuPopup(file, parent) +function UIItem.onMouseRelease(self, mousePos, mouseButton) + if mouseButton ~= MouseRightButton then return end + local top = self:getY() + local bottom = self:getY() + self:getHeight() + local left = self:getX() + local right = self:getX() + self:getWidth() + if not (mousePos.y >= top and mousePos.y <= bottom and mousePos.x >= left and mousePos.x <= right) then return end + + local menuFile = self:getStyle()['popup menu'] + if not menuFile then return end + + local popupMenu = UI.loadAndDisplay(menuFile) + if not popupMenu then return end + + popupMenu:moveTo(mousePos) + popupMenu.onMouseRelease = function(self) self:destroy() end end local function init() - UI.loadAndDisplay('/playground/menubar.otui') end addEvent(init) \ No newline at end of file diff --git a/src/framework/ui/uibutton.cpp b/src/framework/ui/uibutton.cpp index c0b9cb81..d7ae7c0b 100644 --- a/src/framework/ui/uibutton.cpp +++ b/src/framework/ui/uibutton.cpp @@ -57,12 +57,10 @@ void UIButton::onStyleApply(const OTMLNodePtr& styleNode) } } -bool UIButton::onMouseRelease(const Point& mousePos, Fw::MouseButton button) +void UIButton::onMouseRelease(const Point& mousePos, Fw::MouseButton button) { if(isPressed()) { if(m_onClick && getRect().contains(mousePos)) m_onClick(); - return true; } - return false; } diff --git a/src/framework/ui/uibutton.h b/src/framework/ui/uibutton.h index 608282f3..3095c20d 100644 --- a/src/framework/ui/uibutton.h +++ b/src/framework/ui/uibutton.h @@ -41,7 +41,7 @@ public: protected: virtual void onStyleApply(const OTMLNodePtr& styleNode); - virtual bool onMouseRelease(const Point& mousePos, Fw::MouseButton button); + virtual void onMouseRelease(const Point& mousePos, Fw::MouseButton button); SimpleCallback m_onClick; Point m_textTranslate; diff --git a/src/framework/ui/uimanager.h b/src/framework/ui/uimanager.h index 24cf9437..c9992594 100644 --- a/src/framework/ui/uimanager.h +++ b/src/framework/ui/uimanager.h @@ -44,10 +44,15 @@ public: UIWidgetPtr loadUI(const std::string& file, const UIWidgetPtr& parent = nullptr); UIWidgetPtr loadWidgetFromOTML(const OTMLNodePtr& widgetNode, const UIWidgetPtr& parent); + //void setMouseGrabWidget(); + //void setKeyboardGrabWidget(); + UIWidgetPtr getRootWidget() { return m_rootWidget; } private: UIWidgetPtr m_rootWidget; + //UIWidgetPtr m_mouseGrabWidget; + //UIWidgetPtr m_keyboardGrabWidget; std::map m_styles; }; diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index dc6417ef..f4b387c7 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -909,7 +909,7 @@ void UIWidget::onHoverChange(bool hovered) callLuaField("onHoverChange", hovered); // check for new hovered elements when the current widget is removed - if(!hovered && !getParent()) + if(!hovered && !getParent() && g_ui.getRootWidget()) g_ui.getRootWidget()->updateState(Fw::HoverState); } @@ -1000,10 +1000,9 @@ bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button) return false; } -bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) +void UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) { - if(callLuaField("onMouseRelease", mousePos, button)) - return true; + callLuaField("onMouseRelease", mousePos, button); // do a backup of children list, because it may change while looping it UIWidgetList children; @@ -1017,16 +1016,11 @@ bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) } for(const UIWidgetPtr& child : children) { - bool mustEnd = child->onMouseRelease(mousePos, button); + child->onMouseRelease(mousePos, button); if(child->isPressed()) child->setPressed(false); - - if(mustEnd) - return true; } - - return false; } bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved) diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index cc3d8e38..05f60b17 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -173,7 +173,7 @@ protected: /// Triggered when a mouse button is pressed down while mouse pointer is inside widget area virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); /// Triggered when a mouse button is released - virtual bool onMouseRelease(const Point& mousePos, Fw::MouseButton button); + virtual void onMouseRelease(const Point& mousePos, Fw::MouseButton button); /// Triggered when mouse moves (even when the mouse is outside widget area) virtual bool onMouseMove(const Point& mousePos, const Point& mouseMoved); /// Triggered when mouse middle button wheels inside widget area diff --git a/src/framework/ui/uiwindow.cpp b/src/framework/ui/uiwindow.cpp index 910af09f..39bdb7a9 100644 --- a/src/framework/ui/uiwindow.cpp +++ b/src/framework/ui/uiwindow.cpp @@ -120,7 +120,7 @@ bool UIWindow::onMousePress(const Point& mousePos, Fw::MouseButton button) return UIWidget::onMousePress(mousePos, button); } -bool UIWindow::onMouseRelease(const Point& mousePos, Fw::MouseButton button) +void UIWindow::onMouseRelease(const Point& mousePos, Fw::MouseButton button) { if(m_moving) { if(m_movePolicy == FREE_UPDATED_MOVE) { @@ -143,9 +143,8 @@ bool UIWindow::onMouseRelease(const Point& mousePos, Fw::MouseButton button) updateParentLayout(); } m_moving = false; - return true; } - return UIWidget::onMouseRelease(mousePos, button); + UIWidget::onMouseRelease(mousePos, button); } bool UIWindow::onMouseMove(const Point& mousePos, const Point& mouseMoved) diff --git a/src/framework/ui/uiwindow.h b/src/framework/ui/uiwindow.h index 95cc5a4d..9531d1d4 100644 --- a/src/framework/ui/uiwindow.h +++ b/src/framework/ui/uiwindow.h @@ -44,7 +44,7 @@ protected: virtual void onStyleApply(const OTMLNodePtr& styleNode); virtual void onGeometryUpdate(const Rect& oldRect, const Rect& newRect); virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); - virtual bool onMouseRelease(const Point& mousePos, Fw::MouseButton button); + virtual void onMouseRelease(const Point& mousePos, Fw::MouseButton button); virtual bool onMouseMove(const Point& mousePos, const Point& mouseMoved); virtual bool onKeyPress(uchar keyCode, char keyChar, int keyboardModifiers);