Added mouse_wheel_opaque attribute for scroll_list. Made several advanced submenus tear-off-able. Updated menu hover logic (removed MAX_MOUSE_SLOPE_SUB_MENU check) to make menus behave more predictably to cursor movement. Improved menu handling when it runs off of screen (and only uses vertical flip if menu item is in lower half of screen)

This commit is contained in:
Shyotl
2012-03-03 22:11:53 -06:00
parent 9f2b668424
commit 2d75e8fda6
4 changed files with 45 additions and 8 deletions

View File

@@ -562,7 +562,7 @@ void LLMenuItemGL::draw( void )
}
if( !mDrawBranchLabel.empty() )
{
mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, (!getEnabled() || getHighlight()) ? color : color % .7f,
LLFontGL::RIGHT, LLFontGL::BOTTOM, mStyle, font_shadow, S32_MAX, S32_MAX, NULL, FALSE );
}
}
@@ -1494,7 +1494,9 @@ void LLMenuItemBranchGL::openMenu()
S32 delta_x = 0;
S32 delta_y = 0;
branch->localPointToOtherView( 0, 0, &x, &y, branch->getParent() );
if( y < menu_region_rect.mBottom )
F32 center_y = top - (getRect().getHeight() / 2.f);
if( y < menu_region_rect.mBottom && center_y <= menu_region_rect.getCenterY())
{
// open upwards if menu extends past bottom
// adjust by the height of the menu item branch since it is a submenu
@@ -1827,6 +1829,7 @@ LLMenuGL::LLMenuGL( const std::string& name, const std::string& label )
: LLUICtrl( name, LLRect(), FALSE, NULL, NULL ),
mBackgroundColor( sDefaultBackgroundColor ),
mBgVisible( TRUE ),
mHasSelection( FALSE ),
mLabel( label ),
mDropShadowed( TRUE ),
mHorizontalLayout( FALSE ),
@@ -1852,6 +1855,7 @@ LLMenuGL::LLMenuGL( const std::string& label)
: LLUICtrl( label, LLRect(), FALSE, NULL, NULL ),
mBackgroundColor( sDefaultBackgroundColor ),
mBgVisible( TRUE ),
mHasSelection( FALSE ),
mLabel( label ),
mDropShadowed( TRUE ),
mHorizontalLayout( FALSE ),
@@ -2484,9 +2488,9 @@ void LLMenuGL::arrange( void )
}
}
setRect(LLRect(getRect().mLeft, getRect().mBottom + height, getRect().mLeft + width, getRect().mBottom));
S32 cur_height = (S32)llmin(max_height, height);
setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width, getRect().mTop - cur_height));
S32 cur_width = 0;
S32 offset = 0;
item_list_t::iterator item_iter;
@@ -2540,6 +2544,7 @@ void LLMenuGL::createSpilloverBranch()
mSpilloverMenu->updateParent(LLMenuGL::sMenuContainer);
// Inherit colors
mSpilloverMenu->setBackgroundColor( mBackgroundColor );
mSpilloverMenu->setCanTearOff(FALSE);
mSpilloverBranch = new LLMenuItemBranchGL(std::string("More"), std::string("More"), mSpilloverMenu->getHandle());
mSpilloverBranch->setFontStyle(LLFontGL::ITALIC);
@@ -3055,11 +3060,11 @@ BOOL LLMenuGL::handleHover( S32 x, S32 y, MASK mask )
// don't change menu focus unless mouse is moving or alt key is not held down
if ((llabs(mMouseVelX) > 0 ||
llabs(mMouseVelY) > 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))
llabs((F32)mMouseVelY) / llabs((F32)mMouseVelX) > MAX_MOUSE_SLOPE_SUB_MENU)*/)
{
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{

View File

@@ -641,6 +641,7 @@ LLScrollListCtrl::LLScrollListCtrl(const std::string& name, const LLRect& rect,
: LLUICtrl(name, rect, TRUE, commit_callback, callback_user_data),
mLineHeight(0),
mScrollLines(0),
mMouseWheelOpaque(true),
mPageLines(0),
mHeadingHeight(20),
mMaxSelectable(0),
@@ -1950,6 +1951,12 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks)
BOOL handled = FALSE;
// Pretend the mouse is over the scrollbar
handled = mScrollbar->handleScrollWheel( 0, 0, clicks );
if (mMouseWheelOpaque)
{
return TRUE;
}
return handled;
}
@@ -2842,6 +2849,8 @@ LLXMLNodePtr LLScrollListCtrl::getXML(bool save_children) const
node->createChild("draw_stripes", TRUE)->setBoolValue(mDrawStripes);
node->createChild("column_padding", TRUE)->setIntValue(mColumnPadding);
node->createChild("mouse_wheel_opaque", TRUE)->setBoolValue(mMouseWheelOpaque);
addColorXML(node, mBgWriteableColor, "bg_writeable_color", "ScrollBgWriteableColor");
addColorXML(node, mBgReadOnlyColor, "bg_read_only_color", "ScrollBgReadOnlyColor");
@@ -2969,6 +2978,9 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
BOOL sort_ascending = TRUE;
node->getAttributeBOOL("sort_ascending", sort_ascending);
BOOL mouse_wheel_opaque = TRUE;
node->getAttributeBOOL("mouse_wheel_opaque", mouse_wheel_opaque);
LLUICtrlCallback callback = NULL;
@@ -2993,6 +3005,8 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
scroll_list->initFromXML(node, parent);
scroll_list->setSearchColumn(search_column);
scroll_list->mMouseWheelOpaque = mouse_wheel_opaque;
LLSD columns;
S32 index = 0;

View File

@@ -671,6 +671,7 @@ private:
BOOL mCommitOnSelectionChange;
BOOL mSelectionChanged;
BOOL mNeedsScroll;
BOOL mMouseWheelOpaque;
BOOL mCanSelect;
BOOL mDisplayColumnHeaders;
BOOL mColumnsDirty;

View File

@@ -898,6 +898,7 @@ void init_client_menu(LLMenuGL* menu)
{
// *TODO: Translate
LLMenuGL* sub = new LLMenuGL("Consoles");
sub->setCanTearOff(TRUE);
menu->addChild(sub);
sub->addChild(new LLMenuItemCheckGL("Frame Console",
&toggle_visibility,
@@ -978,6 +979,7 @@ void init_client_menu(LLMenuGL* menu)
sub_menu = new LLMenuGL("HUD Info");
{
sub_menu->setCanTearOff(TRUE);
sub_menu->addChild(new LLMenuItemCheckGL("Velocity",
&toggle_visibility,
NULL,
@@ -1039,10 +1041,12 @@ void init_client_menu(LLMenuGL* menu)
menu->addSeparator();
sub_menu = new LLMenuGL("Rendering");
sub_menu->setCanTearOff(TRUE);
init_debug_rendering_menu(sub_menu);
menu->addChild(sub_menu);
sub_menu = new LLMenuGL("World");
sub_menu->setCanTearOff(TRUE);
init_debug_world_menu(sub_menu);
menu->addChild(sub_menu);
@@ -1051,6 +1055,7 @@ void init_client_menu(LLMenuGL* menu)
if (rlv_handler_t::isEnabled())
{
sub_menu = new LLMenuGL("RLVa");
sub_menu->setCanTearOff(TRUE);
init_debug_rlva_menu(sub_menu);
menu->addChild(sub_menu);
sub_menu->setVisible(rlv_handler_t::isEnabled());
@@ -1060,20 +1065,24 @@ void init_client_menu(LLMenuGL* menu)
// [/RLVa:KB]
sub_menu = new LLMenuGL("UI");
sub_menu->setCanTearOff(TRUE);
init_debug_ui_menu(sub_menu);
menu->addChild(sub_menu);
sub_menu = new LLMenuGL("XUI");
sub_menu->setCanTearOff(TRUE);
init_debug_xui_menu(sub_menu);
menu->addChild(sub_menu);
sub_menu = new LLMenuGL("Character");
sub_menu->setCanTearOff(TRUE);
init_debug_avatar_menu(sub_menu);
menu->addChild(sub_menu);
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Network");
sub->setCanTearOff(TRUE);
sub->addChild(new LLMenuItemCallGL("Enable Message Log",
&handle_viewer_enable_message_log, NULL));
@@ -1105,6 +1114,7 @@ void init_client_menu(LLMenuGL* menu)
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Recorder");
sub->setCanTearOff(TRUE);
sub->addChild(new LLMenuItemCheckGL("Full Session Logging", &menu_toggle_control, NULL, &menu_check_control, (void*)"StatsSessionTrackFrameStats"));
@@ -1126,6 +1136,7 @@ void init_client_menu(LLMenuGL* menu)
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Media");
sub->setCanTearOff(TRUE);
sub->addChild(new LLMenuItemCallGL("Reload MIME types", &LLMIMETypes::reload));
sub->addChild(new LLMenuItemCallGL("Web Browser Test", &handle_web_browser_test));
menu->addChild( sub );
@@ -1178,6 +1189,7 @@ void init_client_menu(LLMenuGL* menu)
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Debugging");
sub->setCanTearOff(TRUE);
#if LL_WINDOWS
sub->addChild(new LLMenuItemCallGL("Force Breakpoint", &force_error_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT));
#endif
@@ -1324,6 +1336,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
// Debug menu for types/pools
//
sub_menu = new LLMenuGL("Types");
sub_menu->setCanTearOff(TRUE);
menu->addChild(sub_menu);
sub_menu->addChild(new LLMenuItemCheckGL("Simple",
@@ -1382,6 +1395,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
(void*)LLPipeline::RENDER_TYPE_BUMP, '\\', MASK_CONTROL|MASK_ALT|MASK_SHIFT));
sub_menu->createJumpKeys();
sub_menu = new LLMenuGL("Features");
sub_menu->setCanTearOff(TRUE);
menu->addChild(sub_menu);
sub_menu->addChild(new LLMenuItemCheckGL("UI",
&LLPipeline::toggleRenderDebugFeature, NULL,
@@ -1422,6 +1436,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
// Debug menu for info displays
//
sub_menu = new LLMenuGL("Info Displays");
sub_menu->setCanTearOff(TRUE);
menu->addChild(sub_menu);
sub_menu->addChild(new LLMenuItemCheckGL("Verify", &LLPipeline::toggleRenderDebug, NULL,
@@ -1501,6 +1516,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
(void*)LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY)); ;
sub_menu = new LLMenuGL("Render Tests");
sub_menu->setCanTearOff(TRUE);
sub_menu->addChild(new LLMenuItemCheckGL("Camera Offset",
&menu_toggle_control,
@@ -1590,7 +1606,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
void init_debug_avatar_menu(LLMenuGL* menu)
{
LLMenuGL* sub_menu = new LLMenuGL("Character Tests");
menu->addChild(sub_menu);
sub_menu->setCanTearOff(TRUE);
sub_menu->addChild(new LLMenuItemToggleGL("Go Away/AFK When Idle",
&gAllowIdleAFK));
@@ -1668,6 +1684,7 @@ void init_debug_rlva_menu(LLMenuGL* menu)
// Debug options
{
LLMenuGL* pDbgMenu = new LLMenuGL("Debug");
pDbgMenu->setCanTearOff(TRUE);
if (gSavedSettings.controlExists(RLV_SETTING_DEBUG))
pDbgMenu->addChild(new LLMenuItemCheckGL("Show Debug Messages", menu_toggle_control, NULL, menu_check_control, (void*)RLV_SETTING_DEBUG));