diff options
Diffstat (limited to 'indra/newview')
58 files changed, 2359 insertions, 942 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3439951e80..1520c0ee69 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -209,6 +209,7 @@ set(viewer_SOURCE_FILES      llflexibleobject.cpp      llfloaterabout.cpp      llfloaterbvhpreview.cpp +    llfloateraddpaymentmethod.cpp      llfloaterauction.cpp      llfloaterautoreplacesettings.cpp      llfloateravatar.cpp @@ -840,6 +841,7 @@ set(viewer_HEADER_FILES      llflexibleobject.h      llfloaterabout.h      llfloaterbvhpreview.h +    llfloateraddpaymentmethod.h      llfloaterauction.h      llfloaterautoreplacesettings.h      llfloateravatar.h diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 537744b44c..3d77ac43e5 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -403,6 +403,17 @@          <key>Value</key>          <string></string>        </map> +      <key>FavoritesFolder</key> +      <map> +        <key>Comment</key> +        <string>User's chosen folder which will be shown in the Favorites tab (UUID)</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>String</string> +        <key>Value</key> +        <string></string> +      </map>        <key>SnapshotBaseDir</key>        <map>          <key>Comment</key> diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 856eb3414e..f41eb3daf4 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -253,6 +253,19 @@ std::string LLAvatarPropertiesProcessor::paymentInfo(const LLAvatarData* avatar_  	return LLTrans::getString(payment_text);  } +//static +bool LLAvatarPropertiesProcessor::hasPaymentInfoOnFile(const LLAvatarData* avatar_data) +{ +	// Special accounts like M Linden don't have payment info revealed. +	if (!avatar_data->caption_text.empty()) return true; + +	// Linden employees don't have payment info revealed +	const S32 LINDEN_EMPLOYEE_INDEX = 3; +	if (avatar_data->caption_index == LINDEN_EMPLOYEE_INDEX) return true; + +	return ((avatar_data->flags & AVATAR_TRANSACTED) || (avatar_data->flags & AVATAR_IDENTIFIED)); +} +  void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**)  {  	LLAvatarData avatar_data; diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h index d5c5c75c69..b063048c26 100644 --- a/indra/newview/llavatarpropertiesprocessor.h +++ b/indra/newview/llavatarpropertiesprocessor.h @@ -232,6 +232,8 @@ public:  	// Used for profiles, inspectors.  	static std::string paymentInfo(const LLAvatarData* avatar_data); +	static bool hasPaymentInfoOnFile(const LLAvatarData* avatar_data); +  	static void processAvatarPropertiesReply(LLMessageSystem* msg, void**);  	static void processAvatarInterestsReply(LLMessageSystem* msg, void**); diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index d4fc1fe64d..232e461fd0 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -454,7 +454,7 @@ void LLCurrencyUIManager::Impl::updateUI()  		if (!mUserEnteredCurrencyBuy)  		{ -			if (!mZeroMessage.empty() && mUserCurrencyBuy == 0) +			if (mUserCurrencyBuy == 0)  			{  				lindenAmount->setText(LLStringUtil::null);  			} @@ -467,8 +467,9 @@ void LLCurrencyUIManager::Impl::updateUI()  		}  	} -	mPanel.getChild<LLUICtrl>("currency_est")->setTextArg("[LOCALAMOUNT]", getLocalEstimate()); -	mPanel.getChildView("currency_est")->setVisible( hasEstimate() && mUserCurrencyBuy > 0); +	std::string estimated = (mUserCurrencyBuy == 0) ? mPanel.getString("estimated_zero") : getLocalEstimate(); +	mPanel.getChild<LLUICtrl>("currency_est")->setTextArg("[LOCALAMOUNT]", estimated); +	mPanel.getChildView("currency_est")->setVisible( hasEstimate() || mUserCurrencyBuy == 0);  	mPanel.getChildView("currency_links")->setVisible( mSupportsInternationalBilling);  	mPanel.getChildView("exchange_rate_note")->setVisible( mSupportsInternationalBilling); diff --git a/indra/newview/llfloateraddpaymentmethod.cpp b/indra/newview/llfloateraddpaymentmethod.cpp new file mode 100644 index 0000000000..3952b48229 --- /dev/null +++ b/indra/newview/llfloateraddpaymentmethod.cpp @@ -0,0 +1,81 @@ +/**  + * @file llfloateraddpaymentmethod.cpp + * @brief LLFloaterAddPaymentMethod class implementation + * + * $LicenseInfo:firstyear=2020&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2020, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloateraddpaymentmethod.h" +#include "llnotificationsutil.h" +#include "lluictrlfactory.h" +#include "llweb.h" + + +LLFloaterAddPaymentMethod::LLFloaterAddPaymentMethod(const LLSD& key) +	:	LLFloater(key) +{ +} + +LLFloaterAddPaymentMethod::~LLFloaterAddPaymentMethod() +{ +} + +BOOL LLFloaterAddPaymentMethod::postBuild() +{ +	setCanDrag(FALSE); +	getChild<LLButton>("continue_btn")->setCommitCallback(boost::bind(&LLFloaterAddPaymentMethod::onContinueBtn, this)); +	getChild<LLButton>("close_btn")->setCommitCallback(boost::bind(&LLFloaterAddPaymentMethod::onCloseBtn, this)); +	return TRUE; +} + +void LLFloaterAddPaymentMethod::onOpen(const LLSD& key) +{ +	centerOnScreen(); +} + +void LLFloaterAddPaymentMethod::onContinueBtn() +{ +	closeFloater(); +	LLNotificationsUtil::add("AddPaymentMethod", LLSD(), LLSD(), +		[this](const LLSD¬if, const LLSD&resp) +	{ +		S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp); +		if (opt == 0) +		{ +			LLWeb::loadURL(this->getString("continue_url")); +		} +	});  +} + +void LLFloaterAddPaymentMethod::onCloseBtn() +{ +	closeFloater(); +} + +void LLFloaterAddPaymentMethod::centerOnScreen() +{ +	LLVector2 window_size = LLUI::getInstance()->getWindowSize(); +	centerWithin(LLRect(0, 0, ll_round(window_size.mV[VX]), ll_round(window_size.mV[VY]))); +} + diff --git a/indra/newview/llfloateraddpaymentmethod.h b/indra/newview/llfloateraddpaymentmethod.h new file mode 100644 index 0000000000..b3bb624484 --- /dev/null +++ b/indra/newview/llfloateraddpaymentmethod.h @@ -0,0 +1,52 @@ +/**  + * @file llfloateraddpaymentmethod.h + * @brief LLFloaterAddPaymentMethod class definition + * + * $LicenseInfo:firstyear=2020&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2020, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_FLOATER_ADDPAYMENTMETHOD_H +#define LL_FLOATER_ADDPAYMENTMETHOD_H + +#include "llfloater.h" + +class LLFloaterAddPaymentMethod: +	public LLFloater +{ +	friend class LLFloaterReg; +public: +	/*virtual*/	BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	LLFloaterAddPaymentMethod(const LLSD& key); + +	void centerOnScreen(); + +	void onCloseBtn(); +	void onContinueBtn(); +	 +	/*virtual*/	~LLFloaterAddPaymentMethod(); + +}; + +#endif diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 1751d54b5a..0cfac166c7 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -32,6 +32,8 @@  #include "llcurrencyuimanager.h"  #include "llfloater.h"  #include "llfloaterreg.h" +#include "lllayoutstack.h" +#include "lliconctrl.h"  #include "llnotificationsutil.h"  #include "llstatusbar.h"  #include "lltextbox.h" @@ -42,7 +44,6 @@  #include "llwindow.h"  #include "llappviewer.h" -static const S32 STANDARD_BUY_AMOUNT = 2000;  static const S32 MINIMUM_BALANCE_AMOUNT = 0;  class LLFloaterBuyCurrencyUI @@ -58,8 +59,8 @@ public:  	LLCurrencyUIManager	mManager;  	bool		mHasTarget; -	std::string	mTargetName;  	S32			mTargetPrice; +	S32			mRequiredAmount;  public:  	void noTarget(); @@ -68,6 +69,7 @@ public:  	virtual BOOL postBuild();  	void updateUI(); +	void collapsePanels(bool collapse);  	virtual void draw();  	virtual BOOL canClose(); @@ -92,7 +94,9 @@ LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key)  LLFloaterBuyCurrencyUI::LLFloaterBuyCurrencyUI(const LLSD& key)  :	LLFloater(key),  	mChildren(*this), -	mManager(*this) +	mManager(*this), +	mHasTarget(false), +	mTargetPrice(0)  {  } @@ -104,15 +108,20 @@ LLFloaterBuyCurrencyUI::~LLFloaterBuyCurrencyUI()  void LLFloaterBuyCurrencyUI::noTarget()  {  	mHasTarget = false; -	mManager.setAmount(STANDARD_BUY_AMOUNT); +	mTargetPrice = 0; +	mManager.setAmount(0);  }  void LLFloaterBuyCurrencyUI::target(const std::string& name, S32 price)  {  	mHasTarget = true; -	mTargetName = name;  	mTargetPrice = price; +	if (!name.empty()) +	{ +		getChild<LLUICtrl>("target_price_label")->setValue(name); +	} +  	S32 balance = gStatusBar->getBalance();  	S32 need = price - balance;  	if (need < 0) @@ -120,7 +129,8 @@ void LLFloaterBuyCurrencyUI::target(const std::string& name, S32 price)  		need = 0;  	} -	mManager.setAmount(need + MINIMUM_BALANCE_AMOUNT); +	mRequiredAmount = need + MINIMUM_BALANCE_AMOUNT; +	mManager.setAmount(0);  } @@ -175,7 +185,6 @@ void LLFloaterBuyCurrencyUI::updateUI()  	getChildView("purchase_warning_repurchase")->setVisible(FALSE);  	getChildView("purchase_warning_notenough")->setVisible(FALSE);  	getChildView("contacting")->setVisible(FALSE); -	getChildView("buy_action")->setVisible(FALSE);  	if (hasError)  	{ @@ -209,8 +218,8 @@ void LLFloaterBuyCurrencyUI::updateUI()  		{  			if (mHasTarget)  			{ -				getChildView("buy_action")->setVisible( true); -				getChild<LLUICtrl>("buy_action")->setTextArg("[ACTION]", mTargetName); +				getChild<LLUICtrl>("target_price")->setTextArg("[AMT]", llformat("%d", mTargetPrice)); +				getChild<LLUICtrl>("required_amount")->setTextArg("[AMT]", llformat("%d", mRequiredAmount));  			}  		} @@ -231,18 +240,40 @@ void LLFloaterBuyCurrencyUI::updateUI()  		if (mHasTarget)  		{ -			if (total >= mTargetPrice) -			{ -				getChildView("purchase_warning_repurchase")->setVisible( true); -			} -			else -			{ -				getChildView("purchase_warning_notenough")->setVisible( true); -			} +			getChildView("purchase_warning_repurchase")->setVisible( !getChildView("currency_links")->getVisible());  		}  	} -	getChildView("getting_data")->setVisible( !mManager.canBuy() && !hasError); +	getChildView("getting_data")->setVisible( !mManager.canBuy() && !hasError && !getChildView("currency_est")->getVisible()); +} + +void LLFloaterBuyCurrencyUI::collapsePanels(bool collapse) +{ +	LLLayoutPanel* price_panel = getChild<LLLayoutPanel>("layout_panel_price"); +	 +	if (price_panel->isCollapsed() == collapse) +		return; +	 +	LLLayoutStack* outer_stack = getChild<LLLayoutStack>("outer_stack");	 +	LLLayoutPanel* required_panel = getChild<LLLayoutPanel>("layout_panel_required"); +	LLLayoutPanel* msg_panel = getChild<LLLayoutPanel>("layout_panel_msg"); + +	S32 delta_height = price_panel->getRect().getHeight() + required_panel->getRect().getHeight() + msg_panel->getRect().getHeight(); +	delta_height *= (collapse ? -1 : 1); + +	LLIconCtrl* icon = getChild<LLIconCtrl>("normal_background"); +	LLRect rect = icon->getRect(); +	icon->setRect(rect.setOriginAndSize(rect.mLeft, rect.mBottom - delta_height, rect.getWidth(), rect.getHeight() + delta_height)); + +	outer_stack->collapsePanel(price_panel, collapse); +	outer_stack->collapsePanel(required_panel, collapse); +	outer_stack->collapsePanel(msg_panel, collapse); + +	outer_stack->updateLayout(); + +	LLRect floater_rect = getRect(); +	floater_rect.mBottom -= delta_height; +	setShape(floater_rect, false);  }  void LLFloaterBuyCurrencyUI::onClickBuy() @@ -260,20 +291,72 @@ void LLFloaterBuyCurrencyUI::onClickCancel()  	LLStatusBar::sendMoneyBalanceRequest();  } +LLFetchAvatarPaymentInfo* LLFloaterBuyCurrency::sPropertiesRequest = NULL; +  // static  void LLFloaterBuyCurrency::buyCurrency()  { -	LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance<LLFloaterBuyCurrencyUI>("buy_currency"); -	ui->noTarget(); -	ui->updateUI(); +	delete sPropertiesRequest; +	sPropertiesRequest = new LLFetchAvatarPaymentInfo(false);  }  // static  void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)  { -	LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance<LLFloaterBuyCurrencyUI>("buy_currency"); -	ui->target(name, price); -	ui->updateUI(); +	delete sPropertiesRequest; +	sPropertiesRequest = new LLFetchAvatarPaymentInfo(true, name, price); +} + +// static +void LLFloaterBuyCurrency::handleBuyCurrency(bool has_piof, bool has_target, const std::string name, S32 price) +{ +	delete sPropertiesRequest; +	sPropertiesRequest = NULL; + +	if (has_piof) +	{ +		LLFloaterBuyCurrencyUI* ui = LLFloaterReg::showTypedInstance<LLFloaterBuyCurrencyUI>("buy_currency"); +		if (has_target) +		{ +			ui->target(name, price); +		} +		else +		{ +			ui->noTarget();			 +		} +		ui->updateUI(); +		ui->collapsePanels(!has_target); +	} +	else +	{ +		LLFloaterReg::showInstance("add_payment_method"); +	}  } +LLFetchAvatarPaymentInfo::LLFetchAvatarPaymentInfo(bool has_target, const std::string& name, S32 price) +:	mAvatarID(gAgent.getID()), +	mHasTarget(has_target), +	mPrice(price), +	mName(name) +{ +	LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance(); +	// register ourselves as an observer +	processor->addObserver(mAvatarID, this); +	// send a request (duplicates will be suppressed inside the avatar +	// properties processor) +	processor->sendAvatarPropertiesRequest(mAvatarID); +} + +LLFetchAvatarPaymentInfo::~LLFetchAvatarPaymentInfo() +{ +	LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarID, this); +} +void LLFetchAvatarPaymentInfo::processProperties(void* data, EAvatarProcessorType type) +{ +	if (data && type == APT_PROPERTIES) +	{ +		LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); +		LLFloaterBuyCurrency::handleBuyCurrency(LLAvatarPropertiesProcessor::hasPaymentInfoOnFile(avatar_data), mHasTarget, mName, mPrice); +	} +} diff --git a/indra/newview/llfloaterbuycurrency.h b/indra/newview/llfloaterbuycurrency.h index 7ff6c42384..88d3d17cd6 100644 --- a/indra/newview/llfloaterbuycurrency.h +++ b/indra/newview/llfloaterbuycurrency.h @@ -27,15 +27,34 @@  #ifndef LL_LLFLOATERBUYCURRENCY_H  #define LL_LLFLOATERBUYCURRENCY_H +#include "llavatarpropertiesprocessor.h"  #include "stdtypes.h" - +#include "llagent.h"  class LLFloater; +class LLFetchAvatarPaymentInfo : public LLAvatarPropertiesObserver +{ +public: +	LLFetchAvatarPaymentInfo(bool has_target, const std::string& name = std::string(), S32 price = 0); +	~LLFetchAvatarPaymentInfo(); + +	void processProperties(void* data, EAvatarProcessorType type); + +private: +	LLUUID mAvatarID; +	bool mHasTarget; +	std::string mName; +    S32 mPrice; +}; + +  class LLFloaterBuyCurrency  {  public:  	static void buyCurrency();  	static void buyCurrency(const std::string& name, S32 price); + +		static void handleBuyCurrency(bool has_piof, bool has_target, const std::string name, S32 price);  		/* name should be a noun phrase of the object or service being bought:  				"That object costs"  				"Trying to give" @@ -44,7 +63,8 @@ public:  		*/  	static LLFloater* buildFloater(const LLSD& key); -}; +	static LLFetchAvatarPaymentInfo* sPropertiesRequest; +};  #endif diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index f34760a6bf..749a3d2686 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -51,6 +51,9 @@  #include "llgroupactions.h" +const std::string LINDEN_HOMES_SKU = "131"; +bool LLFloaterLandHoldings::sHasLindenHome = false; +  // protected  LLFloaterLandHoldings::LLFloaterLandHoldings(const LLSD& key)  :	LLFloater(key), @@ -148,10 +151,24 @@ void LLFloaterLandHoldings::refresh()  void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)  {  	LLFloaterLandHoldings* self = LLFloaterReg::findTypedInstance<LLFloaterLandHoldings>("land_holdings"); - -	// Is this packet from an old, closed window? +	S32 count = msg->getNumberOfBlocks("QueryData"); +	std::string land_sku; +	sHasLindenHome = false;  	if (!self)  	{ +		for (S32 i = 0; i < count; i++) +		{ +			if ( msg->getSizeFast(_PREHASH_QueryData, i, _PREHASH_ProductSKU) > 0 ) +			{ +				msg->getStringFast(	_PREHASH_QueryData, _PREHASH_ProductSKU, land_sku, i); + +				if (LINDEN_HOMES_SKU == land_sku) +				{ +					sHasLindenHome = true; +					return; +				} +			} +		}  		return;  	} @@ -174,12 +191,9 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)  	F32		global_x;  	F32		global_y;  	std::string	sim_name; -	std::string land_sku;  	std::string land_type; -	S32 i; -	S32 count = msg->getNumberOfBlocks("QueryData"); -	for (i = 0; i < count; i++) +	for (S32 i = 0; i < count; i++)  	{  		msg->getUUID("QueryData", "OwnerID", owner_id, i);  		msg->getString("QueryData", "Name", name, i); @@ -196,6 +210,10 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)  			msg->getStringFast(	_PREHASH_QueryData, _PREHASH_ProductSKU, land_sku, i);  			LL_INFOS() << "Land sku: " << land_sku << LL_ENDL;  			land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku); +			if (LINDEN_HOMES_SKU == land_sku) +			{ +				sHasLindenHome = true; +			}  		}  		else  		{ diff --git a/indra/newview/llfloaterlandholdings.h b/indra/newview/llfloaterlandholdings.h index d1d510bb40..90e75b1062 100644 --- a/indra/newview/llfloaterlandholdings.h +++ b/indra/newview/llfloaterlandholdings.h @@ -57,6 +57,8 @@ public:  	static void onGrantList(void* data); +	static bool sHasLindenHome; +  protected:  	void refreshAggregates(); diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index 06a908cccc..51b98339c4 100644 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -45,6 +45,7 @@ public:  	virtual LLFolderType::EType getPreferredType() const = 0;  	virtual void showProperties(void) = 0;  	virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make   into pure virtual. +	virtual BOOL isAgentInventory() const { return FALSE; }  	virtual BOOL isUpToDate() const = 0;  	virtual bool hasChildren() const = 0;  	virtual LLInventoryType::EType getInventoryType() const = 0; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d35d8456be..04f89af989 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -138,6 +138,35 @@ bool isMarketplaceSendAction(const std::string& action)  	return ("send_to_marketplace" == action);  } +bool isPanelActive(const std::string& panel_name) +{ +    LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); +    return (active_panel && (active_panel->getName() == panel_name)); +} + +bool isParentSystemFolder(const LLInventoryModel* model, const LLUUID& folder_id) +{ +    if (!model || folder_id.isNull()) return false; + +    LLViewerInventoryCategory* cat = model->getCategory(folder_id); +    if (cat) +    { +        if (cat->getPreferredType() == LLFolderType::FT_ROOT_INVENTORY) +        { +            return false; +        } +        if (LLFolderType::lookupIsProtectedType(cat->getPreferredType())) +        { +            return true; +        } +        else +        { +            return isParentSystemFolder(model, cat->getParentUUID()); +        } +    } +    return false; +} +  // Used by LLFolderBridge as callback for directory fetching recursion  class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver  { @@ -888,8 +917,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  		disabled_items.push_back(std::string("Properties"));  	} -	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -	if (active_panel && (active_panel->getName() != "All Items")) +	if (!isPanelActive("All Items"))  	{  		items.push_back(std::string("Show in Main Panel"));  	} @@ -959,7 +987,7 @@ void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items,  		}  	}  	items.push_back(std::string("Purge Item")); -	if (!isItemRemovable()) +	if (!isItemRemovable() || isPanelActive("Favorite Items"))  	{  		disabled_items.push_back(std::string("Purge Item"));  	} @@ -980,7 +1008,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,  	items.push_back(std::string("Delete")); -	if (!isItemRemovable()) +	if (!isItemRemovable() || isPanelActive("Favorite Items"))  	{  		disabled_items.push_back(std::string("Delete"));  	} @@ -1835,28 +1863,11 @@ void LLItemBridge::restoreToWorld()  void LLItemBridge::gotoItem()  { -	LLInventoryObject *obj = getInventoryObject(); -	if (obj && obj->getIsLinkType()) -	{ -		const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX); -		if (gInventory.isObjectDescendentOf(obj->getLinkedUUID(), inbox_id)) -		{ -			LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); -			if (sidepanel_inventory && sidepanel_inventory->getInboxPanel()) -			{ -				sidepanel_inventory->getInboxPanel()->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); -			} -		} -		else -		{ -			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(); -			if (active_panel) -			{ -				active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); -			} -		} - -	} +    LLInventoryObject *obj = getInventoryObject(); +    if (obj && obj->getIsLinkType()) +    { +        show_item_original(obj->getUUID()); +    }  }  LLUIImagePtr LLItemBridge::getIcon() const @@ -4010,6 +4021,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items  		disabled_items.push_back(std::string("New Clothes"));  		disabled_items.push_back(std::string("New Body Parts"));  		disabled_items.push_back(std::string("upload_def")); +		disabled_items.push_back(std::string("Set Favorites folder"));  	}  	if (favorites == mUUID)  	{ @@ -4037,6 +4049,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items  		disabled_items.push_back(std::string("New Clothes"));  		disabled_items.push_back(std::string("New Body Parts"));  		disabled_items.push_back(std::string("upload_def")); +		disabled_items.push_back(std::string("Set Favorites folder"));      }      if (marketplace_listings_id == mUUID)      { @@ -4045,14 +4058,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items          disabled_items.push_back(std::string("Cut"));          disabled_items.push_back(std::string("Delete"));      } + +	if (isPanelActive("Favorite Items")) +	{ +		disabled_items.push_back(std::string("Delete")); +	}  	if(trash_id == mUUID)  	{ -		bool is_recent_panel = false; -		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); -		if (active_panel && (active_panel->getName() == "Recent Items")) -		{ -			is_recent_panel = true; -		} +		bool is_recent_panel = isPanelActive("Recent Items");  		// This is the trash.  		items.push_back(std::string("Empty Trash")); @@ -4101,6 +4114,16 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items                      items.push_back(std::string("New Body Parts"));                      items.push_back(std::string("New Settings"));                      items.push_back(std::string("upload_def")); + +                    if (!LLFolderType::lookupIsProtectedType(getPreferredType()) && !isParentSystemFolder(model, mUUID)) +                    { +                        items.push_back(std::string("Set Favorites folder")); +                    } +                    if (!LLEnvironment::instance().isInventoryEnabled()) +                    { +                        disabled_items.push_back("New Settings"); +                    } +                  }  			}  			getClipboardEntries(false, items, disabled_items, flags); @@ -7212,21 +7235,17 @@ void LLLinkFolderBridge::performAction(LLInventoryModel* model, std::string acti  }  void LLLinkFolderBridge::gotoItem()  { -	const LLUUID &cat_uuid = getFolderID(); -	if (!cat_uuid.isNull()) -	{ -		LLFolderViewItem *base_folder = mInventoryPanel.get()->getItemByID(cat_uuid); -		if (base_folder) -		{ -			if (LLInventoryModel* model = getInventoryModel()) -			{ -				model->fetchDescendentsOf(cat_uuid); -			} -			base_folder->setOpen(TRUE); -			mRoot->setSelection(base_folder,TRUE); -			mRoot->scrollToShowSelection(); -		} -	} +    LLItemBridge::gotoItem(); + +    const LLUUID &cat_uuid = getFolderID(); +    if (!cat_uuid.isNull()) +    { +        LLFolderViewItem *base_folder = LLInventoryPanel::getActiveInventoryPanel()->getItemByID(cat_uuid); +        if (base_folder) +        { +            base_folder->setOpen(TRUE); +        } +    }  }  const LLUUID &LLLinkFolderBridge::getFolderID() const  { diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 72013f7396..72631174e7 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -63,7 +63,8 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p)  	mPermissions(p.permissions),  	mFilterTypes(p.types),  	mFilterUUID(p.uuid), -	mFilterLinks(p.links) +	mFilterLinks(p.links), +	mSearchVisibility(p.search_visibility)  {  } @@ -154,6 +155,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)  	passed = passed && checkAgainstPermissions(listener);  	passed = passed && checkAgainstFilterLinks(listener);  	passed = passed && checkAgainstCreator(listener); +	passed = passed && checkAgainstSearchVisibility(listener);  	return passed;  } @@ -582,6 +584,27 @@ bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory  	}  } +bool LLInventoryFilter::checkAgainstSearchVisibility(const LLFolderViewModelItemInventory* listener) const +{ +	if (!listener || !hasFilterString()) return TRUE; + +	const LLUUID object_id = listener->getUUID(); +	const LLInventoryObject *object = gInventory.getObject(object_id); +	if (!object) return TRUE; + +	const BOOL is_link = object->getIsLinkType(); +	if (is_link && ((mFilterOps.mSearchVisibility & VISIBILITY_LINKS) == 0)) +		return FALSE; + +	if (listener->isItemInTrash() && ((mFilterOps.mSearchVisibility & VISIBILITY_TRASH) == 0)) +		return FALSE; + +	if (!listener->isAgentInventory() && ((mFilterOps.mSearchVisibility & VISIBILITY_LIBRARY) == 0)) +		return FALSE; + +	return TRUE; +} +  const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const  {  	return mFilterSubString; @@ -750,6 +773,61 @@ void LLInventoryFilter::setFilterMarketplaceListingFolders(bool select_only_list      }  } + +void LLInventoryFilter::toggleSearchVisibilityLinks() +{ +	bool hide_links = mFilterOps.mSearchVisibility & VISIBILITY_LINKS; +	if (hide_links) +	{ +		mFilterOps.mSearchVisibility &= ~VISIBILITY_LINKS; +	} +	else +	{ +		mFilterOps.mSearchVisibility |= VISIBILITY_LINKS; +	} + +	if (hasFilterString()) +	{ +		setModified(hide_links ? FILTER_MORE_RESTRICTIVE : FILTER_LESS_RESTRICTIVE); +	} +} + +void LLInventoryFilter::toggleSearchVisibilityTrash() +{ +	bool hide_trash = mFilterOps.mSearchVisibility & VISIBILITY_TRASH; +	if (hide_trash) +	{ +		mFilterOps.mSearchVisibility &= ~VISIBILITY_TRASH; +	} +	else +	{ +		mFilterOps.mSearchVisibility |= VISIBILITY_TRASH; +	} + +	if (hasFilterString()) +	{ +		setModified(hide_trash ? FILTER_MORE_RESTRICTIVE : FILTER_LESS_RESTRICTIVE); +	} +} + +void LLInventoryFilter::toggleSearchVisibilityLibrary() +{ +	bool hide_library = mFilterOps.mSearchVisibility & VISIBILITY_LIBRARY; +	if (hide_library) +	{ +		mFilterOps.mSearchVisibility &= ~VISIBILITY_LIBRARY; +	} +	else +	{ +		mFilterOps.mSearchVisibility |= VISIBILITY_LIBRARY; +	} + +	if (hasFilterString()) +	{ +		setModified(hide_library ? FILTER_MORE_RESTRICTIVE : FILTER_LESS_RESTRICTIVE); +	} +} +  void LLInventoryFilter::setFilterNoMarketplaceFolder()  {      mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS; @@ -861,6 +939,44 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)  	}  } +void LLInventoryFilter::setSearchVisibilityTypes(U32 types) +{ +	if (mFilterOps.mSearchVisibility != types) +	{ +		// keep current items only if no perm bits getting turned off +		BOOL fewer_bits_set = (mFilterOps.mSearchVisibility & ~types); +		BOOL more_bits_set = (~mFilterOps.mSearchVisibility & types); +		mFilterOps.mSearchVisibility = types; + +		if (more_bits_set && fewer_bits_set) +		{ +			setModified(FILTER_RESTART); +		} +		else if (more_bits_set) +		{ +			// target must have all requested permission bits, so more bits == more restrictive +			setModified(FILTER_MORE_RESTRICTIVE); +		} +		else if (fewer_bits_set) +		{ +			setModified(FILTER_LESS_RESTRICTIVE); +		} +	} +} + +void LLInventoryFilter::setSearchVisibilityTypes(const Params& params) +{ +	if (!params.validateBlock()) +	{ +		return; +	} + +	if (params.filter_ops.search_visibility.isProvided()) +	{ +		setSearchVisibilityTypes(params.filter_ops.search_visibility); +	} +} +  void LLInventoryFilter::setFilterPermissions(PermissionMask perms)  {  	if (mFilterOps.mPermissions != perms) @@ -1262,6 +1378,18 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} +	if (isFilterObjectTypesWith(LLInventoryType::IT_SETTINGS)) +	{ +		filtered_types +=  LLTrans::getString("Settings"); +		filtered_by_type = TRUE; +		num_filter_types++; +	} +	else +	{ +		not_filtered_types +=  LLTrans::getString("Settings"); +		filtered_by_all_types = FALSE; +	} +  	if (!LLInventoryModelBackgroundFetch::instance().folderFetchActive()  		&& filtered_by_type  		&& !filtered_by_all_types) @@ -1317,6 +1445,7 @@ void LLInventoryFilter::toParams(Params& params) const  	params.filter_ops.show_folder_state = getShowFolderState();  	params.filter_ops.creator_type = getFilterCreatorType();  	params.filter_ops.permissions = getFilterPermissions(); +	params.filter_ops.search_visibility = getSearchVisibilityTypes();  	params.substring = getFilterSubString();  	params.since_logoff = isSinceLogoff();  } @@ -1340,6 +1469,7 @@ void LLInventoryFilter::fromParams(const Params& params)  	setShowFolderState(params.filter_ops.show_folder_state);  	setFilterCreator(params.filter_ops.creator_type);  	setFilterPermissions(params.filter_ops.permissions); +	setSearchVisibilityTypes(params.filter_ops.search_visibility);  	setFilterSubString(params.substring);  	setDateRangeLastLogoff(params.since_logoff);  } @@ -1369,6 +1499,11 @@ U64 LLInventoryFilter::getFilterSettingsTypes() const      return mFilterOps.mFilterSettingsTypes;  } +U64 LLInventoryFilter::getSearchVisibilityTypes() const +{ +	return mFilterOps.mSearchVisibility; +} +  bool LLInventoryFilter::hasFilterString() const  {  	return mFilterSubString.size() > 0; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index be02ee3623..0580261c43 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -99,6 +99,14 @@ public:  		FILTERCREATOR_OTHERS  	}; +	enum ESearchVisibility +	{ +		VISIBILITY_NONE = 0, +		VISIBILITY_TRASH = 0x1 << 0, +		VISIBILITY_LIBRARY = 0x1 << 1, +		VISIBILITY_LINKS	= 0x1 << 2 +	}; +  	struct FilterOps  	{  		struct DateRange : public LLInitParam::Block<DateRange> @@ -116,11 +124,13 @@ public:  		struct Params : public LLInitParam::Block<Params>  		{ -			Optional<U32>				types; +			Optional<U32>				types, +										search_visibility;  			Optional<U64>				object_types,  										wearable_types,                                          settings_types,  										category_types; +										  			Optional<EFilterLink>		links;  			Optional<LLUUID>			uuid;  			Optional<DateRange>			date_range; @@ -137,6 +147,7 @@ public:                  settings_types("settings_types", 0xffffFFFFffffFFFFULL),  				category_types("category_types", 0xffffFFFFffffFFFFULL),  				links("links", FILTERLINK_INCLUDE_LINKS), +				search_visibility("search_visibility", 0xFFFFFFFF),  				uuid("uuid"),  				date_range("date_range"),  				hours_ago("hours_ago", 0), @@ -149,7 +160,8 @@ public:  		FilterOps(const Params& = Params()); -		U32 			mFilterTypes; +		U32 			mFilterTypes, +						mSearchVisibility;  		U64				mFilterObjectTypes,   // For _OBJECT  						mFilterWearableTypes,                          mFilterSettingsTypes, // for _SETTINGS @@ -193,7 +205,8 @@ public:  	U64 				getFilterObjectTypes() const;  	U64					getFilterCategoryTypes() const;  	U64					getFilterWearableTypes() const; -    U64                 getFilterSettingsTypes() const; +	U64					getFilterSettingsTypes() const; +	U64					getSearchVisibilityTypes() const;  	bool 				isFilterObjectTypesWith(LLInventoryType::EType t) const;  	void 				setFilterObjectTypes(U64 types); @@ -213,6 +226,12 @@ public:  	ESearchType			getSearchType() { return mSearchType; }  	void 				setFilterCreator(EFilterCreatorType type); +	void				toggleSearchVisibilityLinks(); +	void				toggleSearchVisibilityTrash(); +	void				toggleSearchVisibilityLibrary(); +	void 				setSearchVisibilityTypes(U32 types); +	void 				setSearchVisibilityTypes(const Params& params); +  	void 				setFilterSubString(const std::string& string);  	const std::string& 	getFilterSubString(BOOL trim = FALSE) const;  	const std::string& 	getFilterSubStringOrig() const { return mFilterSubStringOrig; }  @@ -309,6 +328,7 @@ private:  	bool 				checkAgainstPermissions(const LLInventoryItem* item) const;  	bool 				checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;  	bool 				checkAgainstCreator(const class LLFolderViewModelItemInventory* listener) const; +	bool				checkAgainstSearchVisibility(const class LLFolderViewModelItemInventory* listener) const;  	bool				checkAgainstClipboard(const LLUUID& object_id) const;  	FilterOps				mFilterOps; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 7a0ea8b668..f84bc68c82 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -774,40 +774,45 @@ void show_item_profile(const LLUUID& item_uuid)  void show_item_original(const LLUUID& item_uuid)  { -	LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory"); -	if (!floater_inventory) -	{ -		LL_WARNS() << "Could not find My Inventory floater" << LL_ENDL; -		return; -	} - -	//sidetray inventory panel -	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); - -	bool do_reset_inventory_filter = !floater_inventory->isInVisibleChain(); +    LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory"); +    if (!floater_inventory) +    { +        LL_WARNS() << "Could not find My Inventory floater" << LL_ENDL; +        return; +    } +    LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory"); +    if (sidepanel_inventory) +    { +        LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); +        if (main_inventory) +        { +            main_inventory->resetFilters(); +        } +        reset_inventory_filter(); -	LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(); -	if (!active_panel)  -	{ -		//this may happen when there is no floatera and other panel is active in inventory tab +        if (!LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>("inventory")->isInVisibleChain()) +        { +            LLFloaterReg::toggleInstanceOrBringToFront("inventory"); +        } -		if	(sidepanel_inventory) -		{ -			sidepanel_inventory->showInventoryPanel(); -		} -	} -	 -	active_panel = LLInventoryPanel::getActiveInventoryPanel(); -	if (!active_panel)  -	{ -		return; -	} -	active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES); -	 -	if(do_reset_inventory_filter) -	{ -		reset_inventory_filter(); -	} +        const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX); +        if (gInventory.isObjectDescendentOf(gInventory.getLinkedItemID(item_uuid), inbox_id)) +        { +            if (sidepanel_inventory->getInboxPanel()) +            { +                sidepanel_inventory->openInbox(); +                sidepanel_inventory->getInboxPanel()->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES); +            } +        } +        else +        { +            sidepanel_inventory->selectAllItemsPanel(); +            if (sidepanel_inventory->getActivePanel()) +            { +                sidepanel_inventory->getActivePanel()->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES); +            } +        } +    }  } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 28db6a5808..48187c6179 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -543,6 +543,11 @@ const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::          cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));          break;      } +    case LLFolderType::FT_FAVORITE: +    { +        cat_id = LLUUID(gSavedPerAccountSettings.getString("FavoritesFolder")); +        break; +    }      default:          break;      } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 74d9e895c2..bca3cc0cf7 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -158,7 +158,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mViewsInitialized(VIEWS_UNINITIALIZED),  	mInvFVBridgeBuilder(NULL),  	mInventoryViewModel(p.name), -	mGroupedItemBridge(new LLFolderViewGroupedItemBridge) +	mGroupedItemBridge(new LLFolderViewGroupedItemBridge), +	mFocusSelection(false)  {  	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; @@ -180,6 +181,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));  	mCommitCallbackRegistrar.add("Inventory.Share",  boost::bind(&LLAvatarActions::shareWithAvatars, this));  	mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2)); +	mCommitCallbackRegistrar.add("Inventory.SetFavoritesFolder", boost::bind(&LLInventoryPanel::setFavoritesFolder, this, _2));  }  LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id ) @@ -1240,6 +1242,7 @@ void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::  void LLInventoryPanel::clearSelection()  {  	mSelectThisID.setNull(); +	mFocusSelection = false;  }  LLInventoryPanel::selected_items_t LLInventoryPanel::getSelectedItems() const @@ -1469,6 +1472,11 @@ void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)      }  } +void LLInventoryPanel::setFavoritesFolder(const LLSD& userdata) +{ +    gSavedPerAccountSettings.setString("FavoritesFolder", LLFolderBridge::sSelf.get()->getUUID().asString()); +} +  void LLInventoryPanel::purgeSelectedItems()  {      if (!mFolderRoot.get()) return; @@ -1714,15 +1722,17 @@ LLFolderViewFolder* LLInventoryPanel::getFolderByID(const LLUUID& id)  void LLInventoryPanel::setSelectionByID( const LLUUID& obj_id, BOOL    take_keyboard_focus )  {  	LLFolderViewItem* itemp = getItemByID(obj_id); -	if(itemp && itemp->getViewModelItem()) +	if(itemp && itemp->getViewModelItem() && itemp->passedFilter())  	{  		itemp->arrangeAndSet(TRUE, take_keyboard_focus);  		mSelectThisID.setNull(); +		mFocusSelection = false;  		return;  	}  	else  	{  		// save the desired item to be selected later (if/when ready) +		mFocusSelection = take_keyboard_focus;  		mSelectThisID = obj_id;  	}  } @@ -1731,7 +1741,7 @@ void LLInventoryPanel::updateSelection()  {  	if (mSelectThisID.notNull())  	{ -		setSelectionByID(mSelectThisID, false); +		setSelectionByID(mSelectThisID, mFocusSelection);  	}  } @@ -1848,6 +1858,96 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)  	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;  } +static LLDefaultChildRegistry::Register<LLInventoryFavoriteItemsPanel> t_favorites_inventory_panel("favorites_inventory_panel"); + +LLInventoryFavoriteItemsPanel::LLInventoryFavoriteItemsPanel(const Params& params) +    : LLInventoryPanel(params) +{ +    std::string ctrl_name = "FavoritesFolder"; +    if (gSavedPerAccountSettings.controlExists(ctrl_name)) +    { +        LLPointer<LLControlVariable> cntrl_ptr = gSavedPerAccountSettings.getControl(ctrl_name); +        if (cntrl_ptr.notNull()) +        { +            mFolderChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder, this)); +        } +    } +} + +void LLInventoryFavoriteItemsPanel::setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb) +{ +    if (mFolderRoot.get()) +    { +        mFolderRoot.get()->setSelectCallback(cb); +        mSelectionCallback = cb; +    } +} + +void LLInventoryFavoriteItemsPanel::initFromParams(const Params& p) +{ +    Params fav_params(p); +    fav_params.start_folder.id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE); +    LLInventoryPanel::initFromParams(fav_params); +    updateFavoritesRootFolder(); +} + +void LLInventoryFavoriteItemsPanel::updateFavoritesRootFolder() +{ +    const LLUUID& folder_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE); + +    bool is_favorites_set = (folder_id != gInventory.findCategoryUUIDForTypeInRoot(LLFolderType::FT_FAVORITE, true, gInventory.getRootFolderID())); + +    if (!is_favorites_set || folder_id != getRootFolderID()) +    { +        LLUUID root_id = folder_id; +        if (mFolderRoot.get()) +        { +            removeItemID(getRootFolderID()); +            mFolderRoot.get()->destroyView(); +        } + +        mCommitCallbackRegistrar.pushScope(); +        { +            LLFolderView* folder_view = createFolderRoot(root_id); +            mFolderRoot = folder_view->getHandle(); + +            addItemID(root_id, mFolderRoot.get()); + + +            LLRect scroller_view_rect = getRect(); +            scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); +            LLScrollContainer::Params scroller_params(mParams.scroll()); +            scroller_params.rect(scroller_view_rect); + +            if (mScroller) +            { +                removeChild(mScroller); +                delete mScroller; +                mScroller = NULL; +            } +            mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params); +            addChild(mScroller); +            mScroller->addChild(mFolderRoot.get()); +            mFolderRoot.get()->setScrollContainer(mScroller); +            mFolderRoot.get()->setFollowsAll(); +            mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox); + +            if (!mSelectionCallback.empty()) +            { +                mFolderRoot.get()->setSelectCallback(mSelectionCallback); +            } +        } +        mCommitCallbackRegistrar.popScope(); +        mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar); + +        if (is_favorites_set) +        { +            buildNewViews(folder_id); +        } +        mFolderRoot.get()->setShowEmptyMessage(!is_favorites_set); +    } +} +  /************************************************************************/  /* Asset Pre-Filtered Inventory Panel related class                     */  /************************************************************************/ diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index ad6010f09c..9d6d56dd69 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -220,6 +220,7 @@ public:  	void doCreate(const LLSD& userdata);  	bool beginIMSession();  	void fileUploadLocation(const LLSD& userdata); +	void setFavoritesFolder(const LLSD& userdata);  	void purgeSelectedItems();  	bool attachObject(const LLSD& userdata);  	static void idle(void* user_data); @@ -269,6 +270,7 @@ protected:  	LLInventoryModel*			mInventory;  	LLInventoryObserver*		mInventoryObserver;  	LLInvPanelComplObserver*	mCompletionObserver; +	bool						mFocusSelection;  	bool						mAcceptsDragAndDrop;  	bool 						mAllowMultiSelect;  	bool 						mAllowDrag; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index fbc1b80857..d9138091c6 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -115,6 +115,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)  	  mSavedFolderState(NULL),  	  mFilterText(""),  	  mMenuGearDefault(NULL), +	  mMenuVisibility(NULL),  	  mMenuAddHandle(),  	  mNeedUploadCost(true)  { @@ -189,6 +190,16 @@ BOOL LLPanelMainInventory::postBuild()  		worn_filter.markDefault();  		mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));  	} + +	mFavoriteItemsPanel = getChild<LLInventoryFavoriteItemsPanel>("Favorite Items"); +	if (mFavoriteItemsPanel) +	{ +		LLInventoryFilter& recent_filter = mFavoriteItemsPanel->getFilter(); +		recent_filter.setEmptyLookupMessage("InventoryFavoritItemsNotSelected"); +		recent_filter.markDefault(); +		mFavoriteItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mFavoriteItemsPanel, _1, _2)); +	} +  	mSearchTypeCombo  = getChild<LLComboBox>("search_type");  	if(mSearchTypeCombo)  	{ @@ -219,6 +230,17 @@ BOOL LLPanelMainInventory::postBuild()  				recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));  			}  		} +		if(mActivePanel) +		{ +			if(savedFilterState.has(mActivePanel->getFilter().getName())) +			{ +				LLSD items = savedFilterState.get(mActivePanel->getFilter().getName()); +				LLInventoryFilter::Params p; +				LLParamSDParser parser; +				parser.readSD(items, p); +				mActivePanel->getFilter().setSearchVisibilityTypes(p); +			} +		}  	} @@ -229,6 +251,7 @@ BOOL LLPanelMainInventory::postBuild()  	}  	mGearMenuButton = getChild<LLMenuButton>("options_gear_btn"); +	mVisibilityMenuButton = getChild<LLMenuButton>("options_visibility_btn");  	initListCommandsHandlers(); @@ -254,6 +277,9 @@ BOOL LLPanelMainInventory::postBuild()  LLPanelMainInventory::~LLPanelMainInventory( void )  {  	// Save the filters state. +	// Some params types cannot be saved this way +	// for example, LLParamSDParser doesn't know about U64, +	// so some FilterOps params should be revised.  	LLSD filterRoot;  	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");  	if (all_items_panel) @@ -1165,6 +1191,10 @@ void LLPanelMainInventory::initListCommandsHandlers()  	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	mMenuAddHandle = menu->getHandle(); +	mMenuVisibility = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_search_visibility.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mVisibilityMenuButton->setMenu(mMenuVisibility); +	mVisibilityMenuButton->setMenuPosition(LLMenuButton::MP_BOTTOM_LEFT); +  	// Update the trash button when selected item(s) get worn or taken off.  	LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLPanelMainInventory::updateListCommands, this));  } @@ -1354,6 +1384,21 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		}  		LLFloaterReg::showInstance("linkreplace", params);  	} + +	if (command_name == "toggle_search_trash") +	{ +		mActivePanel->getFilter().toggleSearchVisibilityTrash(); +	} + +	if (command_name == "toggle_search_library") +	{ +		mActivePanel->getFilter().toggleSearchVisibilityLibrary(); +	} + +	if (command_name == "include_links") +	{ +		mActivePanel->getFilter().toggleSearchVisibilityLinks(); +	}		  }  void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility ) @@ -1404,7 +1449,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  	}  	if (command_name == "delete")  	{ -		return getActivePanel()->isSelectionRemovable(); +		return getActivePanel()->isSelectionRemovable() && (getActivePanel() != mFavoriteItemsPanel);  	}  	if (command_name == "save_texture")  	{ @@ -1499,6 +1544,21 @@ BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata)  		return sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;  	} +	if (command_name == "toggle_search_trash") +	{ +		return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0; +	} + +	if (command_name == "toggle_search_library") +	{ +		return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0; +	} + +	if (command_name == "include_links") +	{ +		return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;	 +	}	 +  	return FALSE;  } diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index a6bdee233d..313e478bfe 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -37,6 +37,7 @@  class LLComboBox;  class LLFolderViewItem;  class LLInventoryPanel; +class LLInventoryFavoriteItemsPanel;  class LLSaveFolderState;  class LLFilterEditor;  class LLTabContainer; @@ -93,6 +94,8 @@ public:  	void toggleFindOptions(); +    void resetFilters(); +  protected:  	//  	// Misc functions @@ -117,7 +120,6 @@ protected:  	void doToSelected(const LLSD& userdata);  	void closeAllFolders();  	void doCreate(const LLSD& userdata); -	void resetFilters();  	void setSortBy(const LLSD& userdata);  	void saveTexture(const LLSD& userdata);  	bool isSaveTextureEnabled(const LLSD& userdata); @@ -136,6 +138,7 @@ private:  	LLHandle<LLFloater>			mFinderHandle;  	LLInventoryPanel*			mActivePanel;  	LLInventoryPanel*			mWornItemsPanel; +	LLInventoryFavoriteItemsPanel* mFavoriteItemsPanel;  	bool						mResortActivePanel;  	LLSaveFolderState*			mSavedFolderState;  	std::string					mFilterText; @@ -169,7 +172,9 @@ protected:  private:  	LLDragAndDropButton*		mTrashButton;  	LLToggleableMenu*			mMenuGearDefault; +	LLToggleableMenu*			mMenuVisibility;  	LLMenuButton*				mGearMenuButton; +	LLMenuButton*				mVisibilityMenuButton;  	LLHandle<LLView>			mMenuAddHandle;  	bool						mNeedUploadCost; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 17777c3ceb..3c250b3bb3 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -128,10 +128,12 @@  #include "llpanelpick.h"  #include "llpanelgrouplandmoney.h"  #include "llpanelgroupnotices.h" +#include "llparcel.h"  #include "llpreview.h"  #include "llpreviewscript.h"  #include "llproxy.h"  #include "llproductinforequest.h" +#include "llqueryflags.h"  #include "llselectmgr.h"  #include "llsky.h"  #include "llstatview.h" @@ -2257,6 +2259,14 @@ bool idle_startup()  		gAgentAvatarp->sendHoverHeight(); +		// look for parcels we own +		send_places_query(LLUUID::null, +			LLUUID::null, +			"", +			DFQ_AGENT_OWNED, +			LLParcel::C_ANY, +			""); +  		return TRUE;  	} diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 6a29be4aa1..4f46d1c0a2 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -121,6 +121,11 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  				data.mURLExternal = mNotification->getURLOpenExternally();  			} +			if((*it).has("width")) +			{ +				data.mWidth = (*it)["width"].asInteger(); +			} +  			mButtonData.push_back(data);  			option_index++;  		} @@ -159,15 +164,29 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  	// Calc total width of buttons  	S32 button_width = 0;  	S32 sp = font->getWidth(std::string("OO")); +	S32 btn_total_width = 0; +	S32 default_size_btns = 0;  	for( S32 i = 0; i < num_options; i++ ) -	{ +	{				  		S32 w = S32(font->getWidth( options[i].second ) + 0.99f) + sp + 2 * LLBUTTON_H_PAD; -		button_width = llmax( w, button_width ); +		if (mButtonData[i].mWidth > w) +		{ +			btn_total_width += mButtonData[i].mWidth; +		} +		else +		{ +			button_width = llmax(w, button_width); +			default_size_btns++; +		}  	} -	S32 btn_total_width = button_width; +  	if( num_options > 1 )  	{ -		btn_total_width = (num_options * button_width) + ((num_options - 1) * BTN_HPAD); +		btn_total_width = btn_total_width + (button_width * default_size_btns) + ((num_options - 1) * BTN_HPAD); +	} +	else +	{ +		btn_total_width = llmax(btn_total_width, button_width);  	}  	// Message: create text box using raw string, as text has been structure deliberately @@ -333,7 +352,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  		if(btn)  		{  			btn->setName(options[i].first); -			btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT )); +			btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, (mButtonData[i].mWidth == 0) ? button_width : mButtonData[i].mWidth, BTN_HEIGHT ));  			btn->setLabel(options[i].second);  			btn->setFont(font); @@ -348,7 +367,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  				btn->setFocus(TRUE);  			}  		} -		button_left += button_width + BTN_HPAD; +		button_left += ((mButtonData[i].mWidth == 0) ? button_width : mButtonData[i].mWidth) + BTN_HPAD;  	}  	setCheckBoxes(HPAD, VPAD); diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h index 9b4e054bf1..bd34e40642 100644 --- a/indra/newview/lltoastalertpanel.h +++ b/indra/newview/lltoastalertpanel.h @@ -82,9 +82,14 @@ private:  	struct ButtonData  	{ +		ButtonData() +		: mWidth(0) +		{} +		  		LLButton* mButton;  		std::string mURL;  		U32 mURLExternal; +		S32 mWidth;  	};  	std::vector<ButtonData> mButtonData; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index bccf88128d..024f25bc98 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -387,9 +387,9 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )              if (mIsScriptDialog)              {                  // we are using default width for script buttons so we can determinate button_rows -                //to get a number of rows we divide the required width of the buttons to button_panel_width -                S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width); -                //S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width; +                // to get a number of rows we divide the required width of the buttons to button_panel_width +                // buttons.size() is reduced by -2 due to presence of ignore button which is calculated independently a bit lower +                S32 button_rows = llceil(F32(buttons.size() - 2) * (BUTTON_WIDTH + h_pad) / (button_panel_width + h_pad));                  //reserve one row for the ignore_btn                  button_rows++;                  //calculate required panel height for scripdialog notification. diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 414ae1fad6..06587d6025 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -34,6 +34,7 @@  #include "llcompilequeue.h"  #include "llfasttimerview.h"  #include "llfloaterabout.h" +#include "llfloateraddpaymentmethod.h"  #include "llfloaterauction.h"  #include "llfloaterautoreplacesettings.h"  #include "llfloateravatar.h" @@ -194,6 +195,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterAboutUtil::registerFloater();  	LLFloaterReg::add("block_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);  	LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>); +	LLFloaterReg::add("add_payment_method", "floater_add_payment_method.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAddPaymentMethod>);  	LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);  	LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);  	LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index bbed741a33..ed1d726528 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1422,6 +1422,11 @@ void remove_inventory_category(  			LLNotificationsUtil::add("CannotRemoveProtectedCategories");  			return;  		} +		const LLUUID fav_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_FAVORITE); +		if ((cat_id == fav_id) || gInventory.isObjectDescendentOf(fav_id, cat_id)) +		{ +			gSavedPerAccountSettings.setString("FavoritesFolder", ""); +		}          AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1);          AISAPI::RemoveCategory(cat_id, cr);  	} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index dfe9a38d34..ba6db47157 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -64,6 +64,7 @@  #include "llfloaterimcontainer.h"  #include "llfloaterland.h"  #include "llfloaterimnearbychat.h" +#include "llfloaterlandholdings.h"  #include "llfloaterpathfindingcharacters.h"  #include "llfloaterpathfindinglinksets.h"  #include "llfloaterpay.h" @@ -185,11 +186,15 @@ const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents"  LLMenuGL* gAttachSubMenu = NULL;  LLMenuGL* gDetachSubMenu = NULL;  LLMenuGL* gTakeOffClothes = NULL; +LLMenuGL* gDetachAvatarMenu = NULL; +LLMenuGL* gDetachHUDAvatarMenu = NULL;  LLContextMenu* gAttachScreenPieMenu = NULL;  LLContextMenu* gAttachPieMenu = NULL;  LLContextMenu* gAttachBodyPartPieMenus[9];  LLContextMenu* gDetachPieMenu = NULL;  LLContextMenu* gDetachScreenPieMenu = NULL; +LLContextMenu* gDetachAttSelfMenu = NULL; +LLContextMenu* gDetachHUDAttSelfMenu = NULL;  LLContextMenu* gDetachBodyPartPieMenus[9];  // @@ -444,6 +449,9 @@ void init_menus()  	gMenuAttachmentOther = LLUICtrlFactory::createFromFile<LLContextMenu>(  		"menu_attachment_other.xml", gMenuHolder, registry); +	gDetachHUDAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self HUD", true); +	gDetachAttSelfMenu = gMenuHolder->getChild<LLContextMenu>("Detach Self", true); +  	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(  		"menu_land.xml", gMenuHolder, registry); @@ -500,6 +508,9 @@ void init_menus()  	gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);  	gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE); +	gDetachAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach", true); +	gDetachHUDAvatarMenu = gMenuHolder->getChild<LLMenuGL>("Avatar Detach HUD", true); +  	// Don't display the Memory console menu if the feature is turned off  	LLMenuItemCheckGL *memoryMenu = gMenuBarView->getChild<LLMenuItemCheckGL>("Memory", TRUE);  	if (memoryMenu) @@ -676,19 +687,6 @@ class LLAdvancedCheckHUDInfo : public view_listener_t  }; -////////////// -// FLYING   // -////////////// - -class LLAdvancedAgentFlyingInfo : public view_listener_t -{ -	bool handleEvent(const LLSD&) -	{ -		return gAgent.getFlying(); -	} -}; - -  ///////////////////////  // CLEAR GROUP CACHE //  /////////////////////// @@ -3742,6 +3740,35 @@ bool enable_sitdown_self()  	return show_sitdown_self() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();  } +class LLSelfToggleSitStand : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		if (isAgentAvatarValid()) +		{ +			if (gAgentAvatarp->isSitting()) +			{ +				gAgent.standUp(); +			} +			else +			{ +				gAgent.sitDown(); +			} +		} +		return true; +	} +}; + +bool enable_sit_stand() +{ +	return enable_sitdown_self() || enable_standup_self(); +} + +bool enable_fly_land() +{ +	return gAgent.getFlying() || LLAgent::enableFlying(); +} +  class LLCheckPanelPeopleTab : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -4931,7 +4958,7 @@ void handle_buy_or_take()  		{  			LLStringUtil::format_map_t args;  			args["AMOUNT"] = llformat("%d", total_price); -			LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString( "BuyingCosts", args ), total_price ); +			LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString( "this_object_costs", args ), total_price );  		}  	}  	else @@ -5922,6 +5949,16 @@ class LLWorldSetHomeLocation : public view_listener_t  	}  }; +class LLWorldLindenHome : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string url = LLFloaterLandHoldings::sHasLindenHome ? LLTrans::getString("lindenhomes_my_home_url") : LLTrans::getString("lindenhomes_get_home_url"); +		LLWeb::loadURL(url); +		return true; +	} +}; +  class LLWorldTeleportHome : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8771,6 +8808,17 @@ public:  	}  }; +class LLUpdateMembershipLabel : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		const std::string label_str =  LLAgentBenefitsMgr::isCurrent("Base") ? LLTrans::getString("MembershipUpgradeText") : LLTrans::getString("MembershipPremiumText"); +		gMenuHolder->childSetLabelArg("Membership", "[Membership]", label_str); + +		return true; +	} +}; +  void handle_voice_morphing_subscribe()  {  	LLWeb::loadURL(LLTrans::getString("voice_morphing_url")); @@ -8920,11 +8968,13 @@ void initialize_menus()  	view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts"); +	view_listener_t::addEnable(new LLUpdateMembershipLabel(), "Membership.UpdateLabel"); +  	enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed));  	// Agent  	commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); -	enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying)); +	enable.add("Agent.enableFlyLand", boost::bind(&enable_fly_land));  	commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));  	commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));  	commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2)); @@ -8972,9 +9022,6 @@ void initialize_menus()  	view_listener_t::addMenu(new LLViewStatusDoNotDisturb(), "View.Status.CheckDoNotDisturb");  	view_listener_t::addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); -	// Me > Movement -	view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); -  	//Communicate Nearby chat  	view_listener_t::addMenu(new LLCommunicateNearbyChat(), "Communicate.NearbyChat"); @@ -8996,6 +9043,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLWorldTeleportHome(), "World.TeleportHome");  	view_listener_t::addMenu(new LLWorldSetAway(), "World.SetAway");  	view_listener_t::addMenu(new LLWorldSetDoNotDisturb(), "World.SetDoNotDisturb"); +	view_listener_t::addMenu(new LLWorldLindenHome(), "World.LindenHome");  	view_listener_t::addMenu(new LLWorldEnableCreateLandmark(), "World.EnableCreateLandmark");  	view_listener_t::addMenu(new LLWorldEnableSetHomeLocation(), "World.EnableSetHomeLocation"); @@ -9238,11 +9286,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdminOnSaveState(), "Admin.OnSaveState");  	// Self context menu -	view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp"); -	enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self)); -	view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown"); -	enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));  -	enable.add("Self.ShowSitDown", boost::bind(&show_sitdown_self)); +	view_listener_t::addMenu(new LLSelfToggleSitStand(), "Self.ToggleSitStand"); +	enable.add("Self.EnableSitStand", boost::bind(&enable_sit_stand));  	view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");  	view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 0f63c8cf58..36b6971c81 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -188,10 +188,14 @@ extern LLContextMenu		*gMenuMuteParticle;  extern LLMenuGL* gAttachSubMenu;  extern LLMenuGL* gDetachSubMenu;  extern LLMenuGL* gTakeOffClothes; +extern LLMenuGL* gDetachAvatarMenu; +extern LLMenuGL* gDetachHUDAvatarMenu;  extern LLContextMenu* gAttachScreenPieMenu;  extern LLContextMenu* gDetachScreenPieMenu; +extern LLContextMenu* gDetachHUDAttSelfMenu;  extern LLContextMenu* gAttachPieMenu;  extern LLContextMenu* gDetachPieMenu; +extern LLContextMenu* gDetachAttSelfMenu;  extern LLContextMenu* gAttachBodyPartPieMenus[9];  extern LLContextMenu* gDetachBodyPartPieMenus[9]; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 4b231c7067..15181dcd9f 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -830,10 +830,7 @@ void upload_done_callback(  				if(!(can_afford_transaction(expected_upload_cost)))  				{ -					LLStringUtil::format_map_t args; -					args["NAME"] = data->mAssetInfo.getName(); -					args["AMOUNT"] = llformat("%d", expected_upload_cost); -					LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost ); +					LLBuyCurrencyHTML::openCurrencyFloater( "", expected_upload_cost );  					is_balance_sufficient = FALSE;  				}  				else if(region) @@ -967,10 +964,7 @@ void upload_new_resource(  			if (balance < uploadInfo->getExpectedUploadCost())  			{  				// insufficient funds, bail on this upload -				LLStringUtil::format_map_t args; -				args["NAME"] = uploadInfo->getName(); -                args["AMOUNT"] = llformat("%d", uploadInfo->getExpectedUploadCost()); -                LLBuyCurrencyHTML::openCurrencyFloater(LLTrans::getString("UploadingCosts", args), uploadInfo->getExpectedUploadCost()); +                LLBuyCurrencyHTML::openCurrencyFloater("", uploadInfo->getExpectedUploadCost());  				return;  			}  		} diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 458fc3b13d..aec5becdb3 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -778,7 +778,6 @@ void response_group_invitation_coro(std::string url, LLUUID group_id, bool notif              LL_DEBUGS("GroupInvite") << "Successfully sent response to group " << group_id << " invitation" << LL_ENDL;              if (notify_and_update)              { -                LLNotificationsUtil::add("JoinGroupSuccess");                  gAgent.sendAgentDataUpdateRequest();                  LLGroupMgr::getInstance()->clearGroupData(group_id); @@ -5058,6 +5057,15 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)  		// notification was specified using the new mechanism, so we can just handle it here  		std::string notificationID;  		msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); + +		//SL-13824 skip notification when both joining a group and leaving a group +		//remove this after server stops sending these messages   +		if (notificationID == "JoinGroupSuccess" || +			notificationID == "GroupDepart") +		{ +			return true; +		} +  		if (!LLNotifications::getInstance()->templateExists(notificationID))  		{  			return false; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 58109b838e..66233a860e 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -465,6 +465,8 @@ BOOL LLVOAvatarSelf::buildMenus()  		if (gDetachBodyPartPieMenus[i])  		{  			gDetachPieMenu->appendContextSubMenu( gDetachBodyPartPieMenus[i] ); +			gDetachAttSelfMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]); +			gDetachAvatarMenu->appendContextSubMenu(gDetachBodyPartPieMenus[i]);  		}  		else  		{ @@ -493,12 +495,14 @@ BOOL LLVOAvatarSelf::buildMenus()  					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  					gDetachPieMenu->addChild(item); -						 +					gDetachAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params)); +					gDetachAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));  					break;  				}  			}  		}  	} +	  	// add screen attachments  	for (attachment_map_t::iterator iter = mAttachmentPoints.begin();  @@ -532,6 +536,8 @@ BOOL LLVOAvatarSelf::buildMenus()  			item_params.on_enable.parameter = iter->first;  			item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);  			gDetachScreenPieMenu->addChild(item); +			gDetachHUDAttSelfMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params)); +			gDetachHUDAvatarMenu->addChild(LLUICtrlFactory::create<LLMenuItemCallGL>(item_params));  		}  	} diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index e1cf708094..034576d30c 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -960,4 +960,7 @@    <color      name="OutfitGalleryItemUnselected"      value="0.4 0.4 0.4 1" /> +  <color +    name="AddPaymentPanel" +    value="0.27 0.27 0.27 1" />  </colors> diff --git a/indra/newview/skins/default/textures/icons/Inv_Toolbar_SearchVisibility.png b/indra/newview/skins/default/textures/icons/Inv_Toolbar_SearchVisibility.pngBinary files differ new file mode 100644 index 0000000000..048da25c92 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Toolbar_SearchVisibility.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index a875c4e848..8d609afeae 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -45,6 +45,10 @@ with the same filename but different name    <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />    <texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" /> +  <texture name="add_payment_image_center"  file_name="windows/add_payment_image_center.png" preload="true" /> +  <texture name="add_payment_image_left"  file_name="windows/add_payment_image_left.png" preload="true" /> +  <texture name="add_payment_image_right"  file_name="windows/add_payment_image_right.png" preload="true" /> +    <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />    <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" /> @@ -333,6 +337,8 @@ with the same filename but different name    <texture name="Inv_Unknown" file_name="icons/Inv_UnknownObject.png" preload="false" />    <texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />    <texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" /> + +  <texture name="Inv_Toolbar_SearchVisibility" file_name="icons/Inv_Toolbar_SearchVisibility.png" preload="false" />    <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>    <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> @@ -649,6 +655,7 @@ with the same filename but different name    <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />    <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />    <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> +  <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />    <texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" /> diff --git a/indra/newview/skins/default/textures/widgets/TextField_Search_Highlight.png b/indra/newview/skins/default/textures/widgets/TextField_Search_Highlight.pngBinary files differ new file mode 100644 index 0000000000..e3944289c6 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/TextField_Search_Highlight.png diff --git a/indra/newview/skins/default/textures/windows/add_payment_image_center.png b/indra/newview/skins/default/textures/windows/add_payment_image_center.pngBinary files differ new file mode 100644 index 0000000000..b5459136cb --- /dev/null +++ b/indra/newview/skins/default/textures/windows/add_payment_image_center.png diff --git a/indra/newview/skins/default/textures/windows/add_payment_image_left.png b/indra/newview/skins/default/textures/windows/add_payment_image_left.pngBinary files differ new file mode 100644 index 0000000000..7fb65e724a --- /dev/null +++ b/indra/newview/skins/default/textures/windows/add_payment_image_left.png diff --git a/indra/newview/skins/default/textures/windows/add_payment_image_right.png b/indra/newview/skins/default/textures/windows/add_payment_image_right.pngBinary files differ new file mode 100644 index 0000000000..f1937b6318 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/add_payment_image_right.png diff --git a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml new file mode 100644 index 0000000000..1f980564d4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + height="405" + width="900" + layout="topleft" + name="floater_add_payment_method" + single_instance="true" + show_title="false" + legacy_header_height="0" + header_height="0" + background_visible="false" + can_resize="false" + can_drag_on_left="false" + can_minimize="false" + can_close="false"> +  <floater.string +    name="continue_url"> +    https://secondlife.com/my/lindex/buy.php?associate_for_viewer=1 +  </floater.string> +  <panel +   background_opaque="false" +   bg_alpha_color="AddPaymentPanel" +   border_visible="false" +   background_visible="true" +   label="wrapper_panel" +   layout="topleft" +   left="0" +   name="wrapper_panel" +   top="0" +   height="405" +   width="900" +   follows="all" +   translate="false"> +    <text +     type="string" +     length="1" +     follows="top|left|right" +     font="SansSerifLargeBold" +     text_color="White" +     layout="topleft" +     left="0" +     height="14" +     top_pad="30" +     width="900" +     halign="center" +     name="title_txt"> +      Add a payment method to buy Linden dollars and enjoy more of Second Life. +    </text> +    <button +     follows="top|left|right" +     height="24" +     label="Get started" +     font="SansSerifMedium" +     layout="topleft" +     left="320" +     name="continue_btn" +     image_unselected="PushButton_Login" +     image_pressed="PushButton_Login_Pressed" +     image_hover_unselected="PushButton_Login_Over" +     label_color="White" +     top_pad ="15" +     width="140"/> +    <button +     follows="top|left|right" +     height="24" +     label="Later" +     layout="topleft" +     left_pad="9" +     name="close_btn" +     width="90"/> +    <icon +     height="195" +     width="260"  +     image_name="add_payment_image_left" +     layout="topleft" +     left="30" +     name="image_left" +     top_pad="30" +     use_draw_context_alpha="false"/> +    <icon +     height="195" +     width="260" +     image_name="add_payment_image_center" +     layout="topleft" +     left_pad="30" +     name="image_center" +     use_draw_context_alpha="false"/> +    <icon +     height="195" +     width="260" +     image_name="add_payment_image_right" +     layout="topleft" +     left_pad="30" +     name="image_right" +     use_draw_context_alpha="false"/> +    <text +     type="string" +     length="1" +     follows="top|left" +     font="SansSerifMedium" +     text_color="White" +     height="75" +     width="260" +     top_pad="15" +     layout="topleft" +     word_wrap="true" +     left="30" +     name="image_left_desc"> +      Create an avatar you love. Choose from millions of items in stores and the Second Life Marketplace. Your style is here. +    </text> +    <text +     type="string" +     length="1" +     follows="top|left" +     font="SansSerifMedium" +     text_color="White" +     height="75" +     width="260" +     layout="topleft" +     word_wrap="true" +     left_pad="30" +     name="image_center_desc"> +      Donate to your favorite performers and hosts. Your support helps them create great experiences. +    </text> +    <text +     type="string" +     length="1" +     follows="top|left" +     font="SansSerifMedium" +     text_color="White" +     height="75" +     width="260" +     layout="topleft" +     word_wrap="true" +     left_pad="30" +     name="image_right_desc"> +      Make the home of your dreams. With millions of items available to purchase, you can make your retreat unique. +    </text> +  </panel> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 92c5d8bcbe..3df2683ca8 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -14,7 +14,7 @@   help_topic="avatar"   save_rect="true"   save_visibility="true" - title="CHOOSE AN AVATAR" + title="COMPLETE AVATARS"   width="700">      <web_browser        top="25" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 061af1b67c..e8e83301be 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -1,8 +1,8 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater - legacy_header_height="18" +   can_minimize="false" - height="275" + height="285"   layout="topleft"   title="BUY L$"   name="buy currency" @@ -17,277 +17,385 @@       name="info_cannot_buy">          Unable to Buy      </floater.string> +    <floater.string +     name="estimated_zero"> +        US$ 0.00 +    </floater.string>      <icon -     height="215" +     height="245"       image_name="Linden_Dollar_Background"       layout="topleft"       left="0"       name="normal_background" -     top="17" +     top="0"       use_draw_context_alpha="false"       width="350" /> -   <text -     type="string" -     length="1" -     follows="top|left|right" -     font="SansSerifHuge" -     layout="topleft" -     left="20" -     height="30" -     top="25" -     width="340" -     name="info_need_more"> -        You need more L$ -    </text> -    <text -     type="string" -     length="1" -     follows="top|left" -     height="16" +  <layout_stack +    animate="false" +    name="outer_stack" +    layout="topleft" +    follows="all" +    orientation="vertical" +    left="0" +    top="0" +    width="350" +    height="285"> +    <layout_panel +     auto_resize="false" +     name="layout_panel_title"       layout="topleft" -     top="246" -     left="15" -     width="300" -     name="contacting"> -        Contacting LindeX... -    </text> -    <text -     type="string" -     length="1" -     follows="top|left" -     font="SansSerifHuge" +     follows="all" +     width="350" +     height="35"> +      <text +       type="string" +       length="1" +       follows="top|left|right" +       font="SansSerifLarge" +       layout="topleft" +       left="20" +       height="30" +       top="8" +       width="340" +       name="info_need_more"> +          You need more L$ +      </text> +      <text +       type="string" +       length="1" +       follows="top|left|right" +       font="SansSerifLarge" +       layout="topleft" +       left="20" +       height="30" +       top="8" +       width="300" +       name="info_buying"> +          Buy L$ +      </text> +      <view_border +       bevel_style="none" +       height="0" +       layout="topleft" +       left="20" +       name="text_border" +       top_delta="25" +       width="300"/> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_price"       layout="topleft" -     left="20" -     height="30" -     top="25" -     width="300" -     name="info_buying"> -        Buy L$ -    </text> -    <text -     type="string" -     length="1" -     follows="top|left" -     font="SansSerifMedium" -     height="16" +     follows="all" +     width="350" +     height="18"> +      <text +       type="string" +       length="1" +       follows="top|left" +       font="SansSerifMedium" +       height="16" +       layout="topleft" +       left="20" +       name="target_price_label" +       top_pad="3" +       width="210"> +          You need +      </text> +      <text +       type="string" +       length="1" +       font="SansSerifMedium" +       follows="top|left" +       halign="right" +       height="16" +       layout="topleft" +       left="200" +       name="target_price" +       top_delta="0" +       width="120"> +          L$ [AMT] +      </text> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_balance"       layout="topleft" -     left="20" -     name="balance_label" -     top="65" -     width="210"> -        I have -    </text> -    <text -     type="string" -     length="1" -     font="SansSerifMedium" -     follows="top|left" -     halign="right" -     height="16" -     layout="topleft" -     left="200" -     name="balance_amount" -     top_delta="0" -     width="120"> +     follows="all" +     width="350" +     height="19"> +      <text +       type="string" +       length="1" +       follows="top|left" +       font="SansSerifMedium" +       height="16" +       layout="topleft" +       left="20" +       name="balance_label" +       top_pad="5" +       width="210"> +        You now have +      </text> +      <text +       type="string" +       length="1" +       font="SansSerifMedium" +       follows="top|left" +       halign="right" +       height="16" +       layout="topleft" +       left="200" +       name="balance_amount" +       top_delta="0" +       width="120">          L$ [AMT] -    </text> -    <text -     type="string" -     length="1" -     follows="top|left" -     font="SansSerifMedium" -     height="16" -     top="95" -     layout="topleft" -     left="20" -     name="currency_action" -     width="210"> -        I want to buy -    </text> -    <text -     font="SansSerifMedium" -     type="string" -     length="1" -     follows="left|top" -     height="16" -     layout="topleft" -     top_delta="0" -     left="217" -     name="currency_label" -     width="15"> -      L$ -    </text> -    <line_editor -     type="string" -     max_length_bytes="10" -     halign="right" -     font="SansSerifMedium" -     select_on_focus="true" -     follows="top|left" -     top_delta="-7" -     height="22" -     label="L$" -     left_pad="3" -     name="currency_amt" -     width="85"> -        1234 -    </line_editor> -    <text -     type="string" -     font="SansSerifMedium" -     length="1" -     follows="top|left" -     height="16" -     layout="topleft" -     left="20" -     top="125" -     name="buying_label" -     width="210"> -        For the price -    </text> -    <text -     type="string" -     length="1" -     font="SansSerifMedium" -     text_color="EmphasisColor" -     follows="top|left" -     halign="right" -     height="16" -     top_delta="0" +      </text> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_required"       layout="topleft" -     left="150" -     name="currency_est" -     width="170"> -     approx. [LOCALAMOUNT] -    </text> -    <text -     type="string" -     font="SansSerifSmall" -     text_color="EmphasisColor" -     length="1" -     follows="top|left" -     height="16" -     layout="topleft" -     top="125" -     left="170" -     width="150" -     halign="right" -     name="getting_data"> -        Estimating... -    </text> -    <text -     type="string" -     font="SansSerifSmall" -     top="145" -     length="1" -     follows="top|left" -     height="16" -     halign="right" -     left="20" -     width="300" -     layout="topleft" -     name="buy_action"> -        [ACTION] -    </text> -    <text -     type="string" -     font="SansSerifMedium" -     length="1" -     follows="top|left" -     height="16" -     layout="topleft" -     left="20" -     name="total_label" -     top="165" -     width="210"> -        My new balance will be -    </text> -    <text -     type="string" -     length="1" -     font="SansSerifMedium" -     follows="top|left" -     top_delta="0" -     height="16" -     layout="topleft" -     left="200" -     halign="right" -     name="total_amount" -     width="120"> +     follows="all" +     width="350" +     height="22"> +      <text +        type="string" +        length="1" +        follows="top|left" +        font="SansSerifMedium" +        font.style="BOLD" +        height="16" +        layout="topleft" +        left="20" +        name="required_label" +        top_pad="6" +        width="210"> +        You should buy at least +      </text> +      <text +       type="string" +       length="1" +       font="SansSerifMedium" +       follows="top|left" +       halign="right" +       height="16" +       layout="topleft" +       left="200" +       name="required_amount" +       top_delta="0" +       width="120">          L$ [AMT] -    </text> -    <text -     type="string" -     length="1" -     text_color="LtGray_50" -     follows="top|left" +      </text> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_action"       layout="topleft" -     halign="right" -     top="189" -     left="20" -     width="300" -     height="30" -     name="currency_links"> -      [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] -    </text> -    <text -     type="string" -     length="1" -     text_color="LtGray_50" -     follows="top|left" +     follows="all" +     width="350" +     height="90"> +      <view_border +       bevel_style="none" +       height="0" +       layout="topleft" +       left="20" +       name="text_border_2" +       top_pad="5" +       width="300"/> +      <text +       type="string" +       length="1" +       follows="top|left" +       font="SansSerifMedium" +       height="16" +       top_pad="15" +       layout="topleft" +       left="20" +       name="currency_action" +       width="210"> +          Choose amount to buy +      </text> +      <text +       font="SansSerifMedium" +       type="string" +       length="1" +       follows="left|top" +       height="16" +       layout="topleft" +       top_delta="0" +       left="247" +       name="currency_label" +       width="15"> +        L$ +      </text> +      <line_editor +       type="string" +       max_length_bytes="10" +       halign="right" +       font="SansSerifMedium" +       select_on_focus="true" +       follows="top|left" +       top_delta="-4" +       height="22" +       label="L$" +       left_pad="3" +       name="currency_amt" +       width="55"> +          1234 +      </line_editor> +      <text +       type="string" +       length="1" +       font="SansSerifMedium" +       text_color="EmphasisColor" +       follows="top|left" +       halign="right" +       height="16" +       top_pad="4" +       layout="topleft" +       left="150" +       name="currency_est" +       width="170"> +       Approx. [LOCALAMOUNT] +      </text> +      <text +       type="string" +       font="SansSerifSmall" +       text_color="EmphasisColor" +       length="1" +       follows="top|left" +       height="16" +       layout="topleft" +       left="170" +       top_delta="0" +       width="150" +       halign="right" +       name="getting_data"> +          Estimating... +      </text> +      <text +       type="string" +       font="SansSerifMedium" +       length="1" +       follows="top|left" +       height="16" +       layout="topleft" +       left="20" +       name="total_label" +       top_pad="10" +       width="210"> +          Your new balance will be +      </text> +      <text +       type="string" +       length="1" +       font="SansSerifMedium" +       follows="top|left" +       top_delta="0" +       height="16" +       layout="topleft" +       left="200" +       halign="right" +       name="total_amount" +       width="120"> +          L$ [AMT] +      </text> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_msg"       layout="topleft" -     halign="right" -     top="202" -     left="20" -     width="300" -     height="30" -     name="exchange_rate_note"> +     follows="all" +     width="350" +     height="50"> +      <view_border +       bevel_style="none" +       height="0" +       layout="topleft" +       left="20" +       name="text_border_3" +       top_pad="0" +       width="300"/> +      <text +       type="string" +       length="1" +       text_color="LtGray_50" +       follows="top|left" +       layout="topleft" +       halign="right" +       top_pad="3" +       left="20" +       width="300" +       height="30" +       name="currency_links"> +        [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] +      </text> +      <text +       type="string" +       length="1" +       text_color="LtGray_50" +       follows="top|left" +       layout="topleft" +       halign="right" +       top="19" +       left="20" +       width="300" +       height="30" +       name="exchange_rate_note">  Re-enter amount to see the latest exchange rate. -    </text> -    <text -     type="string" -     length="1" -     text_color="LtGray_50" -     follows="top|left" -     layout="topleft" -     halign="right" -     top="208" -     left="10" -     width="310" -     height="35" -     name="purchase_warning_repurchase"> -        Confirming this purchase only buys L$, not the object. -    </text> -    <text -     type="string" -     length="1" -     text_color="LtGray_50" -     follows="top|left" -     layout="topleft" -     halign="right" -     top="213" -     left="20" -     width="300" -     height="30" -     name="purchase_warning_notenough"> -        You aren't buying enough L$. Please increase the amount. -    </text> - -    <button -     follows="bottom|left" -     height="20" -     label="Buy Now" -     layout="topleft" -     left="151" -     name="buy_btn" -     top="242" -     width="90"/> -    <button -     follows="bottom|right" -     height="20" -     label="Cancel" +      </text> +      <text +       type="string" +       length="1" +       follows="top|left" +       layout="topleft" +       font="SansSerifMedium" +       top="10" +       left="20" +       width="310" +       height="35" +       name="purchase_warning_repurchase"> +After you receive your L$, you should try your +purchase again. +      </text> +    </layout_panel> +    <layout_panel +     auto_resize="false" +     name="layout_panel_buttons"       layout="topleft" -     left_pad="10" -     name="cancel_btn" -     width="90"/> +     follows="all" +     width="350" +     height="40"> +      <text +       type="string" +       length="1" +       follows="top|left" +       height="16" +       layout="topleft" +       top_pad="0" +       left="15" +       width="300" +       name="contacting"> +          Contacting LindeX... +        </text> +      <button +       follows="top|left|right" +       height="20" +       label="Buy L$ now" +       layout="topleft" +       left="151" +       name="buy_btn" +       bottom_delta ="8" +       width="90"/> +      <button +       follows="top|left|right" +       height="20" +       label="Cancel" +       layout="topleft" +       left_pad="10"      +       name="cancel_btn" +       width="90"/> +    </layout_panel> +  </layout_stack>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml index fdea7a821a..35ad87ceb0 100644 --- a/indra/newview/skins/default/xui/en/floater_my_appearance.xml +++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml @@ -11,7 +11,7 @@    save_rect="true"    single_instance="true"    reuse_instance="true" -  title="APPEARANCE" +  title="AVATAR"    min_height="440"    min_width="333"    width="333"> diff --git a/indra/newview/skins/default/xui/en/floater_my_scripts.xml b/indra/newview/skins/default/xui/en/floater_my_scripts.xml index 3b0b6723c7..ee6defce9d 100644 --- a/indra/newview/skins/default/xui/en/floater_my_scripts.xml +++ b/indra/newview/skins/default/xui/en/floater_my_scripts.xml @@ -7,7 +7,7 @@   layout="topleft"   name="myscripts"   save_rect="true" - title="My Scripts" + title="ATTACHMENT SCRIPTS"   min_width="620"   width="620">    <panel diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index 38f4b7715f..7ad692038e 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -173,16 +173,13 @@            parameter="avatar_render_settings" />        </menu_item_call>        </context_menu> -  <menu_item_separator -       layout="topleft" name="Impostor seperator"/> -    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 59faf6a9f5..856bf4ce73 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -4,28 +4,7 @@   name="Attachment Pie">      <menu_item_call       enabled="false" -     label="Touch" -     layout="topleft" -     name="Attachment Object Touch"> -        <menu_item_call.on_click -         function="Object.Touch" /> -        <menu_item_call.on_enable -         function="Object.EnableTouch" -         name="EnableTouch"/> -    </menu_item_call> -    <!--menu_item_call -     label="Stand Up" -     layout="topleft" -     name="Stand Up"> -        <menu_item_call.on_click -         function="Self.StandUp" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableStandUp" /> -    </menu_item_call--> -    <menu_item_call -     enabled="false" -     label="Edit" +     label="Edit item"       layout="topleft"       name="Edit...">          <menu_item_call.on_click @@ -35,7 +14,7 @@      </menu_item_call>      <menu_item_call       enabled="false" -     label="Detach" +     label="Detach item"       layout="topleft"       name="Detach">          <menu_item_call.on_click @@ -43,39 +22,29 @@          <menu_item_call.on_enable           function="Attachment.EnableDetach" />      </menu_item_call> -  <menu_item_separator -    layout="topleft" /> -      <menu_item_call -     label="Sit Down" +     enabled="false" +     label="Touch item"       layout="topleft" -     name="Sit Down Here"> +     name="Attachment Object Touch">          <menu_item_call.on_click -         function="Self.SitDown" -         parameter="" /> +         function="Object.Touch" />          <menu_item_call.on_enable -         function="Self.EnableSitDown" /> +         function="Object.EnableTouch" +         name="EnableTouch"/>      </menu_item_call> +    <menu_item_separator +     layout="topleft" />    <menu_item_call -label="Stand Up" -layout="topleft" -name="Stand Up"> -    <menu_item_call.on_click -     function="Self.StandUp" -     parameter="" /> -    <menu_item_call.on_enable -     function="Self.EnableStandUp" /> -  </menu_item_call> -  <menu_item_call -  label="My Appearance" +  label="Outfits..."    name="Change Outfit">      <menu_item_call.on_click       function="CustomizeAvatar" />      <menu_item_call.on_enable       function="Edit.EnableCustomizeAvatar" />    </menu_item_call> -  <menu_item_call label="Edit My Outfit" +  <menu_item_call label="Current outfit..."  layout="topleft"  name="Edit Outfit">      <menu_item_call.on_click @@ -83,7 +52,7 @@ name="Edit Outfit">      <menu_item_call.on_enable       function="Edit.EnableCustomizeAvatar" />    </menu_item_call> -  <menu_item_call label="Edit My Shape" +  <menu_item_call label="Shape..."      layout="topleft"      name="Edit My Shape">      <menu_item_call.on_click @@ -91,7 +60,7 @@ name="Edit Outfit">      <menu_item_call.on_enable       function="Edit.EnableEditShape" />    </menu_item_call> -  <menu_item_call label="Hover Height" +  <menu_item_call label="Hover height..."       layout="topleft"       name="Hover Height">       <menu_item_call.on_click @@ -99,42 +68,224 @@ name="Edit Outfit">       <menu_item_call.on_enable        function="Edit.EnableHoverHeight" />    </menu_item_call> -  <menu_item_call label="Reset Skeleton" +  <context_menu +  label="Take Off" +  layout="topleft" +  name="Take Off >"> +    <context_menu +     label="Clothes" +     layout="topleft" +     name="Clothes >"> +      <menu_item_call +       enabled="false" +       label="Shirt"         layout="topleft" -       name="Reset Skeleton"> -       <menu_item_call.on_click -        function="Avatar.ResetSkeleton" /> -  </menu_item_call> -  <menu_item_call label="Reset Skeleton And Animations" +       name="Shirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Pants"         layout="topleft" -       name="Reset Skeleton And Animations"> -       <menu_item_call.on_click -        function="Avatar.ResetSkeletonAndAnimations" /> -  </menu_item_call> - +       name="Pants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="pants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="pants" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Skirt" +       layout="topleft" +       name="Skirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="skirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="skirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Shoes" +       layout="topleft" +       name="Shoes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shoes" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shoes" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Socks" +       layout="topleft" +       name="Socks"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="socks" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="socks" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Jacket" +       layout="topleft" +       name="Jacket"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="jacket" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="jacket" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Gloves" +       layout="topleft" +       name="Gloves"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="gloves" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="gloves" /> +      </menu_item_call> +      <menu_item_call +            enabled="false" +            label="Undershirt" +            layout="topleft" +            name="Self Undershirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="undershirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="undershirt" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Underpants" +        layout="topleft" +        name="Self Underpants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="underpants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="underpants" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Tattoo" +        layout="topleft" +        name="Self Tattoo"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="tattoo" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="tattoo" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Physics" +        layout="topleft" +        name="Self Physics"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="physics" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="physics" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Alpha" +        layout="topleft" +        name="Self Alpha"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="alpha" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="alpha" /> +      </menu_item_call> +      <menu_item_separator +       layout="topleft" /> +      <menu_item_call +       label="All Clothes" +       layout="topleft" +       name="All Clothes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="all" /> +      </menu_item_call> +    </context_menu> +    <context_menu +     label="HUD" +     layout="topleft" +     name="Detach Self HUD" /> +    <context_menu +     label="Detach" +     layout="topleft" +     name="Detach Self" /> +    <menu_item_call +     label="Detach All" +     layout="topleft" +     name="Detach All"> +      <menu_item_call.on_click +       function="Self.RemoveAllAttachments" +       parameter="" /> +      <menu_item_call.on_enable +       function="Self.EnableRemoveAllAttachments" /> +    </menu_item_call> +  </context_menu> +  <menu_item_separator/>    <menu_item_call -    label="My Friends" +    label="Sit / stand"      layout="topleft" -    name="Friends..."> +    name="Sit stand">      <menu_item_call.on_click -     function="SideTray.PanelPeopleTab" -     parameter="friends_panel" /> +     function="Self.ToggleSitStand"/> +    <menu_item_call.on_enable +     function="Self.EnableSitStand" />    </menu_item_call>    <menu_item_call -   label="My Groups" -   layout="topleft" -   name="Groups..."> +     label="Fly / land" +     name="Fly land">      <menu_item_call.on_click -     function="SideTray.PanelPeopleTab" -     parameter="groups_panel" /> +     function="Agent.toggleFlying" /> +    <menu_item_call.on_enable +     function="Agent.enableFlyLand" />    </menu_item_call>    <menu_item_call -    label="My Profile" -    layout="topleft" -    name="Profile..."> +     label="Stop animations" +     name="Stop Animating My Avatar">      <menu_item_call.on_click -     function="ShowAgentProfile" -     parameter="agent" /> +     function="Tools.StopAllAnimations" /> +  </menu_item_call> +  <menu_item_separator/> +  <menu_item_call label="Reset skeleton" +       layout="topleft" +       name="Reset Skeleton"> +       <menu_item_call.on_click +        function="Avatar.ResetSkeleton" /> +  </menu_item_call> +  <menu_item_call label="Reset skeleton and animations" +       layout="topleft" +       name="Reset Skeleton And Animations"> +       <menu_item_call.on_click +        function="Avatar.ResetSkeletonAndAnimations" />    </menu_item_call>    <menu_item_call   label="Debug Textures" @@ -152,27 +303,13 @@ name="Edit Outfit">              <menu_item_call.on_visible               function="Advanced.EnableAppearanceToXML"/>      </menu_item_call> -  <menu_item_separator -  layout="topleft" /> -  <menu_item_call - enabled="false" - label="Drop" - layout="topleft" - name="Drop"> -    <menu_item_call.on_click -     function="Attachment.Drop" /> -    <menu_item_call.on_enable -     function="Attachment.EnableDrop" /> -  </menu_item_call> -  <menu_item_separator -       layout="topleft" />    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index f9fb847910..acbb9b860d 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -165,16 +165,13 @@        </menu_item_call>        </context_menu> -  <menu_item_separator  -    layout="topleft"  name="Impostor seperator"/> -    <menu_item_call       enabled="false"       label="Block Particle Owner"       name="Mute Particle">      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 9e181d0b6d..a46d9aed55 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -3,209 +3,7 @@   layout="topleft"   name="Self Pie">      <menu_item_call -     label="Sit Down" -     layout="topleft" -     name="Sit Down Here"> -        <menu_item_call.on_click -         function="Self.SitDown" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableSitDown" /> -    </menu_item_call> -    <menu_item_call -     label="Stand Up" -     layout="topleft" -     name="Stand Up"> -        <menu_item_call.on_click -         function="Self.StandUp" -         parameter="" /> -        <menu_item_call.on_enable -         function="Self.EnableStandUp" /> -    </menu_item_call> -    <context_menu -     label="Take Off" -     layout="topleft" -     name="Take Off >"> -        <context_menu -         label="Clothes" -         layout="topleft" -         name="Clothes >"> -            <menu_item_call -             enabled="false" -             label="Shirt" -             layout="topleft" -             name="Shirt"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="shirt" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="shirt" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Pants" -             layout="topleft" -             name="Pants"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="pants" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="pants" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Skirt" -             layout="topleft" -             name="Skirt"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="skirt" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="skirt" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Shoes" -             layout="topleft" -             name="Shoes"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="shoes" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="shoes" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Socks" -             layout="topleft" -             name="Socks"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="socks" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="socks" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Jacket" -             layout="topleft" -             name="Jacket"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="jacket" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="jacket" /> -            </menu_item_call> -            <menu_item_call -             enabled="false" -             label="Gloves" -             layout="topleft" -             name="Gloves"> -                <menu_item_call.on_click -                 function="Edit.TakeOff" -                 parameter="gloves" /> -                <menu_item_call.on_enable -                 function="Edit.EnableTakeOff" -                 parameter="gloves" /> -            </menu_item_call> -           <menu_item_call -                 enabled="false" -                 label="Undershirt" -                 layout="topleft" -                 name="Self Undershirt"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="undershirt" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="undershirt" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Underpants" -                 layout="topleft" -                 name="Self Underpants"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="underpants" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="underpants" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Tattoo" -                 layout="topleft" -                 name="Self Tattoo"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="tattoo" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="tattoo" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Physics" -                 layout="topleft" -                 name="Self Physics"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="physics" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="physics" /> -                </menu_item_call> -               <menu_item_call -                 enabled="false" -                 label="Alpha" -                 layout="topleft" -                 name="Self Alpha"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="alpha" /> -                    <menu_item_call.on_enable -                     function="Edit.EnableTakeOff" -                     parameter="alpha" /> -                </menu_item_call> -                <menu_item_separator -                 layout="topleft" /> -                <menu_item_call -                 label="All Clothes" -                 layout="topleft" -                 name="All Clothes"> -                    <menu_item_call.on_click -                     function="Edit.TakeOff" -                     parameter="all" /> -                </menu_item_call> -        </context_menu> -        <context_menu -         label="HUD" -         layout="topleft" -         name="Object Detach HUD" /> -        <context_menu -         label="Detach" -         layout="topleft" -         name="Object Detach" /> -        <menu_item_call -         label="Detach All" -         layout="topleft" -         name="Detach All"> -            <menu_item_call.on_click -             function="Self.RemoveAllAttachments" -             parameter="" /> -            <menu_item_call.on_enable -             function="Self.EnableRemoveAllAttachments" /> -        </menu_item_call> -    </context_menu> -     <menu_item_call -     label="My Appearance" +     label="Outfits..."       layout="topleft"       name="Chenge Outfit">          <menu_item_call.on_click @@ -213,7 +11,7 @@          <menu_item_call.on_enable           function="Edit.EnableCustomizeAvatar" />      </menu_item_call> -    <menu_item_call label="Edit My Outfit"  +    <menu_item_call label="Current outfit..."       layout="topleft"      name="Edit Outfit">         <menu_item_call.on_click @@ -221,7 +19,7 @@         <menu_item_call.on_enable          function="Edit.EnableCustomizeAvatar" />     </menu_item_call> -    <menu_item_call label="Edit My Shape"  +    <menu_item_call label="Shape..."       layout="topleft"      name="Edit My Shape">         <menu_item_call.on_click @@ -229,7 +27,7 @@         <menu_item_call.on_enable          function="Edit.EnableEditShape" />     </menu_item_call> -   <menu_item_call label="Hover Height" +   <menu_item_call label="Hover height..."       layout="topleft"       name="Hover Height">       <menu_item_call.on_click @@ -237,42 +35,225 @@       <menu_item_call.on_enable        function="Edit.EnableHoverHeight" />     </menu_item_call> -   <menu_item_call label="Reset Skeleton" +  <context_menu +    label="Take Off" +    layout="topleft" +    name="Take Off >"> +    <context_menu +     label="Clothes" +     layout="topleft" +     name="Clothes >"> +      <menu_item_call +       enabled="false" +       label="Shirt" +       layout="topleft" +       name="Shirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Pants" +       layout="topleft" +       name="Pants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="pants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="pants" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Skirt" +       layout="topleft" +       name="Skirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="skirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="skirt" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Shoes" +       layout="topleft" +       name="Shoes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="shoes" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="shoes" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Socks" +       layout="topleft" +       name="Socks"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="socks" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="socks" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Jacket" +       layout="topleft" +       name="Jacket"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="jacket" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="jacket" /> +      </menu_item_call> +      <menu_item_call +       enabled="false" +       label="Gloves" +       layout="topleft" +       name="Gloves"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="gloves" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="gloves" /> +      </menu_item_call> +      <menu_item_call +            enabled="false" +            label="Undershirt" +            layout="topleft" +            name="Self Undershirt"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="undershirt" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="undershirt" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Underpants" +        layout="topleft" +        name="Self Underpants"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="underpants" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="underpants" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Tattoo" +        layout="topleft" +        name="Self Tattoo"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="tattoo" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="tattoo" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Physics" +        layout="topleft" +        name="Self Physics"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="physics" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="physics" /> +      </menu_item_call> +      <menu_item_call +        enabled="false" +        label="Alpha" +        layout="topleft" +        name="Self Alpha"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="alpha" /> +        <menu_item_call.on_enable +         function="Edit.EnableTakeOff" +         parameter="alpha" /> +      </menu_item_call> +      <menu_item_separator +       layout="topleft" /> +      <menu_item_call +       label="All Clothes" +       layout="topleft" +       name="All Clothes"> +        <menu_item_call.on_click +         function="Edit.TakeOff" +         parameter="all" /> +      </menu_item_call> +    </context_menu> +    <context_menu +     label="HUD" +     layout="topleft" +     name="Object Detach HUD" /> +    <context_menu +     label="Detach" +     layout="topleft" +     name="Object Detach" /> +    <menu_item_call +     label="Detach All" +     layout="topleft" +     name="Detach All"> +      <menu_item_call.on_click +       function="Self.RemoveAllAttachments" +       parameter="" /> +      <menu_item_call.on_enable +       function="Self.EnableRemoveAllAttachments" /> +    </menu_item_call> +  </context_menu> +  <menu_item_separator/> +  <menu_item_call +    label="Sit / stand" +    layout="topleft" +    name="Sit stand"> +      <menu_item_call.on_click +       function="Self.ToggleSitStand"/> +      <menu_item_call.on_enable +       function="Self.EnableSitStand" /> +  </menu_item_call> +  <menu_item_call +     label="Fly / land" +     name="Fly land"> +      <menu_item_call.on_click +       function="Agent.toggleFlying" /> +      <menu_item_call.on_enable +       function="Agent.enableFlyLand" /> +  </menu_item_call> +  <menu_item_call +     label="Stop animations" +     name="Stop Animating My Avatar"> +        <menu_item_call.on_click +         function="Tools.StopAllAnimations" /> +  </menu_item_call> +  <menu_item_separator/> +  <menu_item_call label="Reset skeleton"       layout="topleft"       name="Reset Skeleton">       <menu_item_call.on_click        function="Avatar.ResetSkeleton" /> -   </menu_item_call> -  <menu_item_call label="Reset Skeleton And Animations" +  </menu_item_call> +  <menu_item_call label="Reset skeleton and animations"         layout="topleft"         name="Reset Skeleton And Animations">         <menu_item_call.on_click          function="Avatar.ResetSkeletonAndAnimations" />    </menu_item_call> -   <menu_item_call -     label="My Friends" -     layout="topleft" -     name="Friends..."> -        <menu_item_call.on_click -         function="SideTray.PanelPeopleTab" -         parameter="friends_panel" /> -    </menu_item_call> -    <menu_item_call -     label="My Groups" -     layout="topleft" -     name="Groups..."> -        <menu_item_call.on_click -         function="SideTray.PanelPeopleTab" -         parameter="groups_panel" /> -    </menu_item_call> -   <menu_item_call -     label="My Profile" -     layout="topleft" -     name="Profile..."> -        <menu_item_call.on_click -         function="ShowAgentProfile" -         parameter="agent" /> -    </menu_item_call>      <menu_item_call  		 label="Debug Textures"           name="Debug..."> @@ -289,8 +270,6 @@              <menu_item_call.on_visible               function="Advanced.EnableAppearanceToXML"/>      </menu_item_call> -  <menu_item_separator -       layout="topleft" />    <menu_item_call       enabled="false"       label="Block Particle Owner" @@ -298,7 +277,7 @@      <menu_item_call.on_click       function="Particle.Mute" /> -    <menu_item_call.on_enable +    <menu_item_call.on_visible       function="EnableMuteParticle" />    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index eda9739976..e7782a4ca0 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -393,6 +393,13 @@           parameter="model" />        </menu_item_call>      </menu> +      <menu_item_call +       label="Use as Favorites folder" +       layout="topleft" +       name="Set Favorites folder"> +        <menu_item_call.on_click +         function="Inventory.SetFavoritesFolder"/> +      </menu_item_call>      <menu       label="Change Type"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml new file mode 100644 index 0000000000..46193f4a7a --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + bottom="806" + layout="topleft" + left="0" + mouse_opaque="false" + name="menu_search_visibility" + visible="false"> +  <menu_item_check +   label="Search Trash" +   layout="topleft" +   name="search_trash"> +    <on_click +     function="Inventory.GearDefault.Custom.Action" +     parameter="toggle_search_trash" /> +    <on_check +     function="Inventory.GearDefault.Check" +     parameter="toggle_search_trash" /> +  </menu_item_check> +  <menu_item_check +   label="Search Library" +   layout="topleft" +   name="search_library"> +    <on_click +     function="Inventory.GearDefault.Custom.Action" +     parameter="toggle_search_library" /> +    <on_check +     function="Inventory.GearDefault.Check" +     parameter="toggle_search_library" /> +  </menu_item_check> +  <menu_item_separator +   layout="topleft" /> +  <menu_item_check +   label="Include links" +   layout="topleft" +   name="include_links"> +    <on_click +     function="Inventory.GearDefault.Custom.Action" +     parameter="include_links" /> +    <on_check +     function="Inventory.GearDefault.Check" +     parameter="include_links" />          +  </menu_item_check>     +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 5fa1847d1b..0d456ffe5d 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -15,24 +15,6 @@           function="ShowAgentProfile"           parameter="agent" />        </menu_item_call> -      <menu_item_call -       label="Appearance..." -       name="ChangeOutfit" -       shortcut="control|O"> -        <menu_item_call.on_click -         function="Floater.ToggleOrBringToFront" -         parameter="appearance" /> -        <menu_item_call.on_enable -         function="Edit.EnableCustomizeAvatar" /> -      </menu_item_call> -      <menu_item_call -       label="Choose an avatar..." -       name="Avatar Picker"> -        <menu_item_call.on_click -         function="Floater.ToggleOrBringToFront" -         parameter="avatar" /> -      </menu_item_call> -      <menu_item_separator/>        <menu_item_check           label="Inventory..."           name="Inventory" @@ -76,119 +58,29 @@            parameter="experiences"/>        </menu_item_call>        <menu_item_call -        label="My Scripts..." -        name="MyScripts"> -        <menu_item_call.on_click -          function="Floater.ToggleOrBringToFront" -          parameter="my_scripts"/> -      </menu_item_call> -      <menu_item_separator/> -      <menu_item_call         label="Camera Controls..."         name="Camera Controls">          <menu_item_call.on_click           function="Floater.ToggleOrBringToFront"           parameter="camera" />        </menu_item_call> -      <menu -       create_jump_keys="true" -       label="Movement" -       name="Movement" -       tear_off="true"> -        <menu_item_call -         label="Sit Down" -         layout="topleft" -         shortcut="alt|shift|S" -         name="Sit Down Here"> -          <menu_item_call.on_click -           function="Self.SitDown"/> -          <menu_item_call.on_visible -           function="Self.ShowSitDown"/> -          <menu_item_call.on_enable -           function="Self.EnableSitDown" /> -        </menu_item_call> -        <menu_item_call -         label="Stand Up" -         layout="topleft" -         shortcut="alt|shift|S" -         name="Stand up"> -          <menu_item_call.on_click -           function="Self.StandUp"/> -          <menu_item_call.on_visible -           function="Self.EnableStandUp"/> -          <menu_item_call.on_enable -           function="Self.EnableStandUp" /> -        </menu_item_call> -        <menu_item_check -         label="Fly" -         name="Fly" -         shortcut="HOME"> -          <menu_item_check.on_check -           function="Agent.getFlying" /> -          <menu_item_check.on_click -           function="Agent.toggleFlying" /> -          <menu_item_check.on_enable -           function="Agent.enableFlying" /> -        </menu_item_check> -        <menu_item_call -         label="Stop flying" -         name="Stop flying" -         shortcut="HOME"> -          <menu_item_call.on_click -           function="Agent.toggleFlying" /> -          <menu_item_call.on_enable -           function="Agent.getFlying" /> -        </menu_item_call>	 -        <menu_item_check -         label="Always Run" -         name="Always Run" -         shortcut="control|R"> -          <menu_item_check.on_check -           function="World.CheckAlwaysRun" /> -          <menu_item_check.on_click -           function="World.AlwaysRun" /> -        </menu_item_check> -        <menu_item_call -         label="Stop Animating Me" -         name="Stop Animating My Avatar"> -          <menu_item_call.on_click -           function="Tools.StopAllAnimations" /> -        </menu_item_call> -        <menu_item_check -         label="Walk / run / fly..." -         name="WalkRunFly"> -          <menu_item_check.on_check -           function="Floater.Visible" -           parameter="moveview" /> -          <menu_item_check.on_click -           function="Floater.ToggleOrBringToFront" -           parameter="moveview" /> -        </menu_item_check> -      </menu> - -      <menu -       create_jump_keys="true" -       label="Status" -       name="Status" -       tear_off="true"> -        <menu_item_check -         name="Away" -         label="Away"> -          <menu_item_check.on_check -           function="View.Status.CheckAway" /> -          <menu_item_check.on_click -           function="World.SetAway" /> -        </menu_item_check> -        <menu_item_check -         name="Do Not Disturb" -         label="Do Not Disturb"> -          <menu_item_check.on_check -           function="View.Status.CheckDoNotDisturb" /> -          <menu_item_check.on_click -           function="World.SetDoNotDisturb"/> -        </menu_item_check> -       -    </menu> +      <menu_item_separator/> +      <menu_item_check +       name="Away" +       label="Away"> +        <menu_item_check.on_check +         function="View.Status.CheckAway" /> +        <menu_item_check.on_click +         function="World.SetAway" /> +      </menu_item_check> +      <menu_item_check +       name="Do Not Disturb" +       label="Do Not Disturb"> +        <menu_item_check.on_check +         function="View.Status.CheckDoNotDisturb" /> +        <menu_item_check.on_click +         function="World.SetDoNotDisturb"/> +      </menu_item_check>        <menu_item_separator/> @@ -213,6 +105,15 @@           name="ManageMyAccount_url"           parameter="WebLaunchJoinNow,http://secondlife.com/account/" />        </menu_item_call> +      <menu_item_call +           label="[Membership]" +           name="Membership"> +            <menu_item_call.on_click +             function="Advanced.ShowURL" +             parameter="https://secondlife.com/my/account/membership.php"/> +            <menu_item_call.on_visible +                 function="Membership.UpdateLabel"/> +      </menu_item_call>        <menu_item_separator/> @@ -260,6 +161,325 @@      </menu>      <menu       create_jump_keys="true" +     label="Avatar" +     name="Avatar" +     tear_off="true"> +       <menu_item_call +         label="Complete avatars..." +         name="Avatar Picker"> +            <menu_item_call.on_click +             function="Floater.ToggleOrBringToFront" +             parameter="avatar" /> +       </menu_item_call> +       <menu_item_call +         label="Outfits..." +         name="ChangeOutfit" +         shortcut="control|O"> +            <menu_item_call.on_click +             function="Floater.ToggleOrBringToFront" +             parameter="appearance" /> +            <menu_item_call.on_enable +             function="Edit.EnableCustomizeAvatar" /> +       </menu_item_call> +       <menu_item_call  +         label="Current outfit..." +         layout="topleft" +         name="Edit Outfit"> +            <menu_item_call.on_click +             function="EditOutfit" /> +            <menu_item_call.on_enable +             function="Edit.EnableCustomizeAvatar" /> +       </menu_item_call> +       <menu_item_call  +         label="Shape..." +         layout="topleft" +         name="Edit My Shape"> +            <menu_item_call.on_click +             function="EditShape" /> +            <menu_item_call.on_enable +             function="Edit.EnableEditShape" /> +      </menu_item_call> +       <menu_item_call label="Hover height..." +         layout="topleft" +         name="Hover Height"> +            <menu_item_call.on_click +             function="HoverHeight" /> +            <menu_item_call.on_enable +             function="Edit.EnableHoverHeight" /> +      </menu_item_call> +      <menu +        label="Take Off" +        layout="topleft" +        name="Take Off >"> +        <menu +         label="Clothes" +         layout="topleft" +         name="Clothes >"> +          <menu_item_call +           enabled="false" +           label="Shirt" +           layout="topleft" +           name="Shirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="shirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="shirt" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Pants" +           layout="topleft" +           name="Pants"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="pants" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="pants" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Skirt" +           layout="topleft" +           name="Skirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="skirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="skirt" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Shoes" +           layout="topleft" +           name="Shoes"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="shoes" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="shoes" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Socks" +           layout="topleft" +           name="Socks"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="socks" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="socks" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Jacket" +           layout="topleft" +           name="Jacket"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="jacket" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="jacket" /> +          </menu_item_call> +          <menu_item_call +           enabled="false" +           label="Gloves" +           layout="topleft" +           name="Gloves"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="gloves" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="gloves" /> +          </menu_item_call> +          <menu_item_call +                enabled="false" +                label="Undershirt" +                layout="topleft" +                name="Self Undershirt"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="undershirt" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="undershirt" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Underpants" +            layout="topleft" +            name="Self Underpants"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="underpants" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="underpants" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Tattoo" +            layout="topleft" +            name="Self Tattoo"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="tattoo" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="tattoo" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Physics" +            layout="topleft" +            name="Self Physics"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="physics" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="physics" /> +          </menu_item_call> +          <menu_item_call +            enabled="false" +            label="Alpha" +            layout="topleft" +            name="Self Alpha"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="alpha" /> +            <menu_item_call.on_enable +             function="Edit.EnableTakeOff" +             parameter="alpha" /> +          </menu_item_call> +          <menu_item_separator +           layout="topleft" /> +          <menu_item_call +           label="All Clothes" +           layout="topleft" +           name="All Clothes"> +            <menu_item_call.on_click +             function="Edit.TakeOff" +             parameter="all" /> +          </menu_item_call> +        </menu> +        <menu +         label="HUD" +         layout="topleft" +         name="Avatar Detach HUD" /> +        <menu +         label="Detach" +         layout="topleft" +         name="Avatar Detach" /> +        <menu_item_call +         label="Detach All" +         layout="topleft" +         name="Detach All"> +          <menu_item_call.on_click +           function="Self.RemoveAllAttachments" +           parameter="" /> +          <menu_item_call.on_enable +           function="Self.EnableRemoveAllAttachments" /> +        </menu_item_call> +      </menu> +      <menu_item_separator/> + +       <menu_item_call +         label="Sit / stand" +         layout="topleft" +         shortcut="alt|shift|S" +         name="Sit stand"> +          <menu_item_call.on_click +           function="Self.ToggleSitStand"/> +          <menu_item_call.on_enable +           function="Self.EnableSitStand" /> +        </menu_item_call> +        <menu_item_call +         label="Fly / land" +         name="Fly land" +         shortcut="HOME"> +          <menu_item_call.on_click +           function="Agent.toggleFlying" /> +          <menu_item_call.on_enable +           function="Agent.enableFlyLand" /> +        </menu_item_call>        +        <menu_item_call +         label="Stop animations" +         name="Stop Animating My Avatar"> +          <menu_item_call.on_click +           function="Tools.StopAllAnimations" /> +        </menu_item_call> +        <menu_item_check +          label="Walk / run / fly..." +          name="WalkRunFly"> +          <menu_item_check.on_check +           function="Floater.Visible" +           parameter="moveview" /> +          <menu_item_check.on_click +           function="Floater.ToggleOrBringToFront" +           parameter="moveview" /> +        </menu_item_check> +        <menu_item_check +          label="Always run" +          name="Always Run" +          shortcut="control|R"> +          <menu_item_check.on_check +           function="World.CheckAlwaysRun" /> +          <menu_item_check.on_click +           function="World.AlwaysRun" /> +        </menu_item_check> +      <menu_item_separator/> +      <menu_item_check +       label="Gestures..." +       name="Gestures" +       shortcut="control|G"> +        <menu_item_check.on_check +         function="Floater.Visible" +         parameter="gestures" /> +        <menu_item_check.on_click +         function="Floater.Toggle" +         parameter="gestures" /> +      </menu_item_check> +      <menu_item_separator/> +      <menu_item_call  +       label="Reset skeleton" +       layout="topleft" +       name="Reset Skeleton"> +        <menu_item_call.on_click +         function="Avatar.ResetSkeleton" /> +      </menu_item_call> +      <menu_item_call  +       label="Reset skeleton and animations" +       layout="topleft" +       name="Reset Skeleton And Animations"> +        <menu_item_call.on_click +         function="Avatar.ResetSkeletonAndAnimations" /> +      </menu_item_call> +      <menu_item_call +       label="Attachment scripts..." +       name="MyScripts"> +        <menu_item_call.on_click +         function="Floater.ToggleOrBringToFront" +         parameter="my_scripts"/> +      </menu_item_call> +      <menu_item_separator/> +      <menu_item_call +     label="Help with avatars..." +     name="Help with avatars"> +        <menu_item_call.on_click +            function="Advanced.ShowURL" +            parameter="https://community.secondlife.com/search/?type=cms_records3&tags=avatar&nodes=30&search_and_or=or"/> +      </menu_item_call> +    </menu> +    <menu +     create_jump_keys="true"       label="Communicate"       name="Communicate"       tear_off="true"> @@ -524,12 +744,18 @@               parameter="region_info" />          </menu_item_call>          <menu_item_call -         label="My land holdings..." -         name="My Land"> +         label="My Linden Home..." +         name="Linden Home"> +            <menu_item_call.on_click +             function="World.LindenHome"/> +        </menu_item_call> +        <menu_item_call +             label="My land holdings..." +             name="My Land">              <menu_item_call.on_click               function="Floater.Show"               parameter="land_holdings" /> -        </menu_item_call> +      </menu_item_call>          <menu_item_call           label="Buy this land"           name="Buy Land"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 2f4da4f9b7..fd243d8b19 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1024,18 +1024,6 @@ The group no longer has open enrollment.    <notification     icon="alertmodal.tga" -   name="JoinGroupSuccess" -   type="alertmodal"> -You have been added to the group -    <tag>group_id</tag> -    <tag>success</tag> -    <usetemplate -       name="okbutton" -       yestext="OK"/> -  </notification> -   -  <notification -   icon="alertmodal.tga"     name="JoinGroupInsufficientFunds"     type="alertmodal">  Unable to transfer the required L$ [membership_fee] membership fee. @@ -4249,13 +4237,6 @@ Leave Group?       yestext="OK"/>    </notification> -  <notification -   icon="notify.tga" -   name="GroupDepart" -   type="notify"> -You have left the group '<nolink>[group_name]</nolink>'. -    <tag>group</tag> -  </notification>    <notification     icon="alertmodal.tga" @@ -11486,7 +11467,28 @@ Cannot create large prims that intersect other residents.  Please re-try when ot       name="okbutton"       yestext="OK"/>    </notification> -   + +  <notification +   icon="alertmodal.tga" +   name="AddPaymentMethod" +   type="alertmodal"> +On the following page, choose a L$ amount +and click a place Order button. You will be +able to add a payment method at checkout. +    <tag>confirm</tag> +    <form name="form"> +      <button +       default="true" +       index="0" +       width="120" +       name="Continue" +       text="Continue"/> +      <button +       index="1" +       name="Cancel" +       text="Cancel"/> +    </form> +  </notification>    <notification     icon="alert.tga" 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 dc1553e6a3..85d73ece48 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -13,7 +13,7 @@   width="333">      <string       name="edit_shape_title"> -        Editing Shape +        Shape      </string>      <string       name="edit_skin_title"> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index d77fbdec0a..7bd5c9b548 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -32,30 +32,20 @@      		 left="12"  		     name="ItemcountText"  		     font="SansSerifMedium" -		     text_color="EmphasisColor" +		     text_color="InventoryItemLinkColor"  		     use_ellipses="true"  		     top_pad="0"  		     width="300">      Items:    </text> -  <filter_editor -   text_pad_left="10" -   follows="left|top|right" +  <combo_box     height="23" -   label="Enter search text"     layout="topleft"     left="10" -   max_length_chars="300" -   name="inventory search editor"     top="18" -   width="208" /> -  <combo_box -   height="23" -   layout="topleft" -   left_pad="4"     name="search_type" -   follows="top|right" -   width="90"> +   follows="top|left" +   width="88">      <item       label="Name"       name="Name" @@ -72,7 +62,27 @@       label="UUID"       name="UUID"       value="search_by_UUID"/> -    </combo_box> +  </combo_box> +  <menu_button +   follows="top|left" +   tool_tip="Show search visibility options" +   height="23" +   image_overlay="Inv_Toolbar_SearchVisibility" +   layout="topleft" +   left_pad="3" +   name="options_visibility_btn" +   width="31" /> +  <filter_editor +   text_pad_left="10" +   follows="left|top|right" +   height="23" +   label="Enter search text" +   layout="topleft" +   left_pad="3" +   max_length_chars="300" +   highlight_text_field="true" +   name="inventory search editor" +   width="177" />    <tab_container       follows="all"       halign="center" @@ -117,20 +127,32 @@       name="Recent Items"       show_item_link_overlays="true"       width="290" /> -       <inventory_panel -      name="Worn Items" -      label="WORN" -      show_empty_message="false" -      follows="all" -      layout="topleft" -      width="290" -      bg_opaque_color="DkGray2" -      bg_alpha_color="DkGray2" -      background_visible="true" -      border="false" -      bevel_style="none" -      scroll.reserve_scroll_corner="false"> -  </inventory_panel> +    <inventory_panel +     name="Worn Items" +     label="WORN" +     show_empty_message="false" +     follows="all" +     layout="topleft" +     width="290" +     bg_opaque_color="DkGray2" +     bg_alpha_color="DkGray2" +     background_visible="true" +     border="false" +     bevel_style="none" +     scroll.reserve_scroll_corner="false"/> +    <favorites_inventory_panel +     name="Favorite Items" +     label="FAVORITES" +     show_empty_message="false" +     follows="all" +     layout="topleft" +     width="290" +     bg_opaque_color="DkGray2" +     bg_alpha_color="DkGray2" +     background_visible="true" +     border="false" +     bevel_style="none" +     scroll.reserve_scroll_corner="false"/>    </tab_container>    <layout_stack     animate="false" 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 3f7444dec3..6fd54d7c6a 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -81,7 +81,7 @@              name="title"              text_color="LtGray"              top="0" -            value="Edit Outfit" +            value="Current Outfit"              use_ellipses="true"              width="275" /> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f9f12e7f5c..db9d3bfa83 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2297,6 +2297,7 @@ For AI Character: Get the closest navigable point to the point provided.  	<!-- inventory -->  	<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>  	<string name="InventoryNoMatchingRecentItems">Didn't find what you're looking for? Try [secondlife:///app/inventory/filters Show filters].</string> +	<string name="InventoryFavoritItemsNotSelected">Click "Use as Favorites folder" on a folder of your choice. You can choose a different folder at any time. System folders cannot be used for Favorites.</string>  	<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>  	<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>  	<string name="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</string> @@ -2417,6 +2418,7 @@ If you continue to receive this message, please contact Second Life support for  	<string name="Scripts"       value=" Scripts," />  	<string name="Sounds"        value=" Sounds," />  	<string name="Textures"      value=" Textures," /> +	<string name="Settings"      value=" Settings," />  	<string name="Snapshots"     value=" Snapshots," />  	<string name="No Filters"    value="No " />  	<string name="Since Logoff"  value=" - Since Logoff" /> @@ -2834,7 +2836,6 @@ If you continue to receive this message, please contact Second Life support for  	<string name="AcquiredItems">Acquired Items</string>  	<string name="Cancel">Cancel</string>  	<string name="UploadingCosts">Uploading [NAME] costs L$ [AMOUNT]</string> -	<string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>  	<string name="UnknownFileExtension">  		Unknown file extension .%s  Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim @@ -3767,6 +3768,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>    <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string> +  <string name="lindenhomes_get_home_url">https://secondlife.com/land/lindenhomes/member.php</string> +  <string name="lindenhomes_my_home_url">https://land.secondlife.com/en-Us/lindenhomes/my-home.php</string> +  <string name="membership_url">https://secondlife.com/my/account/membership.php</string> +    <!-- Financial operations strings -->    <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT] [REASON].</string>    <string name="paid_you_ldollars_gift">[NAME] paid you L$[AMOUNT]: [REASON]</string> @@ -3790,11 +3795,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="to upload">to upload</string>    <string name="to publish a classified ad">to publish a classified ad</string> -  <string name="giving">Giving L$ [AMOUNT]</string>    <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>    <string name="this_costs">This costs L$ [AMOUNT]</string> -  <string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string> -  <string name="this_object_costs">This object costs L$ [AMOUNT]</string> +   +  <string name="buying_selected_land">This land costs</string> +  <string name="this_object_costs">This item costs</string> +  <string name="giving">You want to give</string>    <string name="group_role_everyone">Everyone</string>    <string name="group_role_officers">Officers</string> @@ -3957,6 +3963,9 @@ Please check http://status.secondlifegrid.net to see if there is a known problem    <string name="Premium PlusMembership">Premium Plus</string>    <string name="InternalMembership">Internal</string> <!-- No need to translate --> +  <string name="MembershipUpgradeText">Upgrade to Premium</string> +  <string name="MembershipPremiumText">My Premium membership</string> +    <!-- Question strings for delete items notifications -->    <string name="DeleteItems">Delete selected items?</string>    <string name="DeleteItem">Delete selected item?</string> @@ -4104,8 +4113,8 @@ Try enclosing path to the editor with double quotes.    <!-- commands -->    <string name="Command_AboutLand_Label">About land</string> -  <string name="Command_Appearance_Label">Appearance</string> -  <string name="Command_Avatar_Label">Avatar</string> +  <string name="Command_Appearance_Label">Outfits</string> +  <string name="Command_Avatar_Label">Complete avatars</string>    <string name="Command_Build_Label">Build</string>    <string name="Command_Chat_Label">Chat</string>    <string name="Command_Conversations_Label">Conversations</string> diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 2cc4abdd30..1c4822b8d5 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -6,9 +6,11 @@    text_pad_left="7"    select_on_focus="true"    text_tentative_color="TextFgTentativeColor" +  highlight_text_field="false"    background_image="TextField_Search_Off"    background_image_disabled="TextField_Search_Disabled" -  background_image_focused="TextField_Search_Active"> +  background_image_focused="TextField_Search_Active" +  background_image_highlight="TextField_Search_Highlight">    <search_button label=""      top_pad="4"      left_pad="4" diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index faa0404b35..dc5a07bf4f 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -7,9 +7,11 @@    text_pad_right="6"     select_on_focus="true"    text_tentative_color="TextFgTentativeColor" +  highlight_text_field="false"    background_image="TextField_Search_Off"    background_image_disabled="TextField_Search_Disabled" -  background_image_focused="TextField_Search_Active" > +  background_image_focused="TextField_Search_Active" +  background_image_highlight="TextField_Search_Highlight">    <search_button       top_pad="4"      left_pad="4"  | 
