diff options
Diffstat (limited to 'indra')
39 files changed, 521 insertions, 216 deletions
| diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index cd23d5cd33..fc93793ed8 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -523,6 +523,8 @@ void	LLAccordionCtrl::arrangeMultiple()  void LLAccordionCtrl::arrange()  { +	updateNoTabsHelpTextVisibility(); +  	if( mAccordionTabs.size() == 0)  	{  		//We do not arrange if we do not have what should be arranged @@ -818,7 +820,7 @@ void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)  {  	LLStringUtil::format_map_t args;  	args["[SEARCH_TERM]"] = LLURI::escape(filter_string); -	std::string text = mNoVisibleTabsOrigString; +	std::string text = filter_string.empty() ? LLStringUtil::null : mNoVisibleTabsOrigString;  	LLStringUtil::format(text, args);  	mNoVisibleTabsHelpText->setValue(text); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 72f3a14822..1a4b804ce4 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2791,7 +2791,7 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width  	height = llceil(mStyle->getFont()->getLineHeight());;  	LLUIImagePtr image = mStyle->getImage(); -	if( image.notNull()) +	if( num_chars>0 && image.notNull())  	{  		width += image->getWidth() + IMAGE_HPAD;  		height = llmax(height, image->getHeight() + IMAGE_HPAD ); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 12d2752180..3691d731ed 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -965,18 +965,10 @@ bool LLAppearanceMgr::getCanRemoveOutfit(const LLUUID& outfit_cat_id)  		return false;  	} -	// Check if the folder contains worn items. -	LLInventoryModel::cat_array_t cats; -	LLInventoryModel::item_array_t items; -	LLFindWorn filter_worn; -	gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_worn); -	if (!items.empty()) -	{ -		return false; -	} -  	// Check for the folder's non-removable descendants.  	LLFindNonRemovableObjects filter_non_removable; +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items;  	LLInventoryModel::item_array_t::const_iterator it;  	gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_non_removable);  	if (!cats.empty() || !items.empty()) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 961969a5c5..18c69b5130 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -243,7 +243,7 @@ public:  		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));  		//*TODO overly defensive thing, source type should be maintained out there -		if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM) +		if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull())  		{  			mSourceType = CHAT_SOURCE_SYSTEM;  		} diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 010033fcd3..74034cfbf7 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -88,6 +88,10 @@ const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH  			+ /*first few characters*/ 40;  const S32 MINIMUM_RENAMER_WIDTH = 80; +// *TODO: move in params in xml if necessary. Requires modification of LLFolderView & LLInventoryPanel Params. +const S32 STATUS_TEXT_HPAD = 6; +const S32 STATUS_TEXT_VPAD = 8; +  enum {  	SIGNAL_NO_KEYBOARD_FOCUS = 1,  	SIGNAL_KEYBOARD_FOCUS = 2 @@ -247,6 +251,9 @@ LLFolderView::LLFolderView(const Params& p)  	text_p.visible(false);  	text_p.allow_html(true);  	text_p.wrap(true); // allow multiline text. See EXT-7564, EXT-7047 +	// set text padding the same as in People panel. EXT-7047, EXT-4837 +	text_p.h_pad(STATUS_TEXT_HPAD); +	text_p.v_pad(STATUS_TEXT_VPAD);  	mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);  	mStatusTextBox->setFollowsLeft();  	mStatusTextBox->setFollowsTop(); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index c82ebd1439..93c56e1b8a 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -271,6 +271,32 @@ public:  //  //  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLFindByMask : public LLInventoryCollectFunctor +{ +public: +	LLFindByMask(U64 mask) +		: mFilterMask(mask) +	{} + +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if(item && (mFilterMask & (1LL << item->getInventoryType())) ) +		{ +			return true; +		} + +		return false; +	} + +private: +	U64 mFilterMask; +}; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLFindNonLinksByMask +// +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLFindNonLinksByMask : public LLInventoryCollectFunctor  {  public: diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index 55cb2619cf..23ea786484 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -70,23 +70,19 @@ void LLPanelInventoryListItemBase::draw()  {  	if (getNeedsRefresh())  	{ -		updateItem(); +		if (mItem) +		{ +			updateItem(mItem->getName()); +		}  		setNeedsRefresh(false);  	}  	LLPanel::draw();  } -void LLPanelInventoryListItemBase::updateItem() +// virtual +void LLPanelInventoryListItemBase::updateItem(const std::string& name)  {  	setIconImage(mIconImage); - -	std::string name = mItem->getName(); - -	if (get_is_item_worn(mItem->getUUID())) -	{ -		name += LLTrans::getString("worn"); -	} -  	setTitle(name, mHighlightedText);  } @@ -140,7 +136,11 @@ BOOL LLPanelInventoryListItemBase::postBuild()  	setIconCtrl(getChild<LLIconCtrl>("item_icon"));  	setTitleCtrl(getChild<LLTextBox>("item_name")); -	mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getFlags(), FALSE); +	if (mItem) +	{ +		mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getFlags(), FALSE); +		updateItem(mItem->getName()); +	}  	setNeedsRefresh(true); @@ -169,6 +169,42 @@ void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask)  	LLPanel::onMouseLeave(x, y, mask);  } +const std::string& LLPanelInventoryListItemBase::getItemName() const +{ +	if (!mItem) +	{ +		return LLStringUtil::null; +	} +	return mItem->getName(); +} + +LLAssetType::EType LLPanelInventoryListItemBase::getType() const +{ +	if (!mItem) +	{ +		return LLAssetType::AT_NONE; +	} +	return mItem->getType(); +} + +LLWearableType::EType LLPanelInventoryListItemBase::getWearableType() const +{ +	if (!mItem) +	{ +		return LLWearableType::WT_NONE; +	} +	return mItem->getWearableType(); +} + +const std::string& LLPanelInventoryListItemBase::getDescription() const +{ +	if (!mItem) +	{ +		return LLStringUtil::null; +	} +	return mItem->getDescription(); +} +  S32 LLPanelInventoryListItemBase::notify(const LLSD& info)  {  	S32 rv = 0; @@ -176,7 +212,7 @@ S32 LLPanelInventoryListItemBase::notify(const LLSD& info)  	{  		mHighlightedText = info["match_filter"].asString(); -		std::string test(mItem->getName()); +		std::string test(mTitleCtrl->getText());  		LLStringUtil::toUpper(test);  		if(mHighlightedText.empty() || std::string::npos != test.find(mHighlightedText)) diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h index c1b1a6f281..d6132717e8 100644 --- a/indra/newview/llinventoryitemslist.h +++ b/indra/newview/llinventoryitemslist.h @@ -122,16 +122,16 @@ public:  	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);  	/** Get the name of a corresponding inventory item */ -	const std::string& getItemName() const { return mItem->getName(); } +	const std::string& getItemName() const;  	/** Get the asset type of a corresponding inventory item */ -	LLAssetType::EType getType() const { return mItem->getType(); } +	LLAssetType::EType getType() const;  	/** Get the wearable type of a corresponding inventory item */ -	LLWearableType::EType getWearableType() const { return mItem->getWearableType(); } +	LLWearableType::EType getWearableType() const;  	/** Get the description of a corresponding inventory item */ -	const std::string& getDescription() const { return mItem->getDescription(); } +	const std::string& getDescription() const;  	/** Get the associated inventory item */  	LLViewerInventoryItem* getItem() const { return mItem; } @@ -152,7 +152,7 @@ protected:  	/**  	 * Called after inventory item was updated, update panel widgets to reflect inventory changes.  	 */ -	virtual void updateItem(); +	virtual void updateItem(const std::string& name);  	/** setter for mIconCtrl */  	void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 7d81cf18aa..6b0103e0de 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -189,6 +189,8 @@ LLInventoryPanel::~LLInventoryPanel()  		}  	} +	gIdleCallbacks.deleteFunction(onIdle, this); +  	// LLView destructor will take care of the sub-views.  	mInventory->removeObserver(mInventoryObserver);  	delete mInventoryObserver; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 4b5e765c4f..1fadb126e4 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -32,6 +32,7 @@  #include "llviewerprecompiledheaders.h" +#include "llagentdata.h" // for gAgentID  #include "llnearbychathandler.h"  #include "llbottomtray.h" @@ -367,6 +368,13 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)  	{  		if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)  			return; + +		// don't process debug messages from not owned objects, see EXT-7762 +		if (gAgentID != chat_msg.mOwnerID) +		{ +			return; +		} +  		if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))  		{ diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index bca292fa4a..03df2d2b20 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -90,17 +90,33 @@ protected:  		registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id));  		enable_registrar.add("Outfit.OnEnable", boost::bind(&OutfitContextMenu::onEnable, this, _2)); +		enable_registrar.add("Outfit.OnVisible", boost::bind(&OutfitContextMenu::onVisible, this, _2));  		return createFromFile("menu_outfit_tab.xml");  	} -	bool onEnable(const LLSD& data) +	bool onEnable(LLSD::String param) +	{ +		LLUUID outfit_cat_id = mUUIDs.back(); + +		if ("rename" == param) +		{ +			return get_is_category_renameable(&gInventory, outfit_cat_id); +		} + +		return true; +	} + +	bool onVisible(LLSD::String param)  	{ -		std::string param = data.asString();  		LLUUID outfit_cat_id = mUUIDs.back();  		bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == outfit_cat_id; -		if ("wear_replace" == param) +		if ("edit" == param) +		{ +			return is_worn; +		} +		else if ("wear_replace" == param)  		{  			return !is_worn;  		} @@ -112,14 +128,6 @@ protected:  		{  			return is_worn;  		} -		else if ("edit" == param) -		{ -			return is_worn; -		} -		else if ("rename" == param) -		{ -			return get_is_category_renameable(&gInventory, outfit_cat_id); -		}  		else if ("delete" == param)  		{  			return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 32b209dd0d..1454a2f6af 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -65,6 +65,7 @@  #include "llsaveoutfitcombobtn.h"  #include "llscrolllistctrl.h"  #include "lltextbox.h" +#include "lltrans.h"  #include "lluictrlfactory.h"  #include "llsdutil.h"  #include "llsidepanelappearance.h" @@ -188,9 +189,8 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	mCOFDragAndDropObserver(NULL),  	mInitialized(false),  	mAddWearablesPanel(NULL), -	mWearableListMaskCollector(NULL), -	mWearableListTypeCollector(NULL), -	mFilterComboBox(NULL) +	mFolderViewFilterCmbBox(NULL), +	mListViewFilterCmbBox(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -202,12 +202,11 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));  	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this)); -	mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES); -	for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++) +	mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES); +	for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++)  	{ -		mLookItemTypes.push_back(LLLookItemType()); +		mFolderViewItemTypes.push_back(LLLookItemType());  	} -	  } @@ -217,17 +216,40 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()  	delete mCOFDragAndDropObserver; -	delete mWearableListMaskCollector; -	delete mWearableListTypeCollector; +	while (!mListViewItemTypes.empty()) { +		delete mListViewItemTypes.back(); +		mListViewItemTypes.pop_back(); +	}  }  BOOL LLPanelOutfitEdit::postBuild()  {  	// gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels - -	mLookItemTypes[LIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK); -	mLookItemTypes[LIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK); -	mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); +	 +	mFolderViewItemTypes[FVIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK); +	mFolderViewItemTypes[FVIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK); +	mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); + +	//order is important, see EListViewItemType for order information +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART))); +	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))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("eyes"), new LLFindActualWearablesOfType(LLWearableType::WT_EYES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SHIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("pants"), new LLFindActualWearablesOfType(LLWearableType::WT_PANTS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shoes"), new LLFindActualWearablesOfType(LLWearableType::WT_SHOES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("socks"), new LLFindActualWearablesOfType(LLWearableType::WT_SOCKS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("jacket"), new LLFindActualWearablesOfType(LLWearableType::WT_JACKET))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("gloves"), new LLFindActualWearablesOfType(LLWearableType::WT_GLOVES))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("undershirt"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERSHIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("underpants"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERPANTS))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA))); +	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));  	mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name");   	mStatus = getChild<LLTextBox>("status"); @@ -252,7 +274,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	mAddWearablesPanel = getChild<LLPanel>("add_wearables_panel"); -	mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items"); +	mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view");  	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);  	mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2)); @@ -260,15 +282,24 @@ BOOL LLPanelOutfitEdit::postBuild()  	mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); -	mFilterComboBox = getChild<LLComboBox>("filter_wearables_combobox"); -	mFilterComboBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1)); -	mFilterComboBox->removeall(); -	for (U32 i = 0; i < mLookItemTypes.size(); ++i) +	mFolderViewFilterCmbBox = getChild<LLComboBox>("folder_view_filter_combobox"); +	mFolderViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onFolderViewFilterCommitted, this, _1)); +	mFolderViewFilterCmbBox->removeall(); +	for (U32 i = 0; i < mFolderViewItemTypes.size(); ++i)  	{ -		mFilterComboBox->add(mLookItemTypes[i].displayName); +		mFolderViewFilterCmbBox->add(mFolderViewItemTypes[i].displayName);  	} -	mFilterComboBox->setCurrentByIndex(LIT_ALL); +	mFolderViewFilterCmbBox->setCurrentByIndex(FVIT_ALL); +	mListViewFilterCmbBox = getChild<LLComboBox>("list_view_filter_combobox"); +	mListViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onListViewFilterCommitted, this, _1)); +	mListViewFilterCmbBox->removeall(); +	for (U32 i = 0; i < mListViewItemTypes.size(); ++i) +	{ +		mListViewFilterCmbBox->add(mListViewItemTypes[i]->displayName); +	} +	mListViewFilterCmbBox->setCurrentByIndex(LVIT_ALL); +  	mSearchFilter = getChild<LLFilterEditor>("look_item_filter");  	mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2)); @@ -283,11 +314,8 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); -	mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK); -	mWearableListTypeCollector = new LLFindActualWearablesOfType(LLWearableType::WT_NONE); - -	mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel"); -	mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list"); +	mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel"); +	mWearableItemsList = getChild<LLInventoryItemsList>("list_view");  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));  	return TRUE; @@ -300,7 +328,7 @@ void LLPanelOutfitEdit::onOpen(const LLSD& key)  	{  		// *TODO: this method is called even panel is not visible to user because its parent layout panel is hidden.  		// So, we can defer initializing a bit. -		mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mWearableListMaskCollector); +		mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mListViewItemTypes[LVIT_ALL]->collector);  		mWearableListManager->populateList();  		displayCurrentOutfit();  		mInitialized = true; @@ -328,13 +356,17 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)  	childSetValue("show_add_wearables_btn", show_add_wearables); -	childSetVisible("filter_wearables_combobox", show_add_wearables); +	updateFiltersVisibility();  	childSetVisible("filter_button", show_add_wearables);  	//search filter should be disabled  	if (!show_add_wearables)  	{  		childSetValue("filter_button", false); + +		mFolderViewFilterCmbBox->setVisible(false); +		mListViewFilterCmbBox->setVisible(false); +  		showWearablesFilter();  	} @@ -358,33 +390,40 @@ void LLPanelOutfitEdit::showWearablesFilter()  void LLPanelOutfitEdit::showWearablesListView()  { -	if(switchPanels(mInventoryItemsPanel, mWearableItemsPanel)) +	if(switchPanels(mInventoryItemsPanel, mWearablesListViewPanel))  	{  		mFolderViewBtn->setToggleState(FALSE);  		mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign());  		mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign()); +		updateFiltersVisibility();  	}  	mListViewBtn->setToggleState(TRUE);  }  void LLPanelOutfitEdit::showWearablesFolderView()  { -	if(switchPanels(mWearableItemsPanel, mInventoryItemsPanel)) +	if(switchPanels(mWearablesListViewPanel, mInventoryItemsPanel))  	{  		mListViewBtn->setToggleState(FALSE);  		mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign());  		mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign()); +		updateFiltersVisibility();  	}  	mFolderViewBtn->setToggleState(TRUE);  } -void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl) +void LLPanelOutfitEdit::updateFiltersVisibility()  { -	U32 curr_filter_type = mFilterComboBox->getCurrentIndex(); -	mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask); +	mListViewFilterCmbBox->setVisible(mWearablesListViewPanel->getVisible()); +	mFolderViewFilterCmbBox->setVisible(mInventoryItemsPanel->getVisible()); +} -	mWearableListMaskCollector->setFilterMask(mLookItemTypes[curr_filter_type].inventoryMask); -	mWearableListManager->setFilterCollector(mWearableListMaskCollector); +void LLPanelOutfitEdit::onFolderViewFilterCommitted(LLUICtrl* ctrl) +{ +	S32 curr_filter_type = mFolderViewFilterCmbBox->getCurrentIndex(); +	if (curr_filter_type < 0) return; + +	mInventoryItemsPanel->setFilterTypes(mFolderViewItemTypes[curr_filter_type].inventoryMask);  	mSavedFolderState->setApply(TRUE);  	mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); @@ -396,6 +435,14 @@ void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)  	LLInventoryModelBackgroundFetch::instance().start();  } +void LLPanelOutfitEdit::onListViewFilterCommitted(LLUICtrl* ctrl) +{ +	S32 curr_filter_type = mListViewFilterCmbBox->getCurrentIndex(); +	if (curr_filter_type < 0) return; + +	mWearableListManager->setFilterCollector(mListViewItemTypes[curr_filter_type]->collector); +} +  void LLPanelOutfitEdit::onSearchEdit(const std::string& string)  {  	if (mSearchString != string) @@ -453,7 +500,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void)  		selected_id = listenerp->getUUID();  	} -	else if (mWearableItemsPanel->getVisible()) +	else if (mWearablesListViewPanel->getVisible())  	{  		selected_id = mWearableItemsList->getSelectedUUID();  	} @@ -537,10 +584,16 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView  } -void LLPanelOutfitEdit::applyFilter(e_look_item_type type) +void LLPanelOutfitEdit::applyFolderViewFilter(EFolderViewItemType type)  { -	mFilterComboBox->setCurrentByIndex(type); -	mFilterComboBox->onCommit(); +	mFolderViewFilterCmbBox->setCurrentByIndex(type); +	mFolderViewFilterCmbBox->onCommit(); +} + +void LLPanelOutfitEdit::applyListViewFilter(EListViewItemType type) +{ +	mListViewFilterCmbBox->setCurrentByIndex(type); +	mListViewFilterCmbBox->onCommit();  }  void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) @@ -561,14 +614,15 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		if (nothing_selected)  		{  			showWearablesFolderView(); +			applyFolderViewFilter(FVIT_ALL);  		}  		if (more_than_one_selected)  		{  			showWearablesListView(); +			applyListViewFilter(LVIT_ALL);  		} -		 -		applyFilter(LIT_ALL); +  		return;  	} @@ -585,7 +639,7 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  	{  		//Inventory misses an item with non-zero id  		showWearablesListView(); -		applyFilter(LIT_ALL); +		applyListViewFilter(LVIT_ALL);  		return;  	} @@ -595,14 +649,13 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		{  			//single clothing or bodypart item is selected  			showFilteredWearablesListView(item->getWearableType()); -			mFilterComboBox->setLabel(getString("Filter.Custom"));  			return;  		}  		else  		{  			//attachment is selected  			showWearablesListView(); -			applyFilter(LIT_ATTACHMENT); +			applyListViewFilter(LVIT_ATTACHMENT);  			return;  		}  	} @@ -740,11 +793,11 @@ void LLPanelOutfitEdit::onAddMoreButtonClicked()  void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type)  { -	mFilterComboBox->setLabel(getString("Filter.Custom")); -	mWearableListTypeCollector->setType(type); -	mWearableListManager->setFilterCollector(mWearableListTypeCollector);  	showAddWearablesPanel(true);  	showWearablesListView(); + +	//e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE +	applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));  } diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index d19ede04f1..56c6c6d680 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -42,6 +42,7 @@  #include "llremoteparcelrequest.h"  #include "llinventory.h" +#include "llinventoryfunctions.h"  #include "llinventoryitemslist.h"  #include "llinventorymodel.h" @@ -69,21 +70,59 @@ class LLPanelOutfitEdit : public LLPanel  	LOG_CLASS(LLPanelOutfitEdit);  public: -	// NOTE: initialize mLookItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor -	typedef enum e_look_item_type +	// NOTE: initialize mFolderViewItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor +	typedef enum e_folder_view_item_type  	{ -		LIT_ALL = 0, -		LIT_WEARABLE, // clothing or shape -		LIT_ATTACHMENT, -		NUM_LOOK_ITEM_TYPES -	} ELookItemType;  +		FVIT_ALL = 0, +		FVIT_WEARABLE, // clothing or shape +		FVIT_ATTACHMENT, +		NUM_FOLDER_VIEW_ITEM_TYPES +	} EFolderViewItemType;  +	//should reflect order from LLWearableType::EType +	typedef enum e_list_view_item_type +	{ +		LVIT_ALL = 0, +		LVIT_CLOTHING, +		LVIT_BODYPART, +		LVIT_ATTACHMENT, +		LVIT_SHAPE, +		LVIT_SKIN, +		LVIT_HAIR, +		LVIT_EYES, +		LVIT_SHIRT, +		LVIT_PANTS, +		LVIT_SHOES, +		LVIT_SOCKS, +		LVIT_JACKET, +		LVIT_GLOVES, +		LVIT_UNDERSHIRT, +		LVIT_UNDERPANTS, +		LVIT_SKIRT, +		LVIT_ALPHA, +		LVIT_TATTOO, +		NUM_LIST_VIEW_ITEM_TYPES +	} EListViewItemType;  +  	struct LLLookItemType {  		std::string displayName;  		U64 inventoryMask;  		LLLookItemType() : displayName("NONE"), inventoryMask(0) {}  		LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}  	}; + +	struct LLFilterItem { +		std::string displayName; +		LLInventoryCollectFunctor* collector; +		LLFilterItem() : displayName("NONE"), collector(NULL) {} +		LLFilterItem(std::string name, LLInventoryCollectFunctor* _collector) : displayName(name), collector(_collector) {} +		~LLFilterItem() { delete collector; } + +	//the struct is not supposed to by copied, either way the destructor kills collector +	//LLPointer is not used as it requires LLInventoryCollectFunctor to extend LLRefCount what it doesn't do +	private: +		LLFilterItem(const LLFilterItem& filter_item) {}; +	};  	LLPanelOutfitEdit();  	/*virtual*/ ~LLPanelOutfitEdit(); @@ -101,12 +140,16 @@ public:  	void showWearablesListView();  	void showWearablesFolderView(); -	void onTypeFilterChanged(LLUICtrl* ctrl); +	void updateFiltersVisibility(); + +	void onFolderViewFilterCommitted(LLUICtrl* ctrl); +	void onListViewFilterCommitted(LLUICtrl* ctrl);  	void onSearchEdit(const std::string& string);  	void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);  	void onAddToOutfitClicked(void); -	void applyFilter(e_look_item_type type); +	void applyFolderViewFilter(EFolderViewItemType type); +	void applyListViewFilter(EListViewItemType type);  	/**  	 * Filter items in views of Add Wearables Panel and show appropriate view depending on currently selected COF item(s) @@ -159,18 +202,18 @@ private:  	LLButton*			mFolderViewBtn;  	LLButton*			mListViewBtn;  	LLPanel*			mAddWearablesPanel; -	LLComboBox*			mFilterComboBox; - -	LLFindNonLinksByMask*  mWearableListMaskCollector; -	LLFindWearablesOfType* mWearableListTypeCollector; +	 +	LLComboBox*			mFolderViewFilterCmbBox; +	LLComboBox*			mListViewFilterCmbBox;  	LLFilteredWearableListManager* 	mWearableListManager;  	LLInventoryItemsList* 			mWearableItemsList; -	LLPanel*						mWearableItemsPanel; +	LLPanel*						mWearablesListViewPanel;  	LLCOFDragAndDropObserver* mCOFDragAndDropObserver; -	std::vector<LLLookItemType> mLookItemTypes; +	std::vector<LLLookItemType> mFolderViewItemTypes; +	std::vector<LLFilterItem*> mListViewItemTypes;  	LLCOFWearables*		mCOFWearables;  	LLMenuGL*			mGearMenu; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 1286642897..1157c40b39 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -91,6 +91,7 @@ public:  		registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));  		enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2)); +		enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));  		mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(  			"menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -99,6 +100,28 @@ public:  	LLMenuGL* getMenu() { return 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; + +		bool have_selection = getSelectedOutfitID().notNull(); +		mMenu->setItemVisible("sepatator1", have_selection); +		mMenu->setItemVisible("sepatator2", have_selection); +		mMenu->arrangeAndClear(); // update menu height +	} +  private:  	const LLUUID& getSelectedOutfitID()  	{ @@ -174,6 +197,26 @@ private:  			return false;  		} +		if ("rename" == param) +		{ +			return get_is_category_renameable(&gInventory, selected_outfit_id); +		} +		else if ("delete" == param) +		{ +			return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id); +		} + +		return true; +	} + +	bool onVisible(LLSD::String param) +	{ +		const LLUUID& selected_outfit_id = getSelectedOutfitID(); +		if (selected_outfit_id.isNull()) // no selection or invalid outfit selected +		{ +			return false; +		} +  		bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id;  		if ("wear" == param) @@ -184,14 +227,6 @@ private:  		{  			return is_worn;  		} -		else if ("rename" == param) -		{ -			return get_is_category_renameable(&gInventory, selected_outfit_id); -		} -		else if ("delete" == param) -		{ -			return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id); -		}  		return true;  	} @@ -528,28 +563,21 @@ void LLPanelOutfitsInventory::updateListCommands()  {  	bool trash_enabled = isActionEnabled("delete");  	bool wear_enabled = isActionEnabled("wear"); +	bool wear_visible = !isCOFPanelActive();  	bool make_outfit_enabled = isActionEnabled("save_outfit");  	mListCommands->childSetEnabled("trash_btn", trash_enabled);  	mListCommands->childSetEnabled("wear_btn", wear_enabled); -	mListCommands->childSetVisible("wear_btn", wear_enabled); +	mListCommands->childSetVisible("wear_btn", wear_visible);  	mSaveComboBtn->setMenuItemEnabled("save_outfit", make_outfit_enabled);  }  void LLPanelOutfitsInventory::showGearMenu()  { -	LLMenuGL* menu = mGearMenu ? mGearMenu->getMenu() : NULL; -	if (menu) -	{ -		menu->buildDrawLabels(); -		menu->updateParent(LLMenuGL::sMenuContainer); -		LLView* spawning_view = getChild<LLView>("options_gear_btn"); -		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); -	} +	if (!mGearMenu) return; + +	LLView* spawning_view = getChild<LLView>("options_gear_btn"); +	mGearMenu->show(spawning_view);  }  void LLPanelOutfitsInventory::onTrashButtonClick() @@ -691,6 +719,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)  		{  			return FALSE;  		} +		return hasItemsSelected();  	}  	if (command_name == "save_outfit")  	{ @@ -713,7 +742,6 @@ bool LLPanelOutfitsInventory::hasItemsSelected()  {  	bool has_items_selected = false; -	// TODO: add handling "My Outfits" tab.  	if (isCOFPanelActive())  	{  		LLFolderView* root = getActivePanel()->getRootFolder(); @@ -723,6 +751,10 @@ bool LLPanelOutfitsInventory::hasItemsSelected()  			has_items_selected = (selection_set.size() > 0);  		}  	} +	else // My Outfits Tab is active +	{ +		has_items_selected = mMyOutfitsPanel->getSelectedOutfitUUID().notNull(); +	}  	return has_items_selected;  } diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index c8abcc83c4..1f979b0ef1 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -84,7 +84,9 @@ LLPanelPlaceProfile::LLPanelPlaceProfile()  // virtual  LLPanelPlaceProfile::~LLPanelPlaceProfile() -{} +{ +	gIdleCallbacks.deleteFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this); +}  // virtual  BOOL LLPanelPlaceProfile::postBuild() diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index a27afeab7c..8fe78a0f81 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -52,6 +52,18 @@  static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR; +// helper function to update AvatarList Item's indicator in the voice participant list +static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted) +{ +	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid)); +	if (item) +	{ +		LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); +		indicator->setIsMuted(is_muted); +	} +} + +  // See EXT-4301.  /**   * class LLAvalineUpdater - observe the list of voice participants in session and check @@ -354,6 +366,20 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)  				}  			}  		} + +		// update voice mute state of all items. See EXT-7235 +		LLSpeakerMgr::speaker_list_t speaker_list; + +		// Use also participants which are not in voice session now (the second arg is TRUE). +		// They can already have mModeratorMutedVoice set from the previous voice session +		// and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time. +		mSpeakerMgr->getSpeakerList(&speaker_list, TRUE); +		for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) +		{ +			const LLPointer<LLSpeaker>& speakerp = *it; + +			update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice); +		}  	}  } @@ -506,12 +532,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event  	// update UI on confirmation of moderator mutes  	if (event->getValue().asString() == "voice")  	{ -		LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID)); -		if (item) -		{ -			LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator"); -			indicator->setIsMuted(speakerp->mModeratorMutedVoice); -		} +		update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice);  	}  	return true;  } diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 54695e9d40..f86838194e 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -126,6 +126,19 @@ BOOL LLPanelWearableOutfitItem::handleDoubleClick(S32 x, S32 y, MASK mask)  	return LLUICtrl::handleDoubleClick(x, y, mask);  } +// virtual +void LLPanelWearableOutfitItem::updateItem(const std::string& name) +{ +	std::string search_label = name; + +	if (mItem && get_is_item_worn(mItem->getUUID())) +	{ +		search_label += LLTrans::getString("worn"); +	} + +	LLPanelInventoryListItemBase::updateItem(search_label); +} +  LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item)  : LLPanelInventoryListItemBase(item)  { @@ -292,12 +305,6 @@ LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableTyp  	return list_item;  } -void LLPanelDummyClothingListItem::updateItem() -{ -	std::string title = wearableTypeToString(mWearableType); -	setTitle(title, LLStringUtil::null); -} -  BOOL LLPanelDummyClothingListItem::postBuild()  {  	LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon"); @@ -307,7 +314,7 @@ BOOL LLPanelDummyClothingListItem::postBuild()  	addWidgetToRightSide("btn_add_panel");  	setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE)); -	updateItem(); +	updateItem(wearableTypeToString(mWearableType));  	// Make it look loke clothing item - reserve space for 'delete' button  	setLeftWidgetsWidth(icon->getRect().mLeft); @@ -452,15 +459,17 @@ static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;  static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list");  LLWearableItemsList::Params::Params() -:	use_internal_context_menu("use_internal_context_menu", true) +:	standalone("standalone", true)  {}  LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)  :	LLInventoryItemsList(p)  {  	setComparator(&WEARABLE_TYPE_NAME_COMPARATOR); -	if (p.use_internal_context_menu) +	mIsStandalone = p.standalone; +	if (mIsStandalone)  	{ +		// Use built-in context menu.  		setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));  	}  } @@ -555,6 +564,18 @@ void LLWearableItemsList::onRightClick(S32 x, S32 y)  /// ContextMenu  ////////////////////////////////////////////////////////////////////////// +LLWearableItemsList::ContextMenu::ContextMenu() +:	mParent(NULL) +{ +} + +void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) +{ +	mParent = dynamic_cast<LLWearableItemsList*>(spawning_view); +	LLListContextMenu::show(spawning_view, uuids, x, y); +	mParent = NULL; // to avoid dereferencing an invalid pointer +} +  // virtual  LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  { @@ -642,17 +663,21 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu  		}  	} // for +	bool standalone = mParent ? mParent->isStandalone() : false; +  	// *TODO: eliminate multiple traversals over the menu items +	setMenuItemVisible(menu, "wear_add",			mask == MASK_CLOTHING && n_worn == 0);  	setMenuItemVisible(menu, "wear",				n_worn == 0); -	setMenuItemVisible(menu, "edit",				mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1); -	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1); +	setMenuItemVisible(menu, "edit",				!standalone && mask & (MASK_CLOTHING|MASK_BODYPART)); +	setMenuItemEnabled(menu, "edit",				n_editable == 1 && n_worn == 1 && n_items == 1);  	setMenuItemVisible(menu, "create_new",			mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1); +	setMenuItemVisible(menu, "show_original",		!standalone);  	setMenuItemEnabled(menu, "show_original",		n_items == 1 && n_links == n_items);  	setMenuItemVisible(menu, "take_off",			mask == MASK_CLOTHING && n_worn == n_items);  	setMenuItemVisible(menu, "detach",				mask == MASK_ATTACHMENT && n_worn == n_items);  	setMenuItemVisible(menu, "take_off_or_detach",	mask == (MASK_ATTACHMENT|MASK_CLOTHING));  	setMenuItemEnabled(menu, "take_off_or_detach",	n_worn == n_items); -	setMenuItemVisible(menu, "object_profile",		mask & (MASK_ATTACHMENT|MASK_CLOTHING)); +	setMenuItemVisible(menu, "object_profile",		!standalone);  	setMenuItemEnabled(menu, "object_profile",		n_items == 1);  	// Populate or hide the "Attach to..." / "Attach to HUD..." submenus. diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index dd0ceb99e4..2f95c733aa 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -56,13 +56,13 @@ class LLPanelWearableListItem : public LLPanelInventoryListItemBase  public:  	/** -	* Shows buttons when mouse is over -	*/ +	 * Shows buttons when mouse is over +	 */  	/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);  	/** -	* Hides buttons when mouse is out -	*/ +	 * Hides buttons when mouse is out +	 */  	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);  protected: @@ -84,11 +84,16 @@ public:  	static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item);  	/** -	* Puts item on if it is not worn by agent -	* otherwise takes it off on double click. -	*/ +	 * Puts item on if it is not worn by agent +	 * otherwise takes it off on double click. +	 */  	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); +	/** +	 * Updates item name and (worn) suffix. +	 */ +	/*virtual*/ void updateItem(const std::string& name); +  protected:  	LLPanelWearableOutfitItem(LLViewerInventoryItem* item); @@ -198,7 +203,6 @@ class LLPanelDummyClothingListItem : public LLPanelWearableListItem  public:  	static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type); -	/*virtual*/ void updateItem();  	/*virtual*/ BOOL postBuild();  	LLWearableType::EType getWearableType() const; @@ -325,6 +329,10 @@ public:  	 */  	class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu>  	{ +	public: +		ContextMenu(); +		/*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); +  	protected:  		enum {  			MASK_CLOTHING		= 0x01, @@ -340,11 +348,13 @@ 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); + +		LLWearableItemsList*	mParent;  	};  	struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params>  	{ -		Optional<bool> use_internal_context_menu; +		Optional<bool> standalone;  		Params();  	}; @@ -361,11 +371,15 @@ public:  	 */  	void updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids); +	bool isStandalone() const { return mIsStandalone; } +  protected:  	friend class LLUICtrlFactory;  	LLWearableItemsList(const LLWearableItemsList::Params& p);  	void onRightClick(S32 x, S32 y); + +	bool mIsStandalone;  };  #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml index c4e31ed180..8e7ef7f0b5 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -11,6 +11,9 @@          <on_enable           function="Gear.OnEnable"           parameter="wear" /> +        <on_visible +         function="Gear.OnVisible" +         parameter="wear" />      </menu_item_call>      <menu_item_call       label="Take Off - Remove from Current Outfit" @@ -21,9 +24,12 @@          <on_enable           function="Gear.OnEnable"           parameter="take_off" /> +        <on_visible +         function="Gear.OnVisible" +         parameter="take_off" />      </menu_item_call> -            <menu_item_separator /> +            <menu_item_separator name="sepatator1" />              <!-- copied (with minor modifications) from menu_inventory_add.xml -->              <!--  *TODO: generate dynamically? -->              <menu @@ -168,7 +174,7 @@              </menu>              <!-- copied from menu_inventory_add.xml --> -    <menu_item_separator /> +    <menu_item_separator name="sepatator2" />      <menu_item_call       label="Rename Outfit"       layout="topleft" @@ -178,6 +184,9 @@          <on_enable           function="Gear.OnEnable"           parameter="rename" /> +        <on_visible +         function="Gear.OnVisible" +         parameter="rename" />      </menu_item_call>      <menu_item_call       label="Delete Outfit" @@ -188,5 +197,8 @@          <on_enable           function="Gear.OnEnable"           parameter="delete" /> +        <on_visible +         function="Gear.OnVisible" +         parameter="delete" />      </menu_item_call>  </menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml index 67559638d9..e084216a69 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml @@ -8,8 +8,8 @@       name="wear_replace">          <on_click           function="Outfit.WearReplace" /> -        <on_enable -         function="Outfit.OnEnable" +        <on_visible +         function="Outfit.OnVisible"           parameter="wear_replace" />      </menu_item_call>      <menu_item_call @@ -18,8 +18,8 @@       name="wear_add">          <on_click           function="Outfit.WearAdd" /> -        <on_enable -         function="Outfit.OnEnable" +        <on_visible +         function="Outfit.OnVisible"           parameter="wear_add" />      </menu_item_call>      <menu_item_call @@ -28,8 +28,8 @@       name="take_off">          <on_click           function="Outfit.TakeOff" /> -        <on_enable -         function="Outfit.OnEnable" +        <on_visible +         function="Outfit.OnVisible"           parameter="take_off" />      </menu_item_call>      <menu_item_call @@ -38,8 +38,8 @@       name="edit">          <on_click           function="Outfit.Edit" /> -        <on_enable -         function="Outfit.OnEnable" +        <on_visible +         function="Outfit.OnVisible"           parameter="edit" />      </menu_item_call>      <menu_item_separator /> @@ -59,8 +59,8 @@       name="delete">          <on_click           function="Outfit.Delete" /> -        <on_enable -         function="Outfit.OnEnable" +        <on_visible +         function="Outfit.OnVisible"           parameter="delete" />      </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml index 44437d01eb..bdfa928b1d 100644 --- a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml +++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml @@ -19,6 +19,6 @@       multi_select="true"       name="wearable_items_list"       translate="false" -     use_internal_context_menu="false" +     standalone="false"      />  </accordion_tab> diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml index 4e5f594ffe..4f989a6f6f 100644 --- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml @@ -57,7 +57,8 @@       left="0"       height="23"       width="23" -     tab_stop="false"> +     tab_stop="false" +     tool_tip="You don't have permission to edit">          <icon            name="btn_lock1"           layout="topleft" @@ -88,7 +89,8 @@            left="0"            height="23"            width="23" -          tab_stop="false" /> +          tab_stop="false" +          tool_tip="Edit this shape"/>        </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 859cc82e81..976f6d6cd0 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -47,7 +47,7 @@       layout="topleft"       name="back_btn"       picture_style="true" -     left="9" +     left="10"       tab_stop="false"       top="2"       width="30" /> @@ -56,7 +56,7 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="4"       name="title"       text_color="LtGray"       top="0" diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml index 5d81aebbd5..93d7720c57 100644 --- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml @@ -37,7 +37,8 @@       left="0"       height="18"       width="18" -     tab_stop="false" /> +     tab_stop="false" +     tool_tip="Remove from outfit" />      <icon       height="16"       follows="top|left" @@ -88,7 +89,8 @@       left="0"       height="23"       width="23" -     tab_stop="false"> +     tab_stop="false" +     tool_tip="You don't have permission to edit">          <icon            name="btn_lock1"           layout="topleft" @@ -119,7 +121,8 @@           left="0"           height="23"           width="23" -         tab_stop="false" /> +         tab_stop="false" +         tool_tip="Edit this wearable"/>        </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml index 45031859f1..75b5fd1532 100644 --- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml @@ -37,7 +37,8 @@       left="0"       height="18"       width="18" -     tab_stop="false" /> +     tab_stop="false" +     tool_tip="Remove from outfit"/>      <icon       height="16"       follows="top|left" diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml index b1f4cbb079..a5dd34bd22 100644 --- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml @@ -67,7 +67,8 @@         left="0"         height="23"         width="23" -       tab_stop="false" /> +       tab_stop="false" +       tool_tip="Add more items of this type" />      </panel>      <icon       follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 1b4f547f9d..6744a7b9c2 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -31,7 +31,7 @@       layout="topleft"       name="back_btn"       picture_style="true" -     left="7" +     left="10"       tab_stop="false"       top="2"       width="30" /> @@ -42,7 +42,7 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="4"       name="title"       text_color="LtGray"       top="0" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index 589ea10e8d..dc83b334b5 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -24,7 +24,7 @@       image_unselected="BackButton_Off"       layout="topleft"       name="back_btn" -     left="7" +     left="10"       tab_stop="false"       top="2"       width="30" /> @@ -35,10 +35,10 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="4"       name="title"       text_color="LtGray" -     top="0" +     top="2"       width="250">          Edit Pick      </text> diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index 645ee8a435..950c4a5fdb 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -141,15 +141,16 @@ left="0"       layout="topleft"       name="back_btn"       left="11" -     top="7" /> +     top="3" />  	<text  	 follows="top|left"  	 font="SansSerifHugeBold"  	 height="22"  	 layout="topleft" -	 left_pad="15" +	 left_pad="8"  	 name="edit_wearable_title"  	 text_color="white" +   top="3"   	 value="Editing Shape"  	 width="270" />       <panel diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 58b78cfa02..e4eb9afb29 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -57,9 +57,9 @@ background_visible="true"        font="SansSerifHugeBold"       h_pad="0"        height="26" -      left_pad="10" +      left_pad="8"       text_color="LtGray" -      top="0" +      top="1"       use_ellipses="true"        width="275"        follows="top|left|right" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index bb73360e0b..55fef5aaf7 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -63,7 +63,7 @@       image_pressed="BackButton_Press"       image_unselected="BackButton_Off"       layout="topleft" -     left="8" +     left="9"       name="back_btn"       tool_tip="Back"       tab_stop="false" @@ -74,10 +74,10 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="7"       name="title"       text_color="LtGray" -     top="2" +     top="3"       use_ellipses="true"       value="Place Profile"       width="280" /> 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 741f60669a..ed3b176267 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -51,7 +51,8 @@      <string name="Filter.All" value="All"/>      <string name="Filter.Clothes/Body" value="Clothes/Body"/>      <string name="Filter.Objects" value="Objects"/> -    <string name="Filter.Custom" value="Custom filter"/> +    <string name="Filter.Clothing" value="Clothing"/> +    <string name="Filter.Bodyparts" value="Body parts"/>      <button @@ -64,14 +65,14 @@       name="back_btn"       left="5"       tab_stop="false" -     top="2" +     top="1"       width="30" />      <text       follows="top|right"       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="20" +     left_pad="10"       name="title"       text_color="LtGray"       top="0" @@ -211,6 +212,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap                       left="2"                       name="show_add_wearables_btn"                       top_pad="2" +                     tool_tip="Open/Close"                       width="125" />                      <combo_box @@ -218,11 +220,20 @@ It is calculated as border_size + 2*UIResizeBarOverlap                       height="22"                       layout="topleft"                       left_pad="5" -                     name="filter_wearables_combobox" +                     name="list_view_filter_combobox"                       top_delta="0"                       visible="false"                       width="152"/> - +                    <combo_box +                     follows="left|right|bottom" +                     height="22" +                     layout="topleft" +                     left_delta="0" +                     name="folder_view_filter_combobox" +                     top_delta="0" +                     visible="false" +                     width="152"/> +                                          <button                       follows="bottom|right"                       height="22" @@ -300,7 +311,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap               layout="topleft"               left="0"               mouse_opaque="false" -             name="inventory_items" +             name="folder_view"               top_pad="5"               width="310"               visible="false"/> @@ -319,7 +330,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap               visible="true">                  <wearable_items_list                   color="0.107 0.107 0.107 1" -                 name="filtered_wearables_list" +                 name="list_view"                   allow_select="true"                   layout="topleft"                   follows="all" @@ -483,6 +494,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap           layout="topleft"           name="revert_btn"           top="0" +         tool_tip="Revert to last saved version"           width="147" />      </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index de1f2cf31b..37eb5eaa98 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -83,18 +83,18 @@        width="241"          /> -        <dnd_button -         follows="bottom|right" -         height="25" -         image_hover_unselected="Toolbar_Right_Over" -          image_overlay="TrashItem_Off" -          image_selected="Toolbar_Right_Selected" -          image_unselected="Toolbar_Right_Off" -         layout="topleft" -         left_pad="1" -         name="trash_btn" -         tool_tip="Remove selected item" -         width="31"/>          +     <dnd_button +      follows="bottom|right" +      height="25" +      image_hover_unselected="Toolbar_Right_Over" +      image_overlay="TrashItem_Off" +      image_selected="Toolbar_Right_Selected" +      image_unselected="Toolbar_Right_Off" +      layout="topleft" +      left_pad="1" +      name="trash_btn" +      tool_tip="Delete selected outfit" +      width="31"/>       <button         follows="bottom|left"         height="23" diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 49e1d16f6a..1d01bcb8a5 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -18,7 +18,7 @@       image_unselected="BackButton_Off"       layout="topleft"       name="back_btn" -     left="7" +     left="10"       tab_stop="false"       top="2"       width="30" /> @@ -27,10 +27,10 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="4"       name="title"       text_color="LtGray" -     top="0" +     top="2"       value="Pick Info"       use_ellipses="true"       width="275" /> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 59f1f6d638..55e0184282 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -160,7 +160,7 @@       image_pressed="BackButton_Press"       image_unselected="BackButton_Off"       layout="topleft" -     left="7" +     left="8"       name="back_btn"       tool_tip="Back"       tab_stop="false" @@ -174,7 +174,7 @@       left_pad="10"       name="title"       text_color="LtGray" -     top="2" +     top="4"       use_ellipses="true"       value="Place Profile"       width="280" /> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 33f895e13a..638e190e8f 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -37,6 +37,7 @@ background_visible="true"       left="6"       name="Places Tabs"       tab_min_width="80" +     tab_max_width="157"       tab_height="30"       tab_group="1"       tab_position="top" diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index cc5ba334d6..d9030fc0d6 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -24,7 +24,7 @@       image_unselected="BackButton_Off"       layout="topleft"       name="back" -     left="9" +     left="10"       tab_stop="false"       top="2"       width="30" /> @@ -38,10 +38,10 @@        font="SansSerifHugeBold"        height="26"        layout="topleft" -      left_pad="10" +      left_pad="5"        name="user_name"        text_color="LtGray" -      top="0" +      top="2"        value="(Loading...)"        use_ellipses="true"        width="275" /> diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index ae08a13793..e189d11d35 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -92,6 +92,7 @@ width="333">        layout="topleft"        left="265"        name="edit_outfit_btn" +      tool_tip="Edit this outfit"        top="7"        width="30" />        <loading_indicator @@ -144,7 +145,7 @@ width="333">     left="5"     min_height="410"     name="panel_outfit_edit" -   top="5" +   top="2"     visible="false"      width="320"/>     <panel diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index b736f5e29c..e2bd6f375e 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -55,10 +55,10 @@       font="SansSerifHugeBold"       height="26"       layout="topleft" -     left_pad="10" +     left_pad="3"       name="title"       text_color="LtGray" -     top="0" +     top="2"       use_ellipses="true"       value="Object Profile"       width="275" /> | 
