diff options
| author | Merov Linden <merov@lindenlab.com> | 2010-10-20 20:50:20 -0700 | 
|---|---|---|
| committer | Merov Linden <merov@lindenlab.com> | 2010-10-20 20:50:20 -0700 | 
| commit | f38d21fe60945d71f8740f6aba58b40d4a722d58 (patch) | |
| tree | 5622ef17bb53f05027881914622463ac1426eb14 /indra | |
| parent | 9652de51ce5a64136b66c04461b12005568bd5f1 (diff) | |
| parent | c12c60df4a28b3cb91870ae0666eb6b3422ff96b (diff) | |
STORM-263 : merge to viewer-development
Diffstat (limited to 'indra')
25 files changed, 193 insertions, 223 deletions
| diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index 3df05f4d3f..c1b5efaa72 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -45,7 +45,8 @@ LLMenuButton::Params::Params()  LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)  :	LLButton(p),  	mMenu(NULL), -	mMenuVisibleLastFrame(false) +	mMenuVisibleLastFrame(false), +	mMenuPosition(MP_BOTTOM_LEFT)  {  	std::string menu_filename = p.menu_filename; @@ -57,38 +58,51 @@ LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)  			llwarns << "Error loading menu_button menu" << llendl;  		}  	} + +	updateMenuOrigin();  } -void LLMenuButton::toggleMenu() +boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_signal_t::slot_type& cb )  { -    if(!mMenu) -		return; +	return LLUICtrl::setMouseDownCallback(cb); +} -	if (mMenu->getVisible() || mMenuVisibleLastFrame) -	{ -		mMenu->setVisible(FALSE); -	} -	else +void LLMenuButton::hideMenu() +{ +	if(!mMenu) return; +	mMenu->setVisible(FALSE); +} + +void LLMenuButton::setMenu(LLMenuGL* menu, EMenuPosition position /*MP_TOP_LEFT*/) +{ +	mMenu = menu; +	mMenuPosition = position; +} + +void LLMenuButton::draw() +{ +	//we save this off so next frame when we try to close it by +	//button click, and it hides menus before we get to it, we know +	mMenuVisibleLastFrame = mMenu && mMenu->getVisible(); + +	if (mMenuVisibleLastFrame)  	{ -	    LLRect rect = getRect(); -		//mMenu->needsArrange(); //so it recalculates the visible elements -		LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom); +		setForcePressedState(true);  	} -} +	LLButton::draw(); -void LLMenuButton::hideMenu()  -{  -	if(!mMenu) -		return; -	mMenu->setVisible(FALSE);  +	setForcePressedState(false);  } -  BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )  {  	if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key))  	{ +		// *HACK: We emit the mouse down signal to fire the callback bound to the +		// menu emerging event before actually displaying the menu. See STORM-263. +		LLUICtrl::handleMouseDown(-1, -1, MASK_NONE); +  		toggleMenu();  		return TRUE;  	} @@ -104,34 +118,52 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )  BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)  { -	if (hasTabStop() && !getIsChrome()) -	{ -		setFocus(TRUE); -	} - +	LLButton::handleMouseDown(x, y, mask);  	toggleMenu(); -	if (getSoundFlags() & MOUSE_DOWN) -	{ -		make_ui_sound("UISndClick"); -	} -  	return TRUE;  } -void LLMenuButton::draw() +void LLMenuButton::toggleMenu()  { -	//we save this off so next frame when we try to close it by  -	//button click, and it hides menus before we get to it, we know -	mMenuVisibleLastFrame = mMenu && mMenu->getVisible(); -	 -	if (mMenuVisibleLastFrame) +    if(!mMenu) return; + +	if (mMenu->getVisible() || mMenuVisibleLastFrame)  	{ -		setForcePressedState(true); +		mMenu->setVisible(FALSE);  	} +	else +	{ +		mMenu->buildDrawLabels(); +		mMenu->arrangeAndClear(); +		mMenu->updateParent(LLMenuGL::sMenuContainer); -	LLButton::draw(); +		updateMenuOrigin(); -	setForcePressedState(false); +	    //mMenu->needsArrange(); //so it recalculates the visible elements +		LLMenuGL::showPopup(getParent(), mMenu, mX, mY); +	}  } +void LLMenuButton::updateMenuOrigin() +{ +	if (!mMenu)	return; + +	LLRect rect = getRect(); + +	switch (mMenuPosition) +	{ +		case MP_TOP_LEFT: +		{ +			mX = rect.mLeft; +			mY = rect.mTop + mMenu->getRect().getHeight(); +			break; +		} +		case MP_BOTTOM_LEFT: +		{ +			mX = rect.mLeft; +			mY = rect.mBottom; +			break; +		} +	} +} diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 81ca0e047c..81c3592b16 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -42,22 +42,40 @@ public:  		Optional<std::string>	menu_filename;  		Params(); -	};	 +	}; + +	typedef enum e_menu_position +	{ +		MP_TOP_LEFT, +		MP_BOTTOM_LEFT +	} EMenuPosition; -	void toggleMenu(); +	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ); +  	/*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, EMenuPosition position = MP_TOP_LEFT); + +	void setMenuPosition(EMenuPosition position) { mMenuPosition = position; }  protected:  	friend class LLUICtrlFactory;  	LLMenuButton(const Params&); +	void toggleMenu(); +	void updateMenuOrigin(); +  private: -	LLMenuGL*	mMenu; -	bool mMenuVisibleLastFrame; +	LLMenuGL*		mMenu; +	bool 			mMenuVisibleLastFrame; +	EMenuPosition	mMenuPosition; +	S32				mX; +	S32				mY;  }; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index db9d386b6b..33c968bf00 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -38,6 +38,7 @@  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "lllistcontextmenu.h" +#include "llmenubutton.h"  #include "llnotificationsutil.h"  #include "lloutfitobserver.h"  #include "llsidetray.h" @@ -126,18 +127,6 @@ public:  		llassert(mMenu);  	} -	void show(LLView* spawning_view) -	{ -		if (!mMenu) return; - -		updateItemsVisibility(); -		mMenu->buildDrawLabels(); -		mMenu->updateParent(LLMenuGL::sMenuContainer); -		S32 menu_x = 0; -		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); -		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); -	} -  	void updateItemsVisibility()  	{  		if (!mMenu) return; @@ -148,6 +137,8 @@ public:  		mMenu->arrangeAndClear(); // update menu height  	} +	LLMenuGL* getMenu() { return mMenu; } +  private:  	const LLUUID& getSelectedOutfitID()  	{ @@ -386,6 +377,11 @@ BOOL LLOutfitsList::postBuild()  	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");  	mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); +	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + +	menu_gear_btn->setMouseDownCallback(boost::bind(&LLOutfitListGearMenu::updateItemsVisibility, mGearMenu)); +	menu_gear_btn->setMenu(mGearMenu->getMenu()); +  	return TRUE;  } @@ -727,13 +723,6 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata)  	return false;  } -// virtual -void LLOutfitsList::showGearMenu(LLView* spawning_view) -{ -	if (!mGearMenu) return; -	mGearMenu->show(spawning_view); -} -  void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const  {  	// Collect selected items from all selected lists. diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index f73ae5bef2..5fecbb83e7 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -94,8 +94,6 @@ public:  	/*virtual*/ bool isActionEnabled(const LLSD& userdata); -	/*virtual*/ void showGearMenu(LLView* spawning_view); -  	const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; }  	/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index 81366c5db4..2ed6b00497 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -39,8 +39,6 @@ public:  	virtual bool isActionEnabled(const LLSD& userdata) = 0; -	virtual void showGearMenu(LLView* spawning_view) = 0; -  	virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {}  	static const std::string& getFilterSubString() { return sFilterSubString; } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index c4a484d368..e5695f420a 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -47,6 +47,7 @@  #include "llinventorymodelbackgroundfetch.h"  #include "llinventorypanel.h"  #include "lllandmarkactions.h" +#include "llmenubutton.h"  #include "llplacesinventorybridge.h"  #include "llplacesinventorypanel.h"  #include "llsidetray.h" @@ -191,6 +192,7 @@ LLLandmarksPanel::LLLandmarksPanel()  	,	mLibraryInventoryPanel(NULL)  	,	mCurrentSelectedList(NULL)  	,	mListCommands(NULL) +	,	mGearButton(NULL)  	,	mGearFolderMenu(NULL)  	,	mGearLandmarkMenu(NULL)  { @@ -685,7 +687,9 @@ void LLLandmarksPanel::initListCommandsHandlers()  {  	mListCommands = getChild<LLPanel>("bottom_panel"); -	mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); +	mGearButton = getChild<LLMenuButton>(OPTIONS_BUTTON_NAME); +	mGearButton->setMouseDownCallback(boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); +  	mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this));  	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); @@ -741,7 +745,7 @@ void LLLandmarksPanel::onActionsButtonClick()  		}  	} -	showActionMenu(menu,OPTIONS_BUTTON_NAME); +	mGearButton->setMenu(menu);  }  void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) @@ -750,7 +754,10 @@ void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_  	{  		menu->buildDrawLabels();  		menu->updateParent(LLMenuGL::sMenuContainer); -		LLView* spawning_view = getChild<LLView> (spawning_view_name); +		menu->arrangeAndClear(); + +		LLView* spawning_view = getChild<LLView>(spawning_view_name); +  		S32 menu_x, menu_y;  		//show menu in co-ordinates of panel  		spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0d4402d8cb..28c19d3e5f 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -39,6 +39,7 @@  class LLAccordionCtrlTab;  class LLFolderViewItem; +class LLMenuButton;  class LLMenuGL;  class LLInventoryPanel;  class LLPlacesInventoryPanel; @@ -155,6 +156,7 @@ private:  	LLPlacesInventoryPanel*		mLandmarksInventoryPanel;  	LLPlacesInventoryPanel*		mMyInventoryPanel;  	LLPlacesInventoryPanel*		mLibraryInventoryPanel; +	LLMenuButton*				mGearButton;  	LLMenuGL*					mGearLandmarkMenu;  	LLMenuGL*					mGearFolderMenu;  	LLMenuGL*					mMenuAdd; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 5b07e4863b..cc69dbd9d4 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -39,6 +39,7 @@  #include "llinventorypanel.h"  #include "llfiltereditor.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "lloutfitobserver.h"  #include "llpreviewtexture.h"  #include "llresmgr.h" @@ -192,6 +193,8 @@ BOOL LLPanelMainInventory::postBuild()  		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));  	} +	mGearMenuButton = getChild<LLMenuButton>("options_gear_btn"); +  	initListCommandsHandlers();  	// *TODO:Get the cost info from the server @@ -900,7 +903,6 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)  void LLPanelMainInventory::initListCommandsHandlers()  { -	childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));  	childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));  	childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); @@ -914,6 +916,7 @@ void LLPanelMainInventory::initListCommandsHandlers()  	mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));  	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));  	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mGearMenuButton->setMenu(mMenuGearDefault);  	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	// Update the trash button when selected item(s) get worn or taken off. @@ -927,11 +930,6 @@ void LLPanelMainInventory::updateListCommands()  	mTrashButton->setEnabled(trash_enabled);  } -void LLPanelMainInventory::onGearButtonClick() -{ -	showActionMenu(mMenuGearDefault,"options_gear_btn"); -} -  void LLPanelMainInventory::onAddButtonClick()  {  	setUploadCostIfNeeded(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index cf2cc14531..f95a99157d 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -40,6 +40,7 @@ class LLSaveFolderState;  class LLFilterEditor;  class LLTabContainer;  class LLFloaterInventoryFinder; +class LLMenuButton;  class LLMenuGL;  class LLFloater; @@ -129,7 +130,6 @@ private:  protected:  	void initListCommandsHandlers();  	void updateListCommands(); -	void onGearButtonClick();  	void onAddButtonClick();  	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);  	void onTrashButtonClick(); @@ -145,6 +145,7 @@ private:  	LLDragAndDropButton*		mTrashButton;  	LLMenuGL*					mMenuGearDefault;  	LLMenuGL*					mMenuAdd; +	LLMenuButton*				mGearMenuButton;  	bool						mNeedUploadCost;  	// List Commands                                                              // diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 494db01f77..5638374178 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -56,6 +56,7 @@  #include "llinventorymodel.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llloadingindicator.h" +#include "llmenubutton.h"  #include "llpaneloutfitsinventory.h"  #include "lluiconstants.h"  #include "llsaveoutfitcombobtn.h" @@ -403,7 +404,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mAddWearablesPanel(NULL),  	mFolderViewFilterCmbBox(NULL),  	mListViewFilterCmbBox(NULL), -	mPlusBtn(NULL) +	mPlusBtn(NULL), +	mWearablesGearMenuBtn(NULL), +	mGearMenuBtn(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -478,13 +481,14 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);  	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);  	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL); -	childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); -	childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);  	childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);  	childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);  	setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2)); +	mWearablesGearMenuBtn = getChild<LLMenuButton>("wearables_gear_menu_btn"); +	mGearMenuBtn = getChild<LLMenuButton>("gear_menu_btn"); +  	mCOFWearables = findChild<LLCOFWearables>("cof_wearables_list");  	mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); @@ -557,6 +561,13 @@ BOOL LLPanelOutfitEdit::postBuild()  	mWearableItemsList->setComparator(mWearableListViewItemsComparator); +	// Creating "Add Wearables" panel gear menu after initialization of mWearableItemsList and mInventoryItemsPanel. +	mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); +	mWearablesGearMenuBtn->setMenu(mAddWearablesGearMenu); + +	mGearMenu = LLPanelOutfitEditGearMenu::create(); +	mGearMenuBtn->setMenu(mGearMenu); +  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));  	return TRUE;  } @@ -1256,37 +1267,6 @@ void LLPanelOutfitEdit::resetAccordionState()  	}  } -void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button) -{ -	LLMenuGL* menu = NULL; - -	if (mAddWearablesPanel->getVisible()) -	{ -		if (!mAddWearablesGearMenu) -		{ -			mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); -		} - -		menu = mAddWearablesGearMenu; -	} -	else -	{ -		if (!mGearMenu) -		{ -			mGearMenu = LLPanelOutfitEditGearMenu::create(); -		} - -		menu = mGearMenu; -	} - -	if (!menu) return; - -	menu->arrangeAndClear(); // update menu height -	S32 menu_y = menu->getRect().getHeight() + clicked_button->getRect().getHeight(); -	menu->buildDrawLabels(); -	LLMenuGL::showPopup(clicked_button, menu, 0, menu_y); -} -  void LLPanelOutfitEdit::onAddMoreButtonClicked()  {  	toggleAddWearablesPanel(); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 2dca986e33..963db84503 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -54,6 +54,7 @@ class LLScrollListCtrl;  class LLToggleableMenu;  class LLFilterEditor;  class LLFilteredWearableListManager; +class LLMenuButton;  class LLMenuGL;  class LLFindNonLinksByMask;  class LLFindWearablesOfType; @@ -186,8 +187,6 @@ public:  									  std::string& tooltip_msg);  private: - -	void onGearButtonClick(LLUICtrl* clicked_button);  	void onAddMoreButtonClicked();  	void showFilteredWearablesListView(LLWearableType::EType type);  	void onOutfitChanging(bool started); @@ -238,8 +237,8 @@ private:  	LLMenuGL*			mAddWearablesGearMenu;  	bool				mInitialized;  	std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; - - +	LLMenuButton*		mWearablesGearMenuBtn; +	LLMenuButton*		mGearMenuBtn;  }; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index d6d8a38ebe..4f2cfa2bbc 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -232,9 +232,7 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()  {  	mListCommands = getChild<LLPanel>("bottom_panel");  	mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); -	mMyOutfitsPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this));  	mMyOutfitsPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); -	mCurrentOutfitPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this));  }  void LLPanelOutfitsInventory::updateListCommands() @@ -258,14 +256,6 @@ void LLPanelOutfitsInventory::updateListCommands()  	}  } -void LLPanelOutfitsInventory::showGearMenu() -{ -	if (!mActivePanel) return; - -	LLView* spawning_view = getChild<LLView>("options_gear_btn"); -	mActivePanel->showGearMenu(spawning_view); -} -  void LLPanelOutfitsInventory::onTrashButtonClick()  {  	LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLPanelOutfitsInventory::onOutfitsRemovalConfirmation, this, _1, _2)); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 040b5319b9..b79a2d3224 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -29,6 +29,7 @@  // libs  #include "llavatarname.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "llmenugl.h"  #include "llnotificationsutil.h"  #include "lleventtimer.h" @@ -464,7 +465,11 @@ LLPanelPeople::LLPanelPeople()  		mAllFriendList(NULL),  		mNearbyList(NULL),  		mRecentList(NULL), -		mGroupList(NULL) +		mGroupList(NULL), +		mNearbyGearButton(NULL), +		mFriendsGearButton(NULL), +		mGroupsGearButton(NULL), +		mRecentGearButton(NULL)  {  	mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList,	this));  	mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList,	this)); @@ -600,11 +605,6 @@ BOOL LLPanelPeople::postBuild()  	buttonSetAction("teleport_btn",		boost::bind(&LLPanelPeople::onTeleportButtonClicked,	this));  	buttonSetAction("share_btn",		boost::bind(&LLPanelPeople::onShareButtonClicked,		this)); -	getChild<LLPanel>(NEARBY_TAB_NAME)->childSetAction("nearby_view_sort_btn",boost::bind(&LLPanelPeople::onNearbyViewSortButtonClicked,		this)); -	getChild<LLPanel>(RECENT_TAB_NAME)->childSetAction("recent_viewsort_btn",boost::bind(&LLPanelPeople::onRecentViewSortButtonClicked,			this)); -	getChild<LLPanel>(FRIENDS_TAB_NAME)->childSetAction("friends_viewsort_btn",boost::bind(&LLPanelPeople::onFriendsViewSortButtonClicked,		this)); -	getChild<LLPanel>(GROUP_TAB_NAME)->childSetAction("groups_viewsort_btn",boost::bind(&LLPanelPeople::onGroupsViewSortButtonClicked,		this)); -  	// Must go after setting commit callback and initializing all pointers to children.  	mTabContainer->selectTabByName(NEARBY_TAB_NAME); @@ -624,24 +624,41 @@ BOOL LLPanelPeople::postBuild()  	enable_registrar.add("People.Recent.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck,	this, _2));  	enable_registrar.add("People.Nearby.ViewSort.CheckItem",	boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck,	this, _2)); +	mNearbyGearButton = getChild<LLMenuButton>("nearby_view_sort_btn"); +	mFriendsGearButton = getChild<LLMenuButton>("friends_viewsort_btn"); +	mGroupsGearButton = getChild<LLMenuButton>("groups_viewsort_btn"); +	mRecentGearButton = getChild<LLMenuButton>("recent_viewsort_btn"); +  	LLMenuGL* plus_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	mGroupPlusMenuHandle  = plus_menu->getHandle();  	LLMenuGL* nearby_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_nearby_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(nearby_view_sort) +	{  		mNearbyViewSortMenuHandle  = nearby_view_sort->getHandle(); +		mNearbyGearButton->setMenu(nearby_view_sort); +	}  	LLMenuGL* friend_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_friends_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(friend_view_sort) +	{  		mFriendsViewSortMenuHandle  = friend_view_sort->getHandle(); +		mFriendsGearButton->setMenu(friend_view_sort); +	}  	LLMenuGL* group_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(group_view_sort) +	{  		mGroupsViewSortMenuHandle  = group_view_sort->getHandle(); +		mGroupsGearButton->setMenu(group_view_sort); +	}  	LLMenuGL* recent_view_sort  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_recent_view_sort.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if(recent_view_sort) +	{  		mRecentViewSortMenuHandle  = recent_view_sort->getHandle(); +		mRecentGearButton->setMenu(recent_view_sort); +	}  	LLVoiceClient::getInstance()->addObserver(this); @@ -911,7 +928,7 @@ void LLPanelPeople::showGroupMenu(LLMenuGL* menu)  	// Calculate its coordinates.  	// (assumes that groups panel is the current tab) -	LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel");  +	LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel");  	LLPanel* parent_panel = mTabContainer->getCurrentPanel();  	menu->arrangeAndClear();  	S32 menu_height = menu->getRect().getHeight(); @@ -1346,38 +1363,6 @@ void LLPanelPeople::onMoreButtonClicked()  	// *TODO: not implemented yet  } -void LLPanelPeople::onFriendsViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mFriendsViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onGroupsViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mGroupsViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onRecentViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mRecentViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} - -void LLPanelPeople::onNearbyViewSortButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mNearbyViewSortMenuHandle.get(); -	if (!menu) -		return; -	showGroupMenu(menu); -} -  void	LLPanelPeople::onOpen(const LLSD& key)  {  	std::string tab_name = key["people_panel_tab_name"]; diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index f5ff09b038..4412aed062 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -36,6 +36,7 @@ class LLAvatarList;  class LLAvatarName;  class LLFilterEditor;  class LLGroupList; +class LLMenuButton;  class LLTabContainer;  class LLPanelPeople  @@ -101,10 +102,6 @@ private:  	void					onShareButtonClicked();  	void					onMoreButtonClicked();  	void					onActivateButtonClicked(); -	void					onRecentViewSortButtonClicked(); -	void					onNearbyViewSortButtonClicked(); -	void					onFriendsViewSortButtonClicked(); -	void					onGroupsViewSortButtonClicked();  	void					onAvatarListDoubleClicked(LLUICtrl* ctrl);  	void					onAvatarListCommitted(LLAvatarList* list);  	void					onGroupPlusButtonClicked(); @@ -156,6 +153,11 @@ private:  	Updater*				mNearbyListUpdater;  	Updater*				mRecentListUpdater; +	LLMenuButton*			mNearbyGearButton; +	LLMenuButton*			mFriendsGearButton; +	LLMenuButton*			mGroupsGearButton; +	LLMenuButton*			mRecentGearButton; +  	std::string				mFilterSubString;  	std::string				mFilterSubStringOrig;  }; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 9b8167b15a..766f93e0a5 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -27,6 +27,7 @@  #include "llviewerprecompiledheaders.h"  #include "llfloaterreg.h" +#include "llmenubutton.h"  #include "llfloaterworldmap.h"  #include "llpanelteleporthistory.h" @@ -375,7 +376,8 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()  		mHistoryAccordion(NULL),  		mAccordionTabMenu(NULL),  		mLastSelectedFlatlList(NULL), -		mLastSelectedItemIndex(-1) +		mLastSelectedItemIndex(-1), +		mMenuGearButton(NULL)  {  	buildFromFile( "panel_teleport_history.xml");  } @@ -439,8 +441,6 @@ BOOL LLTeleportHistoryPanel::postBuild()  		}  	} -	getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this)); -  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  	registrar.add("TeleportHistory.ExpandAllFolders",  boost::bind(&LLTeleportHistoryPanel::onExpandAllFolders,  this)); @@ -448,9 +448,14 @@ BOOL LLTeleportHistoryPanel::postBuild()  	registrar.add("TeleportHistory.ClearTeleportHistory",  boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistory,  this));  	mEnableCallbackRegistrar.add("TeleportHistory.GearMenu.Enable", boost::bind(&LLTeleportHistoryPanel::isActionEnabled, this, _2)); -	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mMenuGearButton = getChild<LLMenuButton>("gear_btn"); + +	LLMenuGL* gear_menu  = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml",  gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());;  	if(gear_menu) +	{  		mGearMenuHandle  = gear_menu->getHandle(); +		mMenuGearButton->setMenu(gear_menu); +	}  	return TRUE;  } @@ -985,27 +990,6 @@ LLFlatListView* LLTeleportHistoryPanel::getFlatListViewFromTab(LLAccordionCtrlTa  	return NULL;  } -void LLTeleportHistoryPanel::onGearButtonClicked() -{ -	LLMenuGL* menu = (LLMenuGL*)mGearMenuHandle.get(); -	if (!menu) -		return; - -	// Shows the menu at the top of the button bar. - -	// Calculate its coordinates. -	LLPanel* bottom_panel = getChild<LLPanel>("bottom_panel"); -	menu->arrangeAndClear(); -	S32 menu_height = menu->getRect().getHeight(); -	S32 menu_x = -2; // *HACK: compensates HPAD in showPopup() -	S32 menu_y = bottom_panel->getRect().mTop + menu_height; - -	// Actually show the menu. -	menu->buildDrawLabels(); -	menu->updateParent(LLMenuGL::sMenuContainer); -	LLMenuGL::showPopup(this, menu, menu_x, menu_y); -} -  bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const  {  	S32 tabs_cnt = mItemContainers.size(); diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index b5a025b39b..3d29454d15 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -38,6 +38,7 @@ class LLTeleportHistoryStorage;  class LLAccordionCtrl;  class LLAccordionCtrlTab;  class LLFlatListView; +class LLMenuButton;  class LLTeleportHistoryPanel : public LLPanelPlacesTab  { @@ -94,7 +95,6 @@ private:  	void showTeleportHistory();  	void handleItemSelect(LLFlatListView* );  	LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *); -	void onGearButtonClicked();  	bool isActionEnabled(const LLSD& userdata) const;  	void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); @@ -118,6 +118,7 @@ private:  	ContextMenu mContextMenu;  	LLContextMenu*			mAccordionTabMenu;  	LLHandle<LLView>		mGearMenuHandle; +	LLMenuButton*			mMenuGearButton;  }; diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 860470cd73..3b3d0cdce5 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -32,6 +32,7 @@  #include "llinventoryfunctions.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h" +#include "llmenubutton.h"  #include "llsidetray.h"  #include "llviewermenu.h"  #include "llwearableitemslist.h" @@ -63,16 +64,7 @@ public:  		llassert(mMenu);  	} -	void show(LLView* spawning_view) -	{ -		if (!mMenu) return; - -		mMenu->buildDrawLabels(); -		mMenu->updateParent(LLMenuGL::sMenuContainer); -		S32 menu_x = 0; -		S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); -		LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); -	} +	LLMenuGL* getMenu() { return mMenu; }  private: @@ -189,6 +181,10 @@ BOOL LLPanelWearing::postBuild()  	mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list");  	mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3)); +	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + +	menu_gear_btn->setMenu(mGearMenu->getMenu()); +  	return TRUE;  } @@ -253,13 +249,6 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata)  	return false;  } -// virtual -void LLPanelWearing::showGearMenu(LLView* spawning_view) -{ -	if (!mGearMenu) return; -	mGearMenu->show(spawning_view); -} -  boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb)  {  	if (!mCOFItemsList) return boost::signals2::connection(); diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 1fa97735b1..157b2c4c5f 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -58,8 +58,6 @@ public:  	/*virtual*/ bool isActionEnabled(const LLSD& userdata); -	/*virtual*/ void showGearMenu(LLView* spawning_view); -  	/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;  	boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb); diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 2ae46f79a5..2a5933e3e9 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -115,7 +115,7 @@  		       layout="topleft"  		       name="options_gear_btn_panel"  		       width="32"> -		          <button +		          <menu_button  		           follows="bottom|left"  		           tool_tip="Show additional options"  		           height="25" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 16529f4064..2b6e082542 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -119,7 +119,7 @@         layout="topleft"         name="options_gear_btn_panel"         width="32"> -          <button +          <menu_button             follows="bottom|left"             tool_tip="Show additional options"             height="25" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index bc050f9ad1..f4dee9cd55 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -378,7 +378,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap       name="no_add_wearables_button_bar"       top_pad="0"       width="313"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" @@ -426,7 +426,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap       top_delta="0"       visible="false"       width="313"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index d18f0d57ca..9f98019c94 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -35,7 +35,7 @@  	 visible="true"  	 name="bottom_panel"  	 width="312"> -     <button +     <menu_button         follows="bottom|left"         tool_tip="Show additional options"         height="25" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml index 2fbbf6610c..d85b778db2 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml @@ -29,7 +29,7 @@       name="bottom_panel"       top_pad="0"       width="312"> -        <button +        <menu_button           follows="bottom|left"           height="25"           image_hover_unselected="Toolbar_Left_Over" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index e7a0b768c6..d34c0c29a8 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -114,7 +114,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -             <button +             <menu_button               follows="bottom|left"               height="25"               image_hover_unselected="Toolbar_Left_Over" @@ -242,7 +242,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M  				       layout="topleft"  				       name="options_gear_btn_panel"  				       width="32"> -				          <button +				          <menu_button  				           follows="bottom|left"  				           tool_tip="Show additional options"  				           height="25" @@ -407,7 +407,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -               <button +               <menu_button                 follows="bottom|left"                 tool_tip="Options"                 height="25" @@ -490,7 +490,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M               name="bottom_panel"               top_pad="0"               width="313"> -               <button +               <menu_button                 follows="bottom|left"                 tool_tip="Options"                 height="25" @@ -499,7 +499,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M                 image_selected="Toolbar_Left_Selected"                 image_unselected="Toolbar_Left_Off"                 layout="topleft" -               left="3"                 name="recent_viewsort_btn"                 top="1"                 width="31" /> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index bf09836e87..768efc2f3f 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -157,7 +157,7 @@       left="3"       name="bottom_panel"       width="313"> -        <button +        <menu_button           follows="bottom|left"           tool_tip="Show additional options"           height="25" | 
