diff options
124 files changed, 1283 insertions, 241 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 9b31e5032a..f1bafba32c 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -190,6 +190,11 @@ Ansariel Hiller  	STORM-2094  	MAINT-5756  	MAINT-4677 +	MAINT-6300 +	MAINT-6397 +	MAINT-6432 +	MAINT-6513 +	MAINT-6514  Aralara Rajal  Arare Chantilly  	CHUIBUG-191 diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp index 60721977cd..7ea42a3fc0 100644 --- a/indra/llcommon/indra_constants.cpp +++ b/indra/llcommon/indra_constants.cpp @@ -60,6 +60,10 @@ const LLUUID IMG_SMOKE_POOF				("1e63e323-5fe0-452e-92f8-b98bd0f764e3"); // On d  const LLUUID IMG_BIG_EXPLOSION_1		("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); // On dataserver  const LLUUID IMG_BIG_EXPLOSION_2		("9c8eca51-53d5-42a7-bb58-cef070395db8"); // On dataserver +const LLUUID IMG_ALPHA_GRAD				("e97cf410-8e61-7005-ec06-629eba4cd1fb"); // VIEWER +const LLUUID IMG_ALPHA_GRAD_2D			("38b86f85-2575-52a9-a531-23108d8da837"); // VIEWER +const LLUUID IMG_TRANSPARENT			("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"); // VIEWER +  const LLUUID IMG_BLOOM1	  			    ("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); // VIEWER  const LLUUID TERRAIN_DIRT_DETAIL		("0bc58228-74a0-7e83-89bc-5c23464bcec5"); // VIEWER  const LLUUID TERRAIN_GRASS_DETAIL		("63338ede-0037-c4fd-855b-015d77112fc8"); // VIEWER diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index 02f063f5e8..fda84aa5a8 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -197,6 +197,10 @@ LL_COMMON_API extern const LLUUID IMG_SMOKE_POOF;  LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_1;  LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_2; +LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD; +LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD_2D; +LL_COMMON_API extern const LLUUID IMG_TRANSPARENT; +  LL_COMMON_API extern const LLUUID IMG_BLOOM1;  LL_COMMON_API extern const LLUUID TERRAIN_DIRT_DETAIL;  LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL; diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index a548c96002..86f407cdb0 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -294,9 +294,11 @@ void LLScopedLock::unlock()  bool ll_apr_warn_status(apr_status_t status)  {  	if(APR_SUCCESS == status) return false; +#if !LL_LINUX  	char buf[MAX_STRING];	/* Flawfinder: ignore */  	apr_strerror(status, buf, sizeof(buf));  	LL_WARNS("APR") << "APR: " << buf << LL_ENDL; +#endif  	return true;  } diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index f3b8999883..c45db3b185 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -576,6 +576,33 @@ std::string utf8str_truncate(const std::string& utf8str, const S32 max_len)  	}  } +std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len) +{ +    if (0 == symbol_len) +    { +        return std::string(); +    } +    if ((S32)utf8str.length() <= symbol_len) +    { +        return utf8str; +    } +    else +    { +        int len = 0, byteIndex = 0; +        const char* aStr = utf8str.c_str(); +        size_t origSize = utf8str.size(); + +        for (byteIndex = 0; len < symbol_len && byteIndex < origSize; byteIndex++) +        { +            if ((aStr[byteIndex] & 0xc0) != 0x80) +            { +                len += 1; +            } +        } +        return utf8str.substr(0, byteIndex); +    } +} +  std::string utf8str_substChar(  	const std::string& utf8str,  	const llwchar target_char, diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 393f6d7a8c..a40db0f8cc 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -564,6 +564,17 @@ LL_COMMON_API S32 utf8str_compare_insensitive(  	const std::string& rhs);  /** +* @brief Properly truncate a utf8 string to a maximum character count. +* +* If symbol_len is longer than the string passed in, the return +* value == utf8str. +* @param utf8str A valid utf8 string to truncate. +* @param symbol_len The maximum number of symbols in the return value. +* @return Returns a valid utf8 string with symbol count <= max_len. +*/ +LL_COMMON_API std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len); + +/**   * @brief Replace all occurences of target_char with replace_char   *   * @param utf8str A utf8 string to process. 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/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 720986a411..00bde8dbc3 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -2235,7 +2235,11 @@ std::string LLDAELoader::getElementLabel(daeElement *element)  		// retrieve index to distinguish items inside same parent  		size_t ind = 0;  		parent->getChildren().find(element, ind); -		index_string = "_" + boost::lexical_cast<std::string>(ind); + +		if (ind > 0) +		{ +			index_string = "_" + boost::lexical_cast<std::string>(ind); +		}  		// if parent has a name or ID, use it  		std::string name = parent->getAttribute("name"); diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 14f75a2352..69038a8627 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1326,7 +1326,7 @@ void LLFloater::setMinimized(BOOL minimize)  		}  		mMinimized = FALSE; - +		setFrontmost();  		// Reshape *after* setting mMinimized  		reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );  	} @@ -1575,6 +1575,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)  		if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;  		if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE; +		setFrontmost(TRUE, FALSE);  		// Otherwise pass to drag handle for movement  		return mDragHandle->handleMouseDown(x, y, mask);  	} @@ -1649,7 +1650,7 @@ void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)  	}  } -void LLFloater::setFrontmost(BOOL take_focus) +void LLFloater::setFrontmost(BOOL take_focus, BOOL restore)  {  	LLMultiFloater* hostp = getHost();  	if (hostp) @@ -1665,7 +1666,7 @@ void LLFloater::setFrontmost(BOOL take_focus)  		LLFloaterView * parent = dynamic_cast<LLFloaterView*>( getParent() );  		if (parent)  		{ -			parent->bringToFront(this, take_focus); +			parent->bringToFront(this, take_focus, restore);  		}  		// Make sure to set the appropriate transparency type (STORM-732). @@ -2320,7 +2321,10 @@ void LLFloaterView::restoreAll()  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)  	{  		LLFloater* floaterp = (LLFloater*)*child_it; -		floaterp->setMinimized(FALSE); +		if (floaterp) +		{ +			floaterp->setMinimized(FALSE); +		}  	}  	// *FIX: make sure dependents are restored @@ -2394,7 +2398,7 @@ LLRect LLFloaterView::findNeighboringPosition( LLFloater* reference_floater, LLF  } -void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus) +void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore)  {  	if (!child)  		return; @@ -2478,7 +2482,12 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)  	{  		sendChildToFront(child);  	} -	child->setMinimized(FALSE); + +	if(restore) +	{ +		child->setMinimized(FALSE); +	} +  	if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))  	{  		child->setFocus(TRUE); diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index ef7c6180d2..165f67499b 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -310,7 +310,7 @@ public:  	/*virtual*/ void setVisible(BOOL visible); // do not override  	/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override -	void			setFrontmost(BOOL take_focus = TRUE); +	void			setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);       virtual void	setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());  	// Defaults to false. @@ -547,7 +547,7 @@ public:  	void			setCycleMode(BOOL mode) { mFocusCycleMode = mode; }  	BOOL			getCycleMode() const { return mFocusCycleMode; } -	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE ); +	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE, BOOL restore = TRUE );  	void			highlightFocusedFloater();  	void			unhighlightFocusedFloater();  	void			focusFrontFloater(); diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 3282c5f726..f9664e0658 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -684,6 +684,13 @@ void LLFolderView::draw()  		}  	} +	if (mRenameItem && mRenamer && mRenamer->getVisible() && !getVisibleRect().overlaps(mRenamer->getRect())) +	{ +		// renamer is not connected to the item we are renaming in any form so manage it manually +		// TODO: consider stopping on any scroll action instead of when out of visible area +		finishRenamingItem(); +	} +  	// skip over LLFolderViewFolder::draw since we don't want the folder icon, label,   	// and arrow for the root folder  	LLView::draw(); @@ -1629,9 +1636,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 100644 --- 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..3d618548c4 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -127,6 +127,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  	mIsSelected( FALSE ),  	mIsCurSelection( FALSE ),  	mSelectPending(FALSE), +	mIsItemCut(false), +	mCutGeneration(0),  	mLabelStyle( LLFontGL::NORMAL ),  	mHasVisibleChildren(FALSE),  	mIsFolderComplete(true), @@ -694,6 +696,19 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L  	return mIsCurSelection;  } +/*virtual*/ bool LLFolderViewItem::isFadeItem() +{ +    LLClipboard& clipboard = LLClipboard::instance(); +    if (mCutGeneration != clipboard.getGeneration()) +    { +        mCutGeneration = clipboard.getGeneration(); +        mIsItemCut = clipboard.isCutMode() +                     && ((getParentFolder() && getParentFolder()->isFadeItem()) +                        || getViewModelItem()->isCutToClipboard()); +    } +    return mIsItemCut; +} +  void LLFolderViewItem::drawHighlight(const BOOL showContent, const BOOL hasKeyboardFocus, const LLUIColor &selectColor, const LLUIColor &flashColor,                                                            const LLUIColor &focusOutlineColor, const LLUIColor &mouseOverColor)  { @@ -875,6 +890,12 @@ void LLFolderViewItem::draw()      }      LLColor4 color = (mIsSelected && filled) ? mFontHighlightColor : mFontColor; + +    if (isFadeItem()) +    { +         // Fade out item color to indicate it's being cut +         color.mV[VALPHA] *= 0.5f; +    }      drawLabel(font, text_left, y, color, right_x);  	//--------------------------------------------------------------------------------// @@ -882,7 +903,7 @@ void LLFolderViewItem::draw()  	//  	if (!mLabelSuffix.empty())  	{ -		font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor, +		font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,  						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,  						  S32_MAX, S32_MAX, &right_x, FALSE );  	} @@ -972,6 +993,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/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 0322c8836d..61c39e0175 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -121,8 +121,11 @@ protected:  								mIsMouseOverTitle,  								mAllowWear,                                  mAllowDrop, -								mSelectPending; -	 +								mSelectPending, +								mIsItemCut; + +	S32							mCutGeneration; +  	LLUIColor                   mFontColor;  	LLUIColor                   mFontHighlightColor; @@ -145,6 +148,7 @@ protected:  	virtual void addFolder(LLFolderViewFolder*) { }  	virtual bool isHighlightAllowed();  	virtual bool isHighlightActive(); +	virtual bool isFadeItem();  	virtual bool isFlashing() { return false; }  	virtual void setFlashState(bool) { } diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index a395af537a..641241a88c 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -173,6 +173,7 @@ public:  	virtual BOOL isItemCopyable() const = 0;  	virtual BOOL copyToClipboard() const = 0;  	virtual BOOL cutToClipboard() = 0; +	virtual bool isCutToClipboard() { return false; };  	virtual BOOL isClipboardPasteable() const = 0;  	virtual void pasteFromClipboard() = 0; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index a08cf91a69..492c9315d1 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -400,12 +400,7 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)  	if (mMaxLengthChars)  	{ -		LLWString truncated_wstring = utf8str_to_wstring(truncated_utf8); -		if (truncated_wstring.size() > (U32)mMaxLengthChars) -		{ -			truncated_wstring = truncated_wstring.substr(0, mMaxLengthChars); -		} -		mText.assign(wstring_to_utf8str(truncated_wstring)); +		mText.assign(utf8str_symbol_truncate(truncated_utf8, mMaxLengthChars));  	}  	if (all_selected) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 616c42895c..c7d7535f87 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -177,6 +177,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  :	LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)),  	mURLClickSignal(NULL),  	mIsFriendSignal(NULL), +	mIsObjectBlockedSignal(NULL),  	mMaxTextByteLength( p.max_text_length ),  	mFont(p.font),  	mFontShadow(p.font_shadow), @@ -268,6 +269,8 @@ LLTextBase::~LLTextBase()  {  	mSegments.clear();  	delete mURLClickSignal; +	delete mIsFriendSignal; +	delete mIsObjectBlockedSignal;  }  void LLTextBase::initFromParams(const LLTextBase::Params& p) @@ -1942,6 +1945,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));  	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));  	registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url)); +	registrar.add("Url.Unblock", boost::bind(&LLUrlAction::unblockObject, url));  	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));  	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));  	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url)); @@ -1968,6 +1972,19 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)  			removeFriendButton->setEnabled(isFriend);  		}  	} + +	if (mIsObjectBlockedSignal) +	{ +		bool is_blocked = *(*mIsObjectBlockedSignal)(LLUUID(LLUrlAction::getObjectId(url)), LLUrlAction::getObjectName(url)); +		LLView* blockButton = mPopupMenu->getChild<LLView>("block_object"); +		LLView* unblockButton = mPopupMenu->getChild<LLView>("unblock_object"); + +		if (blockButton && unblockButton) +		{ +			blockButton->setVisible(!is_blocked); +			unblockButton->setVisible(is_blocked); +		} +	}  	if (mPopupMenu)  	{ @@ -3022,6 +3039,15 @@ boost::signals2::connection LLTextBase::setIsFriendCallback(const is_friend_sign  	return mIsFriendSignal->connect(cb);  } +boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb) +{ +    if (!mIsObjectBlockedSignal) +    { +        mIsObjectBlockedSignal = new is_blocked_signal_t(); +    } +    return mIsObjectBlockedSignal->connect(cb); +} +  //  // LLTextSegment  // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index c6ce5efcb8..85641fd899 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -270,6 +270,7 @@ public:  	friend class LLUICtrlFactory;  	typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t; +	typedef boost::signals2::signal<bool (const LLUUID& blocked_id, const std::string from)> is_blocked_signal_t;  	struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>  	{ @@ -456,6 +457,7 @@ public:  	virtual void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);  	boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);  	boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb); +	boost::signals2::connection setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb);  	void					setWordWrap(bool wrap);  	LLScrollContainer*		getScrollContainer() const { return mScroller; } @@ -685,6 +687,7 @@ protected:  	// Used to check if user with given ID is avatar's friend  	is_friend_signal_t*         mIsFriendSignal; +	is_blocked_signal_t*        mIsObjectBlockedSignal;  	LLUIString					mLabel;	// text label that is visible when no user text provided  }; diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp index fff04b34f2..f6b2ee1dc0 100644 --- 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 100644 --- 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/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp index 324ceb7fba..bfe0a5bb5d 100644 --- a/indra/llui/lltextvalidate.cpp +++ b/indra/llui/lltextvalidate.cpp @@ -328,6 +328,15 @@ namespace LLTextValidate  		return rv;  	} +	bool validateASCIINoLeadingSpace(const LLWString &str) +	{ +		if (LLStringOps::isSpace(str[0])) +		{ +			return FALSE; +		} +		return validateASCII(str); +	} +  	// Used for multiline text stored on the server.  	// Example is landmark description in Places SP.  	bool validateASCIIWithNewLine(const LLWString &str) diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h index 5c830d7db3..e2b6c313d6 100644 --- a/indra/llui/lltextvalidate.h +++ b/indra/llui/lltextvalidate.h @@ -52,6 +52,7 @@ namespace LLTextValidate  	bool	validateASCIIPrintableNoPipe(const LLWString &str);   	bool	validateASCIIPrintableNoSpace(const LLWString &str);  	bool	validateASCII(const LLWString &str); +	bool	validateASCIINoLeadingSpace(const LLWString &str);  	bool	validateASCIIWithNewLine(const LLWString &str);  } diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 56977c597b..84ea770a8d 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -231,3 +231,13 @@ void LLUrlAction::blockObject(std::string url)  		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));  	}  } + +void LLUrlAction::unblockObject(std::string url) +{ +    std::string object_id = getObjectId(url); +    std::string object_name = getObjectName(url); +    if (LLUUID::validate(object_id)) +    { +        executeSLURL("secondlife:///app/agent/" + object_id + "/unblock/" + object_name); +    } +} diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 5497e28bb4..2d2a8dfef1 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -83,6 +83,7 @@ public:  	static void addFriend(std::string url);  	static void removeFriend(std::string url);  	static void blockObject(std::string url); +	static void unblockObject(std::string url);  	/// specify the callbacks to enable this class's functionality  	typedef boost::function<void (const std::string&)> url_callback_t; diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 8f7cac1f61..62c3f401bf 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -588,6 +588,11 @@ void LLView::onVisibilityChange ( BOOL new_visibility )  	BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus();  	BOOST_FOREACH(LLView* viewp, mChildList)  	{ +		if (!viewp) +		{ +			continue; +		} +  		// only views that are themselves visible will have their overall visibility affected by their ancestors  		old_visibility=viewp->getVisible(); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8d863631cf..dce0ea73cd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1315,13 +1315,10 @@ set(viewer_HEADER_FILES  source_group("CMake Rules" FILES ViewerInstall.cmake) +#summary.json creation moved to viewer_manifest.py MAINT-6413  # the viewer_version.txt file created here is for passing to viewer_manifest and autobuild -# the summary.json file is created for the benefit of the TeamCity builds, where -#   it is used to provide descriptive information to the build results page  file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"             "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n") -file(WRITE "${CMAKE_BINARY_DIR}/summary.json" -           "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\"}\n")  set_source_files_properties(     llversioninfo.cpp tests/llversioninfo_test.cpp  diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 2cd6638042..a0d3dc0f99 100644 --- 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 a8d42be2a1..57a9db9337 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11065,6 +11065,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> @@ -13254,6 +13276,17 @@        <key>Value</key>        <string>1</string>      </map> +    <key>UpdaterShowReleaseNotes</key> +    <map> +        <key>Comment</key> +        <string>Enables displaying of the Release notes in a web floater after update.</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Boolean</string> +        <key>Value</key> +        <integer>1</integer> +    </map>      <key>UploadBakedTexOld</key>      <map>        <key>Comment</key> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index be8ea2bab9..e99b94f150 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -32,7 +32,7 @@ RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0  RenderAvatarPhysicsLODFactor 1	1.0  RenderAvatarMaxNonImpostors 1   16 -RenderAvatarMaxComplexity          1	80000 +RenderAvatarMaxComplexity          1	350000  RenderAvatarVP				1	1  RenderAutoMuteSurfaceAreaLimit     1	1000.0  RenderCubeMap				1	1 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index ca6c00951d..801a622e93 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -32,7 +32,7 @@ RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0  RenderAvatarPhysicsLODFactor 1	1.0  RenderAvatarMaxNonImpostors 1   16 -RenderAvatarMaxComplexity          1	80000 +RenderAvatarMaxComplexity          1	350000  RenderAvatarVP				1	1  RenderAutoMuteSurfaceAreaLimit     1	1000.0  RenderCubeMap				1	1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index ea69b088f9..1f891ee4d7 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -32,7 +32,7 @@ RenderAvatarCloth				1	1  RenderAvatarLODFactor			1	1.0  RenderAvatarPhysicsLODFactor 1	1.0  RenderAvatarMaxNonImpostors     1   16 -RenderAvatarMaxComplexity              1	80000 +RenderAvatarMaxComplexity              1	350000  RenderAvatarVP					1	1  RenderAutoMuteSurfaceAreaLimit     1	1000.0  RenderCubeMap				1	1 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index b8677fd9e4..89317f2793 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -648,6 +648,7 @@ Function un.ProgramFiles  %%DELETE_FILES%%
  # Optional/obsolete files.  Delete won't fail if they don't exist.
 +Delete "$INSTDIR\autorun.bat"
  Delete "$INSTDIR\dronesettings.ini"
  Delete "$INSTDIR\message_template.msg"
  Delete "$INSTDIR\newview.pdb"
 @@ -679,6 +680,16 @@ FOLDERFOUND:  NOFOLDER:
 +MessageBox MB_YESNO $(DeleteRegistryKeysMB) IDYES DeleteKeys IDNO NoDelete
 +
 +DeleteKeys:
 +  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\x-grid-location-info"
 +  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\secondlife"
 +  DeleteRegKey HKEY_CLASSES_ROOT "x-grid-location-info"
 +  DeleteRegKey HKEY_CLASSES_ROOT "secondlife"
 +
 +NoDelete:
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsiBinary files differ index 343c312ddc..aa403a961c 100644 --- a/indra/newview/installers/windows/lang_en-us.nsi +++ b/indra/newview/installers/windows/lang_en-us.nsi diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index b76a66ab39..8a65aa6a89 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -62,23 +62,37 @@ using namespace LLAvatarAppearanceDefines;  /////////////////////////////////////////////////////////////////////////////// -// Callback to wear and start editing an item that has just been created. -void wear_and_edit_cb(const LLUUID& inv_item) +void set_default_permissions(LLViewerInventoryItem* item)  { -	if (inv_item.isNull()) return; -	 -		LLViewerInventoryItem* item = gInventory.getItem(inv_item); -		if (!item) return; - -		LLPermissions perm = item->getPermissions(); +	llassert(item); +	LLPermissions perm = item->getPermissions(); +	if (perm.getMaskNextOwner() != LLFloaterPerms::getNextOwnerPerms("Wearables") +		|| perm.getMaskEveryone() != LLFloaterPerms::getEveryonePerms("Wearables") +		|| perm.getMaskGroup() != LLFloaterPerms::getGroupPerms("Wearables")) +	{  		perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));  		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));  		perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables")); +  		item->setPermissions(perm);  		item->updateServer(FALSE); -		gInventory.updateItem(item); -		gInventory.notifyObservers(); +	} +} + +// Callback to wear and start editing an item that has just been created. +void wear_and_edit_cb(const LLUUID& inv_item) +{ +	if (inv_item.isNull()) return; +	 +	LLViewerInventoryItem* item = gInventory.getItem(inv_item); +	if (!item) return; + +	set_default_permissions(item); + +	// item was just created, update even if permissions did not changed +	gInventory.updateItem(item); +	gInventory.notifyObservers();  	// Request editing the item after it gets worn.  	gAgentWearables.requestEditingWearable(inv_item); @@ -94,13 +108,8 @@ void wear_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables")); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables")); -			item->setPermissions(perm); +			set_default_permissions(item); -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b6d02ea2f8..acbcb4f8b7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1220,6 +1220,8 @@ bool LLAppViewer::init()          boost::bind(&LLControlGroup::getU32, boost::ref(gSavedSettings), _1),          boost::bind(&LLControlGroup::declareU32, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_ALWAYS)); +	showReleaseNotesIfRequired(); +  	return true;  } @@ -3438,6 +3440,12 @@ std::string LLAppViewer::getViewerInfoString() const  	{  		support << '\n' << LLTrans::getString("AboutTraffic", args);  	} + +	// SLT timestamp +	LLSD substitution; +	substitution["datetime"] = (S32)time(NULL);//(S32)time_corrected(); +	support << "\n" << LLTrans::getString("AboutTime", substitution); +  	return support.str();  } @@ -5793,6 +5801,18 @@ void LLAppViewer::launchUpdater()  	// LLAppViewer::instance()->forceQuit();  } +/** +* Check if user is running a new version of the viewer. +* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. +*/ +void LLAppViewer::showReleaseNotesIfRequired() +{ +	if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")) +	{ +		LLSD info(getViewerInfo()); +		LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]); +	} +}  //virtual  void LLAppViewer::setMasterSystemAudioMute(bool mute) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index b5e674bd7b..07bef11dbc 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -254,6 +254,8 @@ private:      void sendLogoutRequest();      void disconnectViewer(); + +	void showReleaseNotesIfRequired();  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base. diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 00bc8ebe87..a6e745448a 100644 --- 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 100644 --- 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 100644 --- 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 100644 --- 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 100644 --- 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 100644 --- 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..5d2997688f 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -156,6 +156,10 @@ public:  			LLFloaterSidePanelContainer::showPanel("people", "panel_people",  				LLSD().with("people_panel_tab_name", "blocked_panel").with("blocked_to_select", getAvatarId()));  		} +		else if (level == "unblock") +		{ +			LLMuteList::getInstance()->remove(LLMute(getAvatarId(), mFrom, LLMute::OBJECT)); +		}  		else if (level == "map")  		{  			std::string url = "secondlife://" + mObjectData["slurl"].asString(); @@ -169,6 +173,20 @@ public:  	} +    bool onObjectIconContextMenuItemVisible(const LLSD& userdata) +    { +        std::string level = userdata.asString(); +        if (level == "is_blocked") +        { +            return LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat); +        } +        else if (level == "not_blocked") +        { +            return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat); +        } +        return false; +    } +  	void onAvatarIconContextMenuItemClicked(const LLSD& userdata)  	{  		std::string level = userdata.asString(); @@ -275,6 +293,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.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));  		LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  		mPopupMenuHandleAvatar = menu->getHandle(); @@ -719,6 +738,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)  	editor_params.trusted_content = false;  	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);  	mEditor->setIsFriendCallback(LLAvatarActions::isFriend); +	mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0)); +  }  LLSD LLChatHistory::getValue() const diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index c592a6c0c6..ea2e284305 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -393,7 +393,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat          if (result.has("timeout") && result["timeout"].asBoolean())          { -            std::string buffer = that->getString("Timeout") + ": " + inventory->getName(); +            std::string buffer = "Timeout: " + inventory->getName();              that->addStringMessage(buffer);              return true;          } @@ -443,7 +443,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat      {          if (result.has("timeout") && result["timeout"].asBoolean())          { -            std::string buffer = that->getString("Timeout") + ": " + inventory->getName(); +            std::string buffer = "Timeout: " + inventory->getName();              that->addStringMessage(buffer);              return true;          } @@ -497,7 +497,7 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat      {          if (result.has("timeout") && result["timeout"].asBoolean())          { -            std::string buffer = that->getString("Timeout") + ": " + inventory->getName(); +            std::string buffer = "Timeout: " + inventory->getName();              that->addStringMessage(buffer);              return true;          } diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 33675bd261..b716a76543 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -62,28 +62,15 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :  	LLFacePool(POOL_TERRAIN),  	mTexturep(texturep)  { -	U32 format = GL_ALPHA8; -	U32 int_format = GL_ALPHA; -  	// Hack!  	sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");  	sDetailMode = gSavedSettings.getS32("RenderTerrainDetail"); -	mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",  -													FTT_LOCAL_FILE, -													TRUE, LLGLTexture::BOOST_UI,  -													LLViewerTexture::FETCHED_TEXTURE, -													format, int_format, -													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); +	mAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD);  	//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());  	mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); -	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",  -													FTT_LOCAL_FILE, -													TRUE, LLGLTexture::BOOST_UI,  -													LLViewerTexture::FETCHED_TEXTURE, -													format, int_format, -													LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); +	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD_2D);  	//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());  	m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 7f1c981a3c..d4ba230feb 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -809,3 +809,62 @@ void LLFeatureManager::applyBaseMasks()  		maskFeatures("safe");  	}  } + +LLSD LLFeatureManager::getRecommendedSettingsMap() +{ +	// Create the map and fill it with the hardware recommended settings. +	// It's needed to create an initial Default graphics preset (MAINT-6435). +	// The process is similar to the one LLFeatureManager::applyRecommendedSettings() does. + +	LLSD map(LLSD::emptyMap()); + +	loadGPUClass(); +	U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5)); +	LL_INFOS("RenderInit") << "Getting the map of recommended settings for level " << level << LL_ENDL; + +	applyBaseMasks(); +	std::string features(isValidGraphicsLevel(level) ? getNameForGraphicsLevel(level) : "Low"); + +	maskFeatures(features); + +	LLControlVariable* ctrl = gSavedSettings.getControl("RenderQualityPerformance"); // include the quality value for correct preset loading    +	map["RenderQualityPerformance"]["Value"] = (LLSD::Integer)level; +	map["RenderQualityPerformance"]["Comment"] = ctrl->getComment();; +	map["RenderQualityPerformance"]["Persist"] = 1; +	map["RenderQualityPerformance"]["Type"] = LLControlGroup::typeEnumToString(ctrl->type()); + + + +	for (feature_map_t::iterator mIt = mFeatures.begin(); mIt != mFeatures.end(); ++mIt) +	{ +		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first); +		if (ctrl == NULL) +		{ +			LL_WARNS() << "AHHH! Control setting " << mIt->first << " does not exist!" << LL_ENDL; +			continue; +		} + +		if (ctrl->isType(TYPE_BOOLEAN)) +		{ +			map[mIt->first]["Value"] = (LLSD::Boolean)getRecommendedValue(mIt->first); +		} +		else if (ctrl->isType(TYPE_S32) || ctrl->isType(TYPE_U32)) +		{ +			map[mIt->first]["Value"] = (LLSD::Integer)getRecommendedValue(mIt->first); +		} +		else if (ctrl->isType(TYPE_F32)) +		{ +			map[mIt->first]["Value"] = (LLSD::Real)getRecommendedValue(mIt->first); +		} +		else +		{ +			LL_WARNS() << "AHHH! Control variable is not a numeric type!" << LL_ENDL; +			continue; +		} +		map[mIt->first]["Comment"] = ctrl->getComment();; +		map[mIt->first]["Persist"] = 1; +		map[mIt->first]["Type"] = LLControlGroup::typeEnumToString(ctrl->type()); +	} +	 +	return map; +} diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 12ea691b49..c3d87cea0b 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -157,7 +157,9 @@ public:  	// load the dynamic GPU/feature table from a website  	void fetchHTTPTables(); -	 + +	LLSD getRecommendedSettingsMap(); +  protected:  	bool loadGPUClass(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 7da65a9a7c..d842106146 100644 --- 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/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index 1f85c5ac1b..9fd731ed56 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -601,12 +601,31 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,  			toast_msg = chat_msg.mText;  		} +		bool chat_overlaps = false; +		if(nearby_chat->getChatHistory()) +		{ +			LLRect chat_rect = nearby_chat->getChatHistory()->calcScreenRect(); +			for (std::list<LLView*>::const_iterator child_iter = gFloaterView->getChildList()->begin(); +				 child_iter != gFloaterView->getChildList()->end(); ++child_iter) +			{ +				LLView *view = *child_iter; +				const LLRect& rect = view->getRect(); +				if(view->isInVisibleChain() && (rect.overlaps(chat_rect))) +				{ +					if(!nearby_chat->getChatHistory()->hasAncestor(view)) +					{ +						chat_overlaps = true; +					} +					break; +				} +			} +		}  		//Don't show nearby toast, if conversation is visible and selected  		if ((nearby_chat->hasFocus()) ||  			(LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized()) || -		    ((im_box->getSelectedSession().isNull() && -				((LLFloater::isVisible(im_box) && !im_box->isMinimized() && im_box->isFrontmost()) -						|| (LLFloater::isVisible(nearby_chat) && !nearby_chat->isMinimized() && nearby_chat->isFrontmost()))))) +		    ((im_box->getSelectedSession().isNull() && !chat_overlaps && +				((LLFloater::isVisible(im_box) && !nearby_chat->isTornOff() && !im_box->isMinimized()) +						|| (LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized())))))  		{  			if(nearby_chat->isMessagePaneExpanded())  			{ diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 357b635594..2cd94c592a 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -1094,6 +1094,12 @@ void LLFloaterIMSessionTab::saveCollapsedState()  		gSavedPerAccountSettings.setBOOL("NearbyChatIsNotCollapsed", isMessagePaneExpanded());  	}  } + +LLView* LLFloaterIMSessionTab::getChatHistory() +{ +	return mChatHistory; +} +  BOOL LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask )  {  	BOOL handled = FALSE; diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index e7b05a584b..1b4922fd73 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -103,6 +103,8 @@ public:  	void restoreFloater();  	void saveCollapsedState(); +	LLView* getChatHistory(); +  protected:  	// callback for click on any items of the visual states menu diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 135bbb335e..4a5732aecf 100644 --- 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/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 36bdcf4d89..20d8119606 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1411,7 +1411,7 @@ void LLAvatarComplexityControls::setIndirectMaxArc()  	else  	{  		// This is the inverse of the calculation in updateMaxComplexity -		indirect_max_arc = (U32)((log(max_arc) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE) + MIN_INDIRECT_ARC_LIMIT; +		indirect_max_arc = (U32)ll_round(((log(F32(max_arc)) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE)) + MIN_INDIRECT_ARC_LIMIT;  	}  	gSavedSettings.setU32("IndirectMaxComplexity", indirect_max_arc);  } @@ -1930,7 +1930,7 @@ void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* valu  	{  		// if this is changed, the inverse calculation in setIndirectMaxArc  		// must be changed to match -		max_arc = (U32)exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT))); +		max_arc = (U32)ll_round(exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT))));  	}  	gSavedSettings.setU32("RenderAvatarMaxComplexity", (U32)max_arc); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 4eacd728c3..843dbbf25e 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -412,6 +412,11 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel->getChild<LLUICtrl>("object_bonus_spin")->setValue(LLSD(object_bonus_factor) );  	panel->getChild<LLUICtrl>("access_combo")->setValue(LLSD(sim_access) ); +	LLPanelRegionGeneralInfo* panel_general = LLFloaterRegionInfo::getPanelGeneral(); +	if (panel) +	{ +		panel_general->setObjBonusFactor(object_bonus_factor); +	}   	// detect teen grid for maturity @@ -465,6 +470,16 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()  }  // static +LLPanelRegionGeneralInfo* LLFloaterRegionInfo::getPanelGeneral() +{ +	LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); +	if (!floater) return NULL; +	LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels"); +	LLPanelRegionGeneralInfo* panel = (LLPanelRegionGeneralInfo*)tab->getChild<LLPanel>("General"); +	return panel; +} + +// static  LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()  {  	LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); @@ -717,7 +732,42 @@ BOOL LLPanelRegionGeneralInfo::postBuild()  	childSetAction("im_btn", onClickMessage, this);  //	childSetAction("manage_telehub_btn", onClickManageTelehub, this); -	return LLPanelRegionInfo::postBuild(); +	LLUICtrl* apply_btn = findChild<LLUICtrl>("apply_btn"); +	if (apply_btn) +	{ +		apply_btn->setCommitCallback(boost::bind(&LLPanelRegionGeneralInfo::onBtnSet, this)); +	} + +	refresh(); +	return TRUE; +} + +void LLPanelRegionGeneralInfo::onBtnSet() +{ +	if(mObjBonusFactor == getChild<LLUICtrl>("object_bonus_spin")->getValue().asReal()) +	{ +		if (sendUpdate()) +		{ +			disableButton("apply_btn"); +		} +	} +	else +	{ +		LLNotificationsUtil::add("ChangeObjectBonusFactor", LLSD(), LLSD(), boost::bind(&LLPanelRegionGeneralInfo::onChangeObjectBonus, this, _1, _2)); +	} +} + +bool LLPanelRegionGeneralInfo::onChangeObjectBonus(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) +	{ +		if (sendUpdate()) +		{ +			disableButton("apply_btn"); +		} +	} +	return false;  }  void LLPanelRegionGeneralInfo::onClickKick() diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 46f2b42137..dbb0ad05e9 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -95,6 +95,7 @@ public:  	static LLPanelEstateCovenant* getPanelCovenant();  	static LLPanelRegionTerrainInfo* getPanelRegionTerrain();  	static LLPanelRegionExperiences* getPanelExperiences(); +	static LLPanelRegionGeneralInfo* getPanelGeneral();  	// from LLPanel  	virtual void refresh(); @@ -183,6 +184,9 @@ public:  	// LLPanel  	virtual BOOL postBuild(); +	void onBtnSet(); +	void setObjBonusFactor(F32 object_bonus_factor) {mObjBonusFactor = object_bonus_factor;} +  protected:  	virtual BOOL sendUpdate();  	void onClickKick(); @@ -191,6 +195,9 @@ protected:  	bool onKickAllCommit(const LLSD& notification, const LLSD& response);  	static void onClickMessage(void* userdata);  	bool onMessageCommit(const LLSD& notification, const LLSD& response); +	bool onChangeObjectBonus(const LLSD& notification, const LLSD& response); + +	F32 mObjBonusFactor;  }; diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 0cb37dabe7..b139e5daf5 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -257,7 +257,6 @@ void LLFloaterSellLandUI::setBadge(const char* id, Badge badge)  	static std::string badgeOK("badge_ok.j2c");  	static std::string badgeNote("badge_note.j2c");  	static std::string badgeWarn("badge_warn.j2c"); -	static std::string badgeError("badge_error.j2c");  	std::string badgeName;  	switch (badge) @@ -266,7 +265,7 @@ void LLFloaterSellLandUI::setBadge(const char* id, Badge badge)  		case BADGE_OK:		badgeName = badgeOK;	break;  		case BADGE_NOTE:	badgeName = badgeNote;	break;  		case BADGE_WARN:	badgeName = badgeWarn;	break; -		case BADGE_ERROR:	badgeName = badgeError;	break; +		case BADGE_ERROR:	badgeName = badgeWarn;	break;  	}  	getChild<LLUICtrl>(id)->setValue(badgeName); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index afec981d56..b906671c7f 100644 --- 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 100644 --- 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 100644 --- 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 100644 --- 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/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index a9bf8a9a50..97cc7684e4 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -248,7 +248,7 @@ bool LLGiveInventory::doGiveInventoryCategory(const LLUUID& to_agent,  	gInventory.collectDescendentsIf (cat->getUUID(),  		cats,  		items, -		LLInventoryModel::EXCLUDE_TRASH, +		LLInventoryModel::INCLUDE_TRASH,  		giveable);  	S32 count = cats.size();  	bool complete = true; @@ -499,7 +499,7 @@ bool LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent,  	gInventory.collectDescendentsIf (cat->getUUID(),  		cats,  		items, -		LLInventoryModel::EXCLUDE_TRASH, +		LLInventoryModel::INCLUDE_TRASH,  		giveable);  	bool give_successful = true; diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index a12ec390af..b64df2bd47 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -181,7 +181,7 @@ void LLInspectRemoteObject::update()  	getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());  	// disable the Block button if we don't have the object ID (will this ever happen?) -	getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull()); +	getChild<LLUICtrl>("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID));  }  ////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 26c9b40fb1..f4bf38f65d 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -286,6 +286,16 @@ BOOL LLInvFVBridge::cutToClipboard()  	return FALSE;  } +// virtual +bool LLInvFVBridge::isCutToClipboard() +{ +    if (LLClipboard::instance().isCutMode()) +    { +        return LLClipboard::instance().isOnClipboard(mUUID); +    } +    return false; +} +  // Callback for cutToClipboard if DAMA required...  BOOL LLInvFVBridge::callback_cutToClipboard(const LLSD& notification, const LLSD& response)  { @@ -307,9 +317,7 @@ BOOL LLInvFVBridge::perform_cutToClipboard()  	if (obj && isItemMovable() && isItemRemovable())  	{  		LLClipboard::instance().setCutMode(true); -		BOOL added_to_clipboard = LLClipboard::instance().addToClipboard(mUUID); -        removeObject(&gInventory, mUUID);   // Always perform the remove even if the object couldn't make it to the clipboard -        return added_to_clipboard; +		return LLClipboard::instance().addToClipboard(mUUID);  	}  	return FALSE;  } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 9053c61171..df25e01688 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -116,6 +116,7 @@ public:  	virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL copyToClipboard() const;  	virtual BOOL cutToClipboard(); +	virtual bool isCutToClipboard();  	virtual BOOL isClipboardPasteable() const;  	virtual BOOL isClipboardPasteableAsLink() const;  	virtual void pasteFromClipboard() {} diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 003bbcafed..e995c138b4 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -84,21 +84,18 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)  bool LLInventoryFilter::check(const LLFolderViewModelItem* item)   {  	const LLFolderViewModelItemInventory* listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item); -	// Clipboard cut items are *always* filtered so we need this value upfront -	const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);  	// If it's a folder and we're showing all folders, return automatically.  	const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;  	if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))  	{ -		return passed_clipboard; +		return true;  	}  	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);  	passed = passed && checkAgainstFilterType(listener);  	passed = passed && checkAgainstPermissions(listener);  	passed = passed && checkAgainstFilterLinks(listener); -	passed = passed && passed_clipboard;  	return passed;  } @@ -108,9 +105,8 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)  	const bool passed_string = (mFilterSubString.size() ? item->getName().find(mFilterSubString) != std::string::npos : true);  	const bool passed_filtertype = checkAgainstFilterType(item);  	const bool passed_permissions = checkAgainstPermissions(item); -	const bool passed_clipboard = checkAgainstClipboard(item->getUUID()); -	return passed_filtertype && passed_permissions && passed_clipboard && passed_string; +	return passed_filtertype && passed_permissions && passed_string;  }  bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const @@ -129,13 +125,10 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const  bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  { -	// Always check against the clipboard -	const BOOL passed_clipboard = checkAgainstClipboard(folder_id); -	  	// we're showing all folders, overriding filter  	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)  	{ -		return passed_clipboard; +		return true;  	}  	// when applying a filter, matching folders get their contents downloaded first @@ -201,7 +194,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  	LLViewerInventoryItem* item = gInventory.getItem(folder_id);  	if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)  	{ -		return passed_clipboard; +		return true;  	}  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY) @@ -216,7 +209,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  			return false;  	} -	return passed_clipboard; +	return true;  }  bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInventory* listener) const diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index e3cb4d57ef..d8f019374e 100644 --- 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/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index cada2d7cf2..dfaad5e525 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -582,7 +582,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  	// Add the category to the internal representation  	LLPointer<LLViewerInventoryCategory> cat =  		new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID()); -	cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL); +	cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1  	cat->setDescendentCount(0);  	LLCategoryUpdate update(cat->getParentUUID(), 1);  	accountForUpdate(update); @@ -640,7 +640,7 @@ void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inv          result["parent_id"].asUUID(), (LLFolderType::EType)result["type"].asInteger(),          result["name"].asString(), gAgent.getID()); -    cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL); +    cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1      cat->setDescendentCount(0);      LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d21fda8f9..53b2ca2b74 100644 --- 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 100644 --- 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 100644 --- 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/llmanip.h b/indra/newview/llmanip.h index 1fb05e047a..69881e8589 100644 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -1,4 +1,4 @@ -/**  +/**    * @file llmanip.h   * @brief LLManip class definition   * @@ -37,7 +37,7 @@ class LLToolComposite;  class LLVector3;  class LLObjectSelection; -const S32 MIN_DIVISION_PIXEL_WIDTH = 9; +const S32 MIN_DIVISION_PIXEL_WIDTH = 3;  class LLManip : public LLTool  { diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b4259a456c..3975d3980b 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1,4 +1,4 @@ -/**  +/**    * @file llmaniptranslate.cpp   * @brief LLManipTranslate class implementation   * @@ -548,12 +548,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  		if (off_axis_magnitude > mSnapOffsetMeters)  		{  			mInSnapRegime = TRUE; -			LLVector3 mouse_down_offset(mDragCursorStartGlobal - mDragSelectionStartGlobal);  			LLVector3 cursor_snap_agent = gAgent.getPosAgentFromGlobal(cursor_point_snap_line); -			if (!gSavedSettings.getBOOL("SnapToMouseCursor")) -			{ -				cursor_snap_agent -= mouse_down_offset; -			}  			F32 cursor_grid_dist = (cursor_snap_agent - mGridOrigin) * axis_f; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 0aaed3e286..39ebf9f95b 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4034,6 +4034,11 @@ void LLMeshRepository::uploadError(LLSD& args)  //static  F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)  { +	if (header.size() == 0 || header.has("404") || header["version"].asInteger() > MAX_MESH_VERSION) +	{ +		return 0.f; +	} +  	F32 max_distance = 512.f;  	F32 dlowest = llmin(radius/0.03f, max_distance); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index b2164c1f21..d17f5494a0 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -199,7 +199,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)  	mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); -	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII ); +	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCIINoLeadingSpace );  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 4229419fce..c779ba5cdd 100644 --- 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 100644 --- 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/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 8331c152e2..8b9941c0ca 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1059,9 +1059,6 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		case LLAssetType::AT_BODYPART:  			applyListViewFilter(LVIT_BODYPART);  			break; -		case LLAssetType::AT_GESTURE: -			applyListViewFilter(LVIT_GESTURES); -			break;  		case LLAssetType::AT_CLOTHING:  		default:  			applyListViewFilter(LVIT_CLOTHING); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 841bb4337a..30870daf40 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -80,7 +80,6 @@ public:  	{  		LVIT_ALL = 0,  		LVIT_CLOTHING, -		LVIT_GESTURES,  		LVIT_BODYPART,  		LVIT_ATTACHMENT,  		LVIT_SHAPE, diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 73b928f014..bc177abc57 100644 --- 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 100644 --- 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 100644 --- 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/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index e795e7eedb..184238c40c 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -176,6 +176,16 @@ public:  			return true;  		} +		if (verb == "unblock") +		{ +			if (params.size() > 2) +			{ +				const std::string object_name = params[2].asString(); +				LLMute mute(avatar_id, object_name, LLMute::OBJECT); +				LLMuteList::getInstance()->remove(mute); +			} +			return true; +		}  		return false;  	}  }; diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index c55e230b5e..a2d1752c6a 100644 --- 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 100644 --- 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/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index d95546f11d..9957039f72 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -38,6 +38,7 @@  #include "llviewercontrol.h"  #include "llfloaterpreference.h"  #include "llfloaterreg.h" +#include "llfeaturemanager.h"  LLPresetsManager::LLPresetsManager()  { @@ -60,7 +61,7 @@ void LLPresetsManager::createMissingDefault()  		LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;  		// Write current graphic settings as the default -		savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT); +        savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT, true);  	}      else      { @@ -134,7 +135,7 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam  	presets = mPresetNames;  } -bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name) +bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name, bool createDefault)  {  	if (LLTrans::getString(PRESETS_DEFAULT) == name)  	{ @@ -146,11 +147,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n  	if(PRESETS_GRAPHIC == subdirectory)  	{ -		gSavedSettings.setString("PresetGraphicActive", name); -  		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -		if (instance) +		if (instance && !createDefault)  		{ +            gSavedSettings.setString("PresetGraphicActive", name);  			instance->getControlNames(name_list);              LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;  			name_list.push_back("PresetGraphicActive"); @@ -170,23 +170,36 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n          LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;      } -    if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list +    if (name_list.size() > 1 // if the active preset name is the only thing in the list, don't save the list +        || (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)) // or create a default graphics preset from hw recommended settings       {          // make an empty llsd          LLSD paramsData(LLSD::emptyMap()); -        for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it) +        if (createDefault) +        { +            paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap(); +            if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0) +            { +                // use the recommended setting as an initial one (MAINT-6435) +                gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger()); +            } +        } +        else          { -            std::string ctrl_name = *it; -            LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get(); -            std::string comment = ctrl->getComment(); -            std::string type = LLControlGroup::typeEnumToString(ctrl->type()); -            LLSD value = ctrl->getValue(); - -            paramsData[ctrl_name]["Comment"] =  comment; -            paramsData[ctrl_name]["Persist"] = 1; -            paramsData[ctrl_name]["Type"] = type; -            paramsData[ctrl_name]["Value"] = value; +            for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it) +            { +                std::string ctrl_name = *it; +                LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get(); +                std::string comment = ctrl->getComment(); +                std::string type = LLControlGroup::typeEnumToString(ctrl->type()); +                LLSD value = ctrl->getValue(); + +                paramsData[ctrl_name]["Comment"] = comment; +                paramsData[ctrl_name]["Persist"] = 1; +                paramsData[ctrl_name]["Type"] = type; +                paramsData[ctrl_name]["Value"] = value; +            }          }          std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml"); @@ -203,10 +216,12 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n              LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL; -            gSavedSettings.setString("PresetGraphicActive", name); - -            // signal interested parties -            triggerChangeSignal(); +            if (!createDefault) +            { +                gSavedSettings.setString("PresetGraphicActive", name); +                // signal interested parties +                triggerChangeSignal(); +            }          }          else          { diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h index ac4f0c010c..21f9885f27 100644 --- a/indra/newview/llpresetsmanager.h +++ b/indra/newview/llpresetsmanager.h @@ -56,7 +56,7 @@ public:  	static std::string getPresetsDir(const std::string& subdirectory);  	void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);  	void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option); -	bool savePreset(const std::string& subdirectory, std::string name); +	bool savePreset(const std::string& subdirectory, std::string name, bool createDefault = false);  	void loadPreset(const std::string& subdirectory, std::string name);  	bool deletePreset(const std::string& subdirectory, std::string name); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 20c43bc432..510d91839d 100644 --- 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);  		} @@ -435,6 +437,23 @@ void LLPreviewNotecard::finishInventoryUpload(LLUUID itemId, LLUUID newAssetId,      }  } +void LLPreviewNotecard::finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUID taskId) +{ + +    LLSD floater_key; +    floater_key["taskid"] = taskId; +    floater_key["itemid"] = itemId; +    LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", floater_key); +    if (nc) +    { +        if (nc->hasEmbeddedInventory()) +        { +            gVFS->removeFile(newAssetId, LLAssetType::AT_NOTECARD); +        } +        nc->setAssetId(newAssetId); +        nc->refreshFromInventory(); +    } +}  bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)  { @@ -483,7 +502,7 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)                  else if (!mObjectUUID.isNull() && !task_url.empty())                  {                      uploadInfo = LLResourceUploadInfo::ptr_t(new LLBufferedAssetUploadInfo(mObjectUUID, mItemUUID, LLAssetType::AT_NOTECARD, buffer,  -                        boost::bind(&LLPreviewNotecard::finishInventoryUpload, _1, _3, LLUUID::null))); +                        boost::bind(&LLPreviewNotecard::finishTaskUpload, _1, _3, mObjectUUID)));                      url = task_url;                  } diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index ba571995f6..017c4485ba 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -96,6 +96,7 @@ protected:  	bool handleConfirmDeleteDialog(const LLSD& notification, const LLSD& response);      static void finishInventoryUpload(LLUUID itemId, LLUUID newAssetId, LLUUID newItemId); +    static void finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUID taskId);  protected:  	LLViewerTextEditor* mEditor; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 2a2c51be40..645a77e42a 100644 --- 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/llstartup.cpp b/indra/newview/llstartup.cpp index 88fbd233b8..a2c8e7772e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -687,6 +687,11 @@ bool idle_startup()  			gRememberPassword = gSavedSettings.getBOOL("RememberPassword");  			show_connect_box = TRUE;  		} + +		//setup map of datetime strings to codes and slt & local time offset from utc +		// *TODO: Does this need to be here? +		LLStringOps::setupDatetimeInfo(false); +  		// Go to the next startup state  		LLStartUp::setStartupState( STATE_BROWSER_INIT );  		return FALSE; @@ -1139,9 +1144,6 @@ bool idle_startup()  						LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);  					}  				} -				//setup map of datetime strings to codes and slt & local time offset from utc -				// *TODO: Does this need to be here? -				LLStringOps::setupDatetimeInfo (false);  				transition_back_to_login_panel(emsg.str());  				show_connect_box = true;  			} @@ -3310,6 +3312,13 @@ bool process_login_success_response()  		{  			time_t now = time(NULL);  			gUTCOffset = (server_utc_time - now); + +			// Print server timestamp +			LLSD substitution; +			substitution["datetime"] = (S32)server_utc_time; +			std::string timeStr = "[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second, datetime, slt]"; +			LLStringUtil::format(timeStr, substitution); +			LL_INFOS("AppInit") << "Server SLT timestamp: " << timeStr << ". Server-viewer time offset before correction: " << gUTCOffset << "s" << LL_ENDL;  		}  	} diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 98ed2f0fc4..e3a856be5c 100644 --- 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; @@ -321,6 +325,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )      mTextBox->setContentTrusted(is_content_trusted);      mTextBox->setValue(mNotification->getMessage());  	mTextBox->setIsFriendCallback(LLAvatarActions::isFriend); +    mTextBox->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0));      // add buttons for a script notification      if (mIsTip) diff --git a/indra/newview/lltoastscriptquestion.cpp b/indra/newview/lltoastscriptquestion.cpp index 91ba8c0247..7a3a1d8fd7 100644 --- a/indra/newview/lltoastscriptquestion.cpp +++ b/indra/newview/lltoastscriptquestion.cpp @@ -54,6 +54,19 @@ BOOL LLToastScriptQuestion::postBuild()  	return TRUE;  } + +// virtual +void LLToastScriptQuestion::setFocus(BOOL b) +{ +    LLToastPanel::setFocus(b); +    // toast can fade out and disappear with focus ON, so reset to default anyway +    LLButton* dfbutton = getDefaultButton(); +    if (dfbutton && dfbutton->getVisible() && dfbutton->getEnabled()) +    { +        dfbutton->setFocus(b); +    } +} +  void LLToastScriptQuestion::snapToMessageHeight()  {  	LLTextBox* mMessage = getChild<LLTextBox>("top_info_message"); @@ -118,6 +131,12 @@ void LLToastScriptQuestion::createButtons()  			button->setRect(rect);  			buttons_width += rect.getWidth() + LEFT_PAD; + +			if (form_element.has("default") && form_element["default"].asBoolean()) +			{ +				button->setFocus(TRUE); +				setDefaultBtn(button); +			}  		}  	}  } diff --git a/indra/newview/lltoastscriptquestion.h b/indra/newview/lltoastscriptquestion.h index 3a557f60f6..a756f88415 100644 --- a/indra/newview/lltoastscriptquestion.h +++ b/indra/newview/lltoastscriptquestion.h @@ -39,6 +39,8 @@ public:  	virtual BOOL postBuild();  	virtual ~LLToastScriptQuestion(){}; +	/*virtual*/ void setFocus(BOOL b); +  private:  	void snapToMessageHeight(); diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 2f8e464b71..b0e3b5bf89 100644 --- 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 100644 --- 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 100644 --- 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 100644 --- 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/llviewchildren.cpp b/indra/newview/llviewchildren.cpp index 5c5bbdc8f5..32b2f7e9f5 100644 --- a/indra/newview/llviewchildren.cpp +++ b/indra/newview/llviewchildren.cpp @@ -79,8 +79,9 @@ void LLViewChildren::setBadge(const std::string& id, Badge badge, bool visible)  			default:  			case BADGE_OK:		child->setValue(std::string("badge_ok.j2c"));	break;  			case BADGE_NOTE:	child->setValue(std::string("badge_note.j2c"));	break; -			case BADGE_WARN:	child->setValue(std::string("badge_warn.j2c"));	break; -			case BADGE_ERROR:	child->setValue(std::string("badge_error.j2c"));	break; +			case BADGE_WARN: +			case BADGE_ERROR: +				child->setValue(std::string("badge_warn.j2c"));	break;  		}  	}  } 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/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 0ee873d7a1..80a13bbb71 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1036,6 +1036,22 @@ void activate_gesture_cb(const LLUUID& inv_item)  	LLGestureMgr::instance().activateGesture(inv_item);  } +void set_default_permissions(LLViewerInventoryItem* item, std::string perm_type) +{ +	llassert(item); +	LLPermissions perm = item->getPermissions(); +	if (perm.getMaskEveryone() != LLFloaterPerms::getEveryonePerms(perm_type) +		|| perm.getMaskGroup() != LLFloaterPerms::getGroupPerms(perm_type)) +	{ +		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms(perm_type)); +		perm.setMaskGroup(LLFloaterPerms::getGroupPerms(perm_type)); + +		item->setPermissions(perm); + +		item->updateServer(FALSE); +	} +} +  void create_script_cb(const LLUUID& inv_item)  {  	if (!inv_item.isNull()) @@ -1043,13 +1059,9 @@ void create_script_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts")); - -			item->setPermissions(perm); +			set_default_permissions(item, "Scripts"); -			item->updateServer(FALSE); +			// item was just created, update even if permissions did not changed  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} @@ -1065,13 +1077,8 @@ void create_gesture_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures")); +			set_default_permissions(item, "Gestures"); -			item->setPermissions(perm); - -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers(); @@ -1090,13 +1097,8 @@ void create_notecard_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Notecards")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Notecards")); - -			item->setPermissions(perm); +			set_default_permissions(item, "Notecards"); -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 92df3866f7..5495c0e06a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4719,7 +4719,9 @@ void process_sound_trigger(LLMessageSystem *msg, void **)  {  	if (!gAudiop)  	{ +#if !LL_LINUX  		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +#endif  		return;  	} @@ -4781,7 +4783,9 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)  {  	if (!gAudiop)  	{ +#if !LL_LINUX  		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +#endif  		return;  	} diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp index 7efa821bbf..814060f4f2 100644 --- a/indra/newview/llviewerpartsource.cpp +++ b/indra/newview/llviewerpartsource.cpp @@ -441,10 +441,20 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer  			return NULL;  		} +		F32 prev_max_age = pssp->mPartSysData.mMaxAge; +		F32 prev_start_age = pssp->mPartSysData.mStartAge;  		if (!pssp->mPartSysData.unpackBlock(block_num))  		{  			return NULL;  		} +		else if (pssp->mPartSysData.mMaxAge +				 && (prev_max_age != pssp->mPartSysData.mMaxAge || prev_start_age != pssp->mPartSysData.mStartAge)) +		{ +			// reusing existing pss, so reset time to allow particles to start again +			pssp->mLastUpdateTime = 0.f; +			pssp->mLastPartTime = 0.f; +		} +  		if (pssp->mPartSysData.mTargetUUID.notNull())  		{  			LLViewerObject *target_objp = gObjectList.findObject(pssp->mPartSysData.mTargetUUID); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index cac2ed8585..899ab3a371 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -264,17 +264,18 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)          }          S32 id = ++mHttpResponderID; -        ++mSeedCapAttempts;          LLSD capabilityNames = LLSD::emptyArray();          buildCapabilityNames(capabilityNames);          LL_INFOS("AppInit", "Capabilities") << "Requesting seed from " << url  -            << " (attempt #" << mSeedCapAttempts << ")" << LL_ENDL; +            << " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL;          regionp = NULL;          result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames); +        ++mSeedCapAttempts; +          regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          { diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index db4b555eca..ed719ae418 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1875,7 +1875,8 @@ bool LLViewerFetchedTexture::updateFetch()  	static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false);  	static LLCachedControl<F32>  sCameraMotionThreshold(gSavedSettings,"TextureCameraMotionThreshold", 0.2);  	static LLCachedControl<S32>  sCameraMotionBoost(gSavedSettings,"TextureCameraMotionBoost", 3); -	if(textures_decode_disabled) +	if(textures_decode_disabled || +	   (gUseWireframe && mBoostLevel < LLGLTexture::BOOST_AVATAR_BAKED_SELF)) // don't fetch the surface textures in wireframe mode  	{  		return false;  	} diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 08f6143861..d7080051da 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -171,13 +171,27 @@ void LLViewerTextureList::doPreloadImages()  		mImagePreloads.insert(image);  	}  	image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, -		0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903")); +		0, 0, IMG_TRANSPARENT);  	if (image)   	{  		image->setAddressMode(LLTexUnit::TAM_WRAP);  		mImagePreloads.insert(image);  	} -	 +	image = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, +		GL_ALPHA8, GL_ALPHA, IMG_ALPHA_GRAD); +	if (image) +	{ +		image->setAddressMode(LLTexUnit::TAM_CLAMP); +		mImagePreloads.insert(image); +	} +	image = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, +		GL_ALPHA8, GL_ALPHA, IMG_ALPHA_GRAD_2D); +	if (image) +	{ +		image->setAddressMode(LLTexUnit::TAM_CLAMP); +		mImagePreloads.insert(image); +	} +  	LLPointer<LLImageRaw> img_blak_square_tex(new LLImageRaw(2, 2, 3));  	memset(img_blak_square_tex->getData(), 0, img_blak_square_tex->getDataSize());  	LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, FALSE)); @@ -188,7 +202,7 @@ void LLViewerTextureList::doPreloadImages()  static std::string get_texture_list_name()  { -	return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "texture_list_" + gSavedSettings.getString("LoginLocation") + ".xml"); +	return gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "texture_list_" + gSavedSettings.getString("LoginLocation") + "." + gDirUtilp->getUserName() + ".xml");  }  void LLViewerTextureList::doPrefetchImages() @@ -293,7 +307,7 @@ void LLViewerTextureList::shutdown()  			break;  	} -	if (count > 0 && !gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "").empty()) +	if (count > 0 && !gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").empty())  	{  		std::string filename = get_texture_list_name();  		llofstream file; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 672d153e51..cdc7e20c2c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -8145,6 +8145,7 @@ U32 LLVOAvatar::getPartitionType() const  //static  void LLVOAvatar::updateImpostors()  { +	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;  	LLCharacter::sAllowInstancesChange = FALSE;  	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 72037a84b3..85f4ae587a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -774,6 +774,9 @@ with the same filename but different name    <texture name="default_land_picture.j2c" />    <texture name="default_profile_picture.j2c" />    <texture name="locked_image.j2c" /> +  <texture name="badge_note.j2c" /> +  <texture name="badge_warn.j2c" /> +  <texture name="badge_ok.j2c" />    <texture name="materials_ui_x_24.png" />    <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 170b7177fb..550af03683 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -10,8 +10,10 @@        <file>ArialUni.ttf</file>      </os>      <os name="Mac"> +      <file>ヒラギノ角ゴシック W3.ttc</file>          <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 100644 --- 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..5137aea72a 100644 --- 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,20 @@          <menu_item_call.on_click           function="ObjectIcon.Action"           parameter="block" /> +        <menu_item_call.on_visible +         function="ObjectIcon.Visible" +         parameter="not_blocked" /> +    </menu_item_call> +    <menu_item_call +     label="Unblock" +     layout="topleft" +     name="Unblock"> +        <menu_item_call.on_click +         function="ObjectIcon.Action" +         parameter="unblock" /> +        <menu_item_call.on_visible +         function="ObjectIcon.Visible" +         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 100644 --- 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 100644 --- 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 100644 --- 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_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml index b9d003b841..41d40b389a 100644 --- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml @@ -16,6 +16,13 @@          <menu_item_call.on_click           function="Url.Block" />      </menu_item_call> +    <menu_item_call +     label="Unblock" +     layout="topleft" +     name="unblock_object"> +        <menu_item_call.on_click +         function="Url.Unblock" /> +    </menu_item_call>      <menu_item_separator       layout="topleft" />      <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 0a492fb37b..b189d1038f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -806,7 +806,7 @@              <menu_item_check.on_click               function="Build.Toggle" />              <menu_item_check.on_enable -             function="Build.Enabled" /> +             function="Build.EnabledOrActive" />         </menu_item_check>         <menu            create_jump_keys="true" 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 100644 --- 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 492d963653..9e11a530f7 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1150,6 +1150,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] @@ -3523,6 +3539,19 @@ Teleport all Residents in this region home?    <notification     icon="alertmodal.tga" +   name="ChangeObjectBonusFactor" +   type="alertmodal"> +    Lowering the object bonus after builds have been established in a region may cause objects to be returned or deleted. Are you sure you want to change object bonus? +    <tag>confirm</tag> +    <usetemplate +     ignoretext="Confirm changing object bonus factor" +     name="okcancelignore" +     notext="Cancel" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="EstateObjectReturn"     type="alertmodal">  Are you sure you want to return objects owned by [USER_NAME]? @@ -6881,6 +6910,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" @@ -8272,8 +8314,18 @@ Appearance has been saved to XML to [PATH]      <notification icon="notifytip.tga"  		name="AppearanceToXMLFailed" type="notifytip">  Failed to save appearance to XML. +  </notification> + +  <notification +    icon="notifytip.tga" +    name="PresetNotSaved" +    type="notifytip"> +Error saving preset [NAME]. +  </notification> + +  <notification      icon="notifytip.tga" -	name="PresetNotDeleted" +    name="PresetNotDeleted"      type="notifytip">  Error deleting preset [NAME].    </notification> @@ -8752,23 +8804,6 @@ Click and drag anywhere on the world to rotate your view    </notification>    <notification -  name="PopupAttempt" -  icon="Popup_Caution" -  type="browser"> -    A pop-up was prevented from opening. -    <form name="form"> -      <ignore name="ignore" -              control="MediaEnablePopups" -              invert_control="true" -              text="Enable all pop-ups"/> -      <button default="true" -              index="0" -              name="open" -              text="Open pop-up window"/> -    </form> -  </notification> - -  <notification     icon="alertmodal.tga"     name="SOCKS_NOT_PERMITTED"     type="alertmodal"> @@ -9785,6 +9820,17 @@ You don't have permission to modify that object    <notification     icon="alertmodal.tga" +   name="TooMuchObjectInventorySelected" +   type="alertmodal"> +    <tag>fail</tag> +    Too many objects with large inventory are selected. Please select fewer objects and try again. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="CantEnablePhysObjContributesToNav"     type="notify">     <tag>fail</tag> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 183ae2e824..ded814bbeb 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -67,7 +67,7 @@      follows="left|top"      height="32"      left_pad="-11" -    max_length_bytes="16" +    max_length_chars="16"      text_pad_left="8"      name="password_edit"      label="Password" diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml index d1416ece82..35b80c56ab 100644 --- a/indra/newview/skins/default/xui/en/panel_login_first.xml +++ b/indra/newview/skins/default/xui/en/panel_login_first.xml @@ -124,7 +124,7 @@              width="200"              height="32"              left="220" -            max_length_bytes="16" +            max_length_chars="16"              name="password_edit"              label="Password"              text_pad_left="8" 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 100644 --- 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" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 0b605cf6f7..c20f9b2c51 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -273,6 +273,18 @@      name="update_willing_to_test"      width="400"                 top_pad="5"/> +  <check_box +    top_delta="4" +    enabled="true" +    follows="left|top" +    height="14" +    control_name="UpdaterShowReleaseNotes" +    label="Show Release Notes after update" +    left_delta="0" +    mouse_opaque="true" +    name="update_show_release_notes" +    width="400" +    top_pad="5"/>    <text       type="string"       length="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ae63546082..b19c6756bc 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -54,6 +54,7 @@ LLCEFLib/CEF Version: [LLCEFLIB_VERSION]  Voice Server Version: [VOICE_VERSION]  	</string>  	<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> +	<string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>  	<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>  	<string name="BuildConfiguration">Build Configuration</string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 1c77cf805e..f3d89bb866 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -30,6 +30,7 @@ import sys  import os.path  import shutil  import errno +import json  import re  import tarfile  import time @@ -181,9 +182,16 @@ class ViewerManifest(LLManifest):                  self.path("*.tga")                  self.end_prefix("local_assets") -            # Files in the newview/ directory +            # File in the newview/ directory              self.path("gpu_table.txt") -            # The summary.json file gets left in the build directory by newview/CMakeLists.txt. + +            #summary.json.  Standard with exception handling is fine.  If we can't open a new file for writing, we have worse problems +            summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']),"Channel":self.channel_with_pkg_suffix()} +            with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle: +                json.dump(summary_dict,summary_handle) + +            #we likely no longer need the test, since we will throw an exception above, but belt and suspenders and we get the +            #return code for free.              if not self.path2basename(os.pardir, "summary.json"):                  print "No summary.json file" | 
