diff options
| -rw-r--r-- | indra/newview/llpaneloutfitedit.cpp | 332 | ||||
| -rw-r--r-- | indra/newview/llpaneloutfitedit.h | 17 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.cpp | 142 | ||||
| -rw-r--r-- | indra/newview/llwearableitemslist.h | 53 | 
4 files changed, 88 insertions, 456 deletions
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 0464aa377e..d76a5c586f 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -42,7 +42,6 @@  #include "lloutfitobserver.h"  #include "llcofwearables.h"  #include "llfilteredwearablelist.h" -#include "llfolderviewitem.h"  #include "llinventory.h"  #include "llinventoryitemslist.h"  #include "llviewercontrol.h" @@ -86,11 +85,6 @@ const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;  static const std::string REVERT_BTN("revert_btn"); - -/////////////////////////////////////////////////////////////////////////////// -// LLShopURLDispatcher -/////////////////////////////////////////////////////////////////////////////// -  class LLShopURLDispatcher  {  public: @@ -150,10 +144,6 @@ std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex  	return gSavedSettings.getString(setting_name);  } -/////////////////////////////////////////////////////////////////////////////// -// LLPanelOutfitEditGearMenu -/////////////////////////////////////////////////////////////////////////////// -  class LLPanelOutfitEditGearMenu  {  public: @@ -169,6 +159,7 @@ public:  		if (menu)  		{  			populateCreateWearableSubmenus(menu); +			menu->buildDrawLabels();  		}  		return menu; @@ -217,147 +208,6 @@ private:  	}  }; -/////////////////////////////////////////////////////////////////////////////// -// LLAddWearablesGearMenu -/////////////////////////////////////////////////////////////////////////////// - -class LLAddWearablesGearMenu : public LLInitClass<LLAddWearablesGearMenu> -{ -public: -	static LLMenuGL* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel) -	{ -		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; -		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - -		llassert(flat_list); -		llassert(inventory_panel); - -		LLHandle<LLView> flat_list_handle = flat_list->getHandle(); -		LLHandle<LLPanel> inventory_panel_handle = inventory_panel->getHandle(); - -		registrar.add("AddWearable.Gear.Sort", boost::bind(onSort, flat_list_handle, inventory_panel_handle, _2)); -		enable_registrar.add("AddWearable.Gear.Check", boost::bind(onCheck, flat_list_handle, inventory_panel_handle, _2)); -		enable_registrar.add("AddWearable.Gear.Visible", boost::bind(onVisible, inventory_panel_handle, _2)); - -		LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( -			"menu_add_wearable_gear.xml", -			LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); - -		return menu; -	} - -private: -	static void onSort(LLHandle<LLView> flat_list_handle, -					   LLHandle<LLPanel> inventory_panel_handle, -					   LLSD::String sort_order_str) -	{ -		if (flat_list_handle.isDead() || inventory_panel_handle.isDead()) return; - -		LLWearableItemsList* flat_list = dynamic_cast<LLWearableItemsList*>(flat_list_handle.get()); -		LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get()); - -		if (!flat_list || !inventory_panel) return; - -		LLWearableItemsList::ESortOrder	sort_order; - -		if ("by_most_recent" == sort_order_str) -		{ -			sort_order = LLWearableItemsList::E_SORT_BY_MOST_RECENT; -		} -		else if ("by_name" == sort_order_str) -		{ -			sort_order = LLWearableItemsList::E_SORT_BY_NAME; -		} -		else if ("by_type" == sort_order_str) -		{ -			sort_order = LLWearableItemsList::E_SORT_BY_TYPE_NAME; -		} -		else -		{ -			llwarns << "Unrecognized sort order action" << llendl; -			return; -		} - -		if (inventory_panel->getVisible()) -		{ -			inventory_panel->setSortOrder(sort_order); -		} -		else -		{ -			flat_list->setSortOrder(sort_order); -		} -	} - -	static bool onCheck(LLHandle<LLView> flat_list_handle, -						LLHandle<LLPanel> inventory_panel_handle, -						LLSD::String sort_order_str) -	{ -		if (flat_list_handle.isDead() || inventory_panel_handle.isDead()) return false; - -		LLWearableItemsList* flat_list = dynamic_cast<LLWearableItemsList*>(flat_list_handle.get()); -		LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get()); - -		if (!inventory_panel || !flat_list) return false; - -		// Inventory panel uses its own sort order independent from -		// flat list view so this flag is used to distinguish between -		// currently visible "tree" or "flat" representation of inventory. -		bool inventory_tree_visible = inventory_panel->getVisible(); - -		if (inventory_tree_visible) -		{ -			U32 sort_order = inventory_panel->getSortOrder(); - -			if ("by_most_recent" == sort_order_str) -			{ -				return LLWearableItemsList::E_SORT_BY_MOST_RECENT & sort_order; -			} -			else if ("by_name" == sort_order_str) -			{ -				// If inventory panel is not sorted by date then it is sorted by name. -				return LLWearableItemsList::E_SORT_BY_MOST_RECENT & ~sort_order; -			} -			llwarns << "Unrecognized inventory panel sort order" << llendl; -		} -		else -		{ -			LLWearableItemsList::ESortOrder	sort_order = flat_list->getSortOrder(); - -			if ("by_most_recent" == sort_order_str) -			{ -				return LLWearableItemsList::E_SORT_BY_MOST_RECENT == sort_order; -			} -			else if ("by_name" == sort_order_str) -			{ -				return LLWearableItemsList::E_SORT_BY_NAME == sort_order; -			} -			else if ("by_type" == sort_order_str) -			{ -				return LLWearableItemsList::E_SORT_BY_TYPE_NAME == sort_order; -			} -			llwarns << "Unrecognized wearable list sort order" << llendl; -		} -		return false; -	} - -	static bool onVisible(LLHandle<LLPanel> inventory_panel_handle, -						  LLSD::String sort_order_str) -	{ -		if (inventory_panel_handle.isDead()) return false; - -		LLInventoryPanel* inventory_panel = dynamic_cast<LLInventoryPanel*>(inventory_panel_handle.get()); - -		// Enable sorting by type only for the flat list of items -		// because inventory panel doesn't support this kind of sorting. -		return ( "by_type" == sort_order_str ) -				&&	( !inventory_panel || !inventory_panel->getVisible() ); -	} -}; - -/////////////////////////////////////////////////////////////////////////////// -// LLCOFDragAndDropObserver -/////////////////////////////////////////////////////////////////////////////// -  class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver  {  public: @@ -393,17 +243,12 @@ void LLCOFDragAndDropObserver::done()  	LLAppearanceMgr::instance().updateAppearanceFromCOF();  } -/////////////////////////////////////////////////////////////////////////////// -// LLPanelOutfitEdit -/////////////////////////////////////////////////////////////////////////////// -  LLPanelOutfitEdit::LLPanelOutfitEdit()  :	LLPanel(),   	mSearchFilter(NULL),  	mCOFWearables(NULL),  	mInventoryItemsPanel(NULL),  	mGearMenu(NULL), -	mAddWearablesGearMenu(NULL),  	mCOFDragAndDropObserver(NULL),  	mInitialized(false),  	mAddWearablesPanel(NULL), @@ -456,7 +301,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindNonLinksByMask(ALL_ITEMS_MASK)));  	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsTypeActual(LLAssetType::AT_CLOTHING)));  	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsTypeActual(LLAssetType::AT_BODYPART))); -	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindNonLinksByMask(ATTACHMENT_MASK)));; +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));;  	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE)));  	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN)));  	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("hair"), new LLFindActualWearablesOfType(LLWearableType::WT_HAIR))); @@ -481,9 +326,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);  	childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesFolderView, this), NULL); -	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); @@ -543,12 +386,26 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); +	/* +	 * By default AT_CLOTHING are sorted by (in in MY OUTFITS): +	 *  - by type (types order determined in LLWearableType::EType) +	 *  - each LLWearableType::EType by outer layer on top +	 * +	 * In Add More panel AT_CLOTHING should be sorted in a such way: +	 *  - by type (types order determined in LLWearableType::EType) +	 *  - each LLWearableType::EType by name (EXT-8205) +	*/ +	mWearableListViewItemsComparator = new LLWearableItemTypeNameComparator(); +	mWearableListViewItemsComparator->setOrder(LLAssetType::AT_CLOTHING, LLWearableItemTypeNameComparator::ORDER_RANG_1, false, true); +  	mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel"); -	mWearableItemsList = getChild<LLWearableItemsList>("list_view"); +	mWearableItemsList = getChild<LLInventoryItemsList>("list_view");  	mWearableItemsList->setCommitOnSelectionChange(true);  	mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this));  	mWearableItemsList->setDoubleClickCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this)); +	mWearableItemsList->setComparator(mWearableListViewItemsComparator); +  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));  	return TRUE;  } @@ -586,46 +443,35 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)  {  	mAddWearablesPanel->setVisible(show_add_wearables); -	getChild<LLUICtrl>("show_add_wearables_btn")->setValue(show_add_wearables); +	childSetValue("show_add_wearables_btn", show_add_wearables);  	updateFiltersVisibility(); -	getChildView("filter_button")->setVisible( show_add_wearables); +	childSetVisible("filter_button", show_add_wearables);  	//search filter should be disabled  	if (!show_add_wearables)  	{ -		getChild<LLUICtrl>("filter_button")->setValue(false); +		childSetValue("filter_button", false);  		mFolderViewFilterCmbBox->setVisible(false);  		mListViewFilterCmbBox->setVisible(false);  		showWearablesFilter(); -		/* -		 * By default AT_CLOTHING are sorted by (in in MY OUTFITS): -		 *  - by type (types order determined in LLWearableType::EType) -		 *  - each LLWearableType::EType by outer layer on top -		 * -		 * In Add More panel AT_CLOTHING should be sorted in a such way: -		 *  - by type (types order determined in LLWearableType::EType) -		 *  - each LLWearableType::EType by name (EXT-8205) -		*/ -		mWearableItemsList->setSortOrder(LLWearableItemsList::E_SORT_BY_TYPE_NAME); -  		// Reset mWearableItemsList position to top. See EXT-8180.  		mWearableItemsList->goToTop();  	}  	//switching button bars -	getChildView("no_add_wearables_button_bar")->setVisible( !show_add_wearables); -	getChildView("add_wearables_button_bar")->setVisible( show_add_wearables); +	childSetVisible("no_add_wearables_button_bar", !show_add_wearables); +	childSetVisible("add_wearables_button_bar", show_add_wearables);  }  void LLPanelOutfitEdit::showWearablesFilter()  { -	bool filter_visible = getChild<LLUICtrl>("filter_button")->getValue(); +	bool filter_visible = childGetValue("filter_button"); -	getChildView("filter_panel")->setVisible( filter_visible); +	childSetVisible("filter_panel", filter_visible);  	if(!filter_visible)  	{ @@ -642,7 +488,9 @@ void LLPanelOutfitEdit::showWearablesListView()  {  	if(switchPanels(mInventoryItemsPanel, mWearablesListViewPanel))  	{ -		updateWearablesPanelVerbButtons(); +		mFolderViewBtn->setToggleState(FALSE); +		mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign()); +		mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign());  		updateFiltersVisibility();  	}  	mListViewBtn->setToggleState(TRUE); @@ -652,7 +500,9 @@ void LLPanelOutfitEdit::showWearablesFolderView()  {  	if(switchPanels(mWearablesListViewPanel, mInventoryItemsPanel))  	{ -		updateWearablesPanelVerbButtons(); +		mListViewBtn->setToggleState(FALSE); +		mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign()); +		mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign());  		updateFiltersVisibility();  	}  	mFolderViewBtn->setToggleState(TRUE); @@ -793,17 +643,8 @@ void LLPanelOutfitEdit::onShopButtonClicked()  	if (isAgentAvatarValid())  	{  		// try to get wearable type from 'Add More' panel first (EXT-7639) -		selection_info_t selection_info = getAddMorePanelSelectionType(); - -		LLWearableType::EType type = selection_info.first; +		LLWearableType::EType type = getAddMorePanelSelectionType(); -		if (selection_info.second > 1) -		{ -			// the second argument is not important in this case: generic market place will be opened -			url = url_resolver.resolveURL(LLWearableType::WT_NONE, SEX_FEMALE); -		} -		else -		{  		if (type == LLWearableType::WT_NONE)  		{  			type = getCOFWearablesSelectionType(); @@ -819,9 +660,7 @@ void LLPanelOutfitEdit::onShopButtonClicked()  		if (url.empty())  		{ -				url = url_resolver.resolveURL( -						mCOFWearables->getExpandedAccordionAssetType(), sex); -			} +			url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex);  		}  	}  	else @@ -860,9 +699,9 @@ LLWearableType::EType LLPanelOutfitEdit::getCOFWearablesSelectionType() const  	return type;  } -LLPanelOutfitEdit::selection_info_t LLPanelOutfitEdit::getAddMorePanelSelectionType() const +LLWearableType::EType LLPanelOutfitEdit::getAddMorePanelSelectionType() const  { -	selection_info_t result = std::make_pair(LLWearableType::WT_NONE, 0); +	LLWearableType::EType type = LLWearableType::WT_NONE;  	if (mAddWearablesPanel != NULL && mAddWearablesPanel->getVisible())  	{ @@ -870,11 +709,9 @@ LLPanelOutfitEdit::selection_info_t LLPanelOutfitEdit::getAddMorePanelSelectionT  		{  			std::set<LLUUID> selected_uuids = mInventoryItemsPanel->getRootFolder()->getSelectionList(); -			result.second = selected_uuids.size(); - -			if (result.second == 1) +			if (selected_uuids.size() == 1)  			{ -				result.first = getWearableTypeByItemUUID(*(selected_uuids.begin())); +				type = getWearableTypeByItemUUID(*(selected_uuids.begin()));  			}  		}  		else if (mWearableItemsList != NULL && mWearableItemsList->getVisible()) @@ -882,16 +719,14 @@ LLPanelOutfitEdit::selection_info_t LLPanelOutfitEdit::getAddMorePanelSelectionT  			std::vector<LLUUID> selected_uuids;  			mWearableItemsList->getSelectedUUIDs(selected_uuids); -			result.second = selected_uuids.size(); - -			if (result.second == 1) +			if (selected_uuids.size() == 1)  			{ -				result.first = getWearableTypeByItemUUID(selected_uuids.front()); +				type = getWearableTypeByItemUUID(selected_uuids.front());  			}  		}  	} -	return result; +	return type;  }  LLWearableType::EType LLPanelOutfitEdit::getWearableTypeByItemUUID(const LLUUID& item_uuid) const @@ -928,7 +763,7 @@ void LLPanelOutfitEdit::updatePlusButton()  	}  	// If any of the selected items are not wearable (due to already being worn OR being of the wrong type), disable the add button. -	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(&get_can_item_be_worn, _1)); +	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(& get_can_item_be_worn, _1));  	bool can_add = ( unwearable_item == selected_items.end() );  	mPlusBtn->setEnabled(can_add); @@ -1176,7 +1011,7 @@ void LLPanelOutfitEdit::updateVerbs()  	bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull();  	mSaveComboBtn->setSaveBtnEnabled(!outfit_locked && outfit_is_dirty); -	getChildView(REVERT_BTN)->setEnabled(outfit_is_dirty && has_baseoutfit); +	childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit);  	mSaveComboBtn->setMenuItemEnabled("save_outfit", !outfit_locked && outfit_is_dirty); @@ -1213,33 +1048,13 @@ void LLPanelOutfitEdit::resetAccordionState()  void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button)  { -	LLMenuGL* menu = NULL; - -	if (mAddWearablesPanel->getVisible()) +	if(!mGearMenu)  	{ -		if (!mAddWearablesGearMenu) -		{ -			mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); -		} - -		menu = mAddWearablesGearMenu; -	} -	else -	{ -		if (!mGearMenu) -		{ -			mGearMenu = LLPanelOutfitEditGearMenu::create(); -		} - -		menu = mGearMenu; +		mGearMenu = LLPanelOutfitEditGearMenu::create();  	} -	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); +	S32 menu_y = mGearMenu->getRect().getHeight() + clicked_button->getRect().getHeight(); +	LLMenuGL::showPopup(clicked_button, mGearMenu, 0, menu_y);  }  void LLPanelOutfitEdit::onAddMoreButtonClicked() @@ -1331,62 +1146,5 @@ void LLPanelOutfitEdit::onCOFChanged()  	update();  } -void LLPanelOutfitEdit::updateWearablesPanelVerbButtons() -{ -	if(mWearablesListViewPanel->getVisible()) -	{ -		mFolderViewBtn->setToggleState(FALSE); -		mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign()); -		mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign()); -	} -	else if(mInventoryItemsPanel->getVisible()) -	{ -		mListViewBtn->setToggleState(FALSE); -		mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign()); -		mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign()); -	} -} - -void LLPanelOutfitEdit::saveListSelection() -{ -	if(mWearablesListViewPanel->getVisible()) -	{ -		std::set<LLUUID> selected_ids = mInventoryItemsPanel->getRootFolder()->getSelectionList(); - -		if(!selected_ids.size()) return; - -		for (std::set<LLUUID>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id) -		{ -			mWearableItemsList->selectItemByUUID(*item_id, true); -		} -		mWearableItemsList->scrollToShowFirstSelectedItem(); -	} -	else if(mInventoryItemsPanel->getVisible()) -	{ -		std::vector<LLUUID> selected_ids; -		mWearableItemsList->getSelectedUUIDs(selected_ids); - -		if(!selected_ids.size()) return; - -		mInventoryItemsPanel->clearSelection(); -		LLFolderView* root = mInventoryItemsPanel->getRootFolder(); - -		if(!root) return; - -		for(std::vector<LLUUID>::const_iterator item_id = selected_ids.begin(); item_id != selected_ids.end(); ++item_id) -		{ -			LLFolderViewItem* item = root->getItemByID(*item_id); -			if (!item) continue; - -			LLFolderViewFolder* parent = item->getParentFolder(); -			if(parent) -			{ -				parent->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); -			} -			mInventoryItemsPanel->getRootFolder()->changeSelection(item, TRUE); -		} -		mInventoryItemsPanel->getRootFolder()->scrollToShowSelection(); -	} -}  // EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 871ed8d7ec..784c2bcad1 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -43,8 +43,8 @@  #include "llremoteparcelrequest.h"  #include "llinventory.h"  #include "llinventoryfunctions.h" +#include "llinventoryitemslist.h"  #include "llinventorymodel.h" -#include "llwearableitemslist.h"  class LLButton;  class LLCOFWearables; @@ -201,17 +201,8 @@ private:  	void getCurrentItemUUID(LLUUID& selected_id);  	void onCOFChanged(); -	/** -	 * Method preserves selection while switching between folder/list view modes -	*/ -	void saveListSelection(); - -	void updateWearablesPanelVerbButtons(); - -	typedef std::pair<LLWearableType::EType, size_t> selection_info_t; -  	LLWearableType::EType getCOFWearablesSelectionType() const; -	selection_info_t getAddMorePanelSelectionType() const; +	LLWearableType::EType getAddMorePanelSelectionType() const;  	LLWearableType::EType getWearableTypeByItemUUID(const LLUUID& item_uuid) const;  	LLTextBox*			mCurrentOutfitName; @@ -230,8 +221,9 @@ private:  	LLComboBox*			mListViewFilterCmbBox;  	LLFilteredWearableListManager* 	mWearableListManager; -	LLWearableItemsList* 			mWearableItemsList; +	LLInventoryItemsList* 			mWearableItemsList;  	LLPanel*						mWearablesListViewPanel; +	LLWearableItemTypeNameComparator* mWearableListViewItemsComparator;  	LLCOFDragAndDropObserver* mCOFDragAndDropObserver; @@ -240,7 +232,6 @@ private:  	LLCOFWearables*		mCOFWearables;  	LLMenuGL*			mGearMenu; -	LLMenuGL*			mAddWearablesGearMenu;  	bool				mInitialized;  	std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index e2a5489fcf..5e23965f62 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -478,9 +478,9 @@ LLWearableItemTypeNameComparator::LLWearableItemTypeNameComparator()  	// 1. CLOTHING - sorted by name  	// 2. OBJECT   - sorted by type  	// 3. BODYPART - sorted by name -	mWearableOrder[LLAssetType::AT_CLOTHING] = LLWearableTypeOrder(ORDER_RANK_1, false, false); -	mWearableOrder[LLAssetType::AT_OBJECT]   = LLWearableTypeOrder(ORDER_RANK_2, true, true); -	mWearableOrder[LLAssetType::AT_BODYPART] = LLWearableTypeOrder(ORDER_RANK_3, false, true); +	mWearableOrder[LLAssetType::AT_CLOTHING] = LLWearableTypeOrder(ORDER_RANG_1, false, false); +	mWearableOrder[LLAssetType::AT_OBJECT]   = LLWearableTypeOrder(ORDER_RANG_2, true, true); +	mWearableOrder[LLAssetType::AT_BODYPART] = LLWearableTypeOrder(ORDER_RANG_3, false, true);  }  void LLWearableItemTypeNameComparator::setOrder(LLAssetType::EType items_of_type,  LLWearableItemTypeNameComparator::ETypeListOrder order_priority, bool sort_asset_items_by_name, bool sort_wearable_items_by_name) @@ -527,6 +527,8 @@ bool LLWearableItemTypeNameComparator::doCompare(const LLPanelInventoryListItemB  	const LLWearableType::EType item_wearable_type2 = wearable_item2->getWearableType();  	if (item_wearable_type1 != item_wearable_type2) +		// If items are of different LLWearableType::EType types they are compared +		// by LLWearableType::EType. types order determined in LLWearableType::EType.  	{  		// If items are of different LLWearableType::EType types they are compared  		// by LLWearableType::EType. types order determined in LLWearableType::EType. @@ -549,10 +551,11 @@ LLWearableItemTypeNameComparator::ETypeListOrder LLWearableItemTypeNameComparato  {  	wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type); +  	if(const_it == mWearableOrder.end())  	{  		llwarns<<"Absent information about order rang of items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl; -		return ORDER_RANK_UNKNOWN; +		return ORDER_RANG_UNKNOWN;  	}  	return const_it->second.mOrderPriority; @@ -562,49 +565,37 @@ bool LLWearableItemTypeNameComparator::sortAssetTypeByName(LLAssetType::EType it  {  	wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type); +  	if(const_it == mWearableOrder.end())  	{  		llwarns<<"Absent information about sorting items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;  		return true;  	} +  	return const_it->second.mSortAssetTypeByName; -	} +} +  bool LLWearableItemTypeNameComparator::sortWearableTypeByName(LLAssetType::EType item_type) const  {  	wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type); +  	if(const_it == mWearableOrder.end())  	{  		llwarns<<"Absent information about sorting items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;  		return true; -} - -	return const_it->second.mSortWearableTypeByName; -} - -/*virtual*/ -bool LLWearableItemCreationDateComparator::doCompare(const LLPanelInventoryListItemBase* item1, const LLPanelInventoryListItemBase* item2) const -{ -	time_t date1 = item1->getCreationDate(); -	time_t date2 = item2->getCreationDate(); - -	if (date1 == date2) -	{ -		return LLWearableItemNameComparator::doCompare(item1, item2);  	} -	return date1 > date2; + +	return const_it->second.mSortWearableTypeByName;  }  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// -static LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR; -static const LLWearableItemTypeNameComparator WEARABLE_TYPE_LAYER_COMPARATOR; -static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR; -static const LLWearableItemCreationDateComparator WEARABLE_CREATION_DATE_COMPARATOR; +static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;  static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list"); @@ -616,7 +607,7 @@ LLWearableItemsList::Params::Params()  LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)  :	LLInventoryItemsList(p)  { -	setSortOrder(E_SORT_BY_TYPE_LAYER, false); +	setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);  	mIsStandalone = p.standalone;  	if (mIsStandalone)  	{ @@ -716,38 +707,6 @@ void LLWearableItemsList::onRightClick(S32 x, S32 y)  	ContextMenu::instance().show(this, selected_uuids, x, y);  } -void LLWearableItemsList::setSortOrder(ESortOrder sort_order, bool sort_now) -{ -	switch (sort_order) -	{ -	case E_SORT_BY_MOST_RECENT: -		setComparator(&WEARABLE_CREATION_DATE_COMPARATOR); -		break; -	case E_SORT_BY_NAME: -		setComparator(&WEARABLE_NAME_COMPARATOR); -		break; -	case E_SORT_BY_TYPE_LAYER: -		setComparator(&WEARABLE_TYPE_LAYER_COMPARATOR); -		break; -	case E_SORT_BY_TYPE_NAME: -	{ -		WEARABLE_TYPE_NAME_COMPARATOR.setOrder(LLAssetType::AT_CLOTHING, LLWearableItemTypeNameComparator::ORDER_RANK_1, false, true); -		setComparator(&WEARABLE_TYPE_NAME_COMPARATOR); -		break; -	} - -	// No "default:" to raise compiler warning -	// if we're not handling something -	} - -	mSortOrder = sort_order; - -	if (sort_now) -	{ -		sort(); -	} -} -  //////////////////////////////////////////////////////////////////////////  /// ContextMenu  ////////////////////////////////////////////////////////////////////////// @@ -818,8 +777,6 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  	U32 n_links = 0;				// number of links among the selected items  	U32 n_editable = 0;				// number of editable items among the selected ones -	bool can_be_worn = true; -  	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)  	{  		LLUUID id = *it; @@ -855,22 +812,16 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  		{  			++n_already_worn;  		} - -		if (can_be_worn) -		{ -			can_be_worn = get_can_item_be_worn(item->getLinkedUUID()); -		}  	} // for  	bool standalone = mParent ? mParent->isStandalone() : false; -	bool wear_add_visible = mask & (MASK_CLOTHING|MASK_ATTACHMENT) && n_worn == 0 && can_be_worn && (n_already_worn != 0 || mask & MASK_ATTACHMENT);  	// *TODO: eliminate multiple traversals over the menu items -	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0 && can_be_worn); +	setMenuItemVisible(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0);  	setMenuItemEnabled(menu, "wear_wear", 			n_already_worn == 0 && n_worn == 0); -	setMenuItemVisible(menu, "wear_add",			wear_add_visible); -	setMenuItemEnabled(menu, "wear_add",			canAddWearables(ids)); -	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0 && can_be_worn); +	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0); +	setMenuItemEnabled(menu, "wear_add",			n_items == 1 && canAddWearable(ids.front()) && n_already_worn != 0); +	setMenuItemVisible(menu, "wear_replace",		n_worn == 0 && n_already_worn != 0);  	//visible only when one item selected and this item is worn  	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);  	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1); @@ -978,61 +929,20 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)  	LLAgentWearables::createWearable(item->getWearableType(), true);  } -// Returns true if all the given objects and clothes can be added. +// Can we wear another wearable of the given item's wearable type?  // static -bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_ids) +bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id)  {  	// TODO: investigate wearables may not be loaded at this point EXT-8231 -	U32 n_objects = 0; -	boost::unordered_map<LLWearableType::EType, U32> clothes_by_type; - -	// Count given clothes (by wearable type) and objects. -	for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it) -	{ -		LLViewerInventoryItem* item = gInventory.getItem(*it); -		if (!item) -		{ -			return false; -		} - -		if (item->getType() == LLAssetType::AT_OBJECT) -		{ -			++n_objects; -		} -		else if (item->getType() == LLAssetType::AT_CLOTHING) -		{ -			++clothes_by_type[item->getWearableType()]; -		} -		else -		{ -			llwarns << "Unexpected wearable type" << llendl; -			return false; -		} -	} - -	// Check whether we can add all the objects. -	if (!isAgentAvatarValid() || !gAgentAvatarp->canAttachMoreObjects(n_objects)) +	LLViewerInventoryItem* item = gInventory.getItem(item_id); +	if (!item || item->getType() != LLAssetType::AT_CLOTHING)  	{  		return false;  	} -	// Check whether we can add all the clothes. -	boost::unordered_map<LLWearableType::EType, U32>::const_iterator m_it; -	for (m_it = clothes_by_type.begin(); m_it != clothes_by_type.end(); ++m_it) -	{ -		LLWearableType::EType w_type	= m_it->first; -		U32 n_clothes					= m_it->second; - -		U32 wearable_count = gAgentWearables.getWearableCount(w_type); -		if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE) -		{ -			return false; -		} - -	} - -	return true; +	U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType()); +	return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE;  }  // EOF diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index d7970e0838..237ba1af43 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -313,10 +313,10 @@ public:  	enum ETypeListOrder  	{ -		ORDER_RANK_1 = 1, -		ORDER_RANK_2, -		ORDER_RANK_3, -		ORDER_RANK_UNKNOWN +		ORDER_RANG_1 = 1, +		ORDER_RANG_2, +		ORDER_RANG_3, +		ORDER_RANG_UNKNOWN  	};  	void setOrder(LLAssetType::EType items_of_type, ETypeListOrder order_priority, bool sort_items_by_name, bool sort_wearable_items_by_name); @@ -325,28 +325,28 @@ protected:  	/**  	 * All information about sort order is stored in mWearableOrder map  	 * -	 * mWearableOrder :      KYES              VALUES +	 * mWearableOrder :      KEYES              VALUES  	 *                  [LLAssetType] [struct LLWearableTypeOrder]  	 *  	 *--------------------------------------------------------------------------------------------- -	 * I. Determines order (ORDER_RANK) in which items of LLAssetType should be displayed in list. +	 * I. Determines order (ORDER_RANG) in which items of LLAssetType should be displayed in list.  	 *     For example by spec in MY OUTFITS the order is: -	 *     1. AT_CLOTHING (ORDER_RANK_1) -	 *     2. AT_OBJECT   (ORDER_RANK_2) -	 *     3. AT_BODYPART (ORDER_RANK_3) +	 *     1. AT_CLOTHING (ORDER_RANG_1) +	 *     2. AT_OBJECT   (ORDER_RANG_2) +	 *     3. AT_BODYPART (ORDER_RANG_3)  	 *  	 * II.Items of each type(LLAssetType) are sorted by name or type(LLWearableType)  	 *     For example by spec in MY OUTFITS the order within each items type(LLAssetType) is:  	 *     1. AT_OBJECTS (abc order)  	 *     2. AT_CLOTHINGS -	 *         - by type (types order determined in LLWearableType::EType) -	 *         - outer layer on top +	 *       - by type (types order determined in LLWearableType::EType) +	 *       - outer layer on top  	 *     3. AT_BODYPARTS  (abc order)  	 *---------------------------------------------------------------------------------------------  	 *  	 * For each LLAssetType (KEYS in mWearableOrder) the information about:  	 * -	 *                                             I.  ORDER_RANK (the flag is LLWearableTypeOrder::mOrderPriority) +	 *                                             I.  ORDER_RANG (the flag is LLWearableTypeOrder::mOrderPriority)  	 *  	 *                                             II. whether items of this LLAssetType type should be ordered  	 *                                                 by name or by LLWearableType::EType (the flag is LLWearableTypeOrder::mSortAssetTypeByName) @@ -380,19 +380,6 @@ private:  };  /** - * @class LLWearableItemCreationDateComparator - * - * Comparator for sorting wearable list items by creation date (newest go first). - */ -class LLWearableItemCreationDateComparator : public LLWearableItemNameComparator -{ -	LOG_CLASS(LLWearableItemCreationDateComparator); - -protected: -	/*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* item1, const LLPanelInventoryListItemBase* item2) const; -}; - -/**   * @class LLWearableItemsList   *   * A flat list of wearable inventory items. @@ -431,7 +418,7 @@ public:  		static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);  		static void updateMask(U32& mask, LLAssetType::EType at);  		static void createNewWearable(const LLUUID& item_id); -		static bool canAddWearables(const uuid_vec_t& item_ids); +		static bool canAddWearable(const LLUUID& item_id);  		LLWearableItemsList*	mParent;  	}; @@ -444,14 +431,6 @@ public:  		Params();  	}; -	typedef enum e_sort_order { -		// Values should be compatible with InventorySortOrder setting. -		E_SORT_BY_NAME			= 0, -		E_SORT_BY_MOST_RECENT	= 1, -		E_SORT_BY_TYPE_LAYER	= 2, -		E_SORT_BY_TYPE_NAME 	= 3, -	} ESortOrder; -  	virtual ~LLWearableItemsList();  	/*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true); @@ -466,10 +445,6 @@ public:  	bool isStandalone() const { return mIsStandalone; } -	ESortOrder getSortOrder() const { return mSortOrder; } - -	void setSortOrder(ESortOrder sort_order, bool sort_now = true); -  protected:  	friend class LLUICtrlFactory;  	LLWearableItemsList(const LLWearableItemsList::Params& p); @@ -478,8 +453,6 @@ protected:  	bool mIsStandalone;  	bool mWornIndicationEnabled; - -	ESortOrder		mSortOrder;  };  #endif //LL_LLWEARABLEITEMSLIST_H  | 
