diff options
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 46 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.h | 29 | ||||
| -rw-r--r-- | indra/newview/llpaneloutfitsinventory.cpp | 262 | ||||
| -rw-r--r-- | indra/newview/llpaneloutfitsinventory.h | 36 | ||||
| -rw-r--r-- | indra/newview/llsidepanelappearance.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llsidepanelappearance.h | 4 | 
6 files changed, 264 insertions, 132 deletions
| diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 6c7d434eeb..9f723169e1 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -197,28 +197,6 @@ BOOL LLPanelMainInventory::postBuild()  	return TRUE;
  }
 -void LLPanelMainInventory::initListCommandsHandlers()
 -{
 -	mListCommands = getChild<LLPanel>("bottom_panel");
 -
 -	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
 -	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
 -	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
 -
 -	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
 -	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
 -			,	_4 // BOOL drop
 -			,	_5 // EDragAndDropType cargo_type
 -			,	_7 // EAcceptance* accept
 -			));
 -
 -	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());
 -	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 -	
 -}
 -
  // Destroys the object
  LLPanelMainInventory::~LLPanelMainInventory( void )
  {
 @@ -863,9 +841,30 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)  	self->childSetValue("check_snapshot", FALSE);
  }
 +//////////////////////////////////////////////////////////////////////////////////
 +// List Commands                                                                //
 +void LLPanelMainInventory::initListCommandsHandlers()
 +{
 +	mListCommands = getChild<LLPanel>("bottom_panel");
 +	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
 +	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
 +	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
 +	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
 +	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
 +			,	_4 // BOOL drop
 +			,	_5 // EDragAndDropType cargo_type
 +			,	_7 // EAcceptance* accept
 +			));
 +
 +	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());
 +	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 +	
 +}
  void LLPanelMainInventory::updateListCommands()
  {
 @@ -1018,3 +1017,6 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType  	}
  	return true;
  }
 +
 +// List Commands                                                              //
 +////////////////////////////////////////////////////////////////////////////////
 diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index fbc0f09c50..627be21577 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -111,7 +111,20 @@ protected:  	void resetFilters();
  	void setSortBy(const LLSD& userdata);
 -	// List Commands Handlers
 +private:
 +	LLFloaterInventoryFinder* getFinder();
 +
 +	LLFilterEditor*				mFilterEditor;
 +	LLTabContainer*				mFilterTabs;
 +	LLHandle<LLFloater>			mFinderHandle;
 +	LLInventoryPanel*			mActivePanel;
 +	LLSaveFolderState*			mSavedFolderState;
 +	std::string					mFilterText;
 +
 +
 +	//////////////////////////////////////////////////////////////////////////////////
 +	// List Commands                                                                //
 +protected:
  	void initListCommandsHandlers();
  	void updateListCommands();
  	void onGearButtonClick();
 @@ -122,22 +135,12 @@ protected:  	BOOL isActionEnabled(const LLSD& command_name);
  	void onCustomAction(const LLSD& command_name);
  	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
 -
 -
  private:
 -	LLFloaterInventoryFinder* getFinder();
 -
 -	LLFilterEditor*				mFilterEditor;
 -	LLTabContainer*				mFilterTabs;
 -	LLHandle<LLFloater>			mFinderHandle;
 -	LLInventoryPanel*			mActivePanel;
 -	LLSaveFolderState*			mSavedFolderState;
 -
  	LLPanel*					mListCommands;
  	LLMenuGL*					mMenuGearDefault;
  	LLMenuGL*					mMenuAdd;
 -
 -	std::string					mFilterText;
 +	// List Commands                                                              //
 +	////////////////////////////////////////////////////////////////////////////////
  };
  #endif // LL_LLPANELMAININVENTORY_H
 diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 2964bbe792..5ad9bf056e 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -34,34 +34,36 @@  #include "llpaneloutfitsinventory.h"  #include "llagent.h" +#include "llagentwearables.h" +  #include "llbutton.h"  #include "llfloaterreg.h" -#include "lllandmark.h" -  #include "llfloaterworldmap.h"  #include "llfloaterinventory.h"  #include "llfoldervieweventlistener.h"  #include "llinventoryfunctions.h"  #include "llinventorypanel.h" +#include "lllandmark.h" +#include "llsidepanelappearance.h"  #include "llsidetray.h"  #include "lltabcontainer.h" -#include "llagentwearables.h" -#include "llviewerjointattachment.h"  #include "llviewerfoldertype.h" +#include "llviewerjointattachment.h"  #include "llvoavatarself.h" +// List Commands +#include "lldndbutton.h" +#include "llmenugl.h" +#include "llviewermenu.h" +  static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");  LLPanelOutfitsInventory::LLPanelOutfitsInventory() :  	mInventoryPanel(NULL), -	mActionBtn(NULL), -	mWearBtn(NULL), -	mEditBtn(NULL) +	mParent(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); - -	// LLUICtrlFactory::getInstance()->buildPanel(this, "panel_outfits_inventory.xml");  }  LLPanelOutfitsInventory::~LLPanelOutfitsInventory() @@ -78,16 +80,23 @@ BOOL LLPanelOutfitsInventory::postBuild()  	mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS);  	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2)); -	LLFolderView* root_folder = getRootFolder(); -	root_folder->setReshapeCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2)); -	 -	mWearBtn = getChild<LLButton>("wear_btn"); -	mEditBtn = getChild<LLButton>("edit_btn"); -	mActionBtn = getChild<LLButton>("action_btn"); -	 +	initListCommandsHandlers();  	return TRUE;  } +void LLPanelOutfitsInventory::updateParent() +{ +	if (mParent) +	{ +		mParent->updateVerbs(); +	} +} + +void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent) +{ +	mParent = parent; +} +  // virtual  void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  { @@ -124,12 +133,8 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  void LLPanelOutfitsInventory::onWear()  { -	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); -	if (!current_item) -		return; - -	LLFolderViewEventListener* listenerp = current_item->getListener(); -	if (getIsCorrectType(listenerp)) +	LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); +	if (listenerp)  	{  		listenerp->performAction(NULL, NULL,"replaceoutfit");  	} @@ -147,66 +152,9 @@ void LLPanelOutfitsInventory::onNew()  	getRootFolder()->setNeedsAutoRename(TRUE);  } -void LLPanelOutfitsInventory::updateVerbs() -{ -	BOOL enabled = FALSE; - -	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); -	if (current_item) -	{ -		LLFolderViewEventListener* listenerp = current_item->getListener(); -		if (getIsCorrectType(listenerp)) -		{ -			enabled = TRUE; -		} -	} - -	if (mWearBtn) -	{ -		mWearBtn->setEnabled(enabled); -	} -	// mEditBtn->setEnabled(enabled); -} -  void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)  { -	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); -	if (!current_item) -		return; -	 -	/* -	  LLFolderViewEventListener* listenerp = current_item->getListener(); -	  if (getIsCorrectType(listenerp)) -	  { -	  S32 bottom = 0; -	  LLFolderViewItem* folder = current_item->getParentFolder(); - -	  while ( folder->getParentFolder() != NULL ) -	  { -	  bottom += folder->getRect().mBottom; -	  folder = folder->getParentFolder(); -	  } - -	  LLRect rect = current_item->getRect(); -	  LLRect btn_rect( -	  rect.mRight - mActionBtn->getRect().getWidth(), -	  bottom + rect.mTop, -	  rect.mRight, -	  bottom + rect.mBottom); - -	  mActionBtn->setRect(btn_rect); - -	  if (!mActionBtn->getVisible()) -	  mActionBtn->setVisible(TRUE); -	  } -	  else -	  { -	  if (mActionBtn->getVisible()) -	  mActionBtn->setVisible(FALSE); -	  }  -	*/ - -	updateVerbs(); +	updateParent();  }  void LLPanelOutfitsInventory::onSelectorButtonClicked() @@ -226,6 +174,20 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()  	*/  } +LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() +{ +	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); +	if (!current_item) +		return NULL; + +	LLFolderViewEventListener* listenerp = current_item->getListener(); +	if (getIsCorrectType(listenerp)) +	{ +		return listenerp; +	} +	return NULL; +} +  bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const  {  	if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) @@ -243,3 +205,143 @@ LLFolderView *LLPanelOutfitsInventory::getRootFolder()  {  	return mInventoryPanel->getRootFolder();  } + +////////////////////////////////////////////////////////////////////////////////// +// List Commands                                                                // + +void LLPanelOutfitsInventory::initListCommandsHandlers() +{ +	mListCommands = getChild<LLPanel>("bottom_panel"); + +	mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this)); +	mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); +	mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this)); + +	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); +	trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this +			,	_4 // BOOL drop +			,	_5 // EDragAndDropType cargo_type +			,	_7 // EAcceptance* accept +			)); + +	mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2)); +	mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2)); +	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + +void LLPanelOutfitsInventory::updateListCommands() +{ +	bool trash_enabled = isActionEnabled("delete"); + +	mListCommands->childSetEnabled("trash_btn", trash_enabled); +} + +void LLPanelOutfitsInventory::onGearButtonClick() +{ +	showActionMenu(mMenuGearDefault,"options_gear_btn"); +} + +void LLPanelOutfitsInventory::onAddButtonClick() +{ +	onNew(); +} + +void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) +{ +	if (menu) +	{ +		menu->buildDrawLabels(); +		menu->updateParent(LLMenuGL::sMenuContainer); +		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); +		menu_y += menu->getRect().getHeight(); +		LLMenuGL::showPopup(this, menu, menu_x, menu_y); +	} +} + +void LLPanelOutfitsInventory::onTrashButtonClick() +{ +	onClipboardAction("delete"); +} + +void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata) +{ +	std::string command_name = userdata.asString(); +	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +} + +void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata) +{ +	if (!isActionEnabled(userdata)) +		return; + +	const std::string command_name = userdata.asString(); +	if (command_name == "new") +	{ +		onNew(); +	} +	if (command_name == "edit") +	{ +		onEdit(); +	} +	if (command_name == "wear") +	{ +		onWear(); +	} +	if (command_name == "delete") +	{ +		onClipboardAction("delete"); +	} +} + +BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) +{ +	const std::string command_name = userdata.asString(); +	if (command_name == "delete") +	{ +		BOOL can_delete = FALSE; +		LLFolderView *folder = getActivePanel()->getRootFolder(); +		if (folder) +		{ +			can_delete = TRUE; +			std::set<LLUUID> selection_set; +			folder->getSelectionList(selection_set); +			for (std::set<LLUUID>::iterator iter = selection_set.begin(); +				 iter != selection_set.end(); +				 ++iter) +			{ +				const LLUUID &item_id = (*iter); +				LLFolderViewItem *item = folder->getItemByID(item_id); +				can_delete &= item->getListener()->isItemRemovable(); +			} +			return can_delete; +		} +		return FALSE; +	} +	if (command_name == "edit" ||  +		command_name == "wear") +	{ +		return (getCorrectListenerForAction() != NULL); +	} +	return TRUE; +} + +bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +{ +	*accept = ACCEPT_NO; + +	const bool is_enabled = isActionEnabled("delete"); +	if (is_enabled) *accept = ACCEPT_YES_MULTI; + +	if (is_enabled && drop) +	{ +		onClipboardAction("delete"); +	} +	return true; +} + +// List Commands                                                              // +//////////////////////////////////////////////////////////////////////////////// + diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 3f837d3635..4d903a389b 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -42,6 +42,8 @@ class LLFolderViewEventListener;  class LLInventoryPanel;  class LLSaveFolderState;  class LLButton; +class LLMenuGL; +class LLSidepanelAppearance;  class LLPanelOutfitsInventory : public LLPanel  { @@ -55,22 +57,46 @@ public:  	void onWear();  	void onEdit();  	void onNew(); -	void updateVerbs();  	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);  	void onSelectorButtonClicked(); +	LLInventoryPanel* getActivePanel() { return mInventoryPanel; } + +	// If a compatible listener type is selected, then return a pointer to that. +	// Otherwise, return NULL. +	LLFolderViewEventListener* getCorrectListenerForAction(); +	void setParent(LLSidepanelAppearance *parent); +protected: +	void updateParent(); +	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;  	LLFolderView* getRootFolder();  private: -	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; +	LLSidepanelAppearance*      mParent;  	LLInventoryPanel*			mInventoryPanel;  	LLSaveFolderState*			mSavedFolderState; -	LLButton*					mActionBtn; -	LLButton*					mWearBtn; -	LLButton*					mEditBtn; +	////////////////////////////////////////////////////////////////////////////////// +	// List Commands                                                                // +protected: +	void initListCommandsHandlers(); +	void updateListCommands(); +	void onGearButtonClick(); +	void onAddButtonClick(); +	void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); +	void onTrashButtonClick(); +	void onClipboardAction(const LLSD& userdata); +	BOOL isActionEnabled(const LLSD& command_name); +	void onCustomAction(const LLSD& command_name); +	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); +private: +	LLPanel*					mListCommands; +	LLMenuGL*					mMenuGearDefault; +	LLMenuGL*					mMenuAdd; +	//                                                                            // +	////////////////////////////////////////////////////////////////////////////////  };  #endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index d92e404c2c..aeab3e2876 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -103,6 +103,7 @@ BOOL LLSidepanelAppearance::postBuild()  	}  	mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory")); +	mPanelOutfitsInventory->setParent(this);  	mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));  	if (mLookInfo) @@ -172,10 +173,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)  void LLSidepanelAppearance::onWearButtonClicked()  { -	if (mLookInfo->getVisible()) -	{ -	} -	else +	if (!mLookInfo->getVisible())  	{  		mPanelOutfitsInventory->onWear();  	} @@ -204,10 +202,7 @@ void LLSidepanelAppearance::onEditButtonClicked()  void LLSidepanelAppearance::onNewOutfitButtonClicked()  { -	if (mLookInfo->getVisible()) -	{ -	} -	else +	if (!mLookInfo->getVisible())  	{  		mPanelOutfitsInventory->onNew();  	} @@ -262,12 +257,16 @@ void LLSidepanelAppearance::updateVerbs()  	bool is_look_info_visible = mLookInfo->getVisible();  	mOverflowBtn->setEnabled(false); -	if (is_look_info_visible) +	if (!is_look_info_visible)  	{ +		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); +		mEditBtn->setEnabled(is_correct_type); +		mWearBtn->setEnabled(is_correct_type);  	}  	else  	{ -		mPanelOutfitsInventory->updateVerbs(); +		mEditBtn->setEnabled(FALSE); +		mWearBtn->setEnabled(FALSE);  	}  } diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 7be6d2d432..496a1fef72 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -59,6 +59,8 @@ public:  	void fetchInventory();  	void inventoryFetched(); +	void updateVerbs(); +  private:  	void onFilterEdit(const std::string& search_string); @@ -71,8 +73,6 @@ private:  	void toggleLookInfoPanel(BOOL visible);  	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); -	void updateVerbs(); -  	LLFilterEditor*			mFilterEditor;  	LLPanelOutfitsInventory* mPanelOutfitsInventory;  	LLPanelLookInfo*		mLookInfo; | 
