diff options
51 files changed, 801 insertions, 961 deletions
| diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index bc286c1868..0c1ed2aab9 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -274,7 +274,7 @@ BOOL LLFolderView::canFocusChildren() const  	return FALSE;  } -BOOL LLFolderView::addFolder( LLFolderViewFolder* folder) +void LLFolderView::addFolder( LLFolderViewFolder* folder)  {  	LLFolderViewFolder::addFolder(folder); @@ -288,8 +288,6 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)  	//{  	//	mFolders.insert(mFolders.begin(), folder);  	//} - -	return TRUE;  }  void LLFolderView::closeAllFolders() @@ -1766,14 +1764,14 @@ void LLFolderView::update()  	// until that inventory is loaded up.  	LLFastTimer t2(FTM_INVENTORY); -	if (getFolderViewModel()->getFilter()->isModified() && getFolderViewModel()->getFilter()->isNotDefault()) +	if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault())  	{  		mNeedsAutoSelect = TRUE;  	} -	getFolderViewModel()->getFilter()->clearModified(); +	getFolderViewModel()->getFilter().clearModified();  	// filter to determine visibility before arranging -	filter(*(getFolderViewModel()->getFilter())); +	filter(getFolderViewModel()->getFilter());  	// automatically show matching items, and select first one if we had a selection  	if (mNeedsAutoSelect) @@ -1791,7 +1789,7 @@ void LLFolderView::update()  		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.  		// Used by LLPlacesFolderView. -		if (getFolderViewModel()->getFilter()->showAllResults()) +		if (getFolderViewModel()->getFilter().showAllResults())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index ba37a11bbe..05beff9bd8 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -121,7 +121,7 @@ public:  	void closeAllFolders();  	void openTopLevelFolders(); -	virtual BOOL addFolder( LLFolderViewFolder* folder); +	virtual void addFolder( LLFolderViewFolder* folder);  	// Find width and height of this object and its children. Also  	// makes sure that this view and its children are the right size. @@ -217,6 +217,7 @@ public:  	BOOL getShowSingleSelection() { return mShowSingleSelection; }  	F32  getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }  	bool getUseEllipses() { return mUseEllipses; } +	S32 getSelectedCount() { return (S32)mSelectedItems.size(); }  	void	update();						// needs to be called periodically (e.g. once per frame) diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 2f17fa7c35..480332ae70 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -89,7 +89,8 @@ LLFolderViewItem::Params::Params()  	selection_image("selection_image"),  	item_height("item_height"),  	item_top_pad("item_top_pad"), -	creation_date() +	creation_date(), +	allow_open("allow_open", true)  {}  // Default constructor @@ -105,14 +106,13 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  	mHasVisibleChildren(FALSE),  	mIndentation(0),  	mItemHeight(p.item_height), -	//TODO RN: create interface for string highlighting -	//mStringMatchOffset(std::string::npos),  	mControlLabelRotation(0.f),  	mDragAndDropTarget(FALSE),  	mLabel(p.name),  	mRoot(p.root),  	mViewModelItem(p.listener), -	mIsMouseOverTitle(false) +	mIsMouseOverTitle(false), +	mAllowOpen(p.allow_open)  {  	if (mViewModelItem)  	{ @@ -219,11 +219,11 @@ void LLFolderViewItem::refresh()  	mIconOpen = vmi.getIconOpen();  	mIconOverlay = vmi.getIconOverlay(); -		if (mRoot->useLabelSuffix()) -		{ +	if (mRoot->useLabelSuffix()) +	{  		mLabelStyle = vmi.getLabelStyle();  		mLabelSuffix = vmi.getLabelSuffix(); -} +	}  	//TODO RN: make sure this logic still fires  	//std::string searchable_label(mLabel); @@ -253,7 +253,7 @@ void LLFolderViewItem::arrangeAndSet(BOOL set_selection,  	LLFolderView* root = getRoot();  	if (getParentFolder())  	{ -	getParentFolder()->requestArrange(); +		getParentFolder()->requestArrange();  	}  	if(set_selection)  	{ @@ -273,9 +273,9 @@ std::set<LLFolderViewItem*> LLFolderViewItem::getSelectionList() const  }  // addToFolder() returns TRUE if it succeeds. FALSE otherwise -BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder) +void LLFolderViewItem::addToFolder(LLFolderViewFolder* folder)  { -	return folder->addItem(this); +	folder->addItem(this);  } @@ -404,8 +404,11 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)  void LLFolderViewItem::openItem( void )  { +	if (mAllowOpen) +	{  	getViewModelItem()->openItem();  } +}  void LLFolderViewItem::rename(const std::string& new_name)  { @@ -413,12 +416,12 @@ void LLFolderViewItem::rename(const std::string& new_name)  	{  		getViewModelItem()->renameItem(new_name); -			if(mParentFolder) -			{ -				mParentFolder->requestSort(); -			} -		} +		//if(mParentFolder) +		//{ +		//	mParentFolder->requestSort(); +		//}  	} +}  const std::string& LLFolderViewItem::getName( void ) const  { @@ -517,7 +520,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask )  { -	getViewModelItem()->openItem(); +	openItem();  	return TRUE;  } @@ -744,15 +747,29 @@ void LLFolderViewItem::draw()  		return;  	} +	std::string::size_type filter_string_length = mViewModelItem->hasFilterStringMatch() ? mViewModelItem->getFilterStringSize() : 0; +	F32 right_x  = 0; +	F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; +	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); +	std::string combined_string = mLabel + mLabelSuffix; + +	if (filter_string_length > 0) +	{ +		S32 left = llround(text_left) + font->getWidth(combined_string, 0, mViewModelItem->getFilterStringOffset()) - 2; +		S32 right = left + font->getWidth(combined_string, mViewModelItem->getFilterStringOffset(), filter_string_length) + 2; +		S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD); +		S32 top = getRect().getHeight() - TOP_PAD; + +		LLUIImage* box_image = default_params.selection_image; +		LLRect box_rect(left, top, right, bottom); +		box_image->draw(box_rect, sFilterBGColor); +	} +  	LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;  	//TODO RN: implement this in terms of getColor()  	//if (highlight_link) color = sLinkColor;  	//if (gInventory.isObjectDescendentOf(getViewModelItem()->getUUID(), gInventory.getLibraryRootFolderID())) color = sLibraryColor; -	F32 right_x  = 0; -	F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; -	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation); -  	//--------------------------------------------------------------------------------//  	// Draw the actual label text  	// @@ -773,29 +790,14 @@ void LLFolderViewItem::draw()  	//--------------------------------------------------------------------------------//  	// Highlight string match  	// -	//TODO RN: expose interface for highlighting -	//if (mStringMatchOffset != std::string::npos) -	//{ -	//	// don't draw backgrounds for zero-length strings -	//	S32 filter_string_length = getRoot()->getFilterSubString().size(); -	//	if (filter_string_length > 0) -	//	{ -	//		std::string combined_string = mLabel + mLabelSuffix; -	//		S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1; -	//		S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2; -	//		S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD); -	//		S32 top = getRect().getHeight() - TOP_PAD; -	//	 -	//		LLUIImage* box_image = default_params.selection_image; -	//		LLRect box_rect(left, top, right, bottom); -	//		box_image->draw(box_rect, sFilterBGColor); -	//		F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset); -	//		F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; -	//		font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy, -	//						  sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -	//						  filter_string_length, S32_MAX, &right_x, FALSE ); -	//	} -	//} +	if (filter_string_length > 0) +	{ +		F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mViewModelItem->getFilterStringOffset()); +		F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD; +		font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy, +							sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, +							filter_string_length, S32_MAX, &right_x, FALSE ); +	}  }  const LLFolderViewModelInterface* LLFolderViewItem::getFolderViewModel( void ) const @@ -834,9 +836,9 @@ LLFolderViewFolder::~LLFolderViewFolder( void )  }  // addToFolder() returns TRUE if it succeeds. FALSE otherwise -BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder) +void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)  { -	return folder->addFolder(this); +	folder->addFolder(this);  }  static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange"); @@ -1003,11 +1005,6 @@ BOOL LLFolderViewFolder::needsArrange()  	return mLastArrangeGeneration < getRoot()->getArrangeGeneration();   } -void LLFolderViewFolder::requestSort() -{ -	getViewModelItem()->requestSort(); -} -  //TODO RN: get height resetting working  //void LLFolderViewFolder::setPassedFilter(BOOL passed, BOOL passed_folder, S32 filter_generation)  //{ @@ -1412,7 +1409,6 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )  	}  	//item has been removed, need to update filter  	getViewModelItem()->removeChild(item->getViewModelItem()); -	getViewModelItem()->dirtyFilter();  	//because an item is going away regardless of filter status, force rearrange  	requestArrange();  	removeChild(item); @@ -1478,7 +1474,7 @@ BOOL LLFolderViewFolder::isRemovable()  }  // this is an internal method used for adding items to folders.  -BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) +void LLFolderViewFolder::addItem(LLFolderViewItem* item)  {  	if (item->getParentFolder())  	{ @@ -1491,7 +1487,6 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)  	item->setRect(LLRect(0, 0, getRect().getWidth(), 0));  	item->setVisible(FALSE); -	addChild(item);  	// TODO RN - port creation date management to new code location  #if 0 @@ -1499,10 +1494,7 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)  	setCreationDate(llmax<time_t>(mCreationDate, item->getCreationDate()));  #endif -	// Handle sorting -	requestArrange(); -	requestSort(); - +	addChild(item);  	getViewModelItem()->addChild(item->getViewModelItem());  	// TODO RN - port creation date management to new code location  #if 0 @@ -1528,14 +1520,10 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)  	//	parentp = parentp->getParentFolder();  	//} - -	item->getViewModelItem()->dirtyFilter(); - -	return TRUE;  }  // this is an internal method used for adding items to folders.  -BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder) +void LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)  {  	if (folder->mParentFolder)  	{ @@ -1546,30 +1534,26 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)  	folder->setOrigin(0, 0);  	folder->reshape(getRect().getWidth(), 0);  	folder->setVisible(FALSE); -	addChild( folder );  	// rearrange all descendants too, as our indentation level might have changed -	folder->requestArrange(); -	requestSort(); +	//folder->requestArrange(); +	//requestSort(); +	addChild( folder );  	getViewModelItem()->addChild(folder->getViewModelItem()); -  //After addChild since addChild assigns parent to bubble up to when calling dirtyFilter -  folder->getViewModelItem()->dirtyFilter(); - -	return TRUE;  }  void LLFolderViewFolder::requestArrange()  {   	//if ( mLastArrangeGeneration != -1)  	{ -	mLastArrangeGeneration = -1;  -	// flag all items up to root -	if (mParentFolder) -	{ -		mParentFolder->requestArrange(); -	} +		mLastArrangeGeneration = -1;  +		// flag all items up to root +		if (mParentFolder) +		{ +			mParentFolder->requestArrange();  		}  	} +}  void LLFolderViewFolder::toggleOpen()  { diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 50d3e0580e..4eda02f13f 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -61,6 +61,7 @@ public:  													item_top_pad;  		Optional<time_t>							creation_date; +		Optional<bool>								allow_open;  		Params();  	}; @@ -92,30 +93,29 @@ protected:  	bool						mLabelWidthDirty;  	LLFolderViewFolder*			mParentFolder;  	LLFolderViewModelItem*		mViewModelItem; -	BOOL						mIsCurSelection; -	BOOL						mSelectPending;  	LLFontGL::StyleFlags		mLabelStyle;  	std::string					mLabelSuffix;  	LLUIImagePtr				mIcon;  	LLUIImagePtr				mIconOpen;  	LLUIImagePtr				mIconOverlay; -	BOOL						mHasVisibleChildren;  	S32							mIndentation;  	S32							mItemHeight;  	S32							mDragStartX,  								mDragStartY; -	//TODO RN: create interface for string highlighting -	//std::string::size_type		mStringMatchOffset;  	F32							mControlLabelRotation;  	LLFolderView*				mRoot; -	BOOL						mDragAndDropTarget; +	bool						mHasVisibleChildren; +	bool						mIsCurSelection; +	bool						mDragAndDropTarget;  	bool						mIsMouseOverTitle; +	bool						mAllowOpen; +	bool						mSelectPending;  	// this is an internal method used for adding items to folders. A  	// no-op at this level, but reimplemented in derived classes. -	virtual BOOL addItem(LLFolderViewItem*) { return FALSE; } -	virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; } +	virtual void addItem(LLFolderViewItem*) { } +	virtual void addFolder(LLFolderViewFolder*) { }  	static LLFontGL* getLabelFontForStyle(U8 style); @@ -129,7 +129,7 @@ public:  	virtual ~LLFolderViewItem( void );  	// addToFolder() returns TRUE if it succeeds. FALSE otherwise -	virtual BOOL addToFolder(LLFolderViewFolder* folder); +	virtual void addToFolder(LLFolderViewFolder* folder);  	// Finds width and height of this object and it's children.  Also  	// makes sure that this view and it's children are the right size. @@ -295,7 +295,7 @@ public:  	LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE  );  	// addToFolder() returns TRUE if it succeeds. FALSE otherwise -	virtual BOOL addToFolder(LLFolderViewFolder* folder); +	virtual void addToFolder(LLFolderViewFolder* folder);  	// Finds width and height of this object and it's children.  Also  	// makes sure that this view and it's children are the right size. @@ -354,8 +354,6 @@ public:  	// Called when a child is refreshed.  	virtual void requestArrange(); -	virtual void requestSort(); -  	// internal method which doesn't update the entire view. This  	// method was written because the list iterators destroy the state  	// of other iterations, thus, we can't arrange while iterating @@ -379,8 +377,6 @@ public:  	void applyFunctorToChildren(LLFolderViewFunctor& functor);  	virtual void openItem( void ); -	virtual BOOL addItem(LLFolderViewItem* item); -	virtual BOOL addFolder( LLFolderViewFolder* folder);  	// LLView functionality  	virtual BOOL handleHover(S32 x, S32 y, MASK mask); @@ -410,7 +406,12 @@ public:  	LLFolderViewFolder* getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse);  	void gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse,  std::vector<LLFolderViewItem*>& items); -public: +	// internal functions for tracking folders and items separately +	// use addToFolder() virtual method to ensure folders are always added to mFolders +	// and not mItems +	void addItem(LLFolderViewItem* item); +	void addFolder( LLFolderViewFolder* folder); +  	//WARNING: do not call directly...use the appropriate LLFolderViewModel-derived class instead  	template<typename SORT_FUNC> void sortFolders(const SORT_FUNC& func) { mFolders.sort(func); }  	template<typename SORT_FUNC> void sortItems(const SORT_FUNC& func) { mItems.sort(func); } diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp index dc6e4d754b..6aa4a63edc 100644 --- a/indra/llui/llfolderviewmodel.cpp +++ b/indra/llui/llfolderviewmodel.cpp @@ -36,18 +36,18 @@ bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item)  std::string LLFolderViewModelCommon::getStatusText()  { -	if (!contentsReady() || mFolderView->getViewModelItem()->getLastFilterGeneration() < getFilter()->getCurrentGeneration()) +	if (!contentsReady() || mFolderView->getViewModelItem()->getLastFilterGeneration() < getFilter().getCurrentGeneration())  	{  		return LLTrans::getString("Searching");  	}  	else  	{ -		return getFilter()->getEmptyLookupMessage(); +		return getFilter().getEmptyLookupMessage();  	}  }  void LLFolderViewModelCommon::filter()  { -	getFilter()->setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000)); -	mFolderView->getViewModelItem()->filter(*getFilter()); +	getFilter().setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000)); +	mFolderView->getViewModelItem()->filter(getFilter());  } diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index acdec53602..c4d98657e2 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -73,6 +73,8 @@ public:  	virtual bool				showAllResults() const = 0; +	virtual std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const = 0; +	virtual std::string::size_type getFilterStringSize() const = 0;  	// +-------------------------------------------------------------------+  	// + Status  	// +-------------------------------------------------------------------+ @@ -107,6 +109,24 @@ public:  	virtual S32 				getFirstRequiredGeneration() const = 0;  }; +class LLFolderViewModelInterface +{ +public: +	virtual ~LLFolderViewModelInterface() {} +	virtual void requestSortAll() = 0; + +	virtual void sort(class LLFolderViewFolder*) = 0; +	virtual void filter() = 0; + +	virtual bool contentsReady() = 0; +	virtual void setFolderView(LLFolderView* folder_view) = 0; +	virtual LLFolderViewFilter& getFilter() = 0; +	virtual const LLFolderViewFilter& getFilter() const = 0; +	virtual std::string getStatusText() = 0; + +	virtual bool startDrag(std::vector<LLFolderViewModelItem*>& items) = 0; +}; +  // This is am abstract base class that users of the folderview classes  // would use to bridge the folder view with the underlying data  class LLFolderViewModelItem @@ -155,8 +175,11 @@ public:  	virtual void filter( LLFolderViewFilter& filter) = 0;  	virtual bool passedFilter(S32 filter_generation = -1) = 0;  	virtual bool descendantsPassedFilter(S32 filter_generation = -1) = 0; -	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) = 0; +	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) = 0;  	virtual void dirtyFilter() = 0; +	virtual bool hasFilterStringMatch() = 0; +	virtual std::string::size_type getFilterStringOffset() = 0; +	virtual std::string::size_type getFilterStringSize() = 0;  	virtual S32	getLastFilterGeneration() const = 0; @@ -188,15 +211,17 @@ protected:  class LLFolderViewModelItemCommon : public LLFolderViewModelItem  {  public: -	LLFolderViewModelItemCommon() +	LLFolderViewModelItemCommon(LLFolderViewModelInterface& root_view_model)  	:	mSortVersion(-1),  		mPassedFilter(true),  		mPassedFolderFilter(true), -		mPrevPassedAllFilters(false), +		mStringMatchOffsetFilter(std::string::npos), +		mStringFilterSize(0),  		mFolderViewItem(NULL),  		mLastFilterGeneration(-1),  		mMostFilteredDescendantGeneration(-1), -		mParent(NULL) +		mParent(NULL), +		mRootViewModel(root_view_model)  	{  		std::for_each(mChildren.begin(), mChildren.end(), DeletePointer());  	} @@ -216,24 +241,67 @@ public:  			mParent->dirtyFilter();  		}	  	} +	bool hasFilterStringMatch() { return mStringMatchOffsetFilter != std::string::npos; } +	std::string::size_type getFilterStringOffset() { return mStringMatchOffsetFilter; } +	std::string::size_type getFilterStringSize() { return mStringFilterSize; } +	  	virtual void addChild(LLFolderViewModelItem* child)   	{   		mChildren.push_back(child);   		child->setParent(this);  +		dirtyFilter(); +		requestSort();  	}  	virtual void removeChild(LLFolderViewModelItem* child)   	{   		mChildren.remove(child);   		child->setParent(NULL);  +		dirtyFilter(); +	} + +	void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) +	{ +		mPassedFilter = passed; +		mPassedFolderFilter = passed_folder; +		mLastFilterGeneration = filter_generation; +		mStringMatchOffsetFilter = string_offset; +		mStringFilterSize = string_size; +	} + +	virtual bool potentiallyVisible() +	{ +		return passedFilter() // we've passed the filter +			|| getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration() // or we don't know yet +			|| descendantsPassedFilter(); +	} + +	virtual bool passedFilter(S32 filter_generation = -1)  +	{  +		if (filter_generation < 0)  +			filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); + +		bool passed_folder_filter = mPassedFolderFilter && mLastFilterGeneration >= filter_generation; +		bool passed_filter = mPassedFilter && mLastFilterGeneration >= filter_generation; +		return passed_folder_filter +				&& (descendantsPassedFilter(filter_generation) +					|| passed_filter);  	} +	virtual bool descendantsPassedFilter(S32 filter_generation = -1) +	{  +		if (filter_generation < 0) filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration(); +		return mMostFilteredDescendantGeneration >= filter_generation;  +	} + +  protected:  	virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; }  	S32						mSortVersion;  	bool					mPassedFilter;  	bool					mPassedFolderFilter; -	bool					mPrevPassedAllFilters; +	std::string::size_type	mStringMatchOffsetFilter; +	std::string::size_type	mStringFilterSize;  	S32						mLastFilterGeneration;  	S32						mMostFilteredDescendantGeneration; @@ -242,28 +310,13 @@ protected:  	typedef std::list<LLFolderViewModelItem*> child_list_t;  	child_list_t			mChildren;  	LLFolderViewModelItem*	mParent; +	LLFolderViewModelInterface& mRootViewModel;  	void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;}  	LLFolderViewItem*		mFolderViewItem;  }; -class LLFolderViewModelInterface -{ -public: -	virtual ~LLFolderViewModelInterface() {} -	virtual void requestSortAll() = 0; - -	virtual void sort(class LLFolderViewFolder*) = 0; -	virtual void filter() = 0; -	virtual bool contentsReady() = 0; -	virtual void setFolderView(LLFolderView* folder_view) = 0; -	virtual LLFolderViewFilter* getFilter() = 0; -	virtual const LLFolderViewFilter* getFilter() const = 0; -	virtual std::string getStatusText() = 0; - -	virtual bool startDrag(std::vector<LLFolderViewModelItem*>& items) = 0; -};  class LLFolderViewModelCommon : public LLFolderViewModelInterface  { @@ -307,8 +360,8 @@ public:  	virtual const SortType& getSorter() const 		 { return mSorter; }  	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); } -	virtual FilterType* getFilter() 				 { return &mFilter; } -	virtual const FilterType* getFilter() const		 { return &mFilter; } +	virtual FilterType& getFilter() 				 { return mFilter; } +	virtual const FilterType& getFilter() const		 { return mFilter; }  	virtual void setFilter(const FilterType& filter) { mFilter = filter; }  	// TODO RN: remove this and put all filtering logic in view model diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index f64f33bc5e..91a6b3259c 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -304,9 +304,4 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st  	//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &get_empty_param_block<T>);  } -//static  -const std::string* LLUICtrlFactory::getWidgetName(const std::type_info* widget_type) -{ -	return LLWidgetNameRegistry::instance().getValue(widget_type); -} diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index b441cb0c9d..9f18be2371 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -105,7 +105,7 @@ private:  		ParamDefaults()  		{  			// look up template file for this param block... -			const std::string* param_block_tag = getWidgetName(&typeid(PARAM_BLOCK)); +			const std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));  			if (param_block_tag)  			{	// ...and if it exists, back fill values using the most specific template first  				PARAM_BLOCK params; @@ -139,7 +139,6 @@ public:  	template<typename T>  	static const typename T::Params& getDefaultParams()  	{ -		//#pragma message("Generating ParamDefaults")  		return ParamDefaults<typename T::Params, 0>::instance().get();  	} @@ -303,8 +302,6 @@ private:  	} -	static const std::string* getWidgetName(const std::type_info* widget_type); -  	// this exists to get around dependency on llview  	static void setCtrlParent(LLView* view, LLView* parent, S32 tab_group); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b71f13a450..626fb8caa5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -383,7 +383,6 @@ set(viewer_SOURCE_FILES      llpanelmaininventory.cpp      llpanelmarketplaceinbox.cpp      llpanelmarketplaceinboxinventory.cpp -    llpanelmarketplaceoutboxinventory.cpp      llpanelmediasettingsgeneral.cpp      llpanelmediasettingspermissions.cpp      llpanelmediasettingssecurity.cpp @@ -942,7 +941,6 @@ set(viewer_HEADER_FILES      llpanelmaininventory.h      llpanelmarketplaceinbox.h      llpanelmarketplaceinboxinventory.h -    llpanelmarketplaceoutboxinventory.h      llpanelmediasettingsgeneral.h      llpanelmediasettingspermissions.h      llpanelmediasettingssecurity.h diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index e2417cdddb..e31e39dca2 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -342,7 +342,7 @@ void LLLibraryOutfitsFetch::folderDone()  	}  	mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); -	mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); +	mLibraryClothingID = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_CLOTHING, false);  	// If Library->Clothing->Initial Outfits exists, use that.  	LLNameCategoryCollector matchFolderFunctor("Initial Outfits"); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6d67e098a6..510abf198a 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2330,7 +2330,7 @@ void LLAppearanceMgr::copyLibraryGestures()  	// Copy gestures  	LLUUID lib_gesture_cat_id = -		gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true); +		gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_GESTURE,false);  	if (lib_gesture_cat_id.isNull())  	{  		llwarns << "Unable to copy gestures, source category not found" << llendl; diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp index 04a55b261c..18ed36d0f3 100644 --- a/indra/newview/llfloateroutbox.cpp +++ b/indra/newview/llfloateroutbox.cpp @@ -174,9 +174,8 @@ void LLFloaterOutbox::onOpen(const LLSD& key)  	if (mOutboxId.isNull())  	{  		const bool do_not_create_folder = false; -		const bool do_not_find_in_library = false; -		const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library); +		const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder);  		if (outbox_id.isNull())  		{ @@ -252,7 +251,7 @@ void LLFloaterOutbox::setupOutbox(const LLUUID& outboxId)  	// Set the sort order newest to oldest  	mOutboxInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);	 -	mOutboxInventoryPanel->getFilter()->markDefault(); +	mOutboxInventoryPanel->getFilter().markDefault();  	fetchOutboxContents(); diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp index 13ca73917b..e2376b18d5 100644 --- a/indra/newview/llfolderviewmodelinventory.cpp +++ b/indra/newview/llfolderviewmodelinventory.cpp @@ -109,7 +109,12 @@ bool LLFolderViewModelInventory::contentsReady()  void LLFolderViewModelItemInventory::requestSort()  {  	LLFolderViewModelItemCommon::requestSort(); -	if (mRootViewModel.getSorter().isByDate()) +	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(mFolderViewItem); +	if (folderp) +	{ +		folderp->requestArrange(); +	} +	if (static_cast<LLFolderViewModelInventory&>(mRootViewModel).getSorter().isByDate())  	{  		// sort by date potentially affects parent folders which use a date  		// derived from newest item in them @@ -120,35 +125,9 @@ void LLFolderViewModelItemInventory::requestSort()  	}  } -bool LLFolderViewModelItemInventory::potentiallyVisible() -{ -	return passedFilter() // we've passed the filter -		|| getLastFilterGeneration() < mRootViewModel.getFilter()->getFirstSuccessGeneration() // or we don't know yet -		|| descendantsPassedFilter(); -} - -bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)  -{  -	if (filter_generation < 0)  -		filter_generation = mRootViewModel.getFilter()->getFirstSuccessGeneration(); - -	return mPassedFolderFilter  -		&& (descendantsPassedFilter(filter_generation) -			|| (mLastFilterGeneration >= filter_generation  -				&& mPassedFilter)); -} - -bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation) -{  -	if (filter_generation < 0) filter_generation = mRootViewModel.getFilter()->getFirstSuccessGeneration(); -	return mMostFilteredDescendantGeneration >= filter_generation;  -} - -void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) +void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)  { -	mPassedFilter = passed; -	mPassedFolderFilter = passed_folder; -	mLastFilterGeneration = filter_generation; +	LLFolderViewModelItemCommon::setPassedFilter(passed, passed_folder, filter_generation, string_offset, string_size);  	bool passed_filter_before = mPrevPassedAllFilters;  	mPrevPassedAllFilters = passedFilter(filter_generation); @@ -226,9 +205,7 @@ void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)  								? filter.checkFolder(this)  								: true; -		setPassedFilter(passed_filter, passed_filter_folder, filter_generation); -		//TODO RN: create interface for string highlighting -		//mStringMatchOffset = filter.getStringMatchOffset(this); +		setPassedFilter(passed_filter, passed_filter_folder, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());  	}  } @@ -324,3 +301,8 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,  	}  } +LLFolderViewModelItemInventory::LLFolderViewModelItemInventory( class LLFolderViewModelInventory& root_view_model )  +	:	LLFolderViewModelItemCommon(root_view_model), +	mPrevPassedAllFilters(false) +{ +} diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index ab67c93897..664addf336 100644 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -37,9 +37,7 @@ class LLFolderViewModelItemInventory  	:	public LLFolderViewModelItemCommon  {  public: -	LLFolderViewModelItemInventory(class LLFolderViewModelInventory& root_view_model) -	:	mRootViewModel(root_view_model) -	{} +	LLFolderViewModelItemInventory(class LLFolderViewModelInventory& root_view_model);  	virtual const LLUUID& getUUID() const = 0;  	virtual time_t getCreationDate() const = 0;	// UTC seconds  	virtual void setCreationDate(time_t creation_date_utc) = 0; @@ -55,10 +53,7 @@ public:  	virtual EInventorySortGroup getSortGroup() const = 0;  	virtual LLInventoryObject* getInventoryObject() const = 0;  	virtual void requestSort(); -	virtual bool potentiallyVisible(); -	virtual bool passedFilter(S32 filter_generation = -1); -	virtual bool descendantsPassedFilter(S32 filter_generation = -1); -	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation); +	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0);  	virtual void filter( LLFolderViewFilter& filter);  	virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter); @@ -66,25 +61,36 @@ public:  	virtual LLToolDragAndDrop::ESource getDragSource() const = 0;  protected: -	class LLFolderViewModelInventory& mRootViewModel; +	bool								mPrevPassedAllFilters;  };  class LLInventorySort  {  public: -	LLInventorySort(U32 order = 0) -		:	mSortOrder(order), -		mByDate(false), -		mSystemToTop(false), -		mFoldersByName(false) +	struct Params : public LLInitParam::Block<Params>  	{ -		mByDate = (order & LLInventoryFilter::SO_DATE); -		mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); -		mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME); +		Optional<S32> order; + +		Params() +		:	order("order", 0) +		{} +	}; + +	LLInventorySort(S32 order = 0) +	{ +		fromParams(Params().order(order));  	}  	bool isByDate() const { return mByDate; }  	U32 getSortOrder() const { return mSortOrder; } +	void toParams(Params& p) { p.order(mSortOrder);} +	void fromParams(Params& p)  +	{  +		mSortOrder = p.order;  +		mByDate = (mSortOrder & LLInventoryFilter::SO_DATE); +		mSystemToTop = (mSortOrder & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); +		mFoldersByName = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME); +	}  	bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const;  private: diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index adcd840dfc..cc094fcaa1 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -100,7 +100,7 @@ BOOL LLIMFloaterContainer::postBuild()  	mConversationsListPanel = getChild<LLPanel>("conversations_list_panel");  	// CHUI-98 : View Model for conversations -	LLConversationItem* base_item = new LLConversationItem(); +	LLConversationItem* base_item = new LLConversationItem(this);  	LLFolderView::Params p;  	p.view_model = &mConversationViewModel;  	p.parent_panel = mConversationsListPanel; @@ -418,6 +418,7 @@ void LLIMFloaterContainer::repositioningWidgets()  		 widget_it++, ++index)  	{  		LLFolderViewItem* widget = widget_it->second; +		widget->setVisible(TRUE);  		widget->setRect(LLRect(0,  							   panel_rect.getHeight() - item_height*index,  							   panel_rect.getWidth(), @@ -455,13 +456,13 @@ void LLIMFloaterContainer::addConversationListItem(std::string name, const LLUUI  	mConversationsWidgets[floaterp] = widget;  	// Add a new conversation widget to the root folder of a folder view. -	mConversationsRoot->addItem(widget); +	widget->addToFolder(mConversationsRoot);  	// Add it to the UI  	widget->setVisible(TRUE);  	repositioningWidgets(); - +	  	mConversationsListPanel->addChild(widget);  	return; @@ -532,6 +533,7 @@ LLFolderViewItem* LLIMFloaterContainer::createConversationItemWidget(LLConversat  // Conversation items  LLConversationItem::LLConversationItem(std::string name, const LLUUID& uuid, LLFloater* floaterp, LLIMFloaterContainer* containerp) : +	LLFolderViewModelItemCommon(containerp->getRootViewModel()),  	mName(name),  	mUUID(uuid),      mFloater(floaterp), @@ -539,7 +541,8 @@ LLConversationItem::LLConversationItem(std::string name, const LLUUID& uuid, LLF  {  } -LLConversationItem::LLConversationItem() : +LLConversationItem::LLConversationItem(LLIMFloaterContainer* containerp) : +	LLFolderViewModelItemCommon(containerp->getRootViewModel()),  	mName(""),  	mUUID(),  	mFloater(NULL), diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 7005ab7b6a..b352e8a004 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -57,7 +57,7 @@ class LLConversationItem : public LLFolderViewModelItemCommon  {  public:  	LLConversationItem(std::string name, const LLUUID& uuid, LLFloater* floaterp, LLIMFloaterContainer* containerp); -	LLConversationItem(); +	LLConversationItem(LLIMFloaterContainer* containerp);  	virtual ~LLConversationItem() {}  	// Stub those things we won't really be using in this conversation context @@ -91,7 +91,7 @@ public:  	virtual bool potentiallyVisible() { return true; }  	virtual void filter( LLFolderViewFilter& filter) { }  	virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; } -	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) { } +	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) { }  	virtual bool passedFilter(S32 filter_generation = -1) { return true; }  	// The action callbacks @@ -142,6 +142,8 @@ public:  	void 				setEmptyLookupMessage(const std::string& message) { }  	std::string			getEmptyLookupMessage() const { return mEmpty; }  	bool				showAllResults() const { return true; } +	std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const { return std::string::npos; } +	std::string::size_type getFilterStringSize() const { return 0; }  	bool 				isActive() const { return false; }  	bool 				isModified() const { return false; } @@ -239,6 +241,7 @@ public:  	/*virtual*/ void sessionVoiceOrIMStarted(const LLUUID& session_id);  	/*virtual*/ void sessionRemoved(const LLUUID& session_id);  	/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) {}; +	LLConversationViewModel& getRootViewModel() { return mConversationViewModel; }  private:  	typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 9f1d4bdec9..43c4ce1278 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -900,7 +900,7 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const  LLInventoryFilter* LLInvFVBridge::getInventoryFilter() const  {  	LLInventoryPanel* panel = mInventoryPanel.get(); -	return panel ? panel->getFilter() : NULL; +	return panel ? &(panel->getFilter()) : NULL;  }  BOOL LLInvFVBridge::isItemInTrash() const @@ -955,7 +955,7 @@ BOOL LLInvFVBridge::isCOFFolder() const  BOOL LLInvFVBridge::isInboxFolder() const  { -	const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false); +	const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false);  	if (inbox_id.isNull())  	{ @@ -995,7 +995,7 @@ BOOL LLInvFVBridge::isOutboxFolderDirectParent() const  const LLUUID LLInvFVBridge::getOutboxFolder() const  { -	const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +	const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);  	return outbox_id;  } @@ -1330,7 +1330,7 @@ LLToolDragAndDrop::ESource LLInvFVBridge::getDragSource() const  // +=================================================+  // |        InventoryFVBridgeBuilder                 |  // +=================================================+ -LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, +LLInvFVBridge* LLInventoryFolderViewModelBuilder::createBridge(LLAssetType::EType asset_type,  														LLAssetType::EType actual_asset_type,  														LLInventoryType::EType inv_type,  														LLInventoryPanel* inventory, @@ -1438,7 +1438,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		LLInventoryItem* itemp = model->getItem(mUUID);  		if (!itemp) return; -		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);  		copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());  	}  } @@ -2469,7 +2469,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  			}  			else  			{ -				if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false))) +				if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))  				{  					set_dad_inbox_object(cat_id);  				} @@ -2909,7 +2909,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		LLInventoryCategory * cat = gInventory.getCategory(mUUID);  		if (!cat) return; -		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +		const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);  		copy_folder_to_outbox(cat, outbox_id, cat->getUUID(), LLToolDragAndDrop::getOperationId());  	}  #if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU @@ -4068,7 +4068,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			else  			{  				// set up observer to select item once drag and drop from inbox is complete  -				if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false))) +				if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))  				{  					set_dad_inbox_object(inv_item->getUUID());  				} @@ -6487,7 +6487,7 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(  	}  	else  	{ -		new_listener = LLInventoryFVBridgeBuilder::createBridge(asset_type, +		new_listener = LLInventoryFolderViewModelBuilder::createBridge(asset_type,  																actual_asset_type,  																inv_type,  																inventory, diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 9997d1720f..fc0b15acad 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -185,15 +185,15 @@ protected:  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInvFVBridgeBuilder +// Class LLInventoryFolderViewModelBuilder  // -// This class intended to build Folder View Bridge via LLInvFVBridge::createBridge. -// It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge. +// This class intended to build Folder View Model via LLInvFVBridge::createBridge. +// It can be overridden with another way of creation necessary Inventory Folder View Models.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryFVBridgeBuilder +class LLInventoryFolderViewModelBuilder  {  public: - 	virtual ~LLInventoryFVBridgeBuilder() {} + 	virtual ~LLInventoryFolderViewModelBuilder() {}  	virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type,  										LLAssetType::EType actual_asset_type,  										LLInventoryType::EType inv_type, @@ -637,7 +637,7 @@ public:  };  // Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel -class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder +class LLRecentInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder  {  public:  	// Overrides FolderBridge for Recent Inventory Panel. diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index b4be927b09..c913269aad 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -69,7 +69,6 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)  	mFilterModified(FILTER_NONE),  	mEmptyLookupMessage("InventoryNoMatchingItems"),      mFilterOps(p.filter_ops), -	mOrder(p.sort_order),  	mFilterSubString(p.substring),  	mCurrentGeneration(0),  	mFirstRequiredGeneration(0), @@ -95,9 +94,9 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)  		return passed_clipboard;  	} -	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : 0; +	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos; -	BOOL passed = string_offset !=  std::string::npos; +	BOOL passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);  	passed = passed && checkAgainstFilterType(listener);  	passed = passed && checkAgainstPermissions(listener);  	passed = passed && checkAgainstFilterLinks(listener); @@ -108,7 +107,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)  bool LLInventoryFilter::check(const LLInventoryItem* item)  { -	std::string::size_type string_offset = mFilterSubString.size() ?   item->getName().find(mFilterSubString) : std::string::npos; +	std::string::size_type string_offset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;  	const bool passed_filtertype = checkAgainstFilterType(item);  	const bool passed_permissions = checkAgainstPermissions(item); @@ -116,7 +115,7 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)  	const bool passed = (passed_filtertype   		&& passed_permissions  		&& passed_clipboard  -		&&	(mFilterSubString.size() == 0 || string_offset !=  std::string::npos)); +		&&	(mFilterSubString.size() == 0 || string_offset != std::string::npos));  	return passed;  } @@ -383,9 +382,10 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const  	return mFilterSubString;  } -std::string::size_type   LLInventoryFilter::getStringMatchOffset(LLFolderViewItem* item) const +std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const  { -	return mFilterSubString.size() ? item->getName().find(mFilterSubString)   : std::string::npos; +	const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item); +	return mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;  }  bool LLInventoryFilter::isDefault() const @@ -703,15 +703,6 @@ void LLInventoryFilter::setShowFolderState(EFolderShow state)  	}  } -void LLInventoryFilter::setSortOrder(U32 order) -{ -	if (mOrder != order) -	{ -		mOrder = order; -		setModified(); -	} -} -  void LLInventoryFilter::markDefault()  {  	mDefaultFilterOps = mFilterOps; @@ -944,7 +935,6 @@ LLInventoryFilter& LLInventoryFilter::operator=( const  LLInventoryFilter&  othe  	setShowFolderState(other.getShowFolderState());  	setFilterPermissions(other.getFilterPermissions());  	setFilterSubString(other.getFilterSubString()); -	setSortOrder(other.getSortOrder());  	setDateRangeLastLogoff(other.isSinceLogoff());  	return *this;  } @@ -961,7 +951,6 @@ void LLInventoryFilter::toParams(Params& params) const  	params.filter_ops.show_folder_state = getShowFolderState();  	params.filter_ops.permissions = getFilterPermissions();  	params.substring = getFilterSubString(); -	params.sort_order = getSortOrder();  	params.since_logoff = isSinceLogoff();  } @@ -980,7 +969,6 @@ void LLInventoryFilter::fromParams(const Params& params)  	setShowFolderState(params.filter_ops.show_folder_state);  	setFilterPermissions(params.filter_ops.permissions);  	setFilterSubString(params.substring); -	setSortOrder(params.sort_order);  	setDateRangeLastLogoff(params.since_logoff);  } @@ -1004,6 +992,11 @@ bool LLInventoryFilter::hasFilterString() const  	return mFilterSubString.size() > 0;  } +std::string::size_type LLInventoryFilter::getFilterStringSize() const +{ +	return mFilterSubString.size(); +} +  PermissionMask LLInventoryFilter::getFilterPermissions() const  {  	return mFilterOps.mPermissions; @@ -1030,10 +1023,6 @@ LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const  {   	return mFilterOps.mShowFolderState;   } -U32 LLInventoryFilter::getSortOrder() const  -{  -	return mOrder;  -}  void LLInventoryFilter::setFilterCount(S32 count)   {  diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index af245a9c3b..4912b5ca91 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -74,8 +74,8 @@ public:  	{  		struct DateRange : public LLInitParam::Block<DateRange>  		{ -			Optional<time_t> min_date; -			Optional<time_t> max_date; +			Optional<time_t>	min_date, +								max_date;  			DateRange()  			:	min_date("min_date", time_min()), @@ -115,18 +115,18 @@ public:  		FilterOps(const Params& = Params());  		U32 			mFilterTypes; - -		U64				mFilterObjectTypes;   // For _OBJECT -		U64				mFilterWearableTypes; -		U64				mFilterCategoryTypes; // For _CATEGORY +		U64				mFilterObjectTypes,   // For _OBJECT +						mFilterWearableTypes, +						mFilterLinks, +						mFilterCategoryTypes; // For _CATEGORY  		LLUUID      	mFilterUUID; 		  // for UUID -		time_t			mMinDate; -		time_t			mMaxDate; +		time_t			mMinDate, +						mMaxDate;  		U32				mHoursAgo; +  		EFolderShow		mShowFolderState;  		PermissionMask	mPermissions; -		U64				mFilterLinks;  	};  	struct Params : public LLInitParam::Block<Params> @@ -134,14 +134,12 @@ public:  		Optional<std::string>		name;  		Optional<FilterOps::Params>	filter_ops;  		Optional<std::string>		substring; -		Optional<U32>				sort_order;  		Optional<bool>				since_logoff;  		Params()  		:	name("name"),  			filter_ops(""),  			substring("substring"), -			sort_order("sort_order"),  			since_logoff("since_logoff")  		{}  	}; @@ -193,19 +191,14 @@ public:  	bool				showAllResults() const; - -	std::string::size_type getStringMatchOffset() const; - -	std::string::size_type getStringMatchOffset(LLFolderViewItem* item)   const; +	std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const; +	std::string::size_type getFilterStringSize() const;  	// +-------------------------------------------------------------------+  	// + Presentation  	// +-------------------------------------------------------------------+  	void 				setShowFolderState( EFolderShow state);  	EFolderShow 		getShowFolderState() const; -	void 				setSortOrder(U32 order); -	U32 				getSortOrder() const; -  	void 				setEmptyLookupMessage(const std::string& message);  	std::string			getEmptyLookupMessage() const; @@ -261,8 +254,6 @@ private:  	bool 				checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;  	bool				checkAgainstClipboard(const LLUUID& object_id) const; -	U32						mOrder; -  	FilterOps				mFilterOps;  	FilterOps				mDefaultFilterOps; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 5cb7f53bfa..0673970d89 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -373,13 +373,12 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)  // specifies 'type' as what it defaults to containing. The category is  // not necessarily only for that type. *NOTE: This will create a new  // inventory category on the fly if one does not exist. -const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type,  -													   bool create_folder,  -													   bool find_in_library) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder/*,  +					  bool find_in_library*/)  {  	LLUUID rv = LLUUID::null; -	const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); +	const LLUUID &root_id = /*(find_in_library) ? gInventory.getLibraryRootFolderID() :*/ gInventory.getRootFolderID();  	if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)  	{  		rv = root_id; @@ -402,7 +401,44 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe  		}  	} -	if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library)) +	if(rv.isNull() && isInventoryUsable() && (create_folder && true/*!find_in_library*/)) +	{ +		if(root_id.notNull()) +		{ +			return createNewCategory(root_id, preferred_type, LLStringUtil::null); +		} +	} +	return rv; +} + +const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder) +{ +	LLUUID rv = LLUUID::null; + +	const LLUUID &root_id = gInventory.getLibraryRootFolderID(); +	if(LLFolderType::FT_ROOT_INVENTORY == preferred_type) +	{ +		rv = root_id; +	} +	else if (root_id.notNull()) +	{ +		cat_array_t* cats = NULL; +		cats = get_ptr_in_map(mParentChildCategoryTree, root_id); +		if(cats) +		{ +			S32 count = cats->count(); +			for(S32 i = 0; i < count; ++i) +			{ +				if(cats->get(i)->getPreferredType() == preferred_type) +				{ +					rv = cats->get(i)->getUUID(); +					break; +				} +			} +		} +	} + +	if(rv.isNull() && isInventoryUsable() && (create_folder && true/*!find_in_library*/))  	{  		if(root_id.notNull())  		{ diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 3613bc4917..503de627a0 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -231,11 +231,12 @@ public:  	// Returns the uuid of the category that specifies 'type' as what it   	// defaults to containing. The category is not necessarily only for that type.   	//    NOTE: If create_folder is true, this will create a new inventory category  -	//    on the fly if one does not exist. *NOTE: if find_in_library is true it  -	//    will search in the user's library folder instead of "My Inventory" +	//    on the fly if one does not exist.   	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type,  -										 bool create_folder = true,  -										 bool find_in_library = false); +										 bool create_folder = true); +	//    will search in the user's library folder instead of "My Inventory" +	const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,  +												bool create_folder = true);  	// Get whatever special folder this object is a child of, if any.  	const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index be1cd2510d..1b3391f7ee 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -55,7 +55,7 @@ static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");  const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");  const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");  const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); -static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; +static const LLInventoryFolderViewModelBuilder INVENTORY_BRIDGE_BUILDER;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLInventoryPanelObserver @@ -140,7 +140,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  {  	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; -	// contex menu callbacks +	// context menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));  	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));  	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); @@ -151,71 +151,60 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  } -void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params) -{ -	// Determine the root folder in case specified, and -	// build the views starting with that folder. -	 -	std::string start_folder_name(params.start_folder()); -	 -	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(start_folder_name); - -	LLUUID root_id; - -	if ("LIBRARY" == params.start_folder()) -	{ -		root_id = gInventory.getLibraryRootFolderID(); -	} -	else -	{ -		root_id = (preferred_type != LLFolderType::FT_NONE) -				? gInventory.findCategoryUUIDForType(preferred_type, false, false)  -				: LLUUID::null; -	} -	 -	if ((root_id == LLUUID::null) && !start_folder_name.empty()) -	{ -		llwarns << "No category found that matches start_folder: " << start_folder_name << llendl; -		root_id = LLUUID::generateNewID(); -	} -	 -	LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY, -																	LLAssetType::AT_CATEGORY, -																	LLInventoryType::IT_CATEGORY, -																	this, -																	&mInventoryViewModel, -																	NULL, -																	root_id); -	 -	mFolderRoot = createFolderView(new_listener, params.use_label_suffix()); -	addItemID(root_id, mFolderRoot); -}  void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)  { +	// save off copy of params +	mParams = params;  	// Clear up the root view  	// Note: This needs to be done *before* we build the new folder view  -	LLFolderViewItem* root_view = getItemByID(gInventory.getRootFolderID()); -	if (root_view) +	LLUUID root_id = getRootFolderID(); +	if (mFolderRoot)  	{ -		removeItemID(static_cast<LLFolderViewModelItemInventory*>(root_view->getViewModelItem())->getUUID()); -		root_view->destroyView(); +		removeItemID(root_id); +		mFolderRoot->destroyView(); +		mFolderRoot = NULL;  	}  	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); - -	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves -	buildFolderView(params); - +	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves +	{ +		// Determine the root folder in case specified, and +		// build the views starting with that folder. + + +		LLFolderView::Params p(mParams.folder_view); +		p.name = getName(); +		p.title = getLabel(); +		p.rect = LLRect(0, 0, getRect().getWidth(), 0); +		p.parent_panel = this; +		p.tool_tip = p.name; +		p.listener = mInvFVBridgeBuilder->createBridge(	LLAssetType::AT_CATEGORY, +														LLAssetType::AT_CATEGORY, +														LLInventoryType::IT_CATEGORY, +														this, +														&mInventoryViewModel, +														NULL, +														root_id); +		p.view_model = &mInventoryViewModel; +		p.use_label_suffix = mParams.use_label_suffix; +		p.allow_multiselect = mAllowMultiSelect; +		p.show_empty_message = mShowEmptyMessage; +		p.show_item_link_overlays = mShowItemLinkOverlays; +		p.root = NULL; + +		mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p); +		 +		addItemID(root_id, mFolderRoot); +	} 	  	mCommitCallbackRegistrar.popScope(); -	  	mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);  	// Scroller  	LLRect scroller_view_rect = getRect();  	scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); -	LLScrollContainer::Params scroller_params(params.scroll()); +	LLScrollContainer::Params scroller_params(mParams.scroll());  	scroller_params.rect(scroller_view_rect);  	mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);  	addChild(mScroller); @@ -250,20 +239,20 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)  	}  	// hide inbox -	getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX)); -	getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX)); +	getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX)); +	getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));  	// set the filter for the empty folder if the debug setting is on  	if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))  	{ -		getFilter()->setFilterEmptySystemFolders(); +		getFilter().setFilterEmptySystemFolders();  	}  	// keep track of the clipboard state so that we avoid filtering too much  	mClipboardState = LLClipboard::instance().getGeneration();  	// Initialize base class params. -	LLPanel::initFromParams(params); +	LLPanel::initFromParams(mParams);  }  LLInventoryPanel::~LLInventoryPanel() @@ -296,18 +285,18 @@ void LLInventoryPanel::draw()  	if (mClipboardState != LLClipboard::instance().getGeneration())  	{  		mClipboardState = LLClipboard::instance().getGeneration(); -		getFilter()->setModified(LLClipboard::instance().isCutMode() ? LLInventoryFilter::FILTER_MORE_RESTRICTIVE : LLInventoryFilter::FILTER_LESS_RESTRICTIVE); +		getFilter().setModified(LLClipboard::instance().isCutMode() ? LLInventoryFilter::FILTER_MORE_RESTRICTIVE : LLInventoryFilter::FILTER_LESS_RESTRICTIVE);  	}  	LLPanel::draw();  } -const LLInventoryFilter* LLInventoryPanel::getFilter() const +const LLInventoryFilter& LLInventoryPanel::getFilter() const  {  	return getFolderViewModel()->getFilter();  } -LLInventoryFilter* LLInventoryPanel::getFilter() +LLInventoryFilter& LLInventoryPanel::getFilter()  {  	return getFolderViewModel()->getFilter();  } @@ -315,50 +304,49 @@ LLInventoryFilter* LLInventoryPanel::getFilter()  void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)  {  	if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT) -		getFilter()->setFilterObjectTypes(types); +		getFilter().setFilterObjectTypes(types);  	if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY) -		getFilter()->setFilterCategoryTypes(types); +		getFilter().setFilterCategoryTypes(types);  }  U32 LLInventoryPanel::getFilterObjectTypes() const   {  -	return getFilter()->getFilterObjectTypes(); +	return getFilter().getFilterObjectTypes();  }  U32 LLInventoryPanel::getFilterPermMask() const   {  -	return getFilter()->getFilterPermissions(); +	return getFilter().getFilterPermissions();  }  void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)  { -	getFilter()->setFilterPermissions(filter_perm_mask); +	getFilter().setFilterPermissions(filter_perm_mask);  }  void LLInventoryPanel::setFilterWearableTypes(U64 types)  { -	getFilter()->setFilterWearableTypes(types); +	getFilter().setFilterWearableTypes(types);  }  void LLInventoryPanel::setFilterSubString(const std::string& string)  { -	getFilter()->setFilterSubString(string); +	getFilter().setFilterSubString(string);  }  const std::string LLInventoryPanel::getFilterSubString()   {  -	return getFilter()->getFilterSubString(); +	return getFilter().getFilterSubString();  }  void LLInventoryPanel::setSortOrder(U32 order)  { -        LLInventorySort sorter(order); -	getFilter()->setSortOrder(order); +    LLInventorySort sorter(order);  	if (order != getFolderViewModel()->getSorter().getSortOrder())  	{ -		getFolderViewModel()->setSorter(LLInventorySort(order)); +		getFolderViewModel()->setSorter(sorter);  		// try to keep selection onscreen, even if it wasn't to start with  		mFolderRoot->scrollToShowSelection();  	} @@ -371,27 +359,27 @@ U32 LLInventoryPanel::getSortOrder() const  void LLInventoryPanel::setSinceLogoff(BOOL sl)  { -	getFilter()->setDateRangeLastLogoff(sl); +	getFilter().setDateRangeLastLogoff(sl);  }  void LLInventoryPanel::setHoursAgo(U32 hours)  { -	getFilter()->setHoursAgo(hours); +	getFilter().setHoursAgo(hours);  }  void LLInventoryPanel::setFilterLinks(U64 filter_links)  { -	getFilter()->setFilterLinks(filter_links); +	getFilter().setFilterLinks(filter_links);  }  void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)  { -	getFilter()->setShowFolderState(show); +	getFilter().setShowFolderState(show);  }  LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()  { -	return getFilter()->getShowFolderState(); +	return getFilter().getShowFolderState();  }  void LLInventoryPanel::modelChanged(U32 mask) @@ -484,7 +472,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  		{  			if (view_folder)  			{ -				view_folder->requestSort(); +				view_folder->getViewModelItem()->requestSort();  			}  		}	 @@ -562,7 +550,40 @@ LLFolderView* LLInventoryPanel::getRootFolder()  LLUUID LLInventoryPanel::getRootFolderID()  { -	return static_cast<LLFolderViewModelItemInventory*>(mFolderRoot->getViewModelItem())->getUUID(); +	if (mFolderRoot && mFolderRoot->getViewModelItem()) +	{ +		return static_cast<LLFolderViewModelItemInventory*>(mFolderRoot->getViewModelItem())->getUUID(); + +	} +	else +	{ +		LLUUID root_id; +		if (mParams.start_folder.id.isChosen()) +		{ +			root_id = mParams.start_folder.id; +		} +		else +		{ +			const LLFolderType::EType preferred_type = mParams.start_folder.type.isChosen()  +				? mParams.start_folder.type +				: LLViewerFolderType::lookupTypeFromNewCategoryName(mParams.start_folder.name); + +			if ("LIBRARY" == mParams.start_folder.name()) +			{ +				root_id = gInventory.getLibraryRootFolderID(); +			} +			else if (preferred_type != LLFolderType::FT_NONE) +			{ +				root_id = gInventory.findCategoryUUIDForType(preferred_type, false); +				if (root_id.isNull()) +				{ +					llwarns << "Could not find folder of type " << preferred_type << llendl; +					root_id.generateNewID(); +				} +			} +		} +		return root_id; +	}  } @@ -612,7 +633,16 @@ void LLInventoryPanel::initializeViews()  {  	if (!gInventory.isInventoryUsable()) return; -	buildNewViews(gInventory.getRootFolderID()); +	LLUUID root_id = getRootFolderID(); +	if (root_id.notNull()) +	{ +		buildNewViews(getRootFolderID()); +	} +	else +	{ +		buildNewViews(gInventory.getRootFolderID()); +		buildNewViews(gInventory.getLibraryRootFolderID()); +	}  	gIdleCallbacks.addFunction(idle, this); @@ -639,34 +669,10 @@ void LLInventoryPanel::initializeViews()  	}  } -LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix) -{ -	LLRect folder_rect(0, -					   0, -					   getRect().getWidth(), -					   0); - -	LLFolderView::Params p; -	 -	p.name = getName(); -	p.title = getLabel(); -	p.rect = folder_rect; -	p.parent_panel = this; -	p.tool_tip = p.name; -	p.listener = bridge; -	p.view_model = &mInventoryViewModel; -	p.use_label_suffix = useLabelSuffix; -	p.allow_multiselect = mAllowMultiSelect; -	p.show_empty_message = mShowEmptyMessage; -	p.show_item_link_overlays = mShowItemLinkOverlays; -	p.root = NULL; - -	return LLUICtrlFactory::create<LLFolderView>(p); -}  LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)  { -	LLFolderViewFolder::Params params; +	LLFolderViewFolder::Params params(mParams.folder);  	params.name = bridge->getDisplayName();  	params.root = mFolderRoot; @@ -678,7 +684,7 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br  LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)  { -	LLFolderViewItem::Params params; +	LLFolderViewItem::Params params(mParams.item);  	params.name = bridge->getDisplayName();  	params.creation_date = bridge->getCreationDate(); @@ -1081,7 +1087,7 @@ bool LLInventoryPanel::attachObject(const LLSD& userdata)  BOOL LLInventoryPanel::getSinceLogoff()  { -	return getFilter()->isSinceLogoff(); +	return getFilter().isSinceLogoff();  }  // DEBUG ONLY @@ -1207,12 +1213,12 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L  void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)  { -	getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << folder_type)); +	getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << folder_type));  }  BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const  { -	return !(getFilter()->getFilterCategoryTypes() & (1ULL << folder_type)); +	return !(getFilter().getFilterCategoryTypes() & (1ULL << folder_type));  }  void LLInventoryPanel::addItemID( const LLUUID& id, LLFolderViewItem*   itemp ) @@ -1314,7 +1320,7 @@ public:  	{  		LLInventoryPanel::initFromParams(p);  		// turn on inbox for recent items -		getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX)); +		getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));  	}  protected: @@ -1329,3 +1335,34 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)  	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;  } +namespace LLInitParam +{ +	void TypeValues<LLFolderType::EType>::declareValues() +	{ +		declare(LLFolderType::lookup(LLFolderType::FT_TEXTURE)          , LLFolderType::FT_TEXTURE); +		declare(LLFolderType::lookup(LLFolderType::FT_SOUND)            , LLFolderType::FT_SOUND); +		declare(LLFolderType::lookup(LLFolderType::FT_CALLINGCARD)      , LLFolderType::FT_CALLINGCARD); +		declare(LLFolderType::lookup(LLFolderType::FT_LANDMARK)         , LLFolderType::FT_LANDMARK); +		declare(LLFolderType::lookup(LLFolderType::FT_CLOTHING)         , LLFolderType::FT_CLOTHING); +		declare(LLFolderType::lookup(LLFolderType::FT_OBJECT)           , LLFolderType::FT_OBJECT); +		declare(LLFolderType::lookup(LLFolderType::FT_NOTECARD)         , LLFolderType::FT_NOTECARD); +		declare(LLFolderType::lookup(LLFolderType::FT_ROOT_INVENTORY)   , LLFolderType::FT_ROOT_INVENTORY); +		declare(LLFolderType::lookup(LLFolderType::FT_LSL_TEXT)         , LLFolderType::FT_LSL_TEXT); +		declare(LLFolderType::lookup(LLFolderType::FT_BODYPART)         , LLFolderType::FT_BODYPART); +		declare(LLFolderType::lookup(LLFolderType::FT_TRASH)            , LLFolderType::FT_TRASH); +		declare(LLFolderType::lookup(LLFolderType::FT_SNAPSHOT_CATEGORY), LLFolderType::FT_SNAPSHOT_CATEGORY); +		declare(LLFolderType::lookup(LLFolderType::FT_LOST_AND_FOUND)   , LLFolderType::FT_LOST_AND_FOUND); +		declare(LLFolderType::lookup(LLFolderType::FT_ANIMATION)        , LLFolderType::FT_ANIMATION); +		declare(LLFolderType::lookup(LLFolderType::FT_GESTURE)          , LLFolderType::FT_GESTURE); +		declare(LLFolderType::lookup(LLFolderType::FT_FAVORITE)         , LLFolderType::FT_FAVORITE); +		declare(LLFolderType::lookup(LLFolderType::FT_ENSEMBLE_START)   , LLFolderType::FT_ENSEMBLE_START); +		declare(LLFolderType::lookup(LLFolderType::FT_ENSEMBLE_END)     , LLFolderType::FT_ENSEMBLE_END); +		declare(LLFolderType::lookup(LLFolderType::FT_CURRENT_OUTFIT)   , LLFolderType::FT_CURRENT_OUTFIT); +		declare(LLFolderType::lookup(LLFolderType::FT_OUTFIT)           , LLFolderType::FT_OUTFIT); +		declare(LLFolderType::lookup(LLFolderType::FT_MY_OUTFITS)       , LLFolderType::FT_MY_OUTFITS); +		declare(LLFolderType::lookup(LLFolderType::FT_MESH )            , LLFolderType::FT_MESH ); +		declare(LLFolderType::lookup(LLFolderType::FT_INBOX)            , LLFolderType::FT_INBOX); +		declare(LLFolderType::lookup(LLFolderType::FT_OUTBOX)           , LLFolderType::FT_OUTBOX); +		declare(LLFolderType::lookup(LLFolderType::FT_BASIC_ROOT)       , LLFolderType::FT_BASIC_ROOT); +	} +} diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 910325cdbc..e9bfcb0ccf 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -41,10 +41,19 @@  #include <set>  class LLInvFVBridge; -class LLInventoryFVBridgeBuilder; +class LLInventoryFolderViewModelBuilder;  class LLInvPanelComplObserver;  class LLFolderViewModelInventory; +namespace LLInitParam +{ +	template<> +	struct TypeValues<LLFolderType::EType> : public TypeValuesHelper<LLFolderType::EType> +	{ +		static void declareValues(); +	}; +} +  class LLInventoryPanel : public LLPanel  {  	//-------------------------------------------------------------------- @@ -64,6 +73,19 @@ public:  		{}  	}; +	struct StartFolder : public LLInitParam::ChoiceBlock<StartFolder> +	{ +		Alternative<std::string>			name; +		Alternative<LLUUID>					id; +		Alternative<LLFolderType::EType>	type; + +		StartFolder() +		:	name("name"),  +			id("id"), +			type("type") +		{} +	}; +  	struct Params   	:	public LLInitParam::Block<Params, LLPanel::Params>  	{ @@ -72,11 +94,14 @@ public:  		Optional<bool>						allow_multi_select;  		Optional<bool>						show_item_link_overlays;  		Optional<Filter>					filter; -		Optional<std::string>               start_folder; +		Optional<StartFolder>               start_folder;  		Optional<bool>						use_label_suffix;  		Optional<bool>						show_empty_message;  		Optional<LLScrollContainer::Params>	scroll;  		Optional<bool>						accepts_drag_and_drop; +		Optional<LLFolderView::Params>		folder_view; +		Optional<LLFolderViewFolder::Params> folder; +		Optional<LLFolderViewItem::Params>	 item;  		Params()  		:	sort_order_setting("sort_order_setting"), @@ -88,16 +113,26 @@ public:  			use_label_suffix("use_label_suffix", true),  			show_empty_message("show_empty_message", true),  			scroll("scroll"), -			accepts_drag_and_drop("accepts_drag_and_drop") +			accepts_drag_and_drop("accepts_drag_and_drop"), +			folder_view("folder_view"), +			folder("folder"), +			item("item")  		{}  	}; +	struct InventoryState : public LLInitParam::Block<InventoryState> +	{ +		Mandatory<LLInventoryFilter::Params> filter; +		Mandatory<LLInventorySort::Params> sort; +	}; +  	//--------------------------------------------------------------------  	// Initialization  	//--------------------------------------------------------------------  protected:  	LLInventoryPanel(const Params&);  	void initFromParams(const Params&); +  	friend class LLUICtrlFactory;  public:  	virtual ~LLInventoryPanel(); @@ -126,8 +161,8 @@ public:  	void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);  	void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);  	void clearSelection(); -	LLInventoryFilter* getFilter(); -	const LLInventoryFilter* getFilter() const; +	LLInventoryFilter& getFilter(); +	const LLInventoryFilter& getFilter() const;  	void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);  	U32 getFilterObjectTypes() const;  	void setFilterPermMask(PermissionMask filter_perm_mask); @@ -187,29 +222,30 @@ protected:  	void openStartFolderOrMyInventory(); // open the first level of inventory  	void onItemsCompletion();			// called when selected items are complete -        LLUUID						mSelectThisID;	 +    LLUUID						mSelectThisID;	  	LLInventoryModel*			mInventory;  	LLInventoryObserver*		mInventoryObserver;  	LLInvPanelComplObserver*	mCompletionObserver; -	BOOL						mAcceptsDragAndDrop; -	BOOL 						mAllowMultiSelect; -	BOOL 						mShowItemLinkOverlays; // Shows link graphic over inventory item icons -	BOOL						mShowEmptyMessage; +	bool						mAcceptsDragAndDrop; +	bool 						mAllowMultiSelect; +	bool 						mShowItemLinkOverlays; // Shows link graphic over inventory item icons +	bool						mShowEmptyMessage;  	LLFolderView*				mFolderRoot;  	LLScrollContainer*			mScroller;  	LLFolderViewModelInventory	mInventoryViewModel; +	Params						mParams;	// stored copy of parameter block  	std::map<LLUUID, LLFolderViewItem*> mItemMap;  	/** -	 * Pointer to LLInventoryFVBridgeBuilder. +	 * Pointer to LLInventoryFolderViewModelBuilder.  	 *  	 * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with   	 * another implementation.  	 * Take into account it will not be deleted by LLInventoryPanel itself.  	 */ -	const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder; +	const LLInventoryFolderViewModelBuilder* mInvFVBridgeBuilder;  	//-------------------------------------------------------------------- @@ -239,19 +275,14 @@ protected:  	// Builds the UI.  Call this once the inventory is usable.  	void 				initializeViews(); -	virtual void		buildFolderView(const LLInventoryPanel::Params& params);  	LLFolderViewItem*	buildNewViews(const LLUUID& id);  	BOOL				getIsHiddenFolderType(LLFolderType::EType folder_type) const; -	virtual LLFolderView*		createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix);  	virtual LLFolderViewFolder*	createFolderViewFolder(LLInvFVBridge * bridge);  	virtual LLFolderViewItem*	createFolderViewItem(LLInvFVBridge * bridge);  private: -	BOOL				mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild() -	BOOL				mViewsInitialized; // Views have been generated -	// UUID of category from which hierarchy should be built.  Set with the  -	// "start_folder" xml property.  Default is LLUUID::null that means total Inventory hierarchy.  -	LLUUID				mStartFolderID; +	bool				mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild() +	bool				mViewsInitialized; // Views have been generated  };  #endif // LL_LLINVENTORYPANEL_H diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 4e53082c05..3bd5f96add 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -419,6 +419,35 @@ void LLNearbyChat::show()  	setVisible(TRUE);  } +bool LLNearbyChat::isChatVisible() const +{ +	bool isVisible = false; + +	if (isChatMultiTab()) +	{ +		LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance(); +		// Is the IM floater container ever null? +		llassert(im_box != NULL); +		if (im_box != NULL) +		{ +			if (gSavedSettings.getBOOL("NearbyChatIsNotTornOff")) +			{ +				isVisible = (im_box->getVisible() && !im_box->isMinimized()); +			} +			else +			{ +				isVisible = (getVisible() && !isMinimized()); +			} +		} +	} +	else +	{ +		isVisible = (getVisible() && !isMinimized()); +	} + +	return isVisible; +} +  void LLNearbyChat::showHistory()  {  	openFloater(); diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 90feb71488..a0928e67ef 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -66,6 +66,7 @@ public:  	void addToHost();  	void show(); +	bool isChatVisible() const;  	/** @param archive true - to save a message to the chat history log */  	void	addMessage			(const LLChat& message,bool archive = true, const LLSD &args = LLSD()); @@ -99,8 +100,6 @@ protected:  	/* virtual */ bool applyRectControl(); -	void onToggleNearbyChatPanel(); -  	/*virtual*/ void onTearOffClicked();  	static LLWString stripChannelNumber(const LLWString &mesg, S32* channel); diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 507c6686fd..a420c0d2ed 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -86,7 +86,7 @@ bool LLTipHandler::processNotification(const LLNotificationPtr& notification)  		// don't show toast if Nearby Chat is opened  		LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); -		if (!nearby_chat->isMinimized() && nearby_chat->getVisible()) +		if (nearby_chat->isChatVisible())  		{  			return false;  		} diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 4bbab52e5a..9225ea3d53 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -177,7 +177,7 @@ void LLLandmarksPanelObserver::changed(U32 mask)  	if (!mIsLibraryLandmarksOpen && library)  	{  		// Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827. -		const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); +		const LLUUID &landmarks_cat = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  		if (landmarks_cat.notNull())  		{  			LLOpenFolderByID opener(landmarks_cat); @@ -247,10 +247,7 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)  		LLPlacesInventoryPanel* inventory_list = dynamic_cast<LLPlacesInventoryPanel*>(tab->getAccordionView());  		if (NULL == inventory_list) continue; -		if (inventory_list->getFilter()) -		{ -			filter_list(inventory_list, string); -		} +		filter_list(inventory_list, string);  	}  	if (sFilterSubString != string) @@ -306,8 +303,7 @@ bool LLLandmarksPanel::isSingleItemSelected()  	if (mCurrentSelectedList != NULL)  	{ -		LLPlacesFolderView* root_view = -				static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()); +		LLFolderView* root_view = mCurrentSelectedList->getRootFolder();  		if (root_view->getSelectedCount() == 1)  		{ @@ -366,9 +362,6 @@ void LLLandmarksPanel::onSelectorButtonClicked()  void LLLandmarksPanel::updateShowFolderState()  { -	if (!mLandmarksInventoryPanel->getFilter()) -		return; -  	bool show_all_folders =   mLandmarksInventoryPanel->getFilterSubString().empty();  	if (show_all_folders)  	{ @@ -548,7 +541,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel()  	mFavoritesInventoryPanel = getChild<LLPlacesInventoryPanel>("favorites_list");  	initLandmarksPanel(mFavoritesInventoryPanel); -	mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems"); +	mFavoritesInventoryPanel->getFilter().setEmptyLookupMessage("FavoritesNoMatchingItems");  	initAccordion("tab_favorites", mFavoritesInventoryPanel, true);  } @@ -559,12 +552,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel()  	initLandmarksPanel(mLandmarksInventoryPanel); -	// Check if mLandmarksInventoryPanel is properly initialized and has a Filter created. -	// In case of a dummy widget getFilter() will return NULL. -	if (mLandmarksInventoryPanel->getFilter()) -	{ -		mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); -	} +	mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);  	// subscribe to have auto-rename functionality while creating New Folder  	mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); @@ -588,7 +576,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel()  	initLandmarksPanel(mLibraryInventoryPanel);  	// We want to fetch only "Landmarks" category from the library. -	const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); +	const LLUUID &landmarks_cat = gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);  	if (landmarks_cat.notNull())  	{  		LLInventoryModelBackgroundFetch::instance().start(landmarks_cat); @@ -600,12 +588,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel()  void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list)  { -	// In case of a dummy widget further we have no Folder View widget and no Filter, -	// so further initialization leads to crash. -	if (!inventory_list->getFilter()) -		return; - -	inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems"); +	inventory_list->getFilter().setEmptyLookupMessage("PlacesNoMatchingItems");  	inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);  	inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); @@ -918,8 +901,9 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  {  	std::string command_name = userdata.asString(); -	LLPlacesFolderView* root_folder_view = mCurrentSelectedList ? -		static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL; +	LLFolderView* root_folder_view = mCurrentSelectedList  +		? mCurrentSelectedList->getRootFolder()  +		: NULL;  	if ("collapse_all" == command_name)  	{ diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index fea27b37d3..e1aa70cc4a 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -89,9 +89,9 @@ public:  	static void selectNoTypes(void* user_data);  private:  	LLPanelMainInventory*	mPanelMainInventory; -	LLSpinCtrl*			mSpinSinceDays; -	LLSpinCtrl*			mSpinSinceHours; -	LLInventoryFilter*	mFilter; +	LLSpinCtrl*				mSpinSinceDays; +	LLSpinCtrl*				mSpinSinceHours; +	LLInventoryFilter*		mFilter;  };  ///---------------------------------------------------------------------------- @@ -131,7 +131,7 @@ BOOL LLPanelMainInventory::postBuild()  	mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");  	mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); -	//panel->getFilter()->markDefault(); +	//panel->getFilter().markDefault();  	// Set up the default inv. panel/filter settings.  	mActivePanel = getChild<LLInventoryPanel>("All Items"); @@ -139,7 +139,7 @@ BOOL LLPanelMainInventory::postBuild()  	{  		// "All Items" is the previous only view, so it gets the InventorySortOrder  		mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER)); -		mActivePanel->getFilter()->markDefault(); +		mActivePanel->getFilter().markDefault();  		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);  		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));  		mResortActivePanel = true; @@ -150,7 +150,7 @@ BOOL LLPanelMainInventory::postBuild()  		recent_items_panel->setSinceLogoff(TRUE);  		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);  		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); -		recent_items_panel->getFilter()->markDefault(); +		recent_items_panel->getFilter().markDefault();  		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));  	} @@ -169,14 +169,14 @@ BOOL LLPanelMainInventory::postBuild()  		// Note that the "All Items" settings do not persist.  		if(recent_items_panel)  		{ -			if(savedFilterState.has(recent_items_panel->getFilter()->getName())) +			if(savedFilterState.has(recent_items_panel->getFilter().getName()))  			{  				LLSD recent_items = savedFilterState.get( -					recent_items_panel->getFilter()->getName()); +					recent_items_panel->getFilter().getName());  				LLInventoryFilter::Params p;  				LLParamSDParser parser;  				parser.readSD(recent_items, p); -				recent_items_panel->getFilter()->fromParams(p); +				recent_items_panel->getFilter().fromParams(p);  			}  		} @@ -213,29 +213,29 @@ LLPanelMainInventory::~LLPanelMainInventory( void )  	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");  	if (all_items_panel)  	{ -		LLInventoryFilter* filter = all_items_panel->getFilter(); -		if (filter) +		LLSD filterState; +		LLInventoryPanel::InventoryState p; +		all_items_panel->getFilter().toParams(p.filter); +		all_items_panel->getRootViewModel().getSorter().toParams(p.sort); +		if (p.validateBlock(false))  		{ -			LLSD filterState; -			LLInventoryFilter::Params p; -			filter->toParams(p); -			if (p.validateBlock(false)) -			{ -				LLParamSDParser().writeSD(filterState, p); -				filterRoot[filter->getName()] = filterState; -			} +			LLParamSDParser().writeSD(filterState, p); +			filterRoot[all_items_panel->getName()] = filterState;  		}  	} -	LLInventoryFilter* filter = findChild<LLInventoryPanel>("Recent Items")->getFilter(); -	if (filter) +	LLInventoryPanel* panel = findChild<LLInventoryPanel>("Recent Items"); +	if (panel)  	{  		LLSD filterState; -		LLInventoryFilter::Params p; -		filter->toParams(p); -		LLParamSDParser parser; -		parser.writeSD(filterState, p); -		filterRoot[filter->getName()] = filterState; +		LLInventoryPanel::InventoryState p; +		panel->getFilter().toParams(p.filter); +		panel->getRootViewModel().getSorter().toParams(p.sort); +		if (p.validateBlock(false)) +		{ +			LLParamSDParser().writeSD(filterState, p); +			filterRoot[panel->getName()] = filterState; +		}  	}  	std::ostringstream filterSaveName; @@ -321,7 +321,7 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)  void LLPanelMainInventory::resetFilters()  {  	LLFloaterInventoryFinder *finder = getFinder(); -	getActivePanel()->getFilter()->resetDefault(); +	getActivePanel()->getFilter().resetDefault();  	if (finder)  	{  		finder->updateElementsFromFilter(); @@ -426,7 +426,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )  	}  	// save current folder open state if no filter currently applied -	if (!mActivePanel->getFilter()->isNotDefault()) +	if (!mActivePanel->getFilter().isNotDefault())  	{  		mSavedFolderState->setApply(FALSE);  		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); @@ -488,13 +488,13 @@ void LLPanelMainInventory::onFilterSelected()  	}  	setFilterSubString(mFilterSubString); -	LLInventoryFilter* filter = mActivePanel->getFilter(); +	LLInventoryFilter& filter = mActivePanel->getFilter();  	LLFloaterInventoryFinder *finder = getFinder();  	if (finder)  	{ -		finder->changeFilter(filter); +		finder->changeFilter(&filter);  	} -	if (filter->isActive()) +	if (filter.isActive())  	{  		// If our filter is active we may be the first thing requiring a fetch so we better start it here.  		LLInventoryModelBackgroundFetch::instance().start(); @@ -607,7 +607,7 @@ void LLPanelMainInventory::onFocusReceived()  void LLPanelMainInventory::setFilterTextFromFilter()   {  -	mFilterText = mActivePanel->getFilter()->getFilterText();  +	mFilterText = mActivePanel->getFilter().getFilterText();   }  void LLPanelMainInventory::toggleFindOptions() @@ -657,7 +657,7 @@ LLFloaterInventoryFinder* LLPanelMainInventory::getFinder()  LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :	  	LLFloater(LLSD()),  	mPanelMainInventory(inventory_view), -	mFilter(inventory_view->getPanel()->getFilter()) +	mFilter(&inventory_view->getPanel()->getFilter())  {  	buildFromFile("floater_inventory_view_finder.xml");  	updateElementsFromFilter(); @@ -1082,14 +1082,14 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();  		const std::string &item_name = current_item->getViewModelItem()->getName();  		mFilterSubString = item_name; -		LLInventoryFilter *filter = mActivePanel->getFilter(); -		filter->setFilterSubString(item_name); +		LLInventoryFilter &filter = mActivePanel->getFilter(); +		filter.setFilterSubString(item_name);  		mFilterEditor->setText(item_name);  		mFilterEditor->setFocus(TRUE); -		filter->setFilterUUID(item_id); -		filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); -		filter->setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS); +		filter.setFilterUUID(item_id); +		filter.setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); +		filter.setFilterLinks(LLInventoryFilter::FILTERLINK_ONLY_LINKS);  	}  } diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index 3547156197..ea0521e3a7 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -95,13 +95,13 @@ LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()  	// Set the sort order newest to oldest  	mInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_DATE); -	mInventoryPanel->getFilter()->markDefault(); +	mInventoryPanel->getFilter().markDefault();  	// Set selection callback for proper update of inventory status buttons  	mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this));  	// Set up the note to display when the inbox is empty -	mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems"); +	mInventoryPanel->getFilter().setEmptyLookupMessage("InventoryInboxNoItems");  	// Hide the placeholder text  	inbox_inventory_placeholder->setVisible(FALSE); diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index 6e5a522297..0d3fbe66d7 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -54,69 +54,11 @@ static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_  //  LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p) -	: LLInventoryPanel(p) -{ -} +:	LLInventoryPanel(p) +{}  LLInboxInventoryPanel::~LLInboxInventoryPanel() -{ -} - -// virtual -void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params) -{ -	// Determine the root folder in case specified, and -	// build the views starting with that folder. -	 -	LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false); -	 -	// leslie -- temporary HACK to work around sim not creating inbox with proper system folder type -	if (root_id.isNull()) -	{ -		std::string start_folder_name(params.start_folder()); -		 -		LLInventoryModel::cat_array_t* cats; -		LLInventoryModel::item_array_t* items; -		 -		gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items); -		 -		if (cats) -		{ -			for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it) -			{ -				LLInventoryCategory* cat = *cat_it; -				 -				if (cat->getName() == start_folder_name) -				{ -					root_id = cat->getUUID(); -					break; -				} -			} -		} -		 -		if (root_id == LLUUID::null) -		{ -			llwarns << "No category found that matches inbox inventory panel start_folder: " << start_folder_name << llendl; -		} -	} -	// leslie -- end temporary HACK -	 -	if (root_id == LLUUID::null) -	{ -		llwarns << "Inbox inventory panel has no root folder!" << llendl; -		root_id = LLUUID::generateNewID(); -	} -	 -	LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY, -																	LLAssetType::AT_CATEGORY, -																	LLInventoryType::IT_CATEGORY, -																	this, -																	&mInventoryViewModel, -																	NULL, -																	root_id); -	 -	mFolderRoot = createFolderView(new_listener, params.use_label_suffix()); -} +{}  LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)  { @@ -149,9 +91,9 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b  //  LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p) -	: LLFolderViewFolder(p) -	, LLBadgeOwner(getHandle()) -	, mFresh(false) +:	LLFolderViewFolder(p), +	LLBadgeOwner(getHandle()), +	mFresh(false)  {  #if SUPPORTING_FRESH_ITEM_COUNT  	initBadgeParams(p.new_badge()); @@ -240,9 +182,9 @@ LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p)  #endif  } -BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder) +void LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder)  { -	BOOL retval = LLFolderViewItem::addToFolder(folder); +	LLFolderViewItem::addToFolder(folder);  #if SUPPORTING_FRESH_ITEM_COUNT  	// Compute freshness if our parent is the root folder for the inbox @@ -251,8 +193,6 @@ BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder)  		computeFreshness();  	}  #endif -	 -	return retval;  }  BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 209f3a4098..098969aca6 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -47,9 +47,6 @@ public:  	~LLInboxInventoryPanel();  	// virtual -	void buildFolderView(const LLInventoryPanel::Params& params); - -	// virtual  	LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);  	LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);  }; @@ -63,9 +60,8 @@ public:  		Optional<LLBadge::Params>	new_badge;  		Params() -		: new_badge("new_badge") -		{ -		} +		:	new_badge("new_badge") +		{}  	};  	LLInboxFolderViewFolder(const Params& p); @@ -93,14 +89,13 @@ public:  		Optional<LLBadge::Params>	new_badge;  		Params() -			: new_badge("new_badge") -		{ -		} +		:	new_badge("new_badge") +		{}  	};  	LLInboxFolderViewItem(const Params& p); -	BOOL addToFolder(LLFolderViewFolder* folder); +	void addToFolder(LLFolderViewFolder* folder);  	BOOL handleDoubleClick(S32 x, S32 y, MASK mask);  	void draw(); diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp deleted file mode 100644 index 2885dd6266..0000000000 --- a/indra/newview/llpanelmarketplaceoutboxinventory.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**  - * @file llpanelmarketplaceoutboxinventory.cpp - * @brief LLOutboxInventoryPanel  class definition - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llpanelmarketplaceoutboxinventory.h" - -#include "llfolderviewitem.h" -#include "llfolderviewmodel.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h" -#include "llpanellandmarks.h" -#include "llplacesinventorybridge.h" -#include "lltrans.h" -#include "llviewerfoldertype.h" - - -// -// statics -// - -static LLDefaultChildRegistry::Register<LLOutboxInventoryPanel> r1("outbox_inventory_panel"); -static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_folder_view_folder"); - - -// -// LLOutboxInventoryPanel Implementation -// - -LLOutboxInventoryPanel::LLOutboxInventoryPanel(const LLOutboxInventoryPanel::Params& p) -	: LLInventoryPanel(p) -{ -} - -LLOutboxInventoryPanel::~LLOutboxInventoryPanel() -{ -} - -// virtual -void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params) -{ -	// Determine the root folder in case specified, and -	// build the views starting with that folder. -	 -	LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); -	 -	if (root_id == LLUUID::null) -	{ -		llwarns << "Outbox inventory panel has no root folder!" << llendl; -		root_id = LLUUID::generateNewID(); -	} -	 -	LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY, -																	LLAssetType::AT_CATEGORY, -																	LLInventoryType::IT_CATEGORY, -																	this, -																	&mInventoryViewModel, -																	NULL, -																	root_id); -	 -	mFolderRoot = createFolderView(new_listener, params.use_label_suffix()); -} - -LLFolderViewFolder * LLOutboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge) -{ -	LLOutboxFolderViewFolder::Params params; -	 -	params.name = bridge->getDisplayName(); -	params.root = mFolderRoot; -	params.listener = bridge; -	params.tool_tip = params.name; -	 -	return LLUICtrlFactory::create<LLOutboxFolderViewFolder>(params); -} - -LLFolderViewItem * LLOutboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge) -{ -	LLFolderViewItem::Params params; - -	params.name = bridge->getDisplayName(); -	params.creation_date = bridge->getCreationDate(); -	params.root = mFolderRoot; -	params.listener = bridge; -	params.rect = LLRect (0, 0, 0, 0); -	params.tool_tip = params.name; - -	return LLUICtrlFactory::create<LLOutboxFolderViewItem>(params); -} - -// -// LLOutboxFolderViewFolder Implementation -// - -LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p) -	: LLFolderViewFolder(p) -{ -} - -// -// LLOutboxFolderViewItem Implementation -// - -LLOutboxFolderViewItem::LLOutboxFolderViewItem(const Params& p) -	: LLFolderViewItem(p) -{ -} - -BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) -{ -	return TRUE; -} - -void LLOutboxFolderViewItem::openItem() -{ -	// Intentionally do nothing to block attaching items from the outbox -} - -// eof diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h deleted file mode 100644 index a6c522b7c2..0000000000 --- a/indra/newview/llpanelmarketplaceoutboxinventory.h +++ /dev/null @@ -1,78 +0,0 @@ -/**  - * @file llpanelmarketplaceoutboxinventory.h - * @brief LLOutboxInventoryPanel class declaration - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_OUTBOXINVENTORYPANEL_H -#define LL_OUTBOXINVENTORYPANEL_H - - -#include "llinventorypanel.h" -#include "llfolderviewitem.h" - - -class LLOutboxInventoryPanel : public LLInventoryPanel -{ -public: -	struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params> -	{ -		Params() {} -	}; -	 -	LLOutboxInventoryPanel(const Params& p); -	~LLOutboxInventoryPanel(); - -	// virtual -	void buildFolderView(const LLInventoryPanel::Params& params); - -	// virtual -	LLFolderViewFolder *	createFolderViewFolder(LLInvFVBridge * bridge); -	LLFolderViewItem *		createFolderViewItem(LLInvFVBridge * bridge); -}; - - -class LLOutboxFolderViewFolder : public LLFolderViewFolder -{ -public: -	struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params> -	{ -		Params() {} -	}; -	 -	LLOutboxFolderViewFolder(const Params& p); -}; - - -class LLOutboxFolderViewItem : public LLFolderViewItem -{ -public: -	LLOutboxFolderViewItem(const Params& p); - -	// virtual -	BOOL handleDoubleClick(S32 x, S32 y, MASK mask); -	void openItem(); -}; - - -#endif //LL_OUTBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 4f2c515bde..82956beb3d 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1567,11 +1567,8 @@ void LLPanelObjectInventory::reset()  	mFolders = LLUICtrlFactory::create<LLFolderView>(p);  	// this ensures that we never say "searching..." or "no items found"  	//TODO RN: make this happen by manipulating filter object directly -  	LLInventoryFilter* inventoryFilter = dynamic_cast<LLInventoryFilter*>(mFolders->getFolderViewModel()->getFilter()); -  	if(inventoryFilter) -	{ -    	inventoryFilter->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); -  	} +  	LLInventoryFilter& inventoryFilter = dynamic_cast<LLInventoryFilter&>(mFolders->getFolderViewModel()->getFilter()); +   	inventoryFilter.setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);  	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 1a5f64e295..ebd9604c5b 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -170,7 +170,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(  		if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)  		{  			// *TODO: Create a link folder handler instead if it is necessary -			new_listener = LLInventoryFVBridgeBuilder::createBridge( +			new_listener = LLInventoryFolderViewModelBuilder::createBridge(  				asset_type,  				actual_asset_type,  				inv_type, @@ -184,7 +184,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(  		new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid);  		break;  	default: -		new_listener = LLInventoryFVBridgeBuilder::createBridge( +		new_listener = LLInventoryFolderViewModelBuilder::createBridge(  			asset_type,  			actual_asset_type,  			inv_type, diff --git a/indra/newview/llplacesinventorybridge.h b/indra/newview/llplacesinventorybridge.h index 791502990b..07d18d03c5 100644 --- a/indra/newview/llplacesinventorybridge.h +++ b/indra/newview/llplacesinventorybridge.h @@ -82,7 +82,7 @@ protected:   *   * It builds Bridges for Landmarks and Folders in Places Landmarks Panel   */ -class LLPlacesInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder +class LLPlacesInventoryBridgeBuilder : public LLInventoryFolderViewModelBuilder  {  public:  	/*virtual*/ LLInvFVBridge* createBridge(LLAssetType::EType asset_type, diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index c46681f556..db3f245389 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -58,11 +58,6 @@ LLPlacesInventoryPanel::~LLPlacesInventoryPanel()  	delete mSavedFolderState;  } -void LLPlacesInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params) -{ -	LLInventoryPanel::buildFolderView(params); -} -  // save current folder open state  void LLPlacesInventoryPanel::saveFolderState()  { diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h index f647e7f970..1544b51aed 100644 --- a/indra/newview/llplacesinventorypanel.h +++ b/indra/newview/llplacesinventorypanel.h @@ -46,8 +46,6 @@ public:  	LLPlacesInventoryPanel(const Params& p);  	~LLPlacesInventoryPanel(); -	/*virtual*/ void buildFolderView(const LLInventoryPanel::Params& params); -  	void saveFolderState();  	void restoreFolderState(); @@ -57,7 +55,7 @@ private:  	LLSaveFolderState*			mSavedFolderState;  }; - +//TODO RN: this class is currently unused, make sure that behavior remains  class LLPlacesFolderView : public LLFolderView  {  public: @@ -77,8 +75,6 @@ public:  		mParentLandmarksPanel = panel;  	} -	S32 getSelectedCount() { return (S32)mSelectedItems.size(); } -  private:  	/**  	 * holds pointer to landmark panel. This pointer is used in @c LLPlacesFolderView::handleRightMouseDown diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 47bd620fc6..acb232c77f 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -260,9 +260,8 @@ void LLSidepanelInventory::updateInbox()  	//  	const bool do_not_create_folder = false; -	const bool do_not_find_in_library = false; -	const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library); +	const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder);  	// Set up observer to listen for creation of inbox if at least one of them doesn't exist  	if (inbox_id.isNull()) diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 2d3f144588..65f0290060 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -455,7 +455,7 @@ BOOL LLFloaterTexturePicker::postBuild()  		// Commented out to scroll to currently selected texture. See EXT-5403.  		// // store this filter as the default one -		// mInventoryPanel->getRootFolder()->getFilter()->markDefault(); +		// mInventoryPanel->getRootFolder()->getFilter().markDefault();  		// Commented out to stop opening all folders with textures  		// mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE); @@ -638,10 +638,10 @@ void LLFloaterTexturePicker::draw()  		LLFolderView* folder_view = mInventoryPanel->getRootFolder();  		if (!folder_view) return; -		LLFolderViewFilter* filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter(); +		LLFolderViewFilter& filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter(); -		bool is_filter_active = folder_view->getViewModelItem()->getLastFilterGeneration() < filter->getCurrentGeneration() && -				filter->isNotDefault(); +		bool is_filter_active = folder_view->getViewModelItem()->getLastFilterGeneration() < filter.getCurrentGeneration() && +				filter.isNotDefault();  		// After inventory panel filter is applied we have to update  		// constraint rect for the selected item because of folder view @@ -1012,7 +1012,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )  	else if (mInventoryPanel->getFilterSubString().empty())  	{  		// first letter in search term, save existing folder open state -		if (!mInventoryPanel->getFilter()->isNotDefault()) +		if (!mInventoryPanel->getFilter().isNotDefault())  		{  			mSavedFolderState.setApply(FALSE);  			mInventoryPanel->getRootFolder()->applyFunctorRecursively(mSavedFolderState); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 2680e4451b..94c97158a8 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -812,7 +812,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,  	if (!handled)  	{  		// Disallow drag and drop to 3D from the outbox -		const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false); +		const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);  		if (outbox_id.notNull())  		{  			for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index e5362261cf..2871b7b018 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3124,191 +3124,191 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)  		{  			debugAvatarRezTime("AvatarRezLeftAppearanceNotification","left appearance mode");  		} +	} -		// Rebuild name tag if state change detected -		if (mNameString.empty() -			|| new_name -			|| (!title && !mTitle.empty()) -			|| (title && mTitle != title->getString()) -			|| is_away != mNameAway  -			|| is_busy != mNameBusy  -			|| is_muted != mNameMute -			|| is_appearance != mNameAppearance  -			|| is_friend != mNameFriend -			|| is_cloud != mNameCloud) -		{ -			LLColor4 name_tag_color = getNameTagColor(is_friend); +	// Rebuild name tag if state change detected +	if (mNameString.empty() +		|| new_name +		|| (!title && !mTitle.empty()) +		|| (title && mTitle != title->getString()) +		|| is_away != mNameAway  +		|| is_busy != mNameBusy  +		|| is_muted != mNameMute +		|| is_appearance != mNameAppearance  +		|| is_friend != mNameFriend +		|| is_cloud != mNameCloud) +	{ +		LLColor4 name_tag_color = getNameTagColor(is_friend); -			clearNameTag(); +		clearNameTag(); -			if (is_away || is_muted || is_busy || is_appearance) +		if (is_away || is_muted || is_busy || is_appearance) +		{ +			std::string line; +			if (is_away)  			{ -				std::string line; -				if (is_away) -				{ -					line += LLTrans::getString("AvatarAway"); -					line += ", "; -				} -				if (is_busy) -				{ -					line += LLTrans::getString("AvatarBusy"); -					line += ", "; -				} -				if (is_muted) -				{ -					line += LLTrans::getString("AvatarMuted"); -					line += ", "; -				} -				if (is_appearance) -				{ -					line += LLTrans::getString("AvatarEditingAppearance"); -					line += ", "; -				} -				if (is_cloud) -				{ -					line += LLTrans::getString("LoadingData"); -					line += ", "; -				} -				// trim last ", " -				line.resize( line.length() - 2 ); -				addNameTagLine(line, name_tag_color, LLFontGL::NORMAL, -					LLFontGL::getFontSansSerifSmall()); +				line += LLTrans::getString("AvatarAway"); +				line += ", ";  			} - -			if (sRenderGroupTitles -				&& title && title->getString() && title->getString()[0] != '\0') +			if (is_busy)  			{ -				std::string title_str = title->getString(); -				LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR); -				addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL, -					LLFontGL::getFontSansSerifSmall()); +				line += LLTrans::getString("AvatarBusy"); +				line += ", ";  			} - -			static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames"); -			static LLUICachedControl<bool> show_usernames("NameTagShowUsernames"); - -			if (LLAvatarNameCache::useDisplayNames()) +			if (is_muted)  			{ -				LLAvatarName av_name; -				if (!LLAvatarNameCache::get(getID(), &av_name)) -				{ -					// ...call this function back when the name arrives -					// and force a rebuild -					LLAvatarNameCache::get(getID(), -						boost::bind(&LLVOAvatar::clearNameTag, this)); -				} - -				// Might be blank if name not available yet, that's OK -				if (show_display_names) -				{ -					addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL, -						LLFontGL::getFontSansSerif()); -				} -				// Suppress SLID display if display name matches exactly (ugh) -				if (show_usernames && !av_name.mIsDisplayNameDefault) -				{ -					// *HACK: Desaturate the color -					LLColor4 username_color = name_tag_color * 0.83f; -					addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL, -						LLFontGL::getFontSansSerifSmall()); -				} +				line += LLTrans::getString("AvatarMuted"); +				line += ", ";  			} -			else +			if (is_appearance)  			{ -				const LLFontGL* font = LLFontGL::getFontSansSerif(); -				std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() ); -				addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font); +				line += LLTrans::getString("AvatarEditingAppearance"); +				line += ", ";  			} - -			mNameAway = is_away; -			mNameBusy = is_busy; -			mNameMute = is_muted; -			mNameAppearance = is_appearance; -			mNameFriend = is_friend; -			mNameCloud = is_cloud; -			mTitle = title ? title->getString() : ""; -			LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); -			new_name = TRUE; +			if (is_cloud) +			{ +				line += LLTrans::getString("LoadingData"); +				line += ", "; +			} +			// trim last ", " +			line.resize( line.length() - 2 ); +			addNameTagLine(line, name_tag_color, LLFontGL::NORMAL, +				LLFontGL::getFontSansSerifSmall());  		} -		if (mVisibleChat) +		if (sRenderGroupTitles +			&& title && title->getString() && title->getString()[0] != '\0')  		{ -			mNameText->setFont(LLFontGL::getFontSansSerif()); -			mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT); -			mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f); +			std::string title_str = title->getString(); +			LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR); +			addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL, +				LLFontGL::getFontSansSerifSmall()); +		} -			char line[MAX_STRING];		/* Flawfinder: ignore */ -			line[0] = '\0'; -			std::deque<LLChat>::iterator chat_iter = mChats.begin(); -			mNameText->clearString(); +		static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames"); +		static LLUICachedControl<bool> show_usernames("NameTagShowUsernames"); -			LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" ); -			LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f); -			LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f); -			if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES)  +		if (LLAvatarNameCache::useDisplayNames()) +		{ +			LLAvatarName av_name; +			if (!LLAvatarNameCache::get(getID(), &av_name))  			{ -				++chat_iter; +				// ...call this function back when the name arrives +				// and force a rebuild +				LLAvatarNameCache::get(getID(), +					boost::bind(&LLVOAvatar::clearNameTag, this));  			} -			for(; chat_iter != mChats.end(); ++chat_iter) +			// Might be blank if name not available yet, that's OK +			if (show_display_names)  			{ -				F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f); -				LLFontGL::StyleFlags style; -				switch(chat_iter->mChatType) -				{ -				case CHAT_TYPE_WHISPER: -					style = LLFontGL::ITALIC; -					break; -				case CHAT_TYPE_SHOUT: -					style = LLFontGL::BOLD; -					break; -				default: -					style = LLFontGL::NORMAL; -					break; -				} -				if (chat_fade_amt < 1.f) -				{ -					F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f); -					mNameText->addLine(chat_iter->mText, lerp(new_chat, normal_chat, u), style); -				} -				else if (chat_fade_amt < 2.f) -				{ -					F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f); -					mNameText->addLine(chat_iter->mText, lerp(normal_chat, old_chat, u), style); -				} -				else if (chat_fade_amt < 3.f) -				{ -					// *NOTE: only remove lines down to minimum number -					mNameText->addLine(chat_iter->mText, old_chat, style); -				} +				addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL, +					LLFontGL::getFontSansSerif());  			} -			mNameText->setVisibleOffScreen(TRUE); - -			if (mTyping) +			// Suppress SLID display if display name matches exactly (ugh) +			if (show_usernames && !av_name.mIsDisplayNameDefault)  			{ -				S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1; -				switch(dot_count) -				{ -				case 1: -					mNameText->addLine(".", new_chat); -					break; -				case 2: -					mNameText->addLine("..", new_chat); -					break; -				case 3: -					mNameText->addLine("...", new_chat); -					break; -				} - +				// *HACK: Desaturate the color +				LLColor4 username_color = name_tag_color * 0.83f; +				addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL, +					LLFontGL::getFontSansSerifSmall());  			}  		}  		else  		{ -			// ...not using chat bubbles, just names -			mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_CENTER); -			mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f); -			mNameText->setVisibleOffScreen(FALSE); +			const LLFontGL* font = LLFontGL::getFontSansSerif(); +			std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() ); +			addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font); +		} + +		mNameAway = is_away; +		mNameBusy = is_busy; +		mNameMute = is_muted; +		mNameAppearance = is_appearance; +		mNameFriend = is_friend; +		mNameCloud = is_cloud; +		mTitle = title ? title->getString() : ""; +		LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); +		new_name = TRUE; +	} + +	if (mVisibleChat) +	{ +		mNameText->setFont(LLFontGL::getFontSansSerif()); +		mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT); +		mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f); + +		char line[MAX_STRING];		/* Flawfinder: ignore */ +		line[0] = '\0'; +		std::deque<LLChat>::iterator chat_iter = mChats.begin(); +		mNameText->clearString(); + +		LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" ); +		LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f); +		LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f); +		if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES)  +		{ +			++chat_iter;  		} + +		for(; chat_iter != mChats.end(); ++chat_iter) +		{ +			F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f); +			LLFontGL::StyleFlags style; +			switch(chat_iter->mChatType) +			{ +			case CHAT_TYPE_WHISPER: +				style = LLFontGL::ITALIC; +				break; +			case CHAT_TYPE_SHOUT: +				style = LLFontGL::BOLD; +				break; +			default: +				style = LLFontGL::NORMAL; +				break; +			} +			if (chat_fade_amt < 1.f) +			{ +				F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f); +				mNameText->addLine(chat_iter->mText, lerp(new_chat, normal_chat, u), style); +			} +			else if (chat_fade_amt < 2.f) +			{ +				F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f); +				mNameText->addLine(chat_iter->mText, lerp(normal_chat, old_chat, u), style); +			} +			else if (chat_fade_amt < 3.f) +			{ +				// *NOTE: only remove lines down to minimum number +				mNameText->addLine(chat_iter->mText, old_chat, style); +			} +		} +		mNameText->setVisibleOffScreen(TRUE); + +		if (mTyping) +		{ +			S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1; +			switch(dot_count) +			{ +			case 1: +				mNameText->addLine(".", new_chat); +				break; +			case 2: +				mNameText->addLine("..", new_chat); +				break; +			case 3: +				mNameText->addLine("...", new_chat); +				break; +			} + +		} +	} +	else +	{ +		// ...not using chat bubbles, just names +		mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_CENTER); +		mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f); +		mNameText->setVisibleOffScreen(FALSE);  	}  } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7c744f3c3f..9268e5a869 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -5318,7 +5318,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)  				// crazy cast so that we can overwrite the fade value  				// even though gcc enforces sets as const  				// (fade value doesn't affect sort so this is safe) -				Light* farthest_light = ((Light*) (&(*(mNearbyLights.rbegin())))); +				Light* farthest_light = (const_cast<Light*>(&(*(mNearbyLights.rbegin()))));  				if (light->dist < farthest_light->dist)  				{  					if (farthest_light->fade >= 0.f) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3d057fa8f5..e85637826d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4204,6 +4204,8 @@ Are you sure you want to change the Estate Covenant?    <notification     icon="notifytip.tga"     name="RegionEntryAccessBlocked_Notify" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">     <tag>fail</tag>  The region you're trying to visit contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content. @@ -4212,6 +4214,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu    <notification     icon="notifytip.tga"     name="RegionEntryAccessBlocked_NotifyAdultsOnly" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      <tag>fail</tag>      The region you're trying to visit contains [REGIONMATURITY] content, which is accessible to adults only. @@ -4283,6 +4287,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu    <notification     icon="notifytip.tga"     name="TeleportEntryAccessBlocked_Notify" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      <unique>        <context>REGIONMATURITY</context> @@ -4294,6 +4300,8 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu    <notification     icon="notifytip.tga"     name="TeleportEntryAccessBlocked_NotifyAdultsOnly" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      <unique>        <context>REGIONMATURITY</context> @@ -4414,6 +4422,8 @@ You won't receive any more notifications that you're about to visit a region wit    <notification     icon="notifytip.tga"     name="LandClaimAccessBlocked_Notify" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      The land you're trying to claim contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.      <tag>fail</tag> @@ -4422,6 +4432,8 @@ You won't receive any more notifications that you're about to visit a region wit    <notification     icon="notifytip.tga"     name="LandClaimAccessBlocked_NotifyAdultsOnly" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      <tag>fail</tag>      The land you're trying to claim contains [REGIONMATURITY] content, which is accessible to adults only. @@ -4479,6 +4491,8 @@ You won't receive any more notifications that you're about to visit a region wit    <notification     icon="notifytip.tga"     name="LandBuyAccessBlocked_Notify" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      The land you're trying to buy contains [REGIONMATURITY] content, but your current preferences are set to exclude [REGIONMATURITY] content.      <tag>fail</tag> @@ -4487,6 +4501,8 @@ You won't receive any more notifications that you're about to visit a region wit    <notification     icon="notifytip.tga"     name="LandBuyAccessBlocked_NotifyAdultsOnly" +   log_to_im="false" +   log_to_chat="true"     type="notifytip">      <tag>fail</tag>      The land you're trying to buy contains [REGIONMATURITY] content, which is accessible to adults only. @@ -6397,6 +6413,7 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th     icon="notify.tga"     name="TeleportOffered"     log_to_im="true" +   log_to_chat="false"     type="offer">  [NAME_SLURL] has offered to teleport you to their location: @@ -6418,6 +6435,8 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th    <notification     icon="notify.tga"     name="TeleportOffered_MaturityExceeded" +   log_to_im="true" +   log_to_chat="false"     type="offer">  [NAME_SLURL] has offered to teleport you to their location: @@ -6441,6 +6460,8 @@ This region contains [REGION_CONTENT_MATURITY] content, but your current prefere    <notification     icon="notify.tga"     name="TeleportOffered_MaturityBlocked" +   log_to_im="true" +   log_to_chat="false"     type="notifytip">  [NAME_SLURL] has offered to teleport you to their location: @@ -6455,6 +6476,7 @@ However, this region contains content accessible to adults only.     icon="notify.tga"     name="TeleportOfferSent"     log_to_im="true" +   log_to_chat="false"     show_toast="false"     type="offer">  	Teleport offer sent to [TO_NAME] diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml index 413e22e444..433a3181cd 100644 --- a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml @@ -2,7 +2,7 @@  <inbox_inventory_panel      accepts_drag_and_drop="false"      name="inventory_inbox" -    start_folder="Received Items" +    start_folder.type="inbox"      follows="all" layout="topleft"      top="0" left="0" height="165" width="308"      top_pad="0" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 2a5933e3e9..39805637a0 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -35,7 +35,7 @@               left="0"               mouse_opaque="true"               name="favorites_list" -             start_folder="Favorites" +             start_folder.name="Favorites"               width="307"/>          </accordion_tab>          <accordion_tab @@ -51,7 +51,7 @@               left="0"               mouse_opaque="true"               name="landmarks_list" -             start_folder="Landmarks" +             start_folder.name="Landmarks"               width="307"/>          </accordion_tab>          <accordion_tab @@ -67,7 +67,7 @@               left="0"               mouse_opaque="true"               name="my_inventory_list" -             start_folder="My Inventory" +             start_folder.name="My Inventory"               width="307"/>            </accordion_tab>            <accordion_tab @@ -83,7 +83,7 @@               left="0"               mouse_opaque="true"               name="library_list" -             start_folder="LIBRARY" +             start_folder.name="LIBRARY"               width="313"/>          </accordion_tab>      </accordion> diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml index a3d39e55af..203febbf18 100644 --- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml @@ -1,7 +1,10 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<outbox_inventory_panel +<inventory_panel      name="inventory_outbox" -    start_folder="Outbox" +    start_folder.name="Outbox" +    show_empty_message="false" +    show_load_status="false" +    start_folder.type="outbox"      follows="all" layout="topleft"      top="0" left="0" height="165" width="308"      top_pad="0" @@ -12,6 +15,11 @@      bevel_style="none"      show_item_link_overlays="true"      tool_tip="Drag and drop items here to prepare them for sale on your storefront" -    > -    <scroll reserve_scroll_corner="false" /> -</outbox_inventory_panel> +    scroll.reserve_scroll_corner="false"> +      <folder folder_arrow_image="Folder_Arrow" +              folder_indentation="8" +              item_height="20" +              item_top_pad="4" +              selection_image="Rounded_Square"/> +      <item allow_open="false"/> +</inventory_panel> diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml index 830c27bdac..d5b10e7f51 100644 --- a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml +++ b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml @@ -1,2 +1,3 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<inbox_inventory_panel show_load_status="false" /> +<inbox_inventory_panel show_load_status="false" +                       start_folder.type="inbox"/> diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml deleted file mode 100644 index d19c47f54f..0000000000 --- a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<outbox_folder_view_folder -  folder_arrow_image="Folder_Arrow" -  folder_indentation="8" -  item_height="20"  -  item_top_pad="4" -  selection_image="Rounded_Square" -  > -</outbox_folder_view_folder> diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml deleted file mode 100644 index 3964569da2..0000000000 --- a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<outbox_inventory_panel show_empty_message="false" show_load_status="false" /> | 
