[UI Overhaul] LLMenuGL sync

This commit is contained in:
Inusaito Sayori
2014-05-28 22:08:01 -04:00
parent 43e66b57a0
commit a926cdc5be
2 changed files with 103 additions and 66 deletions

View File

@@ -342,7 +342,7 @@ void LLMenuItemGL::setJumpKey(KEY key)
// virtual
U32 LLMenuItemGL::getNominalHeight( void ) const
{
return llround(mFont->getLineHeight()) + MENU_ITEM_PADDING;
return llround(mFont->getLineHeight()) + MENU_ITEM_PADDING;
}
//virtual
@@ -586,6 +586,7 @@ void LLMenuItemGL::handleVisibilityChange(BOOL new_visibility)
}
LLView::handleVisibilityChange(new_visibility);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLMenuItemSeparatorGL
//
@@ -1187,6 +1188,8 @@ LLMenuItemBranchGL::~LLMenuItemBranchGL()
}
}
// virtual
LLView* LLMenuItemBranchGL::getChildView(const std::string& name, BOOL recurse, BOOL create_if_missing) const
{
@@ -1326,7 +1329,8 @@ void LLMenuItemBranchGL::setHighlight( BOOL highlight )
BOOL auto_open = getEnabled() && (!branch->getVisible() || branch->getTornOff());
// torn off menus don't open sub menus on hover unless they have focus
if (getMenu()->getTornOff() && !((LLFloater*)getMenu()->getParent())->hasFocus())
LLFloater * menu_parent = dynamic_cast<LLFloater *>(getMenu()->getParent());
if (getMenu()->getTornOff() && menu_parent && !menu_parent->hasFocus())
{
auto_open = FALSE;
}
@@ -1347,7 +1351,11 @@ void LLMenuItemBranchGL::setHighlight( BOOL highlight )
{
if (branch->getTornOff())
{
((LLFloater*)branch->getParent())->setFocus(FALSE);
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
if (branch_parent)
{
branch_parent->setFocus(FALSE);
}
branch->clearHoverItem();
}
else
@@ -1405,11 +1413,19 @@ BOOL LLMenuItemBranchGL::handleKeyHere( KEY key, MASK mask )
BOOL handled = branch->clearHoverItem();
if (branch->getTornOff())
{
((LLFloater*)branch->getParent())->setFocus(FALSE);
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
if (branch_parent)
{
branch_parent->setFocus(FALSE);
}
}
if (handled && getMenu()->getTornOff())
{
((LLFloater*)getMenu()->getParent())->setFocus(TRUE);
LLFloater * menu_parent = dynamic_cast<LLFloater *>(getMenu()->getParent());
if (menu_parent)
{
menu_parent->setFocus(TRUE);
}
}
return handled;
}
@@ -1449,9 +1465,13 @@ void LLMenuItemBranchGL::openMenu()
if (branch->getTornOff())
{
gFloaterView->bringToFront((LLFloater*)branch->getParent());
// this might not be necessary, as torn off branches don't get focus and hence no highligth
branch->highlightNextItem(NULL);
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
if (branch_parent)
{
gFloaterView->bringToFront(branch_parent);
// this might not be necessary, as torn off branches don't get focus and hence no highligth
branch->highlightNextItem(NULL);
}
}
else if( !branch->getVisible() )
{
@@ -1584,7 +1604,11 @@ void LLMenuItemBranchDownGL::openMenu( void )
{
if (branch->getTornOff())
{
gFloaterView->bringToFront((LLFloater*)branch->getParent());
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
if (branch_parent)
{
gFloaterView->bringToFront(branch_parent);
}
}
else
{
@@ -1639,7 +1663,11 @@ void LLMenuItemBranchDownGL::setHighlight( BOOL highlight )
{
if (branch->getTornOff())
{
((LLFloater*)branch->getParent())->setFocus(FALSE);
LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent());
if (branch_parent)
{
branch_parent->setFocus(FALSE);
}
branch->clearHoverItem();
}
else
@@ -1946,6 +1974,7 @@ LLMenuGL::LLMenuGL( const std::string& name, const std::string& label )
mArrowDownItem(NULL),
mSpilloverMenu(NULL),
mJumpKey(KEY_NONE),
mCreateJumpKeys(true/*p.create_jump_keys*/),
mNeedsArrange(FALSE),
mResetScrollPositionOnShow(true),
mShortcutPad(ACCEL_PAD_PIXELS)
@@ -1977,6 +2006,7 @@ LLMenuGL::LLMenuGL( const std::string& label)
mArrowUpItem(NULL),
mArrowDownItem(NULL),
mJumpKey(KEY_NONE),
mCreateJumpKeys(true/*p.create_jump_keys*/),
mNeedsArrange(FALSE),
mResetScrollPositionOnShow(true),
mShortcutPad(ACCEL_PAD_PIXELS)
@@ -2453,6 +2483,10 @@ LLView* LLMenuGL::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *fa
LLMenuGL *menu = new LLMenuGL(name, new_menu_label);
bool b(false);
node->getAttribute_bool("scrollable", b);
menu->setScrollable(b);
menu->setJumpKey(jump_key);
BOOL tear_off = FALSE;
@@ -2482,13 +2516,6 @@ LLView* LLMenuGL::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *fa
menu->parseChildXML(child, parent, factory);
}
if (node->hasAttribute("scrollable"))
{
bool b;
node->getAttribute_bool("scrollable", b);
setScrollable(b);
}
if (create_jump_keys)
{
menu->createJumpKeys();
@@ -2975,6 +3002,9 @@ void LLMenuGL::cleanupSpilloverBranch()
void LLMenuGL::createJumpKeys()
{
if (!mCreateJumpKeys) return;
mCreateJumpKeys = FALSE;
mJumpKeys.clear();
std::set<std::string> unique_words;
@@ -3221,7 +3251,7 @@ void LLMenuGL::setItemLastSelected(LLMenuItemGL* item)
LLMenuHolderGL::setActivatedItem(item);
}
// fix the checkmarks
// update enabled and checkmark status
item->buildDrawLabel();
}
@@ -3278,7 +3308,11 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa
// same as giving focus to it
if (!cur_item && getTornOff())
{
((LLFloater*)getParent())->setFocus(TRUE);
LLFloater * parent = dynamic_cast<LLFloater *>(getParent());
if (parent)
{
parent->setFocus(TRUE);
}
}
// Current item position in the items list
@@ -3380,7 +3414,11 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa
// same as giving focus to it
if (!cur_item && getTornOff())
{
((LLFloater*)getParent())->setFocus(TRUE);
LLFloater * parent = dynamic_cast<LLFloater *>(getParent());
if (parent)
{
parent->setFocus(TRUE);
}
}
// Current item reverse position from the end of the list
@@ -3535,7 +3573,7 @@ BOOL LLMenuGL::handleHover( S32 x, S32 y, MASK mask )
if ((llabs(mMouseVelX) > 0 ||
llabs(mMouseVelY) > 0) /*&&
(!mHasSelection ||
(mouse_delta_x == 0 && mouse_delta_y == 0) ||
// (mouse_delta_x == 0 && mouse_delta_y == 0) ||
(mMouseVelX < 0) ||
llabs((F32)mMouseVelY) / llabs((F32)mMouseVelX) > MAX_MOUSE_SLOPE_SUB_MENU)*/)
{
@@ -3607,6 +3645,7 @@ BOOL LLMenuGL::handleScrollWheel( S32 x, S32 y, S32 clicks )
return TRUE;
}
void LLMenuGL::draw( void )
{
if (mNeedsArrange)
@@ -3616,9 +3655,8 @@ void LLMenuGL::draw( void )
}
if (mDropShadowed && !mTornOff)
{
static S32 drop_shadow_floater = LLUI::sConfigGroup->getS32("DropShadowFloater");
static LLColor4 color_drop_shadow = LLUI::sColorsGroup->getColor("ColorDropShadow");
static LLUICachedControl<S32> drop_shadow_floater("DropShadowFloater", 0);
static const LLColor4 color_drop_shadow(LLUI::sColorsGroup->getColor4("ColorDropShadow"));
gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0,
color_drop_shadow, drop_shadow_floater );
}
@@ -3627,20 +3665,6 @@ void LLMenuGL::draw( void )
{
gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0, mBackgroundColor );
}
/*LLRect rootRect = getRootView()->getRect();
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
LLMenuItemGL* itemp = static_cast<LLMenuItemGL*>(*child_it);
if(itemp)
{
LLRect screenRect;
localRectToScreen(itemp->getRect(),&screenRect);
lldebugs << itemp->getName() << "Visible:" << itemp->getVisible() << " ValidRect: " << itemp->getRect().isValid() << " Overlaps: " << rootRect.overlaps(screenRect) << llendl;
}
}*/
LLView::draw();
}
@@ -3655,7 +3679,6 @@ void LLMenuGL::setVisible(BOOL visible)
{
if (visible != getVisible())
{
LLView::setVisible(visible);
if (!visible)
{
lldebugs << "Hiding " << getName() << llendl;
@@ -3672,6 +3695,8 @@ void LLMenuGL::setVisible(BOOL visible)
mHasSelection = true;
mFadeTimer.stop();
}
LLView::setVisible(visible);
}
}
@@ -3729,6 +3754,24 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
return;
}
menu->setVisible( TRUE );
//Do not show menu if all menu items are disabled
BOOL item_enabled = false;
for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin();
itor != menu->getChildList()->end();
++itor)
{
LLView *menu_item = (*itor);
item_enabled = item_enabled || menu_item->getEnabled();
}
if(!item_enabled)
{
menu->setVisible( FALSE );
return;
}
// Save click point for detecting cursor moves before mouse-up.
// Must be in local coords to compare with mouseUp events.
// If the mouse doesn't move, the menu will stay open ala the Mac.
@@ -3741,8 +3784,6 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
menu->mFirstVisibleItem = NULL;
}
menu->setVisible( TRUE );
// Fix menu rect if needed.
menu->needsArrange();
menu->arrangeAndClear();
@@ -4811,7 +4852,8 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
BOOL LLMenuBarGL::handleKeyHere(KEY key, MASK mask)
{
if(key == KEY_ALT && !gKeyboard->getKeyRepeated(key) && LLUI::sConfigGroup->getBOOL("UseAltKeyForMenus"))
static LLUICachedControl<bool> use_altkey_for_menus ("UseAltKeyForMenus", 0);
if(key == KEY_ALT && !gKeyboard->getKeyRepeated(key) && use_altkey_for_menus)
{
mAltKeyTrigger = TRUE;
}
@@ -4894,6 +4936,7 @@ void LLMenuBarGL::draw()
LLMenuGL::draw();
}
void LLMenuBarGL::checkMenuTrigger()
{
// has the ALT key been pressed and subsequently released?
@@ -4901,7 +4944,8 @@ void LLMenuBarGL::checkMenuTrigger()
{
// if alt key was released quickly, treat it as a menu access key
// otherwise it was probably an Alt-zoom or similar action
if (gKeyboard->getKeyElapsedTime(KEY_ALT) <= LLUI::sConfigGroup->getF32("MenuAccessKeyTime") ||
static LLUICachedControl<F32> menu_access_key_time ("MenuAccessKeyTime", 0);
if (gKeyboard->getKeyElapsedTime(KEY_ALT) <= menu_access_key_time ||
gKeyboard->getKeyElapsedFrameCount(KEY_ALT) < 2)
{
if (getHighlightedItem())
@@ -5087,7 +5131,6 @@ LLMenuHolderGL::LLMenuHolderGL(const std::string& name, const LLRect& rect, BOOL
mCanHide = TRUE;
}
void LLMenuHolderGL::draw()
{
LLView::draw();
@@ -5289,11 +5332,10 @@ LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
setRect(rect);
// attach menu to floater
menup->setFollows(FOLLOWS_BOTTOM|FOLLOWS_LEFT);
menup->setFollows(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mOldParent = menup->getParent();
addChild(menup);
menup->setVisible(TRUE);
LLRect menu_rect = menup->getRect();
menu_rect.setOriginAndSize( 1, 1,
menu_rect.getWidth(), menu_rect.getHeight());
@@ -5306,6 +5348,9 @@ LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
mMenu->highlightNextItem(NULL);
}
LLTearOffMenu::~LLTearOffMenu()
{
}
void LLTearOffMenu::draw()
{

View File

@@ -79,16 +79,6 @@ typedef void (*label_callback)(std::string&,void*);
class LLMenuItemGL : public LLUICtrl
{
public:
// static functions to control the global color scheme.
/*static void setEnabledColor( const LLColor4& color ) { sEnabledColor = color; }
static const LLColor4& getEnabledColor() { return sEnabledColor; }
static void setDisabledColor( const LLColor4& color ) { sDisabledColor = color; }
static const LLColor4& getDisabledColor() { return sDisabledColor; }
static void setHighlightBGColor( const LLColor4& color ) { sHighlightBackground = color; }
static const LLColor4& getHighlightBGColor() { return sHighlightBackground; }
static void setHighlightFGColor( const LLColor4& color ) { sHighlightForeground = color; }
static const LLColor4& getHighlightFGColor() { return sHighlightForeground; }*/
LLMenuItemGL( const std::string& name, const std::string& label, KEY key = KEY_NONE, MASK = MASK_NONE );
virtual ~LLMenuItemGL();
@@ -190,6 +180,7 @@ protected:
// the current accelerator key and mask to the provided string.
void appendAcceleratorString( std::string& st ) const;
protected:
KEY mAcceleratorKey;
MASK mAcceleratorMask;
// mLabel contains the actual label specified by the user.
@@ -248,12 +239,12 @@ public:
// doIt() - do the primary funcationality of the menu item.
virtual void doIt( void ) {}
virtual void draw( void );
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ void draw( void );
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
virtual U32 getNominalHeight( void ) const;
/*virtual*/ U32 getNominalHeight( void ) const;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -429,7 +420,6 @@ private:
BOOL* mToggle;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLMenuGL
//
@@ -479,7 +469,7 @@ public:
/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
/*virtual*/ void draw( void );
virtual void drawBackground(LLMenuItemGL* itemp, LLColor4& color);
/*virtual*/ void drawBackground(LLMenuItemGL* itemp, LLColor4& color);
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
/*virtual*/ void removeChild( LLView* ctrl);
@@ -554,7 +544,7 @@ public:
// Show popup in global screen space based on last mouse location.
static void showPopup(LLMenuGL* menu);
// Show popup at a specific location.
// Show popup at a specific location, in the spawn_view's coordinate frame
static void showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y);
// Whether to drop shadow menu bar
@@ -632,6 +622,7 @@ private:
class LLMenuItemBranchGL* mSpilloverBranch;
LLMenuGL* mSpilloverMenu;
KEY mJumpKey;
BOOL mCreateJumpKeys;
S32 mShortcutPad;
bool mResetScrollPositionOnShow;
}; // end class LLMenuGL
@@ -703,11 +694,11 @@ private:
}; // end class LLMenuItemBranchGL
//-----------------------------------------------------------------------------
// class LLContextMenu
// A context menu
//-----------------------------------------------------------------------------
class LLContextMenu
: public LLMenuGL
{
@@ -923,7 +914,8 @@ class LLTearOffMenu : public LLFloater
{
public:
static LLTearOffMenu* create(LLMenuGL* menup);
virtual ~LLTearOffMenu() {}
virtual ~LLTearOffMenu();
virtual void onClose(bool app_quitting);
virtual void draw(void);
virtual void onFocusReceived();