diff options
Diffstat (limited to 'indra')
50 files changed, 600 insertions, 64 deletions
| diff --git a/indra/llmessage/llavatarname.cpp b/indra/llmessage/llavatarname.cpp index d12f157910..d2115ee499 100644 --- a/indra/llmessage/llavatarname.cpp +++ b/indra/llmessage/llavatarname.cpp @@ -166,7 +166,7 @@ void LLAvatarName::setExpires(F64 expires)  	mExpires = LLFrameTimer::getTotalSeconds() + expires;  } -std::string LLAvatarName::getCompleteName() const +std::string LLAvatarName::getCompleteName(bool use_parentheses) const  {  	std::string name;  	if (sUseDisplayNames) @@ -182,7 +182,14 @@ std::string LLAvatarName::getCompleteName() const  			name = mDisplayName;  			if(sUseUsernames)  			{ -				name += " (" + mUsername + ")"; +				if(use_parentheses) +				{ +				    name += " (" + mUsername + ")"; +				} +				else +				{ +				    name += "  [ " + mUsername + " ]"; +				}  			}  		}  	} @@ -220,7 +227,7 @@ std::string LLAvatarName::getDisplayName() const  	}  } -std::string LLAvatarName::getUserName() const +std::string LLAvatarName::getUserName(bool lowercase) const  {  	std::string name;  	if (mLegacyLastName.empty() || (mLegacyLastName == "Resident")) @@ -238,7 +245,15 @@ std::string LLAvatarName::getUserName() const  	}  	else  	{ -		name = mLegacyFirstName + " " + mLegacyLastName; +		if(lowercase) +		{ +		    name = mLegacyFirstName + "." + mLegacyLastName; +		    LLStringUtil::toLower(name); +		} +		else +		{ +		    name = mLegacyFirstName + " " + mLegacyLastName; +	    }  	}  	return name;  } diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h index 1cb3ae421f..192f43f07c 100644 --- a/indra/llmessage/llavatarname.h +++ b/indra/llmessage/llavatarname.h @@ -65,7 +65,7 @@ public:  	// For normal names, returns "James Linden (james.linden)"  	// When display names are disabled returns just "James Linden" -	std::string getCompleteName() const; +	std::string getCompleteName(bool use_parentheses = true) const;  	// Returns "James Linden" or "bobsmith123 Resident" for backwards  	// compatibility with systems like voice and muting @@ -80,7 +80,7 @@ public:  	// Returns "James Linden" or "bobsmith123 Resident"  	// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name  	// Also used for backwards compatibility with systems like voice and muting -	std::string getUserName() const; +	std::string getUserName(bool lowercase = false) const;  	// Returns "james.linden" or the legacy name for very old names  	std::string getAccountName() const { return mUsername; } diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 3282c5f726..8166ef6a07 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1629,9 +1629,9 @@ void LLFolderView::update()  	if (mNeedsAutoSelect)  	{  		LL_RECORD_BLOCK_TIME(FTM_AUTO_SELECT); -		// select new item only if a filtered item not currently selected +		// select new item only if a filtered item not currently selected and there was a selection  		LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back(); -		if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getViewModelItem()->potentiallyVisible())) +		if (!mAutoSelectOverride && selected_itemp && !selected_itemp->getViewModelItem()->potentiallyVisible())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 114dd7bd2f..b5deefd653 100755 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -242,6 +242,8 @@ public:  	bool useLabelSuffix() { return mUseLabelSuffix; }  	virtual void updateMenu(); +	void finishRenamingItem( void ); +      // Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.  	LLHandle<LLFolderView>	getHandle() const { return getDerivedHandle<LLFolderView>(); } @@ -255,7 +257,6 @@ protected:  	void commitRename( const LLSD& data );  	void onRenamerLost(); -	void finishRenamingItem( void );  	void closeRenamer( void );  	bool selectFirstItem(); diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 3def0386e1..5eb5ca4f82 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -972,6 +972,11 @@ void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)  	mIndentation = (getParentFolder())  		? getParentFolder()->getIndentation() + mLocalIndentation  		: 0;  + +	if(isOpen() && folder->isOpen()) +	{ +		requestArrange(); +	}  }  static LLTrace::BlockTimerStatHandle FTM_ARRANGE("Arrange"); diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp index fff04b34f2..f6b2ee1dc0 100755 --- a/indra/llui/lltextutil.cpp +++ b/indra/llui/lltextutil.cpp @@ -56,6 +56,26 @@ void LLTextUtil::textboxSetHighlightedVal(LLTextBox *txtbox, const LLStyle::Para  	txtbox->appendText(text.substr(hl_begin + hl_len),	false, normal_style);  } +void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& normal_style, const std::string& text, const std::string& greyed) +{ +    static LLUIColor sGreyedTextColor = LLUIColorTable::instance().getColor("Gray", LLColor4::grey); + +    size_t greyed_begin = 0, greyed_len = greyed.size(); + +    if (greyed_len == 0 || (greyed_begin = text.find(greyed)) == std::string::npos) +    { +        txtbox->setText(text, normal_style); +        return; +    } + +    LLStyle::Params greyed_style = normal_style; +    greyed_style.color = sGreyedTextColor; +    txtbox->setText(LLStringUtil::null); // clear text +    txtbox->appendText(text.substr(0, greyed_begin),        false, normal_style); +    txtbox->appendText(text.substr(greyed_begin, greyed_len),   false, greyed_style); +    txtbox->appendText(text.substr(greyed_begin + greyed_len),  false, normal_style); +} +  const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)  {  	static const std::string PHONE_SEPARATOR = LLUI::sSettingGroups["config"]->getString("AvalinePhoneSeparator"); diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h index 1be81ffd62..a9c143e445 100755 --- a/indra/llui/lltextutil.h +++ b/indra/llui/lltextutil.h @@ -52,6 +52,12 @@ namespace LLTextUtil  		const std::string& text,  		const std::string& hl); +	void textboxSetGreyedVal( +	        LLTextBox *txtbox, +	        const LLStyle::Params& normal_style, +	        const std::string& text, +	        const std::string& greyed); +  	/**  	 * Formats passed phone number to be more human readable.  	 * diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 2cd6638042..a0d3dc0f99 100755 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -37,7 +37,7 @@             tooltip_ref="Command_Build_Tooltip"             execute_function="Build.Toggle"             execute_parameters="build" -           is_enabled_function="Build.Enabled" +           is_enabled_function="Build.EnabledOrActive"             is_enabled_parameters="build"             is_running_function="Floater.IsOpen"             is_running_parameters="build" diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 15f6fe5649..de5caad7fa 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11062,6 +11062,28 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>FriendsListHideUsernames</key> +    <map> +        <key>Comment</key> +            <string>Show both Display name and Username in Friend list</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +    </map> +    <key>NearbyListHideUsernames</key> +    <map> +        <key>Comment</key> +            <string>Show both Display name and Username in Nearby list</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +    </map>       <key>NearbyListShowMap</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 00bc8ebe87..a6e745448a 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -476,13 +476,63 @@ void LLAvatarActions::kick(const LLUUID& id)  }  // static +void LLAvatarActions::freezeAvatar(const LLUUID& id) +{ +	std::string fullname; +	gCacheName->getFullName(id, fullname); +	LLSD payload; +	payload["avatar_id"] = id; + +	if (!fullname.empty()) +	{ +		LLSD args; +		args["AVATAR_NAME"] = fullname; +		LLNotificationsUtil::add("FreezeAvatarFullname", args, payload, handleFreezeAvatar); +	} +	else +	{ +		LLNotificationsUtil::add("FreezeAvatar", LLSD(), payload, handleFreezeAvatar); +	} +} + +// static +void LLAvatarActions::ejectAvatar(const LLUUID& id, bool ban_enabled) +{ +	std::string fullname; +	gCacheName->getFullName(id, fullname); +	LLSD payload; +	payload["avatar_id"] = id; +	payload["ban_enabled"] = ban_enabled; +	LLSD args; +	if (!fullname.empty()) +	{ +		args["AVATAR_NAME"] = fullname; +	} + +	if (ban_enabled) +	{ +			LLNotificationsUtil::add("EjectAvatarFullname", args, payload, handleEjectAvatar); +	} +	else +	{ +		if (!fullname.empty()) +		{ +			LLNotificationsUtil::add("EjectAvatarFullnameNoBan", args, payload, handleEjectAvatar); +		} +		else +		{ +			LLNotificationsUtil::add("EjectAvatarNoBan", LLSD(), payload, handleEjectAvatar); +		} +	} +} + +// static  void LLAvatarActions::freeze(const LLUUID& id)  {  	LLSD payload;  	payload["avatar_id"] = id;  	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);  } -  // static  void LLAvatarActions::unfreeze(const LLUUID& id)  { @@ -1133,10 +1183,77 @@ bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)  	}  	return false;  } -bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response) + +bool LLAvatarActions::handleFreezeAvatar(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotification::getSelectedOption(notification, response); +	if (0 == option || 1 == option) +	{ +	    U32 flags = 0x0; +	    if (1 == option) +	    { +	        // unfreeze +	        flags |= 0x1; +	    } +	    LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessage("FreezeUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID()); +		msg->addUUID("SessionID", gAgent.getSessionID()); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	return false; +} + +bool LLAvatarActions::handleEjectAvatar(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (2 == option) +	{ +		return false; +	} +	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +	bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean(); + +	if (0 == option) +	{ +		LLMessageSystem* msg = gMessageSystem; +		U32 flags = 0x0; +		msg->newMessage("EjectUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID() ); +		msg->addUUID("SessionID", gAgent.getSessionID() ); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	else if (ban_enabled) +	{ +		LLMessageSystem* msg = gMessageSystem; + +		U32 flags = 0x1; +		msg->newMessage("EjectUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID() ); +		msg->addUUID("SessionID", gAgent.getSessionID() ); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	return false; +} + +bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response);  	if (option == 0)  	{  		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); @@ -1153,6 +1270,7 @@ bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& respons  	}  	return false;  } +  bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotification::getSelectedOption(notification, response); diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index bd0ac24e93..256d44d820 100755 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -173,6 +173,9 @@ public:  	 */	  	static void inviteToGroup(const LLUUID& id); +	static void freezeAvatar(const LLUUID& id); + +	static void ejectAvatar(const LLUUID& id, bool ban_enabled = false);  	/**  	 * Kick avatar off grid  	 */	 @@ -242,6 +245,8 @@ private:  	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);  	static bool handleRemove(const LLSD& notification, const LLSD& response);  	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); +	static bool handleFreezeAvatar(const LLSD& notification, const LLSD& response); +	static bool handleEjectAvatar(const LLSD& notification, const LLSD& response);  	static bool handleKick(const LLSD& notification, const LLSD& response);  	static bool handleFreeze(const LLSD& notification, const LLSD& response);  	static bool handleUnfreeze(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 8846d1317d..513f25e301 100755 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -140,6 +140,7 @@ LLAvatarList::LLAvatarList(const Params& p)  , mShowProfileBtn(p.show_profile_btn)  , mShowSpeakingIndicator(p.show_speaking_indicator)  , mShowPermissions(p.show_permissions_granted) +, mShowCompleteName(false)  {  	setCommitOnSelectionChange(true); @@ -174,6 +175,11 @@ void LLAvatarList::setShowIcons(std::string param_name)  	mShowIcons = gSavedSettings.getBOOL(mIconParamName);  } +std::string LLAvatarList::getAvatarName(LLAvatarName av_name) +{ +	return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); +} +  // virtual  void LLAvatarList::draw()  { @@ -279,7 +285,7 @@ void LLAvatarList::refresh()  		LLAvatarName av_name;  		have_names &= LLAvatarNameCache::get(buddy_id, &av_name); -		if (!have_filter || findInsensitive(av_name.getDisplayName(), mNameFilter)) +		if (!have_filter || findInsensitive(getAvatarName(av_name), mNameFilter))  		{  			if (nadded >= ADD_LIMIT)  			{ @@ -297,7 +303,7 @@ void LLAvatarList::refresh()  				}  				else  				{ -					std::string display_name = av_name.getDisplayName(); +					std::string display_name = getAvatarName(av_name);  					addNewItem(buddy_id,   						display_name.empty() ? waiting_str : display_name,   						LLAvatarTracker::instance().isBuddyOnline(buddy_id)); @@ -327,7 +333,7 @@ void LLAvatarList::refresh()  			const LLUUID& buddy_id = it->asUUID();  			LLAvatarName av_name;  			have_names &= LLAvatarNameCache::get(buddy_id, &av_name); -			if (!findInsensitive(av_name.getDisplayName(), mNameFilter)) +			if (!findInsensitive(getAvatarName(av_name), mNameFilter))  			{  				removeItemByUUID(buddy_id);  				modified = true; @@ -381,6 +387,7 @@ void LLAvatarList::updateAvatarNames()  	for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)  	{  		LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it); +		item->setShowCompleteName(mShowCompleteName);  		item->updateAvatarName();  	}  	mNeedUpdateNames = false; @@ -400,7 +407,7 @@ bool LLAvatarList::filterHasMatches()  		// If name has not been loaded yet we consider it as a match.  		// When the name will be loaded the filter will be applied again(in refresh()). -		if (have_name && !findInsensitive(av_name.getDisplayName(), mNameFilter)) +		if (have_name && !findInsensitive(getAvatarName(av_name), mNameFilter))  		{  			continue;  		} @@ -434,6 +441,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info)  void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)  {  	LLAvatarListItem* item = new LLAvatarListItem(); +	item->setShowCompleteName(mShowCompleteName);  	// This sets the name as a side effect  	item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);  	item->setOnline(mIgnoreOnlineStatus ? true : is_online); @@ -445,6 +453,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is  	item->showSpeakingIndicator(mShowSpeakingIndicator);  	item->setShowPermissions(mShowPermissions); +  	item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4));  	addItem(item, id, pos); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 3542577ae3..1a672c279b 100755 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -83,6 +83,7 @@ public:  	void setShowIcons(std::string param_name);  	bool getIconsVisible() const { return mShowIcons; }  	const std::string getIconParamName() const{return mIconParamName;} +	std::string getAvatarName(LLAvatarName av_name);  	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );  	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); @@ -100,6 +101,8 @@ public:  	void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);  	void handleDisplayNamesOptionChanged(); +	void setShowCompleteName(bool show) { mShowCompleteName = show;}; +  protected:  	void refresh(); @@ -126,6 +129,7 @@ private:  	bool mShowProfileBtn;  	bool mShowSpeakingIndicator;  	bool mShowPermissions; +	bool mShowCompleteName;  	LLTimer*				mLITUpdateTimer; // last interaction time update timer  	std::string				mIconParamName; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 3e6c817dd6..af3fac91bc 100755 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -77,8 +77,10 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)  	mShowInfoBtn(true),  	mShowProfileBtn(true),  	mShowPermissions(false), +	mShowCompleteName(false),  	mHovered(false), -	mAvatarNameCacheConnection() +	mAvatarNameCacheConnection(), +	mGreyOutUsername("")  {  	if (not_from_ui_factory)  	{ @@ -399,14 +401,28 @@ void LLAvatarListItem::updateAvatarName()  void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight)  { -	LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight); +    if(mShowCompleteName && highlight.empty()) +    { +        LLTextUtil::textboxSetGreyedVal(mAvatarName, mAvatarNameStyle, name, mGreyOutUsername); +    } +    else +    { +        LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight); +    }  }  void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)  {  	mAvatarNameCacheConnection.disconnect(); -	setAvatarName(av_name.getDisplayName()); +	mGreyOutUsername = ""; +	std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName(); +	if(av_name.getCompleteName() != av_name.getUserName()) +	{ +	    mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]"; +	    LLStringUtil::toLower(mGreyOutUsername); +	} +	setAvatarName(name_string);  	setAvatarToolTip(av_name.getUserName());  	//requesting the list to resort diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 7ef35a746e..36d18114aa 100755 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -106,6 +106,7 @@ public:  	void setShowPermissions(bool show) { mShowPermissions = show; };  	void showLastInteractionTime(bool show);  	void setAvatarIconVisible(bool visible); +	void setShowCompleteName(bool show) { mShowCompleteName = show;};  	const LLUUID& getAvatarId() const;  	std::string getAvatarName() const; @@ -218,6 +219,9 @@ private:  	/// true when the mouse pointer is hovering over this item  	bool mHovered; +	bool mShowCompleteName; +	std::string mGreyOutUsername; +  	void fetchAvatarName();  	boost::signals2::connection mAvatarNameCacheConnection; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 4b426081d0..9564951986 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -169,6 +169,16 @@ public:  	} +    bool onObjectIconContextMenuItemEnabled(const LLSD& userdata) +    { +        std::string level = userdata.asString(); +        if (level == "is_blocked") +        { +            return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat); +        } +        return false; +    } +  	void onAvatarIconContextMenuItemClicked(const LLSD& userdata)  	{  		std::string level = userdata.asString(); @@ -275,6 +285,7 @@ public:  		registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));  		registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));  		registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2)); +		registrar_enable.add("ObjectIcon.Enable", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemEnabled, this, _2));  		LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  		mPopupMenuHandleAvatar = menu->getHandle(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 7da65a9a7c..d842106146 100755 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -528,7 +528,8 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)  			LLInventoryItem* item = gInventory.getItem(*it);  			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)  			{ -				LLClipboard::instance().addToClipboard(item->getUUID(),LLAssetType::AT_GESTURE); +				LLWString item_name = utf8str_to_wstring(item->getName()); +				LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());  			}  		}  	} diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 135bbb335e..4a5732aecf 100755 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -42,6 +42,8 @@  #include "llfloaterperms.h"  #include "llviewercontrol.h"  #include "llviewermenufile.h"	// upload_new_resource() +#include "llstatusbar.h"	// can_afford_transaction() +#include "llnotificationsutil.h"  #include "lluictrlfactory.h"  #include "llstring.h"  #include "lleconomy.h" @@ -161,12 +163,15 @@ void LLFloaterNameDesc::onBtnOK( )  	LLAssetStorage::LLStoreAssetCallback callback = NULL;  	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). -	void *nruserdata = NULL; -	std::string display_name = LLStringUtil::null; -    LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo( +    if (can_afford_transaction(expected_upload_cost)) +    { +        void *nruserdata = NULL; +        std::string display_name = LLStringUtil::null; + +        LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(              mFilenameAndPath, -            getChild<LLUICtrl>("name_form")->getValue().asString(),  +            getChild<LLUICtrl>("name_form")->getValue().asString(),              getChild<LLUICtrl>("description_form")->getValue().asString(), 0,              LLFolderType::FT_NONE, LLInventoryType::IT_NONE,              LLFloaterPerms::getNextOwnerPerms("Uploads"), @@ -174,7 +179,14 @@ void LLFloaterNameDesc::onBtnOK( )              LLFloaterPerms::getEveryonePerms("Uploads"),              expected_upload_cost)); -    upload_new_resource(uploadInfo, callback, nruserdata); +        upload_new_resource(uploadInfo, callback, nruserdata); +    } +    else +    { +        LLSD args; +        args["COST"] = llformat("%d", expected_upload_cost); +        LLNotificationsUtil::add("ErrorTextureCannotAfford", args); +    }  	closeFloater(false);  } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index afec981d56..b906671c7f 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1418,6 +1418,20 @@ void LLFloaterSnapshot::postPanelSwitch()  }  // static +void LLFloaterSnapshot::inventorySaveFailed() +{ +    LLFloaterSnapshot* instance = findInstance(); +    if (!instance) +    { +        llassert(instance != NULL); +        return; +    } + +    instance->impl.updateControls(instance); +    instance->impl.setStatus(Impl::STATUS_FINISHED, false, "inventory"); +} + +// static  LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  {  	// FIXME: May not work for textures. diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 0bb9474bb5..eb3a94999b 100755 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -61,6 +61,7 @@ public:  	static BOOL saveLocal();  	static void postSave();  	static void postPanelSwitch(); +	static void inventorySaveFailed();  	static LLPointer<LLImageFormatted> getImageData();  	static const LLVector3d& getPosTakenGlobal();  	static void setAgentEmail(const std::string& email); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index ece3e10faa..c67feb8158 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -963,10 +963,10 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,  } -void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui) +void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui, BOOL dest_reached)  {  	LLCtrlListInterface *list = mListSearchResults; -	if (list) +	if (list && (!dest_reached || (list->getItemCount() == 1)))  	{  		list->operateOnAll(LLCtrlListInterface::OP_DELETE);  	} diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 7ce8dae9a9..c5801c8819 100755 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -94,7 +94,7 @@ public:  	// A z_attenuation of 0.0f collapses the distance into the X-Y plane  	F32				getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const; -	void			clearLocationSelection(BOOL clear_ui = FALSE); +	void			clearLocationSelection(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);  	void			clearAvatarSelection(BOOL clear_ui = FALSE);  	void			clearLandmarkSelection(BOOL clear_ui = FALSE); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index e3cb4d57ef..d8f019374e 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -287,7 +287,11 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc                  LL_INFOS("SLM") << "Unlist and clear version folder as the version folder is not at the right place anymore!!" << LL_ENDL;                  LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null,1);              } -            else if (version_folder_uuid.notNull() && LLMarketplaceData::instance().getActivationState(version_folder_uuid) && (count_descendants_items(version_folder_uuid) == 0) && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth)) +            else if (version_folder_uuid.notNull() +                     && gInventory.isCategoryComplete(version_folder_uuid) +                     && LLMarketplaceData::instance().getActivationState(version_folder_uuid) +                     && (count_descendants_items(version_folder_uuid) == 0) +                     && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))              {                  LL_INFOS("SLM") << "Unlist as the version folder is empty of any item!!" << LL_ENDL;                  LLNotificationsUtil::add("AlertMerchantVersionFolderEmpty"); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d21fda8f9..53b2ca2b74 100755 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -64,6 +64,9 @@  #include "llurllineeditorctrl.h"  #include "llagentui.h" +#include "llmenuoptionpathfindingrebakenavmesh.h" +#include "llpathfindingmanager.h" +  //============================================================================  /*   * "ADD LANDMARK" BUTTON UPDATING LOGIC @@ -1194,6 +1197,18 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)  	return false;  } +void LLLocationInputCtrl::callbackRebakeRegion(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) // OK +	{ +		if (LLPathfindingManager::getInstance() != NULL) +		{ +			LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh(); +		} +	} +} +  void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  {  	switch (icon) @@ -1211,6 +1226,16 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  		LLNotificationsUtil::add("NoBuild");  		break;  	case PATHFINDING_DIRTY_ICON: +		if (LLPathfindingManager::getInstance() != NULL) +		{ +			LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance(); +			if (rebakeInstance && rebakeInstance->canRebakeRegion() && (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available)) +			{ +				LLNotificationsUtil::add("PathfindingDirtyRebake", LLSD(), LLSD(), +										 boost::bind(&LLLocationInputCtrl::callbackRebakeRegion, this, _1, _2)); +				break; +			} +		}  		LLNotificationsUtil::add("PathfindingDirty");  		break;  	case PATHFINDING_DISABLED_ICON: diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index cd6fd24077..da71bab6c1 100755 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -166,6 +166,7 @@ private:  	// callbacks  	bool					onLocationContextMenuItemEnabled(const LLSD& userdata);  	void 					onLocationContextMenuItemClicked(const LLSD& userdata); +	void					callbackRebakeRegion(const LLSD& notification, const LLSD& response);  	void					onParcelIconClick(EParcelIcon icon);  	void                    createNavMeshStatusListenerForCurrentRegion(); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 4116e38f11..639641d1c2 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -904,7 +904,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  	std::string stuff = matches[IDX_STUFF];  	boost::match_results<std::string::const_iterator> name_and_text;  	if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false; -	 +  	bool has_name = name_and_text[IDX_NAME].matched;  	std::string name = name_and_text[IDX_NAME]; @@ -956,7 +956,6 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  		im[LL_IM_FROM] = name;  	} -  	im[LL_IM_TEXT] = name_and_text[IDX_TEXT];  	return true;  //parsed name and message text, maybe have a timestamp too  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 4229419fce..c779ba5cdd 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -150,6 +150,7 @@ BOOL LLPanelMainInventory::postBuild()  	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");  	if (recent_items_panel)  	{ +		// assign default values until we will be sure that we have setting to restore  		recent_items_panel->setSinceLogoff(TRUE);  		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);  		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); @@ -181,6 +182,7 @@ BOOL LLPanelMainInventory::postBuild()  				LLParamSDParser parser;  				parser.readSD(recent_items, p);  				recent_items_panel->getFilter().fromParams(p); +				recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));  			}  		} @@ -372,7 +374,14 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)  	}  	getActivePanel()->setSortOrder(sort_order_mask); -	gSavedSettings.setU32("InventorySortOrder", sort_order_mask); +    if ("Recent Items" == getActivePanel()->getName()) +    { +        gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask); +    } +    else +    { +        gSavedSettings.setU32("InventorySortOrder", sort_order_mask); +    }  }  // static @@ -1143,6 +1152,15 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  	}  } +void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility ) +{ +	if(!new_visibility) +	{ +		mMenuAdd->setVisible(FALSE); +		getActivePanel()->getRootFolder()->finishRenamingItem(); +	} +} +  bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)  {  	LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 21f0ca0cae..290e2e5f47 100755 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -72,6 +72,7 @@ public:  									   std::string& tooltip_msg);  	/*virtual*/ void changed(U32);  	/*virtual*/ void draw(); +	/*virtual*/ void 	onVisibilityChange ( BOOL new_visibility );  	LLInventoryPanel* getPanel() { return mActivePanel; }  	LLInventoryPanel* getActivePanel() { return mActivePanel; } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 73b928f014..bc177abc57 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -611,9 +611,11 @@ BOOL LLPanelPeople::postBuild()  	mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));  	mOnlineFriendList->setShowIcons("FriendsListShowIcons");  	mOnlineFriendList->showPermissions("FriendsListShowPermissions"); +	mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));  	mAllFriendList->setNoItemsCommentText(getString("no_friends"));  	mAllFriendList->setShowIcons("FriendsListShowIcons");  	mAllFriendList->showPermissions("FriendsListShowPermissions"); +	mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));  	LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);  	nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2)); @@ -622,6 +624,7 @@ BOOL LLPanelPeople::postBuild()  	mNearbyList->setNoItemsMsg(getString("no_one_near"));  	mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));  	mNearbyList->setShowIcons("NearbyListShowIcons"); +	mNearbyList->setShowCompleteName(!gSavedSettings.getBOOL("NearbyListHideUsernames"));  	mMiniMap = (LLNetMap*)getChildView("Net Map",true);  	mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?   		getString("AltMiniMapToolTipMsg") :	getString("MiniMapToolTipMsg")); @@ -1342,6 +1345,16 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)  		mAllFriendList->showPermissions(show_permissions);  		mOnlineFriendList->showPermissions(show_permissions);  	} +	else if (chosen_item == "view_usernames") +	{ +		bool hide_usernames = !gSavedSettings.getBOOL("FriendsListHideUsernames"); +		gSavedSettings.setBOOL("FriendsListHideUsernames", hide_usernames); + +		mAllFriendList->setShowCompleteName(!hide_usernames); +		mAllFriendList->handleDisplayNamesOptionChanged(); +		mOnlineFriendList->setShowCompleteName(!hide_usernames); +		mOnlineFriendList->handleDisplayNamesOptionChanged(); +	}  	}  void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata) @@ -1374,6 +1387,14 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)  	{  		setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);  	} +	else if (chosen_item == "view_usernames") +	{ +	    bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames"); +	    gSavedSettings.setBOOL("NearbyListHideUsernames", hide_usernames); + +	    mNearbyList->setShowCompleteName(!hide_usernames); +	    mNearbyList->handleDisplayNamesOptionChanged(); +	}  }  bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index a5f59dbf4a..65769ff526 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -38,9 +38,14 @@  #include "llavataractions.h"  #include "llcallingcard.h"			// for LLAvatarTracker  #include "lllogchat.h" +#include "llparcel.h"  #include "llviewermenu.h"			// for gMenuHolder  #include "llconversationmodel.h"  #include "llviewerobjectlist.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "roles_constants.h"  namespace LLPanelPeopleMenus  { @@ -77,9 +82,13 @@ LLContextMenu* PeopleContextMenu::createMenu()  		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id));  		registrar.add("Avatar.TeleportRequest",	boost::bind(&PeopleContextMenu::requestTeleport,		this));  		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id)); +		registrar.add("Avatar.Freeze",			boost::bind(&LLAvatarActions::freezeAvatar,					id)); +		registrar.add("Avatar.Eject",			boost::bind(&PeopleContextMenu::eject,					this)); +  		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));  		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2)); +		enable_registrar.add("Avatar.EnableFreezeEject", boost::bind(&PeopleContextMenu::enableFreezeEject, this, _2));  		// create the context menu from the XUI  		menu = createFromFile("menu_people_nearby.xml"); @@ -258,6 +267,50 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)  	return false;  } +bool PeopleContextMenu::enableFreezeEject(const LLSD& userdata) +{ +    if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1)) +    { +        return false; +    } + +    const LLUUID& id = mUUIDs.front(); + +    // Use avatar_id if available, otherwise default to right-click avatar +    LLVOAvatar* avatar = NULL; +    if (id.notNull()) +    { +        LLViewerObject* object = gObjectList.findObject(id); +        if (object) +        { +            if( !object->isAvatar() ) +            { +                object = NULL; +            } +            avatar = (LLVOAvatar*) object; +        } +    } +    if (!avatar) return false; + +    // Gods can always freeze +    if (gAgent.isGodlike()) return true; + +    // Estate owners / managers can freeze +    // Parcel owners can also freeze +    const LLVector3& pos = avatar->getPositionRegion(); +    const LLVector3d& pos_global = avatar->getPositionGlobal(); +    LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); +    LLViewerRegion* region = avatar->getRegion(); +    if (!region) return false; + +    bool new_value = region->isOwnedSelf(pos); +    if (!new_value || region->isOwnedGroup(pos)) +    { +        new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); +    } +    return new_value; +} +  void PeopleContextMenu::requestTeleport()  {  	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(), @@ -272,6 +325,39 @@ void PeopleContextMenu::offerTeleport()  	LLAvatarActions::offerTeleport(mUUIDs);  } +void PeopleContextMenu::eject() +{ +	if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1)) +	{ +		return; +	} + +	const LLUUID& id = mUUIDs.front(); + +	// Use avatar_id if available, otherwise default to right-click avatar +	LLVOAvatar* avatar = NULL; +	if (id.notNull()) +	{ +		LLViewerObject* object = gObjectList.findObject(id); +		if (object) +		{ +			if( !object->isAvatar() ) +			{ +				object = NULL; +			} +			avatar = (LLVOAvatar*) object; +		} +	} +	if (!avatar) return; +	LLSD payload; +	payload["avatar_id"] = avatar->getID(); +	std::string fullname = avatar->getFullname(); + +	const LLVector3d& pos = avatar->getPositionGlobal(); +	LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel(); +	LLAvatarActions::ejectAvatar(id ,LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED)); +} +  void PeopleContextMenu::startConference()  {  	uuid_vec_t uuids; @@ -320,6 +406,8 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)  		items.push_back(std::string("share"));  		items.push_back(std::string("pay"));  		items.push_back(std::string("block_unblock")); +		items.push_back(std::string("freeze")); +		items.push_back(std::string("eject"));  	}      hide_context_entries(menu, items, disabled_items); diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 9767bab89f..5ed20e0064 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -46,7 +46,9 @@ protected:  private:  	bool enableContextMenuItem(const LLSD& userdata);  	bool checkContextMenuItem(const LLSD& userdata); +	bool enableFreezeEject(const LLSD& userdata);  	void offerTeleport(); +	void eject();  	void startConference();  	void requestTeleport();  }; diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index c55e230b5e..a2d1752c6a 100755 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -34,6 +34,8 @@  #include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model  #include "llpanelsnapshot.h"  #include "llviewercontrol.h" // gSavedSettings +#include "llstatusbar.h"	// can_afford_transaction() +#include "llnotificationsutil.h"  /**   * The panel provides UI for saving snapshot as an inventory texture. @@ -102,6 +104,17 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)  void LLPanelSnapshotInventory::onSend()  { -	LLFloaterSnapshot::saveTexture(); -	LLFloaterSnapshot::postSave(); +    S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +    if (can_afford_transaction(expected_upload_cost)) +    { +        LLFloaterSnapshot::saveTexture(); +        LLFloaterSnapshot::postSave(); +    } +    else +    { +        LLSD args; +        args["COST"] = llformat("%d", expected_upload_cost); +        LLNotificationsUtil::add("ErrorPhotoCannotAfford", args); +        LLFloaterSnapshot::inventorySaveFailed(); +    }  } diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index d86a8b4480..d0353259a5 100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -94,6 +94,7 @@ protected:  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  		registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); +		registrar.add("Wearing.ShowOriginal", boost::bind(show_item_original, mUUIDs.front()));  		registrar.add("Wearing.TakeOff",  					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		registrar.add("Wearing.Detach",  @@ -144,6 +145,7 @@ protected:  		menu->setItemVisible("take_off",	allow_take_off);  		menu->setItemVisible("detach",		allow_detach);  		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach); +		menu->setItemVisible("show_original", mUUIDs.size() == 1);  	}  }; diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 20c43bc432..ba9845ef04 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -94,7 +94,8 @@ BOOL LLPreviewNotecard::postBuild()  	if (item)  	{  		getChild<LLUICtrl>("desc")->setValue(item->getDescription()); -		getChildView("Delete")->setEnabled(true); +		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()); +		getChildView("Delete")->setEnabled(!source_library);  	}  	getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); @@ -219,6 +220,7 @@ void LLPreviewNotecard::loadAsset()  		BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);  		BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);  		BOOL allow_modify = canModify(mObjectUUID, item); +		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID());  		if (allow_copy || gAgent.isGodlike())  		{ @@ -288,7 +290,7 @@ void LLPreviewNotecard::loadAsset()  			getChildView("lock")->setVisible( TRUE);  		} -		if(allow_modify || is_owner) +		if((allow_modify || is_owner) && !source_library)  		{  			getChildView("Delete")->setEnabled(TRUE);  		} diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 2a2c51be40..645a77e42a 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -38,6 +38,7 @@  #include "llimagetga.h"  #include "llimagepng.h"  #include "llinventory.h" +#include "llinventorymodel.h"  #include "llnotificationsutil.h"  #include "llresmgr.h"  #include "lltrans.h" @@ -120,18 +121,22 @@ BOOL LLPreviewTexture::postBuild()  	childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);  	getChildView("save_tex_btn")->setVisible( true);  	getChildView("save_tex_btn")->setEnabled(canSaveAs()); -	 -	if (!mCopyToInv)  -	{ -		const LLInventoryItem* item = getItem(); -		 -		if (item) -		{ -			childSetCommitCallback("desc", LLPreview::onText, this); -			getChild<LLUICtrl>("desc")->setValue(item->getDescription()); -			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); -		} -	} + +    const LLInventoryItem* item = getItem(); +    if (item) +    { +        if (!mCopyToInv) +        { +            childSetCommitCallback("desc", LLPreview::onText, this); +            getChild<LLUICtrl>("desc")->setValue(item->getDescription()); +            getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); +        } +        BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()); +        if (source_library) +        { +            getChildView("Discard")->setEnabled(false); +        } +    }  	// Fill in ratios list with common aspect ratio values  	mRatiosList.clear(); @@ -526,6 +531,15 @@ void LLPreviewTexture::loadAsset()  		// check that we can copy inworld items into inventory  		getChildView("Keep")->setEnabled(mIsCopyable);  	} +	else +	{ +		// check that we can remove item +		BOOL source_library = gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID()); +		if (source_library) +		{ +			getChildView("Discard")->setEnabled(false); +		} +	}  }  LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 98ed2f0fc4..1a8ade5b10 100755 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -103,7 +103,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt  		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));  	}  	// for the scriptdialog buttons we use fixed button size. This  is a limit! -	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH) +	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD))  	{  		p.rect.width = 1;  		p.auto_resize = true; @@ -160,7 +160,11 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair  		}  		LLButton* btn = it->second;  		LLRect btn_rect(btn->getRect()); -		if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel +		if (buttons.size() == 1) // for the one-button forms, center that button +		{ +			left = (max_width - btn_rect.getWidth()) / 2; +		} +		else if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel  		{  			// looks like we need to add button to the next row  			left = 0; diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 2f8e464b71..b0e3b5bf89 100755 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -83,6 +83,7 @@ LLToolMgr::LLToolMgr()  	// Not a panel, register these callbacks globally.  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this)); +	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.EnabledOrActive", boost::bind(&LLToolMgr::buildEnabledOrActive, this));  	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));  	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2)); @@ -264,17 +265,21 @@ bool LLToolMgr::canEdit()  	return LLViewerParcelMgr::getInstance()->allowAgentBuild();  } +bool LLToolMgr::buildEnabledOrActive() +{ +	return inEdit() || canEdit(); +} +  void LLToolMgr::toggleBuildMode(const LLSD& sdname)  {  	const std::string& param = sdname.asString(); +	LLFloaterReg::toggleInstanceOrBringToFront("build");  	if (param == "build" && !canEdit())  	{  		return;  	} -	LLFloaterReg::toggleInstanceOrBringToFront("build"); -  	bool build_visible = LLFloaterReg::instanceVisible("build");  	if (build_visible)  	{ diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h index a3c1045aac..e5b45750d9 100755 --- a/indra/newview/lltoolmgr.h +++ b/indra/newview/lltoolmgr.h @@ -54,6 +54,7 @@ public:  	bool			inEdit();  	bool			canEdit(); +	bool 			buildEnabledOrActive();      bool            canAccessMarketplace();  	void			toggleBuildMode(const LLSD& sdname);  	void			toggleMarketplace(const LLSD& sdname); diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index f611d0503f..b015cde45d 100755 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -183,7 +183,7 @@ void LLTracker::render3D()  		F32 dist = gFloaterWorldMap->getDistanceToDestination(pos_global, 0.5f);  		if (dist < DESTINATION_REACHED_RADIUS)  		{ -			instance()->stopTrackingLocation(); +			instance()->stopTrackingLocation(FALSE,TRUE);  		}  		else  		{ @@ -655,13 +655,13 @@ void LLTracker::stopTrackingLandmark(BOOL clear_ui)  } -void LLTracker::stopTrackingLocation(BOOL clear_ui) +void LLTracker::stopTrackingLocation(BOOL clear_ui, BOOL dest_reached)  {  	purgeBeaconText();  	mTrackedLocationName.assign("");  	mIsTrackingLocation = FALSE;  	mTrackedPositionGlobal.zeroVec(); -	gFloaterWorldMap->clearLocationSelection(clear_ui); +	gFloaterWorldMap->clearLocationSelection(clear_ui, dest_reached);  	mTrackingStatus = TRACKING_NOTHING;  	mTrackingLocationType = LOCATION_NOTHING;  } diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h index 218f3430a6..a1c5052c1b 100755 --- a/indra/newview/lltracker.h +++ b/indra/newview/lltracker.h @@ -116,7 +116,7 @@ protected:  	void stopTrackingAll(BOOL clear_ui = FALSE);  	void stopTrackingAvatar(BOOL clear_ui = FALSE); -	void stopTrackingLocation(BOOL clear_ui = FALSE); +	void stopTrackingLocation(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);  	void stopTrackingLandmark(BOOL clear_ui = FALSE);  	void drawMarker(const LLVector3d& pos_global, const LLColor4& color); diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index f0dafec240..497ff4d2bf 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -837,5 +837,12 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res          }      } +    // Let the Snapshot floater know we have failed uploading. +    LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot"); +    if (uploadInfo->getAssetType() == LLAssetType::AT_TEXTURE && floater_snapshot) +    { +        floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "inventory"))); +    } +  } diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 170b7177fb..5d05ecf127 100755 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -12,6 +12,7 @@      <os name="Mac">        <file>ヒラギノ角ゴ Pro W3.otf</file>        <file>ヒラギノ角ゴ ProN W3.otf</file> +      <file>ヒラギノ明朝 ProN W3.ttc</file>        <file>AppleGothic.dfont</file>        <file>AppleGothic.ttf</file>        <file>AppleSDGothicNeo-Regular.otf</file> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 419ec359a6..dcf2da52f1 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -140,13 +140,6 @@               function="Advanced.ShowDebugSettings"               parameter="all" />          </menu_item_call> -        <menu_item_call -         label="UI/Color Settings" -         name="UI/Color Settings"> -            <menu_item_call.on_click -             function="Advanced.ShowDebugSettings" -             parameter="skin" /> -        </menu_item_call>          <menu_item_separator />          <menu_item_call           label="XUI Preview Tool" diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml index 2d4f1792c2..93093014eb 100755 --- a/indra/newview/skins/default/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml @@ -23,6 +23,9 @@          <menu_item_call.on_click           function="ObjectIcon.Action"           parameter="block" /> +        <menu_item_call.on_enable +         function="ObjectIcon.Enable" +         parameter="is_blocked" />      </menu_item_call>      <menu_item_separator       layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml index 8790fde7c5..b5a4b87acd 100755 --- a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml +++ b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml @@ -40,6 +40,14 @@       function="CheckControl"       parameter="FriendsListShowPermissions" />    </menu_item_check> +  <menu_item_check name="view_usernames" label="Hide usernames"> +    <menu_item_check.on_click +     function="People.Friends.ViewSort.Action" +     parameter="view_usernames" /> +    <menu_item_check.on_check +     function="CheckControl" +     parameter="FriendsListHideUsernames" /> +  </menu_item_check>    <menu_item_check name="view_conversation" label="View Conversation Log...">      <menu_item_check.on_check       function="Floater.Visible" diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index f12226ebeb..c1500d4e7c 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -143,4 +143,20 @@           function="Avatar.EnableItem"           parameter="can_block" />      </menu_item_check> +    <menu_item_call +         label="Freeze" +         name="freeze"> +        <menu_item_call.on_click +         function="Avatar.Freeze" /> +        <menu_item_call.on_visible +         function="Avatar.EnableFreezeEject"/> +    </menu_item_call> +    <menu_item_call +         label="Eject" +         name="eject"> +        <menu_item_call.on_click +         function="Avatar.Eject" /> +        <menu_item_call.on_visible +         function="Avatar.EnableFreezeEject"/> +    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml index da88ca9f4d..a9f6b8045d 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml @@ -50,4 +50,12 @@           function="ToggleControl"           parameter="NearbyListShowMap" />      </menu_item_check> +    <menu_item_check name="view_usernames" label="Hide usernames"> +        <menu_item_check.on_click +         function="People.Nearby.ViewSort.Action" +         parameter="view_usernames" /> +        <menu_item_check.on_check +         function="CheckControl" +         parameter="NearbyListHideUsernames" /> +    </menu_item_check>  </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml index 2d54e69601..44b2727671 100755 --- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml @@ -27,4 +27,11 @@          <on_click           function="Wearing.Edit" />      </menu_item_call> +    <menu_item_call +     label="Show Original" +     layout="topleft" +     name="show_original"> +        <on_click +         function="Wearing.ShowOriginal" /> +    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index f8e346afb9..589c05de99 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1166,6 +1166,22 @@ Error encoding snapshot.    <notification     icon="alertmodal.tga" +   name="ErrorPhotoCannotAfford" +   type="alertmodal"> +    You need L$[COST] to save a photo to your inventory. You may either buy L$ or save the photo to your computer instead. +    <tag>fail</tag> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="ErrorTextureCannotAfford" +   type="alertmodal"> +    You need L$[COST] to save a texture to your inventory. You may either buy L$ or save the photo to your computer instead. +    <tag>fail</tag> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="ErrorUploadingPostcard"     type="alertmodal">  There was a problem sending a snapshot due to the following reason: [REASON] @@ -6908,6 +6924,19 @@ This area has building disabled. You can't build or rez objects here.    </notification>    <notification +   icon="notify.tga" +   name="PathfindingDirtyRebake" +   persist="true" +   type="notify"> +   <unique/> +   The region has pending pathfinding changes.  If you have build rights, you may rebake the region by clicking on the “Rebake region” button. +   <usetemplate +     name="okbutton" +     yestext="Rebake region" +   /> +  </notification> + +  <notification       icon="notify.tga"       name="DynamicPathfindingDisabled"       persist="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 3e96160834..4a5117adac 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -138,7 +138,7 @@     initial_value="1"     layout="topleft"     left_pad="0" -   max_val="1.5" +   max_val="2.0"     min_val="0.75"     name="ui_scale_slider"     top_pad="-14" | 
