diff options
Diffstat (limited to 'indra')
33 files changed, 696 insertions, 577 deletions
| 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 b87851490d..209bc6925f 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 @@ -970,7 +970,7 @@ 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); @@ -1002,8 +1002,11 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair)  	item_pair->first->die();  	delete item_pair; -	rearrangeItems(); -	notifyParentItemsRectChanged(); +	if (rearrange) +	{ +		rearrangeItems(); +		notifyParentItemsRectChanged(); +	}  	return true;  } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index ded46d8122..29b6b718af 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  @@ -349,7 +352,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/lltextbase.cpp b/indra/llui/lltextbase.cpp index 223998569b..ed03645944 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;  } @@ -2324,6 +2345,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..ff99712c5f 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(typename const 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/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index f278fb6a7b..48ad762965 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -463,7 +463,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/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/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/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/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/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 9f9a9bef35..973ffc2e07 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)); -LLPanelClothingListItem::~LLPanelClothingListItem() -{ +	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)); +	} + +	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); -LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem() -{ +	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)); +	} + +	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() -{ -	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml"); +	if (add_panelp) +	{ +		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 d16a2a89c8..367b648b3d 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..0eb043a7a3 100644 --- a/indra/newview/llwindebug.cpp +++ b/indra/newview/llwindebug.cpp @@ -129,7 +129,7 @@ void  LLWinDebug::init()  		s_first_run = false;  		// Add this exeption hanlder to save windows style minidump. -		AddVectoredExceptionHandler(0, &vectoredHandler); +		//AddVectoredExceptionHandler(0, &vectoredHandler);  	}  } diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml deleted file mode 100644 index 4f989a6f6f..0000000000 --- a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml +++ /dev/null @@ -1,105 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - follows="top|right|left" - height="23" - layout="topleft" - left="0" - name="wearable_item" - top="0" - width="380"> -    <icon -     follows="top|right|left" -     height="22" -     image_name="ListItem_Over" -     layout="topleft" -     left="0" -     name="hovered_icon" -     top="1" -     visible="false" -     width="380" /> -    <icon -     height="22" -     follows="top|right|left" -     image_name="ListItem_Select" -     layout="topleft" -     left="0" -     name="selected_icon" -     top="1" -     visible="false" -     width="380" /> -    <icon -     height="16" -     follows="top|left" -     image_name="Inv_Object" -     layout="topleft" -     left="0" -     name="item_icon" -     top="2" -     width="16" /> -    <text -     follows="left|right" -     height="16" -     layout="topleft" -     left_pad="5" -     allow_html="false" -     use_ellipses="true" -     name="item_name" -     text_color="white" -     top="5" -     value="..." -     width="359" /> -    <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"> -        <icon  -         name="btn_lock1" -         layout="topleft" -         follows="top|right" -         image_name="Locked_Icon" -         top="2" -         left="5" -         height="13" -         width="9" -         tab_stop="false" /> -    </panel> -    <panel -     background_visible="false" -     name="btn_edit_panel" -     layout="topleft" -     follows="top|right" -     top="1" -     left_pad="3" -     height="23" -     width="26" -     tab_stop="false"> -         <button  -          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"/> -      </panel> -    <icon -     follows="left|right|top" -     height="3" -     image_name="Wearables_Divider" -     layout="bottomleft" -     left="0" -     name="wearable_type_separator_icon" -     top="0" -     visible="true" -     width="380"/> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml deleted file mode 100644 index 93d7720c57..0000000000 --- a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml +++ /dev/null @@ -1,137 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - follows="top|right|left" - height="23" - layout="topleft" - left="0" - name="wearable_item" - top="0" - width="380"> -    <icon -     follows="top|right|left" -     height="22" -     image_name="ListItem_Over" -     layout="topleft" -     left="0" -     name="hovered_icon" -     top="1" -     visible="false" -     width="380" /> -    <icon -     height="22" -     follows="top|right|left" -     image_name="ListItem_Select" -     layout="topleft" -     left="0" -     name="selected_icon" -     top="1" -     visible="false" -     width="380" /> -    <button  -     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" /> -    <icon -     height="16" -     follows="top|left" -     image_name="Inv_Object" -     layout="topleft" -     left_pad="3" -     name="item_icon" -     top="2" -     width="16" /> -    <text -     follows="left|right" -     height="16" -     layout="topleft" -     left_pad="5" -     allow_html="false" -     use_ellipses="true" -     name="item_name" -     text_color="white" -     top="5" -     value="..." -     width="359" /> -    <button  -     name="btn_move_up" -     layout="topleft" -     follows="top|right" -     image_overlay="UpArrow_Off" -     top="1" -     left="0" -     height="23" -     width="23" -     tab_stop="false" /> -    <button  -     name="btn_move_down" -     layout="topleft" -     follows="top|right" -     image_overlay="DownArrow_Off" -     top="1" -     left_pad="3" -     height="23" -     width="23" -     tab_stop="false" /> -    <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"> -        <icon  -         name="btn_lock1" -         layout="topleft" -         follows="top|right" -         image_name="Locked_Icon" -         top="2" -         left="5" -         height="13" -         width="9" -         tab_stop="false" /> -    </panel> -    <panel -     background_visible="false" -     name="btn_edit_panel" -     layout="topleft" -     follows="top|right" -     top="0" -     left_pad="3" -     height="23" -     width="26" -     tab_stop="false"> -        <button  -         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"/> -      </panel> -    <icon -     follows="left|right|top" -     height="3" -     image_name="Wearables_Divider" -     layout="bottomleft" -     left="0" -     name="wearable_type_separator_icon" -     top="0" -     visible="false" -     width="380"/> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml deleted file mode 100644 index 75b5fd1532..0000000000 --- a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - follows="top|right|left" - height="23" - layout="topleft" - left="0" - name="deletable_wearable_item" - top="0" - width="380"> -    <icon -     follows="top|right|left" -     height="22" -     image_name="ListItem_Over" -     layout="topleft" -     left="0" -     name="hovered_icon" -     top="1" -     visible="false" -     width="380" /> -    <icon -     height="22" -     follows="top|right|left" -     image_name="ListItem_Select" -     layout="topleft" -     left="0" -     name="selected_icon" -     top="1" -     visible="false" -     width="380" /> -    <button  -     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"/> -    <icon -     height="16" -     follows="top|left" -     image_name="Inv_Object" -     layout="topleft" -     left_pad="3" -     name="item_icon" -     top="2" -     width="16" /> -    <text -     follows="left|right" -     height="16" -     layout="topleft" -     left_pad="5" -     allow_html="false" -     use_ellipses="true" -     name="item_name" -     text_color="white" -     top="5" -     value="..." -     width="359" /> -    <icon -     follows="left|right|top" -     height="3" -     image_name="Wearables_Divider" -     layout="bottomleft" -     left="0" -     name="wearable_type_separator_icon" -     top="0" -     visible="true" -     width="380"/> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml deleted file mode 100644 index a5dd34bd22..0000000000 --- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml +++ /dev/null @@ -1,83 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - follows="top|right|left" - height="23" - layout="topleft" - left="0" - name="dummy_clothing_item" - top="0" - width="380"> -    <icon -     follows="top|right|left" -     height="22" -     image_name="ListItem_Over" -     layout="topleft" -     left="0" -     name="hovered_icon" -     top="1" -     visible="false" -     width="380" /> -    <icon -     height="22" -     follows="top|right|left" -     image_name="ListItem_Select" -     layout="topleft" -     left="0" -     name="selected_icon" -     top="1" -     visible="false" -     width="380" /> -    <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" /> -    <text -     follows="left|right" -     height="16" -     layout="topleft" -     left_pad="5" -     allow_html="false" -     use_ellipses="true" -     name="item_name" -     text_color="LtGray_50" -     top="4" -     value="..." -     width="359" /> -    <panel -     name="btn_add_panel" -     layout="topleft" -     follows="top|right" -     top="0" -     left="0" -     height="23" -     width="26" -     tab_stop="false"> -      <button  -       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" /> -    </panel> -    <icon -     follows="left|right|top" -     height="3" -     image_name="Wearables_Divider" -     layout="bottomleft" -     left="0" -     name="wearable_type_separator_icon" -     top="0" -     visible="true" -     width="380"/> -</panel> 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..4e7e2873b5 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_name="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> | 
