diff options
82 files changed, 1258 insertions, 362 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 8c6bd5e0fe..c8125c675f 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -517,6 +517,7 @@ Ringo Tuxing  Robin Cornelius  	SNOW-108  	SNOW-204 +	SNOW-484  	VWR-2488  	VWR-9557  	VWR-11128 diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index f4dc3b927b..7bc9e97eb1 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -1248,6 +1248,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)  		return FALSE;  	} +	if(mJointMotionList->mEmoteName==mID.asString()) +	{ +		llwarns << "Malformed animation mEmoteName==mID" << llendl; +		return FALSE; +	} +  	//-------------------------------------------------------------------------  	// get loop  	//------------------------------------------------------------------------- diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 809a626c93..e0b56b7973 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -428,9 +428,11 @@ S32 LLQueuedThread::processNextRequest()  		llassert_always(req->getStatus() == STATUS_QUEUED);  		break;  	} +	U32 start_priority = 0 ;  	if (req)  	{  		req->setStatus(STATUS_INPROGRESS); +		start_priority = req->getPriority();  	}  	unlockData(); @@ -439,8 +441,7 @@ S32 LLQueuedThread::processNextRequest()  	// safe to access req.  	if (req)  	{ -		// process request -		U32 start_priority = req->getPriority(); +		// process request		  		bool complete = req->processRequest();  		if (complete) diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index ad950685c0..c3ef734823 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -40,8 +40,6 @@  #include "llfocusmgr.h"  #include "lllocalcliprect.h" -#include "lltrans.h" -  #include "boost/bind.hpp"  static const S32 DRAGGER_BAR_MARGIN = 4; @@ -74,7 +72,6 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)  {  	initNoTabsWidget(params.no_matched_tabs_text); -	mNoVisibleTabsOrigString = LLTrans::getString(params.no_visible_tabs_text.initial_value().asString());  	mSingleExpansion = params.single_expansion;  	if(mFitParent && !mSingleExpansion)  	{ @@ -389,7 +386,7 @@ void	LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)  {  	LLTextBox::Params tp = tb_params;  	tp.rect(getLocalRect()); -	mNoMatchedTabsOrigString = LLTrans::getString(tp.initial_value().asString()); +	mNoMatchedTabsOrigString = tp.initial_value().asString();  	mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this);  } diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 39e46a7ccb..aeedf62379 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -1,3 +1,4 @@ +  /**    * @file llbutton.cpp   * @brief LLButton base class diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index d1c0b38809..5b4fee0051 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -157,7 +157,7 @@ bool LLFlatListView::insertItemAfter(LLPanel* after_item, LLPanel* item_to_add,  } -bool LLFlatListView::removeItem(LLPanel* item) +bool LLFlatListView::removeItem(LLPanel* item, bool rearrange)  {  	if (!item) return false;  	if (item->getParent() != mItemsPanel) return false; @@ -165,22 +165,22 @@ bool LLFlatListView::removeItem(LLPanel* item)  	item_pair_t* item_pair = getItemPair(item);  	if (!item_pair) return false; -	return removeItemPair(item_pair); +	return removeItemPair(item_pair, rearrange);  } -bool LLFlatListView::removeItemByValue(const LLSD& value) +bool LLFlatListView::removeItemByValue(const LLSD& value, bool rearrange)  {  	if (value.isUndefined()) return false;  	item_pair_t* item_pair = getItemPair(value);  	if (!item_pair) return false; -	return removeItemPair(item_pair); +	return removeItemPair(item_pair, rearrange);  } -bool LLFlatListView::removeItemByUUID(const LLUUID& uuid) +bool LLFlatListView::removeItemByUUID(const LLUUID& uuid, bool rearrange)  { -	return removeItemByValue(LLSD(uuid)); +	return removeItemByValue(LLSD(uuid), rearrange);  }  LLPanel* LLFlatListView::getItemByValue(const LLSD& value) const @@ -327,6 +327,9 @@ U32 LLFlatListView::size(const bool only_visible_items) const  void LLFlatListView::clear()  { +	// This will clear mSelectedItemPairs, calling all appropriate callbacks. +	resetSelection(); +	  	// do not use LLView::deleteAllChildren to avoid removing nonvisible items. drag-n-drop for ex.  	for (pairs_iterator_t it = mItemPairs.begin(); it != mItemPairs.end(); ++it)  	{ @@ -335,7 +338,6 @@ void LLFlatListView::clear()  		delete *it;  	}  	mItemPairs.clear(); -	mSelectedItemPairs.clear();  	// also set items panel height to zero. Reshape it to allow reshaping of non-item children  	LLRect rc = mItemsPanel->getRect(); @@ -970,11 +972,12 @@ bool LLFlatListView::isSelected(item_pair_t* item_pair) const  	return std::find(mSelectedItemPairs.begin(), it_end, item_pair) != it_end;  } -bool LLFlatListView::removeItemPair(item_pair_t* item_pair) +bool LLFlatListView::removeItemPair(item_pair_t* item_pair, bool rearrange)  {  	llassert(item_pair);  	bool deleted = false; +	bool selection_changed = false;  	for (pairs_iterator_t it = mItemPairs.begin(); it != mItemPairs.end(); ++it)  	{  		item_pair_t* _item_pair = *it; @@ -994,6 +997,7 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair)  		if (selected_item_pair == item_pair)  		{  			it = mSelectedItemPairs.erase(it); +			selection_changed = true;  			break;  		}  	} @@ -1002,8 +1006,16 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair)  	item_pair->first->die();  	delete item_pair; +	if (rearrange) +	{  	rearrangeItems();  	notifyParentItemsRectChanged(); +	} + +	if (selection_changed && mCommitOnSelectionChange) +	{ +		onCommit(); +	}  	return true;  } @@ -1080,7 +1092,7 @@ void LLFlatListView::onFocusReceived()  {  	if (size())  	{ -		mSelectedItemsBorder->setVisible(TRUE); +	mSelectedItemsBorder->setVisible(TRUE);  	}  	gEditMenuHandler = this;  } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index ded46d8122..50d06fbc94 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -117,6 +117,9 @@ public:  		Params();  	}; +	// disable traversal when finding widget to hand focus off to +	/*virtual*/ BOOL canFocusChildren() const { return FALSE; } +  	/**  	 * Connects callback to signal called when Return key is pressed.  	 */ @@ -149,19 +152,19 @@ public:  	 * Remove specified item  	 * @return true if the item was removed, false otherwise   	 */ -	virtual bool removeItem(LLPanel* item); +	virtual bool removeItem(LLPanel* item, bool rearrange = true);  	/**   	 * Remove an item specified by value  	 * @return true if the item was removed, false otherwise   	 */ -	virtual bool removeItemByValue(const LLSD& value); +	virtual bool removeItemByValue(const LLSD& value, bool rearrange = true);  	/**   	 * Remove an item specified by uuid  	 * @return true if the item was removed, false otherwise   	 */ -	virtual bool removeItemByUUID(const LLUUID& uuid); +	virtual bool removeItemByUUID(const LLUUID& uuid, bool rearrange = true);  	/**   	 * Get an item by value  @@ -262,6 +265,7 @@ public:  	void setAllowSelection(bool can_select) { mAllowSelection = can_select; }  	/** Sets flag whether onCommit should be fired if selection was changed */ +	// FIXME: this should really be a separate signal, since "Commit" implies explicit user action, and selection changes can happen more indirectly.  	void setCommitOnSelectionChange(bool b)		{ mCommitOnSelectionChange = b; }  	/** Get number of selected items in the list */ @@ -349,7 +353,7 @@ protected:  	virtual bool isSelected(item_pair_t* item_pair) const; -	virtual bool removeItemPair(item_pair_t* item_pair); +	virtual bool removeItemPair(item_pair_t* item_pair, bool rearrange);  	/**  	 * Notify parent about changed size of internal controls with "size_changes" action diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index ee70dadbd0..7fa3c2cf65 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -34,6 +34,7 @@  #include "llnotifications.h" +#include "llinstantmessage.h"  #include "llxmlnode.h"  #include "lluictrl.h"  #include "lluictrlfactory.h" @@ -41,6 +42,7 @@  #include "llsdserialize.h"  #include "lltrans.h"  #include "llnotificationslistener.h" +#include "llstring.h"  #include <algorithm>  #include <boost/regex.hpp> @@ -1488,7 +1490,14 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification)  void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first,  		const std::string& last, bool is_group)  { -	gCacheName->getFullName(id, mName); +	mName = first + " " + last; + +	LLStringUtil::trim(mName); +	if (mName.empty()) +	{ +		llwarns << "Empty name received for Id: " << id << llendl; +		mName = SYSTEM_FROM; +	}  	modifyNotificationParams();  	LLNotifications::instance().add(mParams);  	cleanup(); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index e220013274..d3b2a368a5 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -66,7 +66,10 @@ bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, cons  	{  		return a->getStart() < b->getStart();  	} -	return a->getEnd() < b->getEnd(); +	else +	{ +		return a->getEnd() < b->getEnd(); +	}  } @@ -174,7 +177,7 @@ LLTextBase::Params::Params()  LLTextBase::LLTextBase(const LLTextBase::Params &p)   :	LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)), -	mURLClickSignal(), +	mURLClickSignal(NULL),  	mMaxTextByteLength( p.max_text_length ),  	mDefaultFont(p.font),  	mFontShadow(p.font_shadow), @@ -209,7 +212,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mParseHTML(p.allow_html),  	mParseHighlights(p.parse_highlights),  	mBGVisible(p.bg_visible), -	mScroller(NULL) +	mScroller(NULL), +	mStyleDirty(true)  {  	if(p.allow_scroll)  	{ @@ -248,9 +252,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  LLTextBase::~LLTextBase()  { -	// Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder -  	mSegments.clear(); +	delete mURLClickSignal;  }  void LLTextBase::initFromParams(const LLTextBase::Params& p) @@ -296,13 +299,18 @@ bool LLTextBase::truncate()  	return did_truncate;  } -LLStyle::Params LLTextBase::getDefaultStyleParams() +const LLStyle::Params& LLTextBase::getDefaultStyleParams()  { -	return LLStyle::Params() -		.color(LLUIColor(&mFgColor)) -		.readonly_color(LLUIColor(&mReadOnlyFgColor)) -		.font(mDefaultFont) -		.drop_shadow(mFontShadow); +	if (mStyleDirty) +	{ +		  mDefaultStyle +				  .color(LLUIColor(&mFgColor)) +				  .readonly_color(LLUIColor(&mReadOnlyFgColor)) +				  .font(mDefaultFont) +				  .drop_shadow(mFontShadow); +		  mStyleDirty = false; +	} +	return mDefaultStyle;  }  void LLTextBase::onValueChange(S32 start, S32 end) @@ -861,11 +869,12 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)  	if (cur_segment && cur_segment->handleMouseUp(x, y, mask))  	{  		// Did we just click on a link? -		if (cur_segment->getStyle() +		if (mURLClickSignal +			&& cur_segment->getStyle()  		    && cur_segment->getStyle()->isLink())  		{  			// *TODO: send URL here? -			mURLClickSignal(this, LLSD() ); +			(*mURLClickSignal)(this, LLSD() );  		}  		return TRUE;  	} @@ -1039,12 +1048,14 @@ void LLTextBase::draw()  void LLTextBase::setColor( const LLColor4& c )  {  	mFgColor = c; +	mStyleDirty = true;  }  //virtual   void LLTextBase::setReadOnlyColor(const LLColor4 &c)  {  	mReadOnlyFgColor = c; +	mStyleDirty = true;  }  //virtual @@ -1488,12 +1499,22 @@ void LLTextBase::getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg  LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index)  { +	if (index > getLength()) { return mSegments.end(); } + +	// when there are no segments, we return the end iterator, which must be checked by caller +	if (mSegments.size() <= 1) { return mSegments.begin(); } +  	segment_set_t::iterator it = mSegments.upper_bound(new LLIndexSegment(index));  	return it;  }  LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 index) const  { +	if (index > getLength()) { return mSegments.end(); } + +	// when there are no segments, we return the end iterator, which must be checked by caller +	if (mSegments.size() <= 1) { return mSegments.begin(); } +  	LLTextBase::segment_set_t::const_iterator it =  mSegments.upper_bound(new LLIndexSegment(index));  	return it;  } @@ -2330,6 +2351,15 @@ LLRect LLTextBase::getVisibleDocumentRect() const  	}  } +boost::signals2::connection LLTextBase::setURLClickedCallback(const commit_signal_t::slot_type& cb) +{ +	if (!mURLClickSignal) +	{ +		mURLClickSignal = new commit_signal_t(); +	} +	return mURLClickSignal->connect(cb); +} +  //  // LLTextSegment  // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 300ee0f05f..4b0eeeb7d6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -361,10 +361,7 @@ public:  	virtual void			appendLineBreakSegment(const LLStyle::Params& style_params);  	virtual void			appendImageSegment(const LLStyle::Params& style_params);  	virtual void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo); - -public: -	// Fired when a URL link is clicked -	commit_signal_t mURLClickSignal; +	boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);  protected:  	// helper structs @@ -457,7 +454,7 @@ protected:  	void							createDefaultSegment();  	virtual void					updateSegments();  	void							insertSegment(LLTextSegmentPtr segment_to_insert); -	LLStyle::Params					getDefaultStyleParams(); +	const LLStyle::Params&			getDefaultStyleParams();  	//  manage lines  	S32								getLineStart( S32 line ) const; @@ -497,6 +494,12 @@ protected:  	LLRect						mVisibleTextRect;			// The rect in which text is drawn.  Excludes borders.  	LLRect						mTextBoundingRect; +	// default text style +	LLStyle::Params				mDefaultStyle; +	bool						mStyleDirty; +	const LLFontGL* const		mDefaultFont;		// font that is used when none specified, can only be set by constructor +	const LLFontGL::ShadowType	mFontShadow;		// shadow style, can only be set by constructor +  	// colors  	LLUIColor					mCursorColor;  	LLUIColor					mFgColor; @@ -523,8 +526,6 @@ protected:  	LLFontGL::VAlign			mVAlign;  	F32							mLineSpacingMult;	// multiple of line height used as space for a single line of text (e.g. 1.5 to get 50% padding)  	S32							mLineSpacingPixels;	// padding between lines -	const LLFontGL*				mDefaultFont;		// font that is used when none specified -	LLFontGL::ShadowType		mFontShadow;  	bool						mBorderVisible;  	bool                		mParseHTML;			// make URLs interactive  	bool						mParseHighlights;	// highlight user-defined keywords @@ -547,6 +548,9 @@ protected:  	bool						mScrollNeeded;		// need to change scroll region because of change to cursor position  	S32							mScrollIndex;		// index of first character to keep visible in scroll region +	// Fired when a URL link is clicked +	commit_signal_t*			mURLClickSignal; +  };  #endif diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index c9474d66b7..130cda3784 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -264,8 +264,6 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :  	mContextMenu(NULL),  	mShowContextMenu(p.show_context_menu)  { -	mDefaultFont = p.font; -  	mSourceID.generate();  	//FIXME: use image? diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 3ade46d367..ff330f863a 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -675,7 +675,7 @@ BOOL LLUICtrl::getIsChrome() const  class CompareByDefaultTabGroup: public LLCompareByTabOrder  {  public: -	CompareByDefaultTabGroup(LLView::child_tab_order_t order, S32 default_tab_group): +	CompareByDefaultTabGroup(const LLView::child_tab_order_t& order, S32 default_tab_group):  			LLCompareByTabOrder(order),  			mDefaultTabGroup(default_tab_group) {}  private: @@ -699,13 +699,16 @@ class LLUICtrl::DefaultTabGroupFirstSorter : public LLQuerySorter, public LLSing  {  public:  	/*virtual*/ void operator() (LLView * parent, viewList_t &children) const -	{ +	{	  		children.sort(CompareByDefaultTabGroup(parent->getCtrlOrder(), parent->getDefaultTabGroup()));  	}  }; +LLFastTimer::DeclareTimer FTM_FOCUS_FIRST_ITEM("Focus First Item"); +  BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)  { +	LLFastTimer _(FTM_FOCUS_FIRST_ITEM);  	// try to select default tab group child  	LLCtrlQuery query = getTabOrderQuery();  	// sort things such that the default tab group is at the front diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index c99acee48e..dc43b311a7 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -182,7 +182,7 @@ public:  	void popFactoryFunctions();  	template<typename T> -	static T* createWidget(typename T::Params& params, LLView* parent = NULL) +	static T* createWidget(const typename T::Params& params, LLView* parent = NULL)  	{  		T* widget = NULL; diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index f7a53e87de..ac9e71665f 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -135,9 +135,16 @@ void LLUIString::updateResult() const  	mResult = mOrig;  	// get the defailt args + local args -	LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); -	combined_args.insert(mArgs.begin(), mArgs.end()); -	LLStringUtil::format(mResult, combined_args); +	if (mArgs.empty()) +	{ +		LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); +	} +	else +	{ +		LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); +		combined_args.insert(mArgs.begin(), mArgs.end()); +		LLStringUtil::format(mResult, combined_args); +	}  }  void LLUIString::updateWResult() const diff --git a/indra/llui/llview.h b/indra/llui/llview.h index aba6c310f1..8e705ed701 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -265,7 +265,7 @@ public:  	virtual BOOL	postBuild() { return TRUE; } -	child_tab_order_t getCtrlOrder() const		{ return mCtrlOrder; } +	const child_tab_order_t& getCtrlOrder() const		{ return mCtrlOrder; }  	ctrl_list_t getCtrlList() const;  	ctrl_list_t getCtrlListSorted() const; @@ -620,12 +620,13 @@ public:  class LLCompareByTabOrder  {  public: -	LLCompareByTabOrder(LLView::child_tab_order_t order) : mTabOrder(order) {} +	LLCompareByTabOrder(const LLView::child_tab_order_t& order) : mTabOrder(order) {}  	virtual ~LLCompareByTabOrder() {}  	bool operator() (const LLView* const a, const LLView* const b) const;  private:  	virtual bool compareTabOrders(const LLView::tab_order_t & a, const LLView::tab_order_t & b) const { return a < b; } -	LLView::child_tab_order_t mTabOrder; +	// ok to store a reference, as this should only be allocated on stack during view query operations +	const LLView::child_tab_order_t& mTabOrder;  };  template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) const diff --git a/indra/llui/llviewquery.cpp b/indra/llui/llviewquery.cpp index bdb3d223a6..1b44cc528e 100644 --- a/indra/llui/llviewquery.cpp +++ b/indra/llui/llviewquery.cpp @@ -95,8 +95,8 @@ viewList_t LLViewQuery::run(LLView* view) const  		if (pre.first)  		{  			post = runFilters(view, filtered_children, mPostFilters); +			}  		} -	}  	if(pre.first && post.first)   	{ @@ -119,12 +119,12 @@ void LLViewQuery::filterChildren(LLView * view, viewList_t & filtered_children)  		(*mSorterp)(view, views); // sort the children per the sorter  	}  	for(LLView::child_list_iter_t iter = views.begin(); -			iter != views.end(); -			iter++) -		{ -			viewList_t indiv_children = this->run(*iter); -			filtered_children.insert(filtered_children.end(), indiv_children.begin(), indiv_children.end()); -		} +		iter != views.end(); +		iter++) +	{ +		viewList_t indiv_children = this->run(*iter); +		filtered_children.splice(filtered_children.end(), indiv_children); +	}  }  filterResult_t LLViewQuery::runFilters(LLView * view, const viewList_t children, const filterList_t filters) const diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h index 98d9bf8796..68af31933d 100644 --- a/indra/llui/llviewquery.h +++ b/indra/llui/llviewquery.h @@ -122,7 +122,7 @@ public:  	viewList_t operator () (LLView * view) const { return run(view); }  	// override this method to provide iteration over other types of children -	virtual void filterChildren(LLView * view, viewList_t & filtered_children) const; +	virtual void filterChildren(LLView * view, viewList_t& filtered_children) const;  private: diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c2236233dc..810b2d9a1d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4678,7 +4678,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> +      <string>http://marketplace.secondlife.com/</string>      </map>      <key>MarketplaceURL_objectFemale</key>      <map> @@ -4733,7 +4733,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> +      <string>http://marketplace.secondlife.com</string>      </map>      <key>MarketplaceURL_bodypartMale</key>      <map> @@ -4744,7 +4744,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> +      <string>http://marketplace.secondlife.com/</string>      </map>      <key>MarketplaceURL_glovesMale</key>      <map> @@ -11869,5 +11869,16 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>TipToastMessageLineCount</key> +    <map> +      <key>Comment</key> +      <string>Max line count of text message on tip toast.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>  </map>  </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7c92a5a756..a4bf56fc96 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3406,6 +3406,9 @@ void LLAgent::setTeleportState(ETeleportState state)  	}  	else if(mTeleportState == TELEPORT_ARRIVING)  	{ +		// First two position updates after a teleport tend to be weird +		LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2; +  		// Let the interested parties know we've teleported.  		LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal());  	} diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 0a2f0e9399..d911d123f4 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -48,7 +48,7 @@ public:  	virtual ~LLOrderMyOutfitsOnDestroy()  	{ -		if (LLApp::isExiting()) +		if (!LLApp::isRunning())  		{  			llwarns << "called during shutdown, skipping" << llendl;  			return; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e1635461db..78edcb3e25 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -999,7 +999,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  			{  				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false);  			} -			addCOFItemLink(item_to_wear, do_update); +			addCOFItemLink(item_to_wear, do_update, cb);  		}   		break;  	case LLAssetType::AT_BODYPART: @@ -2183,17 +2183,19 @@ void LLAppearanceMgr::updateIsDirty()  	}  	else  	{ +		LLIsOfAssetType collector = LLIsOfAssetType(LLAssetType::AT_LINK); +  		LLInventoryModel::cat_array_t cof_cats;  		LLInventoryModel::item_array_t cof_items; -		gInventory.collectDescendents(cof, cof_cats, cof_items, -									  LLInventoryModel::EXCLUDE_TRASH); +		gInventory.collectDescendentsIf(cof, cof_cats, cof_items, +									  LLInventoryModel::EXCLUDE_TRASH, collector);  		LLInventoryModel::cat_array_t outfit_cats;  		LLInventoryModel::item_array_t outfit_items; -		gInventory.collectDescendents(base_outfit, outfit_cats, outfit_items, -									  LLInventoryModel::EXCLUDE_TRASH); +		gInventory.collectDescendentsIf(base_outfit, outfit_cats, outfit_items, +									  LLInventoryModel::EXCLUDE_TRASH, collector); -		if(outfit_items.count() != cof_items.count() -1) +		if(outfit_items.count() != cof_items.count())  		{  			// Current outfit folder should have one more item than the outfit folder.  			// this one item is the link back to the outfit folder itself. @@ -2201,16 +2203,6 @@ void LLAppearanceMgr::updateIsDirty()  			return;  		} -		//getting rid of base outfit folder link to simplify comparison -		for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) -		{ -			if (*it == base_outfit_item) -			{ -				cof_items.erase(it); -				break; -			} -		} -  		//"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions)  		std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid);  		std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 3275d784a3..99156b9d9d 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -211,7 +211,7 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)  void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)  {  	LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL; -	LLAvalineListItem* item = new LLAvalineListItem; +	LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);  	item->setAvatarId(item_id, session_id, true, false);  	item->setName(item_name); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 6897f4ee8e..2826899cb0 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1886,7 +1886,7 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)  	if("end" == action)  	{ -		LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); +		LLScriptFloaterManager::instance().removeNotification(getSessionId());  	}  } @@ -1969,7 +1969,7 @@ void LLInvOfferChiclet::onMenuItemClicked(const LLSD& user_data)  	if("end" == action)  	{ -		LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); +		LLScriptFloaterManager::instance().removeNotification(getSessionId());  	}  } diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 629a92db11..893400185c 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -284,7 +284,8 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),  	mAttachmentsTab(NULL),  	mBodyPartsTab(NULL),  	mLastSelectedTab(NULL), -	mAccordionCtrl(NULL) +	mAccordionCtrl(NULL), +	mCOFVersion(-1)  {  	mClothingMenu = new CofClothingContextMenu(this);  	mAttachmentMenu = new CofAttachmentContextMenu(this); @@ -381,6 +382,23 @@ void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expa  void LLCOFWearables::refresh()  { +	const LLUUID cof_id = LLAppearanceMgr::instance().getCOF(); +	if (cof_id.isNull()) +	{ +		llwarns << "COF ID cannot be NULL" << llendl; +		return; +	} + +	LLViewerInventoryCategory* catp = gInventory.getCategory(cof_id); +	if (!catp) +	{ +		llwarns << "COF category cannot be NULL" << llendl; +		return; +	} + +	if (mCOFVersion == catp->getVersion()) return; +	mCOFVersion = catp->getVersion(); +  	typedef std::vector<LLSD> values_vector_t;  	typedef std::map<LLFlatListView*, values_vector_t> selection_map_t; @@ -396,7 +414,7 @@ void LLCOFWearables::refresh()  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t cof_items; -	gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, cof_items, LLInventoryModel::EXCLUDE_TRASH); +	gInventory.collectDescendents(cof_id, cats, cof_items, LLInventoryModel::EXCLUDE_TRASH);  	populateAttachmentsAndBodypartsLists(cof_items); @@ -504,7 +522,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory  	item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);  	//turning on gray separator line for the last item in the items group of the same wearable type -	item_panel->childSetVisible("wearable_type_separator_icon", last); +	item_panel->setSeparatorVisible(last);  	return item_panel;  } diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h index 9a259600a9..cd7cc060e5 100644 --- a/indra/newview/llcofwearables.h +++ b/indra/newview/llcofwearables.h @@ -82,6 +82,7 @@ public:  	LLPanel* getSelectedItem();  	void getSelectedItems(std::vector<LLPanel*>& selected_items) const; +	/* Repopulate the COF wearables list if the COF category has been changed since the last refresh */  	void refresh();  	void clear(); @@ -127,6 +128,9 @@ protected:  	LLListContextMenu* mBodyPartMenu;  	LLAccordionCtrl*	mAccordionCtrl; + +	/* COF category version since last refresh */ +	S32 mCOFVersion;  }; diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp index 22f2bb1d16..4f4c7dead7 100644 --- a/indra/newview/lldndbutton.cpp +++ b/indra/newview/lldndbutton.cpp @@ -42,7 +42,7 @@ LLDragAndDropButton::Params::Params()  } -LLDragAndDropButton::LLDragAndDropButton(Params& params) +LLDragAndDropButton::LLDragAndDropButton(const Params& params)  : LLButton(params)  { diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h index c888268187..433b3f7ff5 100644 --- a/indra/newview/lldndbutton.h +++ b/indra/newview/lldndbutton.h @@ -54,7 +54,7 @@ public:  		Params();  	}; -	LLDragAndDropButton(Params& params); +	LLDragAndDropButton(const Params& params);  	typedef boost::function<bool (  		S32 /*x*/, S32 /*y*/, MASK /*mask*/, BOOL /*drop*/, diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 149ba2478d..92fda31cc2 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -140,7 +140,13 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons  	// LLTextBox::setText will obliterate the expander segment, so make sure  	// we generate it again by clearing mExpanderVisible  	mExpanderVisible = false; -	LLTextEditor::setText(text, input_params); + +	// Workaround for EXT-8259: trim text before rendering it. +	{ +		std::string trimmed_text(text); +		LLStringUtil::trim(trimmed_text); +		LLTextEditor::setText(trimmed_text, input_params); +	}  	// text contents have changed, segments are cleared out  	// so hide the expander and determine if we need it diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 24cd7b8018..f1d39a41ae 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -263,6 +263,7 @@ public:  	BOOL needsAutoRename() { return mNeedsAutoRename; }  	void setNeedsAutoRename(BOOL val) { mNeedsAutoRename = val; }  	void setPinningSelectedItem(BOOL val) { mPinningSelectedItem = val; } +	void setAutoSelectOverride(BOOL val) { mAutoSelectOverride = val; }  	void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index a2b72e7d74..21313f9df7 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1022,6 +1022,14 @@ void LLIMModel::sendMessage(const std::string& utf8_text,  		}  		else  		{ +			// IM_SESSION_INVITE means that this is an Ad-hoc incoming chat +			//		(it can be also Group chat but it is checked above) +			// In this case mInitialTargetIDs contains Ad-hoc session ID and it should not be added +			// to Recent People to prevent showing of an item with (???)(???). See EXT-8246. +			// Concrete participants will be added into this list once they sent message in chat. +			if (IM_SESSION_INVITE == dialog) return; + +			// implemented adding of all participants of an outgoing to Recent People List. See EXT-5694.  			for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();  				it!=session->mInitialTargetIDs.end();++it)  			{ diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index a2b5ffbac4..cb7b338e95 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -161,8 +161,7 @@ BOOL LLInspectObject::postBuild(void)  	// Hide floater when name links clicked  	LLTextBox* textbox = getChild<LLTextBox>("object_creator"); -	textbox->mURLClickSignal.connect( -		boost::bind(&LLInspectObject::closeFloater, this, false) ); +	textbox->setURLClickedCallback(boost::bind(&LLInspectObject::closeFloater, this, false) );  	// Hook up functionality  	getChild<LLUICtrl>("buy_btn")->setCommitCallback( diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index ba357b2361..3d350606c6 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -519,6 +519,19 @@ bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  	return TRUE;  } +bool LLIsOfAssetType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ +	if(mType == LLAssetType::AT_CATEGORY) +	{ +		if(cat) return TRUE; +	} +	if(item) +	{ +		if(item->getActualType() == mType) return TRUE; +	} +	return FALSE; +} +  bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  {  	if(mType == LLAssetType::AT_CATEGORY) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 1c3f82c531..4a7721098d 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -174,6 +174,25 @@ protected:  	LLAssetType::EType mType;  }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsOfAssetType +// +// Implementation of a LLInventoryCollectFunctor which returns TRUE if +// the item or category is of asset type passed in during construction. +// Link types are treated as links, not as the types they point to. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLIsOfAssetType : public LLInventoryCollectFunctor +{ +public: +	LLIsOfAssetType(LLAssetType::EType type) : mType(type) {} +	virtual ~LLIsOfAssetType() {} +	virtual bool operator()(LLInventoryCategory* cat, +							LLInventoryItem* item); +protected: +	LLAssetType::EType mType; +}; +  class LLIsTypeWithPermissions : public LLInventoryCollectFunctor  {  public: @@ -271,9 +290,7 @@ public:  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLFindNonLinksByMask -// -// +// Class LLFindByMask  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLFindByMask : public LLInventoryCollectFunctor  { @@ -382,6 +399,19 @@ public:  	}  }; +/* Filters out items of a particular asset type */ +class LLIsTypeActual : public LLIsType +{ +public: +	LLIsTypeActual(LLAssetType::EType type) : LLIsType(type) {} +	virtual ~LLIsTypeActual() {} +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if (item && item->getIsLinkType()) return false; +		return LLIsType::operator()(cat, item); +	} +}; +  // Collect non-removable folders and items.  class LLFindNonRemovableObjects : public LLInventoryCollectFunctor  { diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index fbb3774917..e01f05c0f2 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -107,9 +107,12 @@ void LLInventoryItemsList::idle(void* user_data)  	}  } +LLFastTimer::DeclareTimer FTM_INVENTORY_ITEMS_REFRESH("Inventory List Refresh"); +  void LLInventoryItemsList::refresh()  { -	static const unsigned ADD_LIMIT = 50; +	LLFastTimer _(FTM_INVENTORY_ITEMS_REFRESH); +	static const unsigned ADD_LIMIT = 20;  	uuid_vec_t added_items;  	uuid_vec_t removed_items; @@ -140,7 +143,8 @@ void LLInventoryItemsList::refresh()  	it = removed_items.begin();  	for( ; removed_items.end() != it; ++it)  	{ -		removeItemByUUID(*it); +		// don't filter items right away +		removeItemByUUID(*it, false);  	}  	// Filter, rearrange and notify parent about shape changes diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index c487aa10a7..e4a7a158a3 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -51,7 +51,12 @@ static const S32 WIDGET_SPACING = 3;  LLPanelInventoryListItemBase::Params::Params()  :	default_style("default_style"), -	worn_style("worn_style") +	worn_style("worn_style"), +	hover_image("hover_image"), +	selected_image("selected_image"), +	separator_image("separator_image"), +	item_icon("item_icon"), +	item_name("item_name")  {};  LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item) @@ -59,8 +64,10 @@ LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInven  	LLPanelInventoryListItemBase* list_item = NULL;  	if (item)  	{ -		list_item = new LLPanelInventoryListItemBase(item); -		list_item->init(); +		const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>(); +		list_item = new LLPanelInventoryListItemBase(item, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  } @@ -76,6 +83,25 @@ void LLPanelInventoryListItemBase::draw()  		}  		setNeedsRefresh(false);  	} + +	if (mHovered && mHoverImage) +	{ +		mHoverImage->draw(getLocalRect()); +	} + +	if (mSelected && mSelectedImage) +	{ +		mSelectedImage->draw(getLocalRect()); +	} + +	if (mSeparatorVisible && mSeparatorImage) +	{ +		// stretch along bottom of listitem, using image height +		LLRect separator_rect = getLocalRect(); +		separator_rect.mTop = mSeparatorImage->getHeight(); +		mSeparatorImage->draw(separator_rect); +	} +	  	LLPanel::draw();  } @@ -134,9 +160,6 @@ void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show)  BOOL LLPanelInventoryListItemBase::postBuild()  { -	setIconCtrl(getChild<LLIconCtrl>("item_icon")); -	setTitleCtrl(getChild<LLTextBox>("item_name")); -  	LLViewerInventoryItem* inv_item = getItem();  	if (inv_item)  	{ @@ -156,18 +179,18 @@ void LLPanelInventoryListItemBase::setValue(const LLSD& value)  {  	if (!value.isMap()) return;  	if (!value.has("selected")) return; -	childSetVisible("selected_icon", value["selected"]); +	mSelected = value["selected"];  }  void LLPanelInventoryListItemBase::onMouseEnter(S32 x, S32 y, MASK mask)  { -	childSetVisible("hovered_icon", true); +	mHovered = true;  	LLPanel::onMouseEnter(x, y, mask);  }  void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask)  { -	childSetVisible("hovered_icon", false); +	mHovered = false;  	LLPanel::onMouseLeave(x, y, mask);  } @@ -244,21 +267,47 @@ S32 LLPanelInventoryListItemBase::notify(const LLSD& info)  	return rv;  } -LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item) -: LLPanel() -, mInventoryItemUUID(item ? item->getUUID() : LLUUID::null) -, mIconCtrl(NULL) -, mTitleCtrl(NULL) -, mWidgetSpacing(WIDGET_SPACING) -, mLeftWidgetsWidth(0) -, mRightWidgetsWidth(0) -, mNeedsRefresh(false) +LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const LLPanelInventoryListItemBase::Params& params) +:	LLPanel(params), +	mInventoryItemUUID(item ? item->getUUID() : LLUUID::null), +	mIconCtrl(NULL), +	mTitleCtrl(NULL), +	mWidgetSpacing(WIDGET_SPACING), +	mLeftWidgetsWidth(0), +	mRightWidgetsWidth(0), +	mNeedsRefresh(false), +	mHovered(false), +	mSelected(false), +	mSeparatorVisible(false), +	mHoverImage(params.hover_image), +	mSelectedImage(params.selected_image), +	mSeparatorImage(params.separator_image)  { -} +	LLIconCtrl::Params icon_params(params.item_icon); +	applyXUILayout(icon_params, this); -void LLPanelInventoryListItemBase::init() -{ -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml"); +	mIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params); +	if (mIconCtrl) +	{ +		addChild(mIconCtrl); +	} +	else +	{ +		mIconCtrl = dynamic_cast<LLIconCtrl*>(LLUICtrlFactory::createDefaultWidget<LLIconCtrl>("item_icon")); +	} + +	LLTextBox::Params text_params(params.item_name); +	applyXUILayout(text_params, this); + +	mTitleCtrl = LLUICtrlFactory::create<LLTextBox>(text_params); +	if (mTitleCtrl) +	{ +		addChild(mTitleCtrl); +	} +	else +	{ +		mTitleCtrl = dynamic_cast<LLTextBox*>(LLUICtrlFactory::createDefaultWidget<LLTextBox>("item_title")); +	}  }  class WidgetVisibilityChanger diff --git a/indra/newview/llinventorylistitem.h b/indra/newview/llinventorylistitem.h index f29d92d51c..575f6aec19 100644 --- a/indra/newview/llinventorylistitem.h +++ b/indra/newview/llinventorylistitem.h @@ -41,12 +41,12 @@  // llui  #include "llpanel.h"  #include "llstyle.h" +#include "lliconctrl.h" +#include "lltextbox.h"  // newview  #include "llwearabletype.h" -class LLIconCtrl; -class LLTextBox;  class LLViewerInventoryItem;  /** @@ -70,6 +70,11 @@ public:  	{  		Optional<LLStyle::Params>	default_style,  									worn_style; +		Optional<LLUIImage*>		hover_image, +									selected_image, +									separator_image; +		Optional<LLIconCtrl::Params>	item_icon; +		Optional<LLTextBox::Params>		item_name;  		Params();  	}; @@ -149,30 +154,22 @@ public:  	/** Get the associated inventory item */  	LLViewerInventoryItem* getItem() const; +	void setSeparatorVisible(bool visible) { mSeparatorVisible = visible; } +  	virtual ~LLPanelInventoryListItemBase(){}  protected: -	LLPanelInventoryListItemBase(LLViewerInventoryItem* item); +	LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const Params& params);  	typedef std::vector<LLUICtrl*> widget_array_t;  	/** -	 * Use it from a factory function to build panel, do not build panel in constructor -	 */ -	virtual void init(); - -	/**  	 * Called after inventory item was updated, update panel widgets to reflect inventory changes.  	 */  	virtual void updateItem(const std::string& name,  							EItemState item_state = IS_DEFAULT); -	/** setter for mIconCtrl */ -	void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; } -	/** setter for MTitleCtrl */ -	void setTitleCtrl(LLTextBox* tb) { mTitleCtrl = tb; } -  	void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; }  	void setRightWidgetsWidth(S32 width) { mRightWidgetsWidth = width; } @@ -221,6 +218,14 @@ private:  	LLTextBox*		mTitleCtrl;  	LLUIImagePtr	mIconImage; +	LLUIImagePtr	mHoverImage; +	LLUIImagePtr	mSelectedImage; +	LLUIImagePtr	mSeparatorImage; + +	bool			mHovered; +	bool			mSelected; +	bool			mSeparatorVisible; +  	std::string		mHighlightedText;  	widget_array_t	mLeftSideWidgets; diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index b8590d838e..46ebb54786 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -1052,7 +1052,7 @@ void LLLocationInputCtrl::changeLocationPresentation()  		//needs unescaped one  		LLSLURL slurl;  		LLAgentUI::buildSLURL(slurl, false); -		mTextEntry->setText(slurl.getSLURLString()); +		mTextEntry->setText(LLURI::unescape(slurl.getSLURLString()));  		mTextEntry->selectAll();  		mMaturityButton->setVisible(FALSE); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 8a52cf715f..6c1fb69c02 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -393,8 +393,6 @@ LLGestureComboList::~LLGestureComboList()  LLCtrlListInterface* LLGestureComboList::getListInterface()  { -	LLCtrlListInterface *result = mList; -	llassert((LLCtrlListInterface*)mList==result);  	return mList;  }; diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp index e0658554a4..8ba2e6d01c 100644 --- a/indra/newview/llpanelgenerictip.cpp +++ b/indra/newview/llpanelgenerictip.cpp @@ -35,6 +35,7 @@  #include "llpanelgenerictip.h"  #include "llnotifications.h" +#include "llviewercontrol.h" // for gSavedSettings  LLPanelGenericTip::LLPanelGenericTip( @@ -45,7 +46,8 @@ LLPanelGenericTip::LLPanelGenericTip(  	childSetValue("message", notification->getMessage()); -	// set line max count to 3 in case of a very long name -	snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + +	S32 max_line_count =  gSavedSettings.getS32("TipToastMessageLineCount"); +	snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count);  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 17ec0d3a56..56b73fe55b 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -197,14 +197,15 @@ BOOL LLPanelMainInventory::postBuild()  		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));  	} +	initListCommandsHandlers(); +  	// *TODO:Get the cost info from the server  	const std::string upload_cost("10"); -	childSetLabelArg("Upload Image", "[COST]", upload_cost); -	childSetLabelArg("Upload Sound", "[COST]", upload_cost); -	childSetLabelArg("Upload Animation", "[COST]", upload_cost); -	childSetLabelArg("Bulk Upload", "[COST]", upload_cost); +	mMenuAdd->getChild<LLMenuItemGL>("Upload Image")->setLabelArg("[COST]", upload_cost); +	mMenuAdd->getChild<LLMenuItemGL>("Upload Sound")->setLabelArg("[COST]", upload_cost); +	mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost); +	mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost); -	initListCommandsHandlers();  	return TRUE;  } diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp index 6ba015b11c..b21fd7d385 100644 --- a/indra/newview/llpanelonlinestatus.cpp +++ b/indra/newview/llpanelonlinestatus.cpp @@ -34,6 +34,7 @@  #include "llnotifications.h"  #include "llpanelonlinestatus.h" +#include "llviewercontrol.h" // for gSavedSettings  LLPanelOnlineStatus::LLPanelOnlineStatus(  		const LLNotificationPtr& notification) : @@ -54,7 +55,7 @@ LLPanelOnlineStatus::LLPanelOnlineStatus(  				notification, notification->getResponseTemplate()));  	} -	// set line max count to 3 in case of a very long name -	snapToMessageHeight(getChild<LLTextBox> ("message"), 3); +	S32 max_line_count =  gSavedSettings.getS32("TipToastMessageLineCount"); +	snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count);  } diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 5195b719d4..8b9baef54a 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -71,6 +71,7 @@  #include "llsdutil.h"  #include "llsidepanelappearance.h"  #include "lltoggleablemenu.h" +#include "llvoavatarself.h"  #include "llwearablelist.h"  #include "llwearableitemslist.h"  #include "llwearabletype.h" @@ -263,7 +264,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()  	observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this));  	observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));  	observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); -	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this)); +	observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::onCOFChanged, this));  	gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true));  	gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false)); @@ -297,9 +298,9 @@ BOOL LLPanelOutfitEdit::postBuild()  	mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK);  	//order is important, see EListViewItemType for order information -	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK))); -	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING))); -	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindNonLinksByMask(ALL_ITEMS_MASK))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsTypeActual(LLAssetType::AT_CLOTHING))); +	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsTypeActual(LLAssetType::AT_BODYPART)));  	mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));;  	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE)));  	mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN))); @@ -331,7 +332,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);  	childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); -	setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this)); +	setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2));  	mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list");  	mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); @@ -347,8 +348,8 @@ BOOL LLPanelOutfitEdit::postBuild()  	mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view");  	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);  	mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); -	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); -	mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); +	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this)); +	mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this));  	mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); @@ -388,7 +389,7 @@ BOOL LLPanelOutfitEdit::postBuild()  	mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel");  	mWearableItemsList = getChild<LLInventoryItemsList>("list_view");  	mWearableItemsList->setCommitOnSelectionChange(true); -	mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); +	mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this));  	mWearableItemsList->setDoubleClickCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));  	mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this)); @@ -442,6 +443,9 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)  		mListViewFilterCmbBox->setVisible(false);  		showWearablesFilter(); + +		// Reset mWearableItemsList position to top. See EXT-8180. +		mWearableItemsList->goToTop();  	}  	//switching button bars @@ -583,11 +587,16 @@ void LLPanelOutfitEdit::onPlusBtnClicked(void)  	}  } -void LLPanelOutfitEdit::onVisibilityChange() +void LLPanelOutfitEdit::onVisibilityChange(const LLSD &in_visible_chain)  {  	showAddWearablesPanel(false);  	mWearableItemsList->resetSelection();  	mInventoryItemsPanel->clearSelection(); + +	if (in_visible_chain.asBoolean()) +	{ +		update(); +	}  }  void LLPanelOutfitEdit::onAddWearableClicked(void) @@ -614,15 +623,52 @@ void LLPanelOutfitEdit::onShopButtonClicked()  {  	static LLShopURLDispatcher url_resolver; +	// will contain the resultant URL  	std::string url; + +	if (isAgentAvatarValid()) +	{ +		// try to get wearable type from 'Add More' panel first (EXT-7639) +		LLWearableType::EType type = getAddMorePanelSelectionType(); + +		if (type == LLWearableType::WT_NONE) +		{ +			type = getCOFWearablesSelectionType(); +		} + +		ESex sex = gAgentAvatarp->getSex(); + +		// WT_INVALID comes for attachments +		if (type != LLWearableType::WT_INVALID && type != LLWearableType::WT_NONE) +		{ +			url = url_resolver.resolveURL(type, sex); +		} + +		if (url.empty()) +		{ +			url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex); +		} +	} +	else +	{ +		llwarns << "Agent avatar is invalid" << llendl; + +		// the second argument is not important in this case: generic market place will be opened +		url = url_resolver.resolveURL(LLWearableType::WT_NONE, SEX_FEMALE); +	} + +	LLWeb::loadURLExternal(url); +} + +LLWearableType::EType LLPanelOutfitEdit::getCOFWearablesSelectionType() const +{  	std::vector<LLPanel*> selected_items; -	mCOFWearables->getSelectedItems(selected_items); +	LLWearableType::EType type = LLWearableType::WT_NONE; -	ESex sex = gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE; +	mCOFWearables->getSelectedItems(selected_items);  	if (selected_items.size() == 1)  	{ -		LLWearableType::EType type = LLWearableType::WT_NONE;  		LLPanel* item = selected_items.front();  		// LLPanelDummyClothingListItem is lower then LLPanelInventoryListItemBase in hierarchy tree @@ -634,20 +680,45 @@ void LLPanelOutfitEdit::onShopButtonClicked()  		{  			type = real_item->getWearableType();  		} +	} -		// WT_INVALID comes for attachments -		if (type != LLWearableType::WT_INVALID) +	return type; +} + +LLWearableType::EType LLPanelOutfitEdit::getAddMorePanelSelectionType() const +{ +	LLWearableType::EType type = LLWearableType::WT_NONE; + +	if (mAddWearablesPanel != NULL && mAddWearablesPanel->getVisible()) +	{ +		if (mInventoryItemsPanel != NULL && mInventoryItemsPanel->getVisible())  		{ -			url = url_resolver.resolveURL(type, sex); +			std::set<LLUUID> selected_uuids = mInventoryItemsPanel->getRootFolder()->getSelectionList(); + +			if (selected_uuids.size() == 1) +			{ +				type = getWearableTypeByItemUUID(*(selected_uuids.begin())); +			}  		} -	} +		else if (mWearableItemsList != NULL && mWearableItemsList->getVisible()) +		{ +			std::vector<LLUUID> selected_uuids; +			mWearableItemsList->getSelectedUUIDs(selected_uuids); -	if (url.empty()) -	{ -		url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex); +			if (selected_uuids.size() == 1) +			{ +				type = getWearableTypeByItemUUID(selected_uuids.front()); +			} +		}  	} -	LLWeb::loadURLExternal(url); +	return type; +} + +LLWearableType::EType LLPanelOutfitEdit::getWearableTypeByItemUUID(const LLUUID& item_uuid) const +{ +	LLViewerInventoryItem* item = gInventory.getLinkedItem(item_uuid); +	return (item != NULL) ? item->getWearableType() : LLWearableType::WT_NONE;  }  void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) @@ -667,7 +738,7 @@ void LLPanelOutfitEdit::onEditWearableClicked(void)  	}  } -void LLPanelOutfitEdit::onInventorySelectionChange() +void LLPanelOutfitEdit::updatePlusButton()  {  	uuid_vec_t selected_items;  	getSelectedItemsUUID(selected_items); @@ -910,6 +981,9 @@ void LLPanelOutfitEdit::updateVerbs()  	mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing"));  	updateCurrentOutfitName(); + +	//updating state of "Wear Item" button previously known as "Plus" button +	updatePlusButton();  }  bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel) @@ -957,9 +1031,6 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type  	showAddWearablesPanel(true);  	showWearablesListView(); -	// Reset mWearableItemsList position to top. See EXT-8180. -	mWearableItemsList->goToTop(); -  	//e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE  	applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));  } @@ -1026,5 +1097,13 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list)  //	return selected_id;  } +void LLPanelOutfitEdit::onCOFChanged() +{ +	//the panel is only updated when is visible to a user +	if (!isInVisibleChain()) return; + +	update(); +} +  // EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 5009de0fef..0efc6dc189 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -145,10 +145,10 @@ public:  	void onFolderViewFilterCommitted(LLUICtrl* ctrl);  	void onListViewFilterCommitted(LLUICtrl* ctrl);  	void onSearchEdit(const std::string& string); -	void onInventorySelectionChange(); +	void updatePlusButton();  	void onPlusBtnClicked(void); -	void onVisibilityChange(); +	void onVisibilityChange(const LLSD &in_visible_chain);  	void applyFolderViewFilter(EFolderViewItemType type);  	void applyListViewFilter(EListViewItemType type); @@ -198,6 +198,11 @@ private:  	void onOutfitChanging(bool started);  	void getSelectedItemsUUID(uuid_vec_t& uuid_list);  	void getCurrentItemUUID(LLUUID& selected_id); +	void onCOFChanged(); + +	LLWearableType::EType getCOFWearablesSelectionType() const; +	LLWearableType::EType getAddMorePanelSelectionType() const; +	LLWearableType::EType getWearableTypeByItemUUID(const LLUUID& item_uuid) const;  	LLTextBox*			mCurrentOutfitName;  	LLTextBox*			mStatus; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 8fe78a0f81..f2e6969998 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -582,7 +582,7 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)  	else  	{  		std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id); -		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? display_name : LLTrans::getString("AvatarNameWaiting")); +		mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name);  		mAvalineUpdater->watchAvalineCaller(avatar_id);  	}  	adjustParticipant(avatar_id); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index ef6ceb5f2e..7fdc5c8b5f 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -75,7 +75,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)  	  mLastWidth(0),  	  mAspectRatio(0.f),  	  mPreviewToSave(FALSE), -	  mImage(NULL) +	  mImage(NULL), +	  mImageOldBoostLevel(LLViewerTexture::BOOST_NONE)  {  	updateImageID();  	if (key.has("save_as")) @@ -93,7 +94,7 @@ LLPreviewTexture::~LLPreviewTexture()  	{  		getWindow()->decBusyCount();  	} - +	mImage->setBoostLevel(mImageOldBoostLevel);  	mImage = NULL;  } @@ -543,6 +544,7 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata)  void LLPreviewTexture::loadAsset()  {  	mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	mImageOldBoostLevel = mImage->getBoostLevel();  	mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);  	mImage->forceToSaveRawImage(0) ;  	mAssetStatus = PREVIEW_ASSET_LOADING; diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 0f29a741c1..cbdb057781 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -82,9 +82,10 @@ private:  	void				updateDimensions();  	LLUUID				mImageID;  	LLPointer<LLViewerFetchedTexture>		mImage; -	BOOL				mLoadingFullImage; +	S32                 mImageOldBoostLevel;  	std::string			mSaveFileName;  	LLFrameTimer		mSavedFileTimer; +	BOOL				mLoadingFullImage;  	BOOL                mShowKeepDiscard;  	BOOL                mCopyToInv; @@ -94,11 +95,10 @@ private:  	// This is stored off in a member variable, because the save-as  	// button and drag and drop functionality need to know.  	BOOL mIsCopyable; - +	BOOL mUpdateDimensions;  	S32 mLastHeight;  	S32 mLastWidth; -	F32 mAspectRatio; -	BOOL mUpdateDimensions; +	F32 mAspectRatio;	  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;   }; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index b68fc3b002..75797dae81 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -176,7 +176,15 @@ void LLScriptFloater::onClose(bool app_quitting)  	if(getNotificationId().notNull())  	{ -		LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); +		// we shouldn't kill notification on exit since it may be used as persistent. +		if (app_quitting) +		{ +			LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); +		} +		else +		{ +			LLScriptFloaterManager::getInstance()->removeNotification(getNotificationId()); +		}  	}  } @@ -352,7 +360,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  				set_new_message |= !floater->hasFocus();  			} -			onRemoveNotification(it->first); +			removeNotification(it->first);  		}  	} @@ -379,6 +387,17 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  	toggleScriptFloater(notification_id, set_new_message);  } +void LLScriptFloaterManager::removeNotification(const LLUUID& notification_id) +{ +	LLNotificationPtr notification = LLNotifications::instance().find(notification_id); +	if (notification != NULL && !notification->isCancelled()) +	{ +		LLNotificationsUtil::cancel(notification); +	} + +	onRemoveNotification(notification_id); +} +  void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  {  	if(notification_id.isNull()) @@ -392,6 +411,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	LLIMWellWindow::getInstance()->removeObjectRow(notification_id); +	mNotifications.erase(notification_id); +  	// close floater  	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);  	if(floater) @@ -400,8 +421,6 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  		floater->setNotificationId(LLUUID::null);  		floater->closeFloater();  	} - -	mNotifications.erase(notification_id);  }  void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message) diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index dc0cfc2400..6990234fd7 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -65,6 +65,11 @@ public:  	void onAddNotification(const LLUUID& notification_id);  	/** +	 * Removes notification. +	 */ +	void removeNotification(const LLUUID& notification_id); + +	/**  	 * Handles notification removal.  	 * Removes script notification toast, removes script chiclet, closes script floater  	 */ diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 98282c1673..7104f3934d 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -230,15 +230,15 @@ LLSideTrayTab*  LLSideTrayTab::createInstance	()  LLSideTray::Params::Params()  :	collapsed("collapsed",false), -	tab_btn_image_normal("tab_btn_image","sidebar_tab_left.tga"), -	tab_btn_image_selected("tab_btn_image_selected","button_enabled_selected_32x128.tga"), +	tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("sidebar_tab_left.tga")), +	tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("button_enabled_selected_32x128.tga")),  	default_button_width("tab_btn_width",32),  	default_button_height("tab_btn_height",32),  	default_button_margin("tab_btn_margin",0)  {}  //virtual  -LLSideTray::LLSideTray(Params& params) +LLSideTray::LLSideTray(const Params& params)  	   : LLPanel(params)  	    ,mActiveTab(0)  		,mCollapsed(false) @@ -373,10 +373,10 @@ LLButton* LLSideTray::createButton	(const std::string& name,const std::string& i  	bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP);  	bparams.rect (rect);  	bparams.tab_stop(false); -	bparams.image_unselected.name(sidetray_params.tab_btn_image_normal); -	bparams.image_selected.name(sidetray_params.tab_btn_image_selected); -	bparams.image_disabled.name(sidetray_params.tab_btn_image_normal); -	bparams.image_disabled_selected.name(sidetray_params.tab_btn_image_selected); +	bparams.image_unselected(sidetray_params.tab_btn_image_normal); +	bparams.image_selected(sidetray_params.tab_btn_image_selected); +	bparams.image_disabled(sidetray_params.tab_btn_image_normal); +	bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected);  	LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);  	button->setLabel(name); diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 3a8d308425..406cdc9055 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -54,13 +54,13 @@ public:  	:	public LLInitParam::Block<Params, LLPanel::Params>  	{  		// initial state -		Optional<bool>		collapsed; -		Optional<std::string>		tab_btn_image_normal; -		Optional<std::string>		tab_btn_image_selected; +		Optional<bool>				collapsed; +		Optional<LLUIImage*>		tab_btn_image_normal, +									tab_btn_image_selected; -		Optional<S32>				default_button_width; -		Optional<S32>				default_button_height; -		Optional<S32>				default_button_margin; +		Optional<S32>				default_button_width, +									default_button_height, +									default_button_margin;  		Params();  	}; @@ -68,7 +68,7 @@ public:  	static LLSideTray*	getInstance		();  	static bool			instanceCreated	();  protected: -	LLSideTray(Params& params); +	LLSideTray(const Params& params);  	typedef std::vector<LLSideTrayTab*> child_vector_t;  	typedef child_vector_t::iterator					child_vector_iter_t;  	typedef child_vector_t::const_iterator  			child_vector_const_iter_t; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index e6b4aeb6c2..1a8c2b8fc0 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -371,7 +371,7 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()  //---------------------------------------------------------------------------------  void LLIMWellWindow::ObjectRowPanel::onClosePanel()  { -	LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId()); +	LLScriptFloaterManager::getInstance()->removeNotification(mChiclet->getSessionId());  }  void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/) @@ -832,7 +832,7 @@ void LLIMWellWindow::closeAllImpl()  		ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);  		if (obj_panel)  		{ -			LLScriptFloaterManager::instance().onRemoveNotification(*iter); +			LLScriptFloaterManager::instance().removeNotification(*iter);  		}  	}  } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index d324cb1565..c0518b705b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -426,6 +426,10 @@ BOOL LLFloaterTexturePicker::postBuild()  		mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  		mInventoryPanel->setAllowMultiSelect(FALSE); +		// Disable auto selecting first filtered item because it takes away +		// selection from the item set by LLTextureCtrl owning this floater. +		mInventoryPanel->getRootFolder()->setAutoSelectOverride(TRUE); +  		// Commented out to scroll to currently selected texture. See EXT-5403.  		// // store this filter as the default one  		// mInventoryPanel->getRootFolder()->getFilter()->markDefault(); diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp index 8488527185..333f682e8f 100644 --- a/indra/newview/llurllineeditorctrl.cpp +++ b/indra/newview/llurllineeditorctrl.cpp @@ -89,9 +89,10 @@ void LLURLLineEditor::copyEscapedURLToClipboard()  	const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length));  	LLWString text_to_copy; -	if (LLSLURL(unescaped_text).isValid()) +	// *HACK: Because LLSLURL is currently broken we cannot use it to check if unescaped_text is a valid SLURL (see EXT-8335). +	if (LLStringUtil::startsWith(unescaped_text, "http://")) // SLURL  		text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text)); -	else +	else // human-readable location  		text_to_copy = utf8str_to_wstring(unescaped_text);  	gClipboard.copyFromString( text_to_copy ); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 7e8f11c41a..9926c8d15f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -873,6 +873,21 @@ LLInventoryCallbackManager::~LLInventoryCallbackManager()  	sInstance = NULL;  } +//static  +void LLInventoryCallbackManager::destroyClass() +{ +	if (sInstance) +	{ +		for (callback_map_t::iterator it = sInstance->mMap.begin(), end_it = sInstance->mMap.end(); it != end_it; ++it) +		{ +			// drop LLPointer reference to callback +			it->second = NULL; +		} +		sInstance->mMap.clear(); +	} +} + +  U32 LLInventoryCallbackManager::registerCB(LLPointer<LLInventoryCallback> cb)  {  	if (cb.isNull()) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 690c23e6a5..ef3586537b 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -36,6 +36,7 @@  #include "llinventory.h"  #include "llframetimer.h"  #include "llwearable.h" +#include "llui.h" //for LLDestroyClass  #include <boost/signals2.hpp>	// boost::signals2::trackable @@ -304,8 +305,9 @@ private:  // misc functions  //void inventory_reliable_callback(void**, S32 status); -class LLInventoryCallbackManager +class LLInventoryCallbackManager : public LLDestroyClass<LLInventoryCallbackManager>  { +	friend class LLDestroyClass<LLInventoryCallbackManager>;  public:  	LLInventoryCallbackManager();  	~LLInventoryCallbackManager(); @@ -313,9 +315,12 @@ public:  	void fire(U32 callback_id, const LLUUID& item_id);  	U32 registerCB(LLPointer<LLInventoryCallback> cb);  private: -	std::map<U32, LLPointer<LLInventoryCallback> > mMap; +	typedef std::map<U32, LLPointer<LLInventoryCallback> > callback_map_t; +	callback_map_t mMap;  	U32 mLastCallback;  	static LLInventoryCallbackManager *sInstance; +	static void destroyClass(); +  public:  	static bool is_instantiated() { return sInstance != NULL; }  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 04545d2549..fa0e860ae9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2614,7 +2614,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			params.substitutions = substitutions;  			params.payload = payload; -			LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, false); +			LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group);  		}  		break;  	case IM_FROM_TASK_AS_ALERT: diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 6d93de2383..15bdf126c5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -79,6 +79,7 @@  #include "llviewerparceloverlay.h"  #include "llviewerpartsource.h"  #include "llviewerregion.h" +#include "llviewerstats.h"  #include "llviewertextureanim.h"  #include "llviewerwindow.h" // For getSpinAxis  #include "llvoavatar.h" @@ -1916,6 +1917,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  			avatar->clampAttachmentPositions();  		} +		 +		// If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps +		if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) ) +		{ +			LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() ); +		}  	}  	if (new_rot != mLastRot diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index bdc34d0f18..a706e77f19 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -280,6 +280,8 @@ LLViewerStats::LLViewerStats() :  	{  		mStats[ST_HAS_BAD_TIMER] = 1.0;  	}	 +	 +	mAgentPositionSnaps.reset();  }  LLViewerStats::~LLViewerStats() @@ -299,6 +301,8 @@ void LLViewerStats::resetStats()  	LLViewerStats::getInstance()->mPacketsOutStat.reset();  	LLViewerStats::getInstance()->mFPSStat.reset();  	LLViewerStats::getInstance()->mTexturePacketsStat.reset(); +	 +	LLViewerStats::getInstance()->mAgentPositionSnaps.reset();  } @@ -393,6 +397,10 @@ void LLViewerStats::addToMessage(LLSD &body) const  					<< llendl;  		}  	} +	 +	body["AgentPositionSnaps"] = mAgentPositionSnaps.getData(); +	llinfos << "STAT: AgentPositionSnaps: Mean = " << mAgentPositionSnaps.getMean() << "; StdDev = " << mAgentPositionSnaps.getStdDev()  +			<< "; Count = " << mAgentPositionSnaps.getCount() << llendl;  }  // static diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 13d73000d2..694eeaf097 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -197,6 +197,61 @@ public:  	void addToMessage(LLSD &body) const; +	struct  StatsAccumulator +	{ +		S32 mCount; +		F32 mSum; +		F32 mSumOfSquares; +		U32 mCountOfNextUpdatesToIgnore; + +		inline void push( F32 val ) +		{ +			if ( mCountOfNextUpdatesToIgnore > 0 ) +			{ +				mCountOfNextUpdatesToIgnore--; +				return; +			} +			 +			mCount++; +			mSum += val; +			mSumOfSquares += val * val; +		} +		 +		inline F32 getMean() const +		{ +			return (mCount == 0) ? 0.f : ((F32)mSum)/mCount; +		} +		 +		inline F32 getStdDev() const +		{ +			const F32 mean = getMean(); +			return (mCount == 0) ? 0.f : sqrt( mSumOfSquares/mCount - (mean * mean) ); +		} +		 +		inline U32 getCount() const +		{ +			return mCount; +		} + +		inline void reset() +		{ +			mCount = 0; +			mSum = mSumOfSquares = 0.f; +			mCountOfNextUpdatesToIgnore = 0; +		} +		 +		inline LLSD getData() const +		{ +			LLSD data; +			data["mean"] = getMean(); +			data["std_dev"] = getStdDev(); +			data["count"] = (S32)mCount; +			return data; +		} +	}; + +	StatsAccumulator mAgentPositionSnaps; +	  private:  	F64	mStats[ST_COUNT]; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 2929dce898..e38608bcfc 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -493,6 +493,7 @@ LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 com  	mFullHeight = height ;  	mUseMipMaps = usemipmaps ;  	mComponents = components ; +	setTexelsPerImage();  	mID.generate();  	sImageCount++; @@ -521,6 +522,7 @@ void LLViewerTexture::init(bool firstinit)  	mFullWidth = 0;  	mFullHeight = 0; +	mTexelsPerImage = 0 ;  	mUseMipMaps = FALSE ;  	mComponents = 0 ; @@ -529,7 +531,7 @@ void LLViewerTexture::init(bool firstinit)  	mMaxVirtualSize = 0.f;  	mNeedsGLTexture = FALSE ;  	mMaxVirtualSizeResetInterval = 1; -	mMaxVirtualSizeResetCounter = 1 ; +	mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ;  	mAdditionalDecodePriority = 0.f ;	  	mParcelMedia = NULL ;  	mNumFaces = 0 ; @@ -836,7 +838,8 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image  	{  		mFullWidth = mGLTexturep->getCurrentWidth() ;  		mFullHeight = mGLTexturep->getCurrentHeight() ;  -		mComponents = mGLTexturep->getComponents() ;		 +		mComponents = mGLTexturep->getComponents() ;	 +		setTexelsPerImage();  	}  	return ret ; @@ -1054,9 +1057,16 @@ void LLViewerTexture::destroyGLTexture()  	}	  } +void LLViewerTexture::setTexelsPerImage() +{ +	S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); +	S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); +	mTexelsPerImage = (F32)fullwidth * fullheight; +} +  BOOL LLViewerTexture::isLargeImage()  { -	return mFullWidth * mFullHeight > LLViewerTexture::sMinLargeImageSize ; +	return  (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize ;  }  //virtual  @@ -1410,6 +1420,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)  			mFullWidth = mRawImage->getWidth();  			mFullHeight = mRawImage->getHeight(); +			setTexelsPerImage();  		}  		else  		{ @@ -1615,11 +1626,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	{  		// priority range = 100,000 - 500,000  		S32 desired_discard = mDesiredDiscardLevel; -		if (getDontDiscard()) -		{ -			desired_discard -= 2; -		} -		else if (!isJustBound() && mCachedRawImageReady) +		if (!isJustBound() && mCachedRawImageReady)  		{  			if(mBoostLevel < BOOST_HIGH)  			{ @@ -1635,7 +1642,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		S32 ddiscard = cur_discard - desired_discard;  		ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); -		priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; +		priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;		  	}  	// Priority Formula: @@ -1643,19 +1650,51 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  	// [10,000,000] + [1,000,000-9,000,000]  + [100,000-500,000]   + [1-20,000]  + [0-999]  	if (priority > 0.0f)  	{ +		bool large_enough = mCachedRawImageReady && ((S32)mTexelsPerImage > sMinLargeImageSize) ; +		if(large_enough) +		{ +			//Note:  +			//to give small, low-priority textures some chance to be fetched,  +			//cut the priority in half if the texture size is larger than 256 * 256 and has a 64*64 ready. +			priority *= 0.5f ;  +		} +  		pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL);   		priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel;  		if ( mBoostLevel > BOOST_HIGH)  		{ -			priority += PRIORITY_BOOST_HIGH_FACTOR; +			if(mBoostLevel > BOOST_SUPER_HIGH) +			{ +				//for very important textures, always grant the highest priority. +				priority += PRIORITY_BOOST_HIGH_FACTOR; +			} +			else if(mCachedRawImageReady) +			{ +				//Note:  +				//to give small, low-priority textures some chance to be fetched,  +				//if high priority texture has a 64*64 ready, lower its fetching priority. +				setAdditionalDecodePriority(0.5f) ; +			} +			else +			{ +				priority += PRIORITY_BOOST_HIGH_FACTOR; +			}  		}		  		if(mAdditionalDecodePriority > 0.0f)  		{  			// priority range += 1,000,000.f-9,000,000.f -			priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); +			F32 additional = PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); +			if(large_enough) +			{ +				//Note:  +				//to give small, low-priority textures some chance to be fetched,  +				//cut the additional priority to a quarter if the texture size is larger than 256 * 256 and has a 64*64 ready. +				additional *= 0.25f ; +			} +			priority += additional;  		}  	}  	return priority; @@ -1698,11 +1737,6 @@ void LLViewerFetchedTexture::updateVirtualSize()  		addTextureStats(0.f, FALSE) ;//reset  	} -	if(mForceToSaveRawImage) -	{ -		setAdditionalDecodePriority(0.75f) ; //boost the fetching priority -	} -  	for(U32 i = 0 ; i < mNumFaces ; i++)  	{				  		LLFace* facep = mFaceList[i] ; @@ -1815,6 +1849,7 @@ bool LLViewerFetchedTexture::updateFetch()  			{  				mFullWidth = mRawImage->getWidth() << mRawDiscardLevel;  				mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; +				setTexelsPerImage();  				if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE)  				{  @@ -2890,10 +2925,6 @@ void LLViewerLODTexture::processTextureStats()  		//static const F64 log_2 = log(2.0);  		static const F64 log_4 = log(4.0); -		S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); -		S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); -		mTexelsPerImage = (F32)fullwidth * fullheight; -  		F32 discard_level = 0.f;  		// If we know the output width and height, we can force the discard diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index f071c6e392..1f0d760daf 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -124,15 +124,16 @@ public:  		BOOST_HIGH 			= 10,  		BOOST_BUMP          ,  		BOOST_TERRAIN		, // has to be high priority for minimap / low detail -		BOOST_SELECTED		, -		BOOST_HUD			, +		BOOST_SELECTED		,		  		BOOST_AVATAR_BAKED_SELF	, +		BOOST_AVATAR_SELF	, // needed for baking avatar +		BOOST_SUPER_HIGH    , //textures higher than this need to be downloaded at the required resolution without delay. +		BOOST_HUD			,  		BOOST_ICON			,  		BOOST_UI			,  		BOOST_PREVIEW		,  		BOOST_MAP			, -		BOOST_MAP_VISIBLE	, -		BOOST_AVATAR_SELF	, // needed for baking avatar +		BOOST_MAP_VISIBLE	,		  		BOOST_MAX_LEVEL,  		//other texture Categories @@ -266,6 +267,7 @@ protected:  	void init(bool firstinit) ;	  	void reorganizeFaceList() ;  	void reorganizeVolumeList() ; +	void setTexelsPerImage();  private:  	//note: do not make this function public.  	/*virtual*/ LLImageGL* getGLTexture() const ; @@ -278,6 +280,7 @@ protected:  	S32 mFullHeight;  	BOOL  mUseMipMaps ;  	S8  mComponents; +	F32 mTexelsPerImage;			// Texels per image.  	mutable S8  mNeedsGLTexture;  	mutable F32 mMaxVirtualSize;	// The largest virtual size of the image, in pixels - how much data to we need?	  	mutable S32  mMaxVirtualSizeResetCounter ; @@ -596,8 +599,6 @@ private:  	void scaleDown() ;		  private: -	 -	F32 mTexelsPerImage;			// Texels per image.  	F32 mDiscardVirtualSize;		// Virtual size used to calculate desired discard	  	F32 mCalculatedDiscardLevel;    // Last calculated discard level  }; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 32723dfe3d..72aec07e67 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3190,29 +3190,26 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		{ // muted avatars update at 16 hz  			mUpdatePeriod = 16;  		} -		else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible) +		else if (mVisibilityRank <= LLVOAvatar::sMaxVisible)  		{ //first 25% of max visible avatars are not impostored  			mUpdatePeriod = 1;  		} -		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 4) +		else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4)  		{ //background avatars are REALLY slow updating impostors  			mUpdatePeriod = 16;  		} -		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 3) +		else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 3)  		{ //back 25% of max visible avatars are slow updating impostors  			mUpdatePeriod = 8;  		} -		else if (visible && mImpostorPixelArea <= impostor_area) +		else if (mImpostorPixelArea <= impostor_area)  		{  // stuff in between gets an update period based on pixel area  			mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8);  		} -		else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible) -		{ // force nearby impostors in ultra crowded areas -			mUpdatePeriod = 2; -		}  		else -		{ // not impostored -			mUpdatePeriod = 1; +		{ +			//nearby avatars, update the impostors more frequently. +			mUpdatePeriod = 4;  		}  		visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; @@ -4288,6 +4285,8 @@ void LLVOAvatar::checkTextureLoading()  	return ;  } +const F32  SELF_ADDITIONAL_PRI = 0.75f ; +const F32  ADDITIONAL_PRI = 0.5f;  void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level)  {  	//Note: @@ -4303,9 +4302,14 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel  	mMinPixelArea = llmin(pixel_area, mMinPixelArea);	  	imagep->addTextureStats(pixel_area / texel_area_ratio);  	imagep->setBoostLevel(boost_level); -	if(boost_level == LLViewerTexture::BOOST_AVATAR_BAKED_SELF) +	 +	if(boost_level != LLViewerTexture::BOOST_AVATAR_BAKED_SELF) +	{ +		imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ; +	} +	else  	{ -		imagep->setAdditionalDecodePriority(1.0f) ; +		imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ;  	}  } @@ -7312,7 +7316,7 @@ void LLVOAvatar::cullAvatarsByPixelArea()  	std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());  	// Update the avatars that have changed status -	U32 rank = 0; +	U32 rank = 2; //1 is reserved for self.   	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();  		 iter != LLCharacter::sInstances.end(); ++iter)  	{ @@ -7336,7 +7340,7 @@ void LLVOAvatar::cullAvatarsByPixelArea()  		if (inst->isSelf())  		{ -			inst->setVisibilityRank(0); +			inst->setVisibilityRank(1);  		}  		else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible())  		{ diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index bb04511a8d..2ef333a0a0 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -869,7 +869,7 @@ private:  public:  	// Responsible for detecting the user's voice signal (and when the  	// user speaks, it puts a voice symbol over the avatar's head) and gesticulations -	LLVoiceVisualizer*  mVoiceVisualizer; +	LLPointer<LLVoiceVisualizer>  mVoiceVisualizer;  	int					mCurrentGesticulationLevel;  	//-------------------------------------------------------------------- @@ -1050,5 +1050,6 @@ protected: // Shared with LLVOAvatarSelf  }; // LLVOAvatar  extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; +extern const F32  SELF_ADDITIONAL_PRI;  #endif // LL_VO_AVATAR_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 46d987353f..3a283e7aa6 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2037,7 +2037,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  			imagep->resetTextureStats();  			imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL);  			imagep->addTextureStats( desired_pixels / texel_area_ratio ); -			imagep->setAdditionalDecodePriority(1.0f) ; +			imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ;  			imagep->forceUpdateBindStats() ;  			if (imagep->getDiscardLevel() < 0)  			{ diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index c01d7fa62f..fe8c09e329 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -85,8 +85,8 @@ void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask)  	reshapeWidgets();  } -LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item) -: LLPanelInventoryListItemBase(item) +LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item, const LLPanelWearableListItem::Params& params) +: LLPanelInventoryListItemBase(item, params)  {  } @@ -101,15 +101,19 @@ LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryIt  	LLPanelWearableOutfitItem* list_item = NULL;  	if (item)  	{ -		list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled); -		list_item->init(); +		const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>(); + +		list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  }  LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item, -													 bool worn_indication_enabled) -: LLPanelInventoryListItemBase(item) +													 bool worn_indication_enabled, +													 const LLPanelWearableOutfitItem::Params& params) +: LLPanelInventoryListItemBase(item, params)  , mWornIndicationEnabled(worn_indication_enabled)  {  } @@ -132,6 +136,17 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item"); + + +LLPanelClothingListItem::Params::Params() +:	up_btn("up_btn"), +	down_btn("down_btn"), +	edit_btn("edit_btn"), +	lock_panel("lock_panel"), +	edit_panel("edit_panel"), +	lock_icon("lock_icon") +{}  // static  LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item) @@ -139,24 +154,54 @@ LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem*  	LLPanelClothingListItem* list_item = NULL;  	if(item)  	{ -		list_item = new LLPanelClothingListItem(item); -		list_item->init(); +		const LLPanelClothingListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelClothingListItem>(); +		list_item = new LLPanelClothingListItem(item, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  } -LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item) - : LLPanelDeletableWearableListItem(item) +LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item, const LLPanelClothingListItem::Params& params) + : LLPanelDeletableWearableListItem(item, params) +{ +	LLButton::Params button_params = params.up_btn; +	applyXUILayout(button_params, this); +	addChild(LLUICtrlFactory::create<LLButton>(button_params)); + +	button_params = params.down_btn; +	applyXUILayout(button_params, this); +	addChild(LLUICtrlFactory::create<LLButton>(button_params)); + +	LLPanel::Params panel_params = params.lock_panel; +	applyXUILayout(panel_params, this); +	LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); +	addChild(lock_panelp); + +	panel_params = params.edit_panel; +	applyXUILayout(panel_params, this); +	LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); +	addChild(edit_panelp); + +	if (lock_panelp)  { +		LLIconCtrl::Params icon_params = params.lock_icon; +		applyXUILayout(icon_params, this); +		lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));  } -LLPanelClothingListItem::~LLPanelClothingListItem() +	if (edit_panelp)  { +		button_params = params.edit_btn; +		applyXUILayout(button_params, this); +		edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params)); +	} + +	setSeparatorVisible(false);  } -void LLPanelClothingListItem::init() +LLPanelClothingListItem::~LLPanelClothingListItem()  { -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_clothing_list_item.xml");  }  BOOL LLPanelClothingListItem::postBuild() @@ -178,30 +223,62 @@ BOOL LLPanelClothingListItem::postBuild()  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item"); + + +LLPanelBodyPartsListItem::Params::Params() +:	edit_btn("edit_btn"), +	edit_panel("edit_panel"), +	lock_panel("lock_panel"), +	lock_icon("lock_icon") +{} +  // static  LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item)  {  	LLPanelBodyPartsListItem* list_item = NULL;  	if(item)  	{ -		list_item = new LLPanelBodyPartsListItem(item); -		list_item->init(); +		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelBodyPartsListItem>(); +		list_item = new LLPanelBodyPartsListItem(item, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  } -LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item) -: LLPanelWearableListItem(item) +LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const LLPanelBodyPartsListItem::Params& params) +: LLPanelWearableListItem(item, params)  { +	LLPanel::Params panel_params = params.edit_panel; +	applyXUILayout(panel_params, this); +	LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); +	addChild(edit_panelp); + +	panel_params = params.lock_panel; +	applyXUILayout(panel_params, this); +	LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); +	addChild(lock_panelp); +	 +	if (edit_panelp) +	{ +		LLButton::Params btn_params = params.edit_btn; +		applyXUILayout(btn_params, this); +		edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(btn_params));  } -LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem() +	if (lock_panelp)  { +		LLIconCtrl::Params icon_params = params.lock_icon; +		applyXUILayout(icon_params, this); +		lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params)); +	} + +	setSeparatorVisible(true);  } -void LLPanelBodyPartsListItem::init() +LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem()  { -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_body_parts_list_item.xml");  }  BOOL LLPanelBodyPartsListItem::postBuild() @@ -214,6 +291,11 @@ BOOL LLPanelBodyPartsListItem::postBuild()  	return TRUE;  } +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item"); + +LLPanelDeletableWearableListItem::Params::Params() +:	delete_btn("delete_btn") +{}  // static  LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item) @@ -221,20 +303,22 @@ LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLVie  	LLPanelDeletableWearableListItem* list_item = NULL;  	if(item)  	{ -		list_item = new LLPanelDeletableWearableListItem(item); -		list_item->init(); +		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>(); +		list_item = new LLPanelDeletableWearableListItem(item, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  } -LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item) -: LLPanelWearableListItem(item) +LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const LLPanelDeletableWearableListItem::Params& params) +: LLPanelWearableListItem(item, params)  { -} +	LLButton::Params button_params = params.delete_btn; +	applyXUILayout(button_params, this); +	addChild(LLUICtrlFactory::create<LLButton>(button_params)); -void LLPanelDeletableWearableListItem::init() -{ -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_deletable_wearable_list_item.xml"); +	setSeparatorVisible(true);  }  BOOL LLPanelDeletableWearableListItem::postBuild() @@ -260,8 +344,11 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt  	LLPanelAttachmentListItem* list_item = NULL;  	if(item)  	{ -		list_item = new LLPanelAttachmentListItem(item); -		list_item->init(); +		const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>(); + +		list_item = new LLPanelAttachmentListItem(item, params); +		list_item->initFromParams(params); +		list_item->postBuild();  	}  	return list_item;  } @@ -284,27 +371,32 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name,  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item"); + +LLPanelDummyClothingListItem::Params::Params() +:	add_panel("add_panel"), +	add_btn("add_btn") +{}  LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type)  { -	LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type); -	list_item->init(); +	const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDummyClothingListItem>(); + +	LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type, params); +	list_item->initFromParams(params); +	list_item->postBuild();  	return list_item;  }  BOOL LLPanelDummyClothingListItem::postBuild()  { -	LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon"); -	setIconCtrl(icon); -	setTitleCtrl(getChild<LLTextBox>("item_name")); -  	addWidgetToRightSide("btn_add_panel");  	setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE));  	updateItem(wearableTypeToString(mWearableType));  	// Make it look loke clothing item - reserve space for 'delete' button -	setLeftWidgetsWidth(icon->getRect().mLeft); +	setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft);  	setWidgetsVisible(false);  	reshapeWidgets(); @@ -317,15 +409,23 @@ LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const  	return mWearableType;  } -LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type) - : LLPanelWearableListItem(NULL) - , mWearableType(w_type) +LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type, const LLPanelDummyClothingListItem::Params& params) +:	LLPanelWearableListItem(NULL, params),  +	mWearableType(w_type)  { -} +	LLPanel::Params panel_params(params.add_panel); +	applyXUILayout(panel_params, this); +	LLPanel* add_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); +	addChild(add_panelp); -void LLPanelDummyClothingListItem::init() +	if (add_panelp)  { -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml"); +		LLButton::Params button_params(params.add_btn); +		applyXUILayout(button_params, this); +		add_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params)); +} + +	setSeparatorVisible(true);  }  typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t; diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 0e5403f30c..f2f81968ee 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -68,7 +68,7 @@ public:  protected: -	LLPanelWearableListItem(LLViewerInventoryItem* item); +	LLPanelWearableListItem(LLViewerInventoryItem* item, const Params& params);  };  /** @@ -93,7 +93,7 @@ public:  protected:  	LLPanelWearableOutfitItem(LLViewerInventoryItem* item, -							  bool worn_indication_enabled); +							  bool worn_indication_enabled, const Params& params);  private:  	bool	mWornIndicationEnabled; @@ -103,6 +103,13 @@ class LLPanelDeletableWearableListItem : public LLPanelWearableListItem  {  	LOG_CLASS(LLPanelDeletableWearableListItem);  public: +	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> +	{ +		Optional<LLButton::Params>		delete_btn; + +		Params(); +	}; +  	static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item); @@ -116,9 +123,7 @@ public:  	inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); }  protected: -	LLPanelDeletableWearableListItem(LLViewerInventoryItem* item); - -	/*virtual*/ void init(); +	LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const Params& params);  };  /** Outfit list item for an attachment */ @@ -134,7 +139,7 @@ public:  								EItemState item_state = IS_DEFAULT);  protected: -	LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {}; +	LLPanelAttachmentListItem(LLViewerInventoryItem* item, const Params& params) : LLPanelDeletableWearableListItem(item, params) {};  };  /** @@ -147,6 +152,18 @@ class LLPanelClothingListItem : public LLPanelDeletableWearableListItem  	LOG_CLASS(LLPanelClothingListItem);  public: +	struct Params : public LLInitParam::Block<Params, LLPanelDeletableWearableListItem::Params> +	{ +		Optional<LLButton::Params>		up_btn, +										down_btn, +										edit_btn; +		Optional<LLPanel::Params>		lock_panel, +										edit_panel; +		Optional<LLIconCtrl::Params>	lock_icon; + +		Params(); +	}; +  	static LLPanelClothingListItem* create(LLViewerInventoryItem* item);  	virtual ~LLPanelClothingListItem(); @@ -162,18 +179,25 @@ public:  	inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }  	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); } -  protected: -	LLPanelClothingListItem(LLViewerInventoryItem* item); -	 -	/*virtual*/ void init(); +	LLPanelClothingListItem(LLViewerInventoryItem* item, const Params& params); +  };  class LLPanelBodyPartsListItem : public LLPanelWearableListItem  {  	LOG_CLASS(LLPanelBodyPartsListItem);  public: +	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> +	{ +		Optional<LLButton::Params>		edit_btn; +		Optional<LLPanel::Params>		lock_panel, +										edit_panel; +		Optional<LLIconCtrl::Params>	lock_icon; + +		Params(); +	};  	static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item); @@ -188,9 +212,7 @@ public:  	inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }  protected: -	LLPanelBodyPartsListItem(LLViewerInventoryItem* item); - -	/*virtual*/ void init(); +	LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const Params& params);  }; @@ -202,15 +224,19 @@ protected:  class LLPanelDummyClothingListItem : public LLPanelWearableListItem  {  public: +	struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> +	{ +		Optional<LLPanel::Params> add_panel; +		Optional<LLButton::Params> add_btn; +		Params(); +	};  	static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type);  	/*virtual*/ BOOL postBuild();  	LLWearableType::EType getWearableType() const;  protected: -	LLPanelDummyClothingListItem(LLWearableType::EType w_type); - -	/*virtual*/ void init(); +	LLPanelDummyClothingListItem(LLWearableType::EType w_type, const Params& params);  	static std::string wearableTypeToString(LLWearableType::EType w_type); diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp index 502fefd4ef..660245b02b 100644 --- a/indra/newview/llwindebug.cpp +++ b/indra/newview/llwindebug.cpp @@ -97,6 +97,9 @@ void  LLWinDebug::init()  	// Load the dbghelp dll now, instead of waiting for the crash.  	// Less potential for stack mangling +	// Don't install vectored exception handler if being debugged. +	if(IsDebuggerPresent()) return; +  	if (s_first_run)  	{  		// First, try loading from the directory that the app resides in. @@ -135,36 +138,42 @@ void  LLWinDebug::init()  void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename)  { -	if(f_mdwp == NULL || gDirUtilp == NULL) -	{ -		return; -	} -	else +	// Temporary fix to switch out the code that writes the DMP file. +	// Fix coming that doesn't write a mini dump file for regular C++ exceptions. +	const bool enable_write_dump_file = false; +	if ( enable_write_dump_file )  	{ -		std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); - -		HANDLE hFile = CreateFileA(dump_path.c_str(), -									GENERIC_WRITE, -									FILE_SHARE_WRITE, -									NULL, -									CREATE_ALWAYS, -									FILE_ATTRIBUTE_NORMAL, -									NULL); - -		if (hFile != INVALID_HANDLE_VALUE) +		if(f_mdwp == NULL || gDirUtilp == NULL)  		{ -			// Write the dump, ignoring the return value -			f_mdwp(GetCurrentProcess(), -					GetCurrentProcessId(), -					hFile, -					type, -					ExInfop, -					NULL, -					NULL); - -			CloseHandle(hFile); +			return;  		} +		else +		{ +			std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); + +			HANDLE hFile = CreateFileA(dump_path.c_str(), +										GENERIC_WRITE, +										FILE_SHARE_WRITE, +										NULL, +										CREATE_ALWAYS, +										FILE_ATTRIBUTE_NORMAL, +										NULL); + +			if (hFile != INVALID_HANDLE_VALUE) +			{ +				// Write the dump, ignoring the return value +				f_mdwp(GetCurrentProcess(), +						GetCurrentProcessId(), +						hFile, +						type, +						ExInfop, +						NULL, +						NULL); + +				CloseHandle(hFile); +			} +		}  	}  } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7d0f763bd1..b578cb9f69 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7111,7 +7111,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  	if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate)  	{  		BOOL skip_avatar_update = FALSE; -		if (gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) +		if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)  		{  			skip_avatar_update = TRUE;  		} diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 8c3aa2c9a4..da2be18db6 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -71,7 +71,8 @@              image_name="Cam_Preset_Front_Off" />            <panel_camera_item.selected_picture              image_name="Cam_Preset_Front_On" /> -          <panel_camera_item.text> +          <panel_camera_item.text +            name="front_view_text">              Front View            </panel_camera_item.text>          </panel_camera_item> @@ -85,7 +86,8 @@              image_name="Cam_Preset_Side_Off" />            <panel_camera_item.selected_picture              image_name="Cam_Preset_Side_On" /> -          <panel_camera_item.text> +          <panel_camera_item.text +            name="side_view_text">              Side View            </panel_camera_item.text>          </panel_camera_item> @@ -100,7 +102,8 @@              image_name="Cam_Preset_Back_Off" />            <panel_camera_item.selected_picture              image_name="Cam_Preset_Back_On" /> -          <panel_camera_item.text> +          <panel_camera_item.text +            name="rear_view_text">              Rear View            </panel_camera_item.text>          </panel_camera_item> @@ -122,7 +125,8 @@            <panel_camera_item.mousedown_callback              function="CameraPresets.ChangeView"              parameter="object_view" /> -          <panel_camera_item.text> +          <panel_camera_item.text +            name="object_view_text">              Object View            </panel_camera_item.text>            <panel_camera_item.picture @@ -136,7 +140,8 @@            <panel_camera_item.mousedown_callback              function="CameraPresets.ChangeView"              parameter="mouselook_view" /> -          <panel_camera_item.text> +          <panel_camera_item.text +            name="mouselook_view_text">              Mouselook View            </panel_camera_item.text>            <panel_camera_item.picture diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index 5ad099e2d9..ae98abf4fb 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -50,8 +50,13 @@                       function="File.UploadBulk"                       parameter="" />                  </menu_item_call> -                <menu_item_separator -                 layout="topleft" /> +	            <menu_item_call +	             label="Set Default Upload Permissions" +	             name="perm prefs"> +	                <menu_item_call.on_click +	                 function="Floater.Toggle" +	                 parameter="perm_prefs" /> +	            </menu_item_call>              </menu>              <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 3557318705..63ff7047b4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -707,13 +707,6 @@           label="Options"           name="Options"           tear_off="true"> -            <menu_item_call -             label="Set Default Upload Permissions" -             name="perm prefs"> -                <menu_item_call.on_click -                 function="Floater.Toggle" -                 parameter="perm_prefs" /> -            </menu_item_call>  	   <menu_item_check  	       label="Show Advanced Permissions"  	       name="DebugPermissions"> @@ -873,8 +866,13 @@                   function="File.UploadBulk"                   parameter="" />              </menu_item_call> -            <menu_item_separator -             layout="topleft" /> +            <menu_item_call +             label="Set Default Upload Permissions" +             name="perm prefs"> +                <menu_item_call.on_click +                 function="Floater.Toggle" +                 parameter="perm_prefs" /> +            </menu_item_call>          </menu>      </menu>      <menu diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1bb282dff9..95ee374e39 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -819,7 +819,7 @@ Delete pick <nolink>[PICK]</nolink>?     icon="alertmodal.tga"     name="DeleteOutfits"     type="alertmodal"> -    Delete the selected outfit/s? +    Delete the selected outfit?      <usetemplate       name="okcancelbuttons"       notext="Cancel" @@ -5493,7 +5493,6 @@ If you stay in this region you will be logged out.    <notification     icon="notify.tga"     name="LoadWebPage" -   persist="true"     type="notify">  Load web page [URL]? @@ -5593,7 +5592,6 @@ Grant this request?    <notification     icon="notify.tga"     name="ScriptDialog" -   persist="true"     type="notify">  [FIRST] [LAST]'s '[TITLE]'  [MESSAGE] @@ -5608,7 +5606,6 @@ Grant this request?    <notification     icon="notify.tga"     name="ScriptDialogGroup" -   persist="true"     type="notify">  [GROUPNAME]'s '[TITLE]'  [MESSAGE] diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index a4cac97af6..8c13ced8f3 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -104,6 +104,7 @@  		follows="top|left"  		font="SansSerif"  		left="10" +		name="nearby_media_title"  		width="100">  	  Nearby Media  	</text> @@ -114,6 +115,7 @@  		font="SansSerif"  		top_pad="15"  		left="10" +		name="show_text"  		width="40">  	  Show:  	</text> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index b43aa0a824..d18f0d57ca 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,9 +14,9 @@       background_visible="true"       bg_alpha_color="DkGray2"       bg_opaque_color="DkGray2" -     no_matched_tabs_text.value="NoOutfitsTabsMatched" +     no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."       no_matched_tabs_text.v_pad="10" -     no_visible_tabs_text.value="NoOutfits" +     no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"       follows="all"       height="400"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 20d49fac04..048de70045 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1958,6 +1958,9 @@ Clears (deletes) the media and all params from the given face.  	<string name="InvFolder Animations">Animations</string>  	<string name="InvFolder Gestures">Gestures</string>  	<string name="InvFolder Favorite">Favorites</string> +  <!-- historically default name of the Favorites folder can start from either "f" or "F" letter. +  We should localize both of them with the same value --> +	<string name="InvFolder favorite">Favorites</string>  	<string name="InvFolder Current Outfit">Current Outfit</string>  	<string name="InvFolder Initial Outfits">Initial Outfits</string>  	<string name="InvFolder My Outfits">My Outfits</string> @@ -2198,10 +2201,6 @@ Clears (deletes) the media and all params from the given face.    <!-- panel preferences general -->    <string name="BusyModeResponseDefault">The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string> -	<!-- Outfits Panel --> -	<string name="NoOutfits">You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]</string> -	<string name="NoOutfitsTabsMatched">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> -  	<!-- Mute -->  	<string name="MuteByName">(By name)</string>  	<string name="MuteAgent">(Resident)</string> diff --git a/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml new file mode 100644 index 0000000000..c08267de82 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<bodyparts_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + bottom="0" + width="380"> +  <item_icon +   height="16" +   follows="top|left" +   image_name="Inv_Object" +   layout="topleft" +   left="0" +   name="item_icon" +   top="2" +   width="16" /> +  <item_name +   follows="left|right" +   height="16" +   layout="topleft" +   left="21" +   allow_html="false" +   use_ellipses="true" +   name="item_name" +   text_color="white" +   top="5" +   value="..." +   width="359" /> +  <lock_panel +   background_visible="false" +   name="btn_lock" +   layout="topleft" +   follows="top|right" +   top="0" +   left="0" +   height="23" +   width="23" +   tab_stop="false" +   tool_tip="You don't have permission to edit"/> +  <lock_icon +   name="btn_lock1" +   layout="topleft" +   follows="top|right" +   image_name="Locked_Icon" +   top="2" +   left="5" +   height="13" +   width="9" +   tab_stop="false" /> +  <edit_panel +   background_visible="false" +   name="btn_edit_panel" +   layout="topleft" +   follows="top|right" +   top="1" +   left="17" +   height="23" +   width="26" +   tab_stop="false"/> +  <edit_btn +   name="btn_edit" +   layout="topleft" +   follows="top|right" +   image_overlay="Edit_Wrench" +   top="0" +   left="0" +   height="23" +   width="23" +   tab_stop="false" +   tool_tip="Edit this shape"/> +</bodyparts_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml new file mode 100644 index 0000000000..f7a05e9bc4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<clothing_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + bottom="0" + width="380"> +  <lock_icon +   height="16" +   follows="top|left" +   image_name="Inv_Object" +   layout="topleft" +   left="21" +   name="item_icon" +   top="2" +   width="16" /> +  <item_name +   follows="left|right" +   height="16" +   layout="topleft" +   left="42" +   allow_html="false" +   use_ellipses="true" +   name="item_name" +   text_color="white" +   top="5" +   value="..." +   width="359" /> +  <up_btn +   name="btn_move_up" +   layout="topleft" +   follows="top|right" +   image_overlay="UpArrow_Off" +   top="1" +   left="0" +   height="23" +   width="23" +   tab_stop="false" /> +  <down_btn +   name="btn_move_down" +   layout="topleft" +   follows="top|right" +   image_overlay="DownArrow_Off" +   top="1" +   left="26" +   height="23" +   width="23" +   tab_stop="false" /> +  <lock_panel +   background_visible="false" +   name="btn_lock" +   layout="topleft" +   follows="top|right" +   top="0" +   left="0" +   height="23" +   width="23" +   tab_stop="false" +   tool_tip="You don't have permission to edit"/> +  <lock_icon +   name="btn_lock1" +   layout="topleft" +   follows="top|right" +   image_name="Locked_Icon" +   top="2" +   left="5" +   height="13" +   width="9" +   tab_stop="false" /> +  <edit_panel +   background_visible="false" +   name="btn_edit_panel" +   layout="topleft" +   follows="top|right" +   top="0" +   left="26" +   height="23" +   width="26" +   tab_stop="false"/> +  <edit_btn +   name="btn_edit" +   layout="topleft" +   follows="top|right" +   image_overlay="Edit_Wrench" +   top="1" +   left="0" +   height="23" +   width="23" +   tab_stop="false" +   tool_tip="Edit this wearable"/> +</clothing_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml new file mode 100644 index 0000000000..88a4682e13 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<deletable_wearable_list_item +  follows="top|right|left" +  height="23" +  layout="topleft" +  left="0" +  name="deletable_wearable_item" +  bottom="0" +  width="380"> +  <delete_btn +  name="btn_delete" +  layout="topleft" +  follows="top|left" +  image_unselected="Toast_CloseBtn" +  image_selected="Toast_CloseBtn" +  top="3" +  left="0" +  height="18" +  width="18" +  tab_stop="false" +  tool_tip="Remove from outfit"/> +  <item_icon +   height="16" +   follows="top|left" +   image_name="Inv_Object" +   layout="topleft" +   left="24" +   name="item_icon" +   top="2" +   width="16" /> +  <item_name +   follows="left|right" +   height="16" +   layout="topleft" +   left="45" +   allow_html="false" +   use_ellipses="true" +   name="item_name" +   text_color="white" +   top="5" +   value="..." +   width="359" /> +</deletable_wearable_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml new file mode 100644 index 0000000000..80a877a6c2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<dummy_clothing_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="dummy_clothing_item" + bottom="0" + width="380"> +  <item_icon +    height="16" +    color="0.75 0.75 0.75 1" +    follows="top|left" +    image_name="Inv_Object" +    layout="topleft" +    left="20" +    name="item_icon" +    top="2" +    width="16" /> +  <item_name +    follows="left|right" +    height="16" +    layout="topleft" +    left="41" +    allow_html="false" +    use_ellipses="true" +    name="item_name" +    text_color="LtGray_50" +    top="4" +    value="..." +    width="359" /> +  <add_panel +    name="btn_add_panel" +    layout="topleft" +    follows="top|right" +    top="0" +    left="0" +    height="23" +    width="26" +    tab_stop="false"/> +  <add_btn +     name="btn_add" +     layout="topleft" +     follows="top|right" +     image_overlay="AddItem_Off" +     top="0" +     left="0" +     height="23" +     width="23" +     tab_stop="false" +     tool_tip="Add more items of this type" /> +</dummy_clothing_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml index 50be0ac1a1..0a5930c820 100644 --- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml @@ -1,11 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <inventory_list_item - height="0" - layout="topleft" - left="0" - name="inventory_list_item" - top="0" - width="0"> +  follows="top|right|left" +  height="20" +  name="inventory_item" +  tab_stop="false"  +  hover_image="ListItem_Over" +  selected_image="ListItem_Select" +  separator_image="Wearables_Divider"  +  width="380">    <!-- DEFAULT style for inventory list item -->    <default_style     font="SansSerifSmall" @@ -16,4 +18,25 @@     font="SansSerifSmall"     font.style="BOLD"     color="EmphasisColor" /> +  <item_icon +    height="16" +    follows="top|left" +    image_name="Inv_Object" +    layout="topleft" +    left="0" +    name="item_icon" +    top="0" +    width="16" /> +  <item_name +    follows="left|right" +    height="20" +    layout="topleft" +    left="21" +    allow_html="false" +    use_ellipses="true" +    name="item_name" +    text_color="white" +    top="4" +    value="..." +    width="359" />  </inventory_list_item> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml index 978ca86d62..66bfd01a2a 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml @@ -27,7 +27,7 @@  			Médias proches  		</text>  		<text name="show_text"> -			Afficher : +			Voir :  		</text>  		<combo_box name="show_combo">  			<combo_box.item label="Tout" name="All"/> @@ -42,7 +42,7 @@  			<scroll_list.columns label="Nom" name="media_name"/>  			<scroll_list.columns label="Débogage" name="media_debug"/>  		</scroll_list> -		<panel> +		<panel name="media_controls_panel">  			<layout_stack name="media_controls">  				<layout_panel name="stop">  					<button name="stop_btn" tool_tip="Arrêter le média sélectionné"/> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 56ffcbdece..1767a31496 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -427,7 +427,17 @@ Mídia:  			<check_box label="Repetir mídia" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia chegar ao fim, ela recomeça."/>  		</panel>  		<panel label="SOM" name="land_audio_panel"> +			<text name="MusicURL:"> +				URL de música: +			</text>  			<check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/> +			<text name="Sound:"> +				Som: +			</text> +			<check_box label="Limitar sons de gestos e objetos a esta parcela" name="check sound local"/> +			<text name="Voice settings:"> +				Voz: +			</text>  			<check_box label="Ativar voz" name="parcel_enable_voice_channel"/>  			<check_box label="Ativar voz (definições do terreno)" name="parcel_enable_voice_channel_is_estate_disabled"/>  			<check_box label="Limitar bate-papo de voz a este lote" name="parcel_enable_voice_channel_local"/> | 
