diff options
Diffstat (limited to 'indra/llui')
-rw-r--r-- | indra/llui/llmenubutton.cpp | 32 | ||||
-rw-r--r-- | indra/llui/llmenubutton.h | 11 |
2 files changed, 39 insertions, 4 deletions
diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index 3df05f4d3f..0930eb95dd 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -57,6 +57,8 @@ LLMenuButton::LLMenuButton(const LLMenuButton::Params& p) llwarns << "Error loading menu_button menu" << llendl; } } + + setMenuPosition(); } void LLMenuButton::toggleMenu() @@ -70,12 +72,34 @@ void LLMenuButton::toggleMenu() } else { - LLRect rect = getRect(); - //mMenu->needsArrange(); //so it recalculates the visible elements - LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom); + //mMenu->needsArrange(); //so it recalculates the visible elements + LLMenuGL::showPopup(getParent(), mMenu, mX, mY); } } +void LLMenuButton::setMenuPosition(EMenuPosition position /*ON_BOTTOM_LEFT*/) +{ + if (!mMenu) + return; + + LLRect rect = getRect(); + + switch (position) + { + case ON_TOP_LEFT: + { + mX = rect.mLeft; + mY = rect.mTop + mMenu->getRect().getHeight(); + break; + } + case ON_BOTTOM_LEFT: + { + mX = rect.mLeft; + mY = rect.mBottom; + break; + } + } +} void LLMenuButton::hideMenu() { @@ -109,6 +133,8 @@ BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask) setFocus(TRUE); } + LLUICtrl::handleMouseDown(x, y, mask); + toggleMenu(); if (getSoundFlags() & MOUSE_DOWN) diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 81ca0e047c..273af2413e 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -42,14 +42,22 @@ public: Optional<std::string> menu_filename; Params(); - }; + }; + + enum EMenuPosition + { + ON_TOP_LEFT, + ON_BOTTOM_LEFT + }; void toggleMenu(); + void setMenuPosition(EMenuPosition position = ON_BOTTOM_LEFT); /*virtual*/ void draw(); /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask ); void hideMenu(); LLMenuGL* getMenu() { return mMenu; } + void setMenu(LLMenuGL* menu) { mMenu = menu; } protected: friend class LLUICtrlFactory; @@ -58,6 +66,7 @@ protected: private: LLMenuGL* mMenu; bool mMenuVisibleLastFrame; + S32 mX, mY; }; |