diff options
25 files changed, 417 insertions, 488 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 785bf4b868..4f447fd35b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -808,7 +808,7 @@ set(viewer_HEADER_FILES      llfloaterwindowsize.h      llfloaterworldmap.h      llfolderview.h -    llfoldervieweventlistener.h +    llfolderviewmodel.h      llfolderviewitem.h      llfollowcam.h      llfriendcard.h diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index decfef2ae6..68dc7681cc 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -778,7 +778,7 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL  	const std::set<LLFolderViewItem*>::const_iterator it_end = inventory_selected.end();  	for (; it != it_end; ++it)  	{ -		LLViewerInventoryCategory* inv_cat = gInventory.getCategory((*it)->getListener()->getUUID()); +		LLViewerInventoryCategory* inv_cat = gInventory.getCategory((*it)->getItemViewModel()->getUUID());  		// any category can be offered.  		if (inv_cat)  		{ @@ -788,7 +788,7 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL  		// check if inventory item can be given  		LLFolderViewItem* item = *it;  		if (!item) return false; -		LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getListener()); +		LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getViewModelItem());  		if (bridge && bridge->canShare())  		{  			continue; diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp index ba0f51b467..04a55b261c 100644 --- a/indra/newview/llfloateroutbox.cpp +++ b/indra/newview/llfloateroutbox.cpp @@ -251,7 +251,7 @@ void LLFloaterOutbox::setupOutbox(const LLUUID& outboxId)  	// Set the sort order newest to oldest -	mOutboxInventoryPanel->getViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);	 +	mOutboxInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);	  	mOutboxInventoryPanel->getFilter()->markDefault();  	fetchOutboxContents(); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 1f48ef98f6..918e68e444 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -304,7 +304,7 @@ BOOL LLFolderView::canFocusChildren() const  BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)  {  	// enforce sort order of My Inventory followed by Library -	if (folder->getListener()->getUUID() == gInventory.getLibraryRootFolderID()) +	if (folder->getViewModelItem()->getUUID() == gInventory.getLibraryRootFolderID())  	{  		mFolders.push_back(folder);  	} @@ -366,7 +366,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen  static LLFastTimer::DeclareTimer FTM_FILTER("Filter Inventory"); -void LLFolderView::filter( LLInventoryFilter& filter ) +void LLFolderView::filter( LLFolderViewFilter& filter )  {  	LLFastTimer t2(FTM_FILTER);  	filter.setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000)); @@ -667,7 +667,7 @@ BOOL LLFolderView::startDrag(LLToolDragAndDrop::ESource source)  		{  			EDragAndDropType type = DAD_NONE;  			LLUUID id = LLUUID::null; -			can_drag = can_drag && (*item_it)->getListener()->startDrag(&type, &id); +			can_drag = can_drag && (*item_it)->getViewModelItem()->startDrag(&type, &id);  			types.push_back(type);  			cargo_ids.push_back(id); @@ -947,7 +947,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL  			for(S32 i = 0; i < count; ++i)  			{ -				listener = items[i]->getListener(); +				listener = items[i]->getViewModelItem();  				if(listener && (listeners.find(listener) == LLDynamicArray<LLFolderViewModelItemInventory*>::FAIL))  				{  					listeners.put(listener); @@ -984,7 +984,7 @@ void LLFolderView::openSelectedItems( void )  				// IT_{OBJECT,ATTACHMENT} creates LLProperties  				// floaters; others create LLPreviews.  Put  				// each one in the right type of container. -				LLFolderViewModelItemInventory* listener = (*item_it)->getListener(); +				LLFolderViewModelItemInventory* listener = (*item_it)->getViewModelItem();  				bool is_prop = listener && (listener->getInventoryType() == LLInventoryType::IT_OBJECT || listener->getInventoryType() == LLInventoryType::IT_ATTACHMENT);  				if (is_prop)  					LLFloater::setFloaterHost(multi_propertiesp); @@ -1010,7 +1010,7 @@ void LLFolderView::propertiesSelectedItems( void )  		{  			LLFolderViewItem* folder_item = mSelectedItems.front();  			if(!folder_item) return; -			folder_item->getListener()->showProperties(); +			folder_item->getViewModelItem()->showProperties();  		}  		else  		{ @@ -1021,7 +1021,7 @@ void LLFolderView::propertiesSelectedItems( void )  			selected_items_t::iterator item_it;  			for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)  			{ -				(*item_it)->getListener()->showProperties(); +				(*item_it)->getViewModelItem()->showProperties();  			}  			LLFloater::setFloaterHost(NULL); @@ -1124,7 +1124,7 @@ BOOL LLFolderView::canCopy() const  	for (selected_items_t::const_iterator selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)  	{  		const LLFolderViewItem* item = *selected_it; -		if (!item->getListener()->isItemCopyable()) +		if (!item->getViewModelItem()->isItemCopyable())  		{  			return FALSE;  		} @@ -1144,7 +1144,7 @@ void LLFolderView::copy()  		selected_items_t::iterator item_it;  		for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)  		{ -			listener = (*item_it)->getListener(); +			listener = (*item_it)->getViewModelItem();  			if(listener)  			{  				listener->copyToClipboard(); @@ -1164,7 +1164,7 @@ BOOL LLFolderView::canCut() const  	for (selected_items_t::const_iterator selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)  	{  		const LLFolderViewItem* item = *selected_it; -		const LLFolderViewModelItemInventory* listener = item->getListener(); +		const LLFolderViewModelItemInventory* listener = item->getViewModelItem();  		if (!listener || !listener->isItemRemovable())  		{ @@ -1185,7 +1185,7 @@ void LLFolderView::cut()  		selected_items_t::iterator item_it;  		for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)  		{ -			listener = (*item_it)->getListener(); +			listener = (*item_it)->getViewModelItem();  			if(listener)  			{  				listener->cutToClipboard(); @@ -1210,11 +1210,11 @@ BOOL LLFolderView::canPaste() const  		{  			// *TODO: only check folders and parent folders of items  			const LLFolderViewItem* item = (*item_it); -			const LLFolderViewModelItemInventory* listener = item->getListener(); +			const LLFolderViewModelItemInventory* listener = item->getViewModelItem();  			if(!listener || !listener->isClipboardPasteable())  			{  				const LLFolderViewFolder* folderp = item->getParentFolder(); -				listener = folderp->getListener(); +				listener = folderp->getViewModelItem();  				if (!listener || !listener->isClipboardPasteable())  				{  					return FALSE; @@ -1238,7 +1238,7 @@ void LLFolderView::paste()  		for (selected_it = mSelectedItems.begin(); selected_it != mSelectedItems.end(); ++selected_it)  		{  			LLFolderViewItem* item = *selected_it; -			LLFolderViewModelItemInventory* listener = item->getListener(); +			LLFolderViewModelItemInventory* listener = item->getViewModelItem();  			if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)  			{  				item = item->getParentFolder(); @@ -1271,8 +1271,8 @@ void LLFolderView::startRenamingSelectedItem( void )  	{  		item = mSelectedItems.front();  	} -	if(getVisible() && getEnabled() && (count == 1) && item && item->getListener() && -	   item->getListener()->isItemRenameable()) +	if(getVisible() && getEnabled() && (count == 1) && item && item->getViewModelItem() && +	   item->getViewModelItem()->isItemRenameable())  	{  		mRenameItem = item; @@ -1581,7 +1581,7 @@ BOOL LLFolderView::canDoDelete() const  	for (selected_items_t::const_iterator item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)  	{ -		if (!(*item_it)->getListener()->isItemRemovable()) +		if (!(*item_it)->getViewModelItem()->isItemRemovable())  		{  			return FALSE;  		} @@ -1766,7 +1766,7 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	// when drop is not handled by child, it should be handled  	// by the folder which is the hierarchy root.  	if (!handled -		&& getListener()->getUUID().notNull()) +		&& getViewModelItem()->getUUID().notNull())  		{  			handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);  		} @@ -1930,7 +1930,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)  	{  		LLFolderViewItem* folder_item = *set_iter;  		if(!folder_item) continue; -		LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); +		LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem();  		if(!bridge) continue;  		bridge->performAction(model, action);  	} diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 37005f080f..9b8a629387 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -111,7 +111,7 @@ public:  	virtual LLFolderView*	getRoot() { return this; } -	LLFolderViewModelInterface* getViewModel() { return mViewModel; } +	LLFolderViewModelInterface* getFolderViewModel() { return mViewModel; }  	void setFilterPermMask(PermissionMask filter_perm_mask); @@ -272,8 +272,6 @@ protected:  	void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response); -	LLInventorySort& getSortFunction() { return mSortFunction; } -  protected:  	LLHandle<LLView>					mPopupMenuHandle; @@ -318,7 +316,6 @@ protected:  	LLPanel*						mParentPanel; -	LLInventorySort					mSortFunction;  	LLFolderViewModelInterface*		mViewModel;  	/** diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 13b721fa23..0a3c03e868 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -30,10 +30,9 @@  // viewer includes  #include "llfolderview.h"		// Items depend extensively on LLFolderViews  #include "llfolderview.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llviewerfoldertype.h"  #include "llinventorybridge.h"	// for LLItemBridge in LLInventorySort::operator() -#include "llinventoryfilter.h"  #include "llinventoryfunctions.h"  #include "llinventorymodelbackgroundfetch.h"  #include "llpanel.h" @@ -120,7 +119,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  	mItemHeight(p.item_height),  	mPassedFilter(FALSE),  	mLastFilterGeneration(-1), -	mStringMatchOffset(std::string::npos), +	//TODO RN: create interface for string highlighting +	//mStringMatchOffset(std::string::npos),  	mControlLabelRotation(0.f),  	mDragAndDropTarget(FALSE),  	mLabel(p.name), @@ -218,7 +218,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)  BOOL LLFolderViewItem::potentiallyVisible()  {  	return getFiltered() // we've passed the filter -		||	getLastFilterGeneration() < getRoot()->getFilter()->getFirstSuccessGeneration()); // or we don't know yet +		||	getLastFilterGeneration() < getRoot()->getFilter()->getFirstSuccessGeneration(); // or we don't know yet  }  BOOL LLFolderViewItem::getFiltered()  @@ -244,45 +244,17 @@ void LLFolderViewItem::setIcon(LLUIImagePtr icon)  void LLFolderViewItem::refresh()  { -	if(!getListener()) return; +	if(!getViewModelItem()) return; -	mLabel = getListener()->getDisplayName(); -	LLFolderType::EType preferred_type = getListener()->getPreferredType(); +	mLabel = getViewModelItem()->getDisplayName(); -		// *TODO: to be removed when database supports multi language. This is a -		// temporary attempt to display the inventory folder in the user locale. -		// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID -		//		it uses the same way to find localized string - -		// HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder) -		// Translation of Accessories folder in Library inventory folder -		bool accessories = false; -		if(mLabel == std::string("Accessories")) -		{ -			//To ensure that Accessories folder is in Library we have to check its parent folder. -			//Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model -		LLInventoryCategory* cat = gInventory.getCategory(getListener()->getUUID()); -			if(cat) -			{ -				const LLUUID& parent_folder_id = cat->getParentUUID(); -				accessories = (parent_folder_id == gInventory.getLibraryRootFolderID()); -			} -		} - -		//"Accessories" inventory category has folder type FT_NONE. So, this folder -		//can not be detected as protected with LLFolderType::lookupIsProtectedType -		if (accessories || LLFolderType::lookupIsProtectedType(preferred_type)) -		{ -			LLTrans::findString(mLabel, "InvFolder " + mLabel); -		}; - -		setToolTip(mLabel); -	setIcon(getListener()->getIcon()); -		if (mRoot->useLabelSuffix()) -		{ -		mLabelStyle = getListener()->getLabelStyle(); -		mLabelSuffix = getListener()->getLabelSuffix(); -} +	setToolTip(mLabel); +	setIcon(getViewModelItem()->getIcon()); +	if (mRoot->useLabelSuffix()) +	{ +		mLabelStyle = getViewModelItem()->getLabelStyle(); +		mLabelSuffix = getViewModelItem()->getLabelSuffix(); +	}  	std::string searchable_label(mLabel);  	searchable_label.append(mLabelSuffix); @@ -381,7 +353,6 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder)  		return FALSE;  	}  	mParentFolder = folder; -	root->addItemID(getListener()->getUUID(), this);  	return folder->addItem(this);  } @@ -420,7 +391,7 @@ S32 LLFolderViewItem::getItemHeight()  	return mItemHeight;  } -void LLFolderViewItem::filter( LLInventoryFilter& filter) +void LLFolderViewItem::filter( LLFolderViewFilter& filter)  {  	const BOOL previous_passed_filter = mPassedFilter;  	const BOOL passed_filter = filter.check(this); @@ -435,7 +406,8 @@ void LLFolderViewItem::filter( LLInventoryFilter& filter)  	}  	setFiltered(passed_filter, filter.getCurrentGeneration()); -	mStringMatchOffset = filter.getStringMatchOffset(this); +	//TODO RN: create interface for string highlighting +	//mStringMatchOffset = filter.getStringMatchOffset(this);  	filter.decrementFilterCount();  	if (getRoot()->getDebugFilters()) @@ -498,9 +470,9 @@ void LLFolderViewItem::selectItem(void)  {  	if (mIsSelected == FALSE)  	{ -		if (getListener()) +		if (getViewModelItem())  		{ -			getListener()->selectItem(); +			getViewModelItem()->selectItem();  		}  		mIsSelected = TRUE;  	} @@ -508,9 +480,9 @@ void LLFolderViewItem::selectItem(void)  BOOL LLFolderViewItem::isMovable()  { -	if( getListener() ) +	if( getViewModelItem() )  	{ -		return getListener()->isItemMovable(); +		return getViewModelItem()->isItemMovable();  	}  	else  	{ @@ -520,9 +492,9 @@ BOOL LLFolderViewItem::isMovable()  BOOL LLFolderViewItem::isRemovable()  { -	if( getListener() ) +	if( getViewModelItem() )  	{ -		return getListener()->isItemRemovable(); +		return getViewModelItem()->isItemRemovable();  	}  	else  	{ @@ -548,9 +520,9 @@ BOOL LLFolderViewItem::remove()  	{  		return FALSE;  	} -	if(getListener()) +	if(getViewModelItem())  	{ -		return getListener()->removeItem(); +		return getViewModelItem()->removeItem();  	}  	return TRUE;  } @@ -558,25 +530,17 @@ BOOL LLFolderViewItem::remove()  // Build an appropriate context menu for the item.  void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)  { -	if(getListener()) +	if(getViewModelItem())  	{ -		getListener()->buildContextMenu(menu, flags); +		getViewModelItem()->buildContextMenu(menu, flags);  	}  }  void LLFolderViewItem::openItem( void )  { -	if( getListener() ) +	if( getViewModelItem() )  	{ -		getListener()->openItem(); -	} -} - -void LLFolderViewItem::preview( void ) -{ -	if (getListener()) -	{ -		getListener()->previewItem(); +		getViewModelItem()->openItem();  	}  } @@ -584,9 +548,9 @@ void LLFolderViewItem::rename(const std::string& new_name)  {  	if( !new_name.empty() )  	{ -		if( getListener() ) +		if( getViewModelItem() )  		{ -			getListener()->renameItem(new_name); +			getViewModelItem()->renameItem(new_name);  			if(mParentFolder)  			{ @@ -601,19 +565,13 @@ const std::string& LLFolderViewItem::getSearchableLabel() const  	return mSearchableLabel;  } -LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void) -{ -	if (!getListener()) return NULL; -	return gInventory.getItem(getListener()->getUUID()); -} -  const std::string& LLFolderViewItem::getName( void ) const  { -	if(getListener()) +	if(getViewModelItem())  	{ -		return getListener()->getName(); +		return getViewModelItem()->getName();  	} -	return z; +	return LLStringUtil::null;  }  // LLView functionality @@ -689,9 +647,9 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  				// *TODO: push this into listener and remove  				// dependency on llagent -				if (getListener()) +				if (getViewModelItem())  				{ -					src = getListener()->getDragSource(); +					src = getViewModelItem()->getDragSource();  				}  				else  				{ @@ -701,7 +659,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  				can_drag = root->startDrag(src);  				if (can_drag)  				{ -					// if (getListener()) getListener()->startDrag(); +					// if (getViewModelItem()) getViewModelItem()->startDrag();  					// RN: when starting drag and drop, clear out last auto-open  					root->autoOpenTest(NULL);  					root->setShowSelectionContext(TRUE); @@ -738,7 +696,10 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask )  { -	preview(); +	if (getViewModelItem()) +	{ +		getViewModelItem()->openItem(); +	}  	return TRUE;  } @@ -790,9 +751,9 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  {  	BOOL accepted = FALSE;  	BOOL handled = FALSE; -	if(getListener()) +	if(getViewModelItem())  	{ -		accepted = getListener()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg); +		accepted = getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);  		handled = accepted;  		if (accepted)  		{ @@ -838,15 +799,12 @@ void LLFolderViewItem::draw()  	const S32 FOCUS_LEFT = 1;  	const LLFontGL* font = getLabelFontForStyle(mLabelStyle); -	getListener()->update(); +	getViewModelItem()->update();  	//--------------------------------------------------------------------------------//  	// Draw open folder arrow  	// -	const bool up_to_date = getListener() && getListener()->isUpToDate(); -	const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) // we fetched our children and some of them have passed the filter... -										|| (!up_to_date && getListener() && getListener()->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter) -	if (possibly_has_children) +	if (hasVisibleChildren() || getViewModelItem()->hasChildren())  	{  		LLUIImage* arrow_image = default_params.folder_arrow_image;  		gl_draw_scaled_rotated_image( @@ -943,25 +901,27 @@ void LLFolderViewItem::draw()  		mDragAndDropTarget = FALSE;  	} -	const LLViewerInventoryItem *item = getInventoryItem(); -	const BOOL highlight_link = mIconOverlay && item && item->getIsLinkType(); -	//--------------------------------------------------------------------------------// -	// Draw open icon -	// -	const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD; -	if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders - 	{ -		mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1); -	} -	else if (mIcon) -	{ - 		mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); - 	} +	//TODO RN: implement this in terms of getIcon() and getIconOverlay() -	if (highlight_link) -	{ -		mIconOverlay->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); -	} +	//const LLViewerInventoryItem *item = getInventoryItem(); +	//const BOOL highlight_link = mIconOverlay && item && item->getIsLinkType(); +	////--------------------------------------------------------------------------------// +	//// Draw open icon +	//// +	//const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD; +	//if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders + //	{ +	//	mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1); +	//} +	//else if (mIcon) +	//{ + //		mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); + //	} + +	//if (highlight_link) +	//{ +	//	mIconOverlay->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1); +	//}  	//--------------------------------------------------------------------------------//  	// Exit if no label to draw @@ -972,8 +932,9 @@ void LLFolderViewItem::draw()  	}  	LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor; -	if (highlight_link) color = sLinkColor; -	if (in_library) color = sLibraryColor; +	//TODO RN: implement this in terms of getColor() +	//if (highlight_link) color = sLinkColor; +	//if (getViewModelItem() && 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; @@ -984,7 +945,7 @@ void LLFolderViewItem::draw()  	//  	if (getRoot()->getDebugFilters())  	{ -		if (!getFiltered() && !possibly_has_children) +		if (!getFiltered() && !getViewModelItem()->hasChildren())  		{  			color.mV[VALPHA] *= 0.5f;  		} @@ -1016,7 +977,7 @@ void LLFolderViewItem::draw()  	//--------------------------------------------------------------------------------//  	// Highlight string match  	// -	RN: expose interface for highlighting +	//TODO RN: expose interface for highlighting  	//if (mStringMatchOffset != std::string::npos)  	//{  	//	// don't draw backgrounds for zero-length strings @@ -1098,7 +1059,7 @@ static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");  S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)  {  	// sort before laying out contents -	getRoot->getViewModel()->sort(this); +	getRoot()->getFolderViewModel()->sort(this);  	LLFastTimer t2(FTM_ARRANGE); @@ -1122,8 +1083,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)  			for (folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)  			{  				LLFolderViewFolder* folderp = (*fit); -				found = ( folderp->getListener() -								&&	(folderp->getFiltered(filter_generation) +				found = ( (folderp->getFiltered(filter_generation)  									 ||	(folderp->getFilteredFolder(filter_generation)   										 && folderp->hasFilteredDescendants(filter_generation))));  				if (found) @@ -1164,10 +1124,9 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)  				}  				else  				{ -					folderp->setVisible( folderp->getListener() -										&&	(folderp->getFiltered(filter_generation) +					folderp->setVisible( folderp->getFiltered(filter_generation)  											||	(folderp->getFilteredFolder(filter_generation)  -												&& folderp->hasFilteredDescendants(filter_generation)))); // passed filter or has descendants that passed filter +												&& folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter  				}  				if (folderp->getVisible()) @@ -1277,7 +1236,7 @@ BOOL LLFolderViewFolder::needsArrange()  void LLFolderViewFolder::requestSort()  { -	getRoot()->getViewModel()->requestSort(this); +	getRoot()->getFolderViewModel()->requestSort(this);  }  void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recurse_up) @@ -1293,7 +1252,7 @@ void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recur  	}  } -void LLFolderViewFolder::filter( LLInventoryFilter& filter) +void LLFolderViewFolder::filter( LLFolderViewFilter& filter)  {  	S32 filter_generation = filter.getCurrentGeneration();  	// if failed to pass filter newer than must_pass_generation @@ -1301,7 +1260,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  	// check against items that have passed the filter  	S32 must_pass_generation = filter.getFirstRequiredGeneration(); -	bool autoopen_folders = (filter.hasFilterString()); +	bool autoopen_folders = filter.showAllResults();  	// if we have already been filtered against this generation, skip out  	if (getCompletedFilterGeneration() >= filter_generation) @@ -1317,7 +1276,8 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  		{  			// go ahead and flag this folder as done  			mLastFilterGeneration = filter_generation;			 -			mStringMatchOffset = std::string::npos; +			//TODO RN: create interface for string highlighting +			//mStringMatchOffset = std::string::npos;  		}  		else // filter self only on first pass through  		{ @@ -1351,15 +1311,6 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  		return;  	} -	// when applying a filter, matching folders get their contents downloaded first -	if (filter.isNotDefault() -		&& getFiltered(filter.getFirstSuccessGeneration()) -		&&	(getListener() -			&& !gInventory.isCategoryComplete(getListener()->getUUID()))) -	{ -		LLInventoryModelBackgroundFetch::instance().start(getListener()->getUUID()); -	} -  	// now query children  	for (folders_t::iterator iter = mFolders.begin();  		 iter != mFolders.end(); @@ -1449,7 +1400,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)  	}  } -void LLFolderViewFolder::filterFolder(LLInventoryFilter& filter) +void LLFolderViewFolder::filterFolder(LLFolderViewFilter& filter)  {  	const BOOL previous_passed_filter = mPassedFolderFilter;  	const BOOL passed_filter = filter.checkFolder(this); @@ -1944,9 +1895,9 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )  BOOL LLFolderViewFolder::isMovable()  { -	if( getListener() ) +	if( getViewModelItem() )  	{ -		if( !(getListener()->isItemMovable()) ) +		if( !(getViewModelItem()->isItemMovable()) )  		{  			return FALSE;  		} @@ -1977,9 +1928,9 @@ BOOL LLFolderViewFolder::isMovable()  BOOL LLFolderViewFolder::isRemovable()  { -	if( getListener() ) +	if( getViewModelItem() )  	{ -		if( !(getListener()->isItemRemovable()) ) +		if( !(getViewModelItem()->isItemRemovable()) )  		{  			return FALSE;  		} @@ -2023,7 +1974,7 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)  	requestArrange();  	requestSort(); -	FIXME: RN - make sort bubble up as long as parent Folder doesn't have anything matching sort criteria +	//TODO RN - make sort bubble up as long as parent Folder doesn't have anything matching sort criteria  	//// Traverse parent folders and update creation date and resort, if necessary  	//LLFolderViewFolder* parentp = this;  	//while (parentp) @@ -2052,16 +2003,7 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)  	// rearrange all descendants too, as our indentation level might have changed  	folder->requestArrange(TRUE);  	requestSort(); -	if (getRoot()->getSortFunction().isByDate()) -	{ -	LLFolderViewFolder* parentp = getParentFolder(); -		while(parentp) -	{ -		// parent folder doesn't have a time stamp yet, so get it from us -		parentp->requestSort(); -		parentp = parentp->getParentFolder(); -	} -	} +  	return TRUE;  } @@ -2100,15 +2042,15 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType r  {  	BOOL was_open = isOpen();  	mIsOpen = openitem; -	if (getListener()) +	if (getViewModelItem())  	{  		if(!was_open && openitem)  		{ -			getListener()->openItem(); +			getViewModelItem()->openItem();  		}  		else if(was_open && !openitem)  		{ -			getListener()->closeItem(); +			getViewModelItem()->closeItem();  		}  	} @@ -2229,7 +2171,7 @@ BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,  													   EAcceptance* accept,  													   std::string& tooltip_msg)  { -	BOOL accepted = getListener() && getListener()->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg); +	BOOL accepted = getViewModelItem() && getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);  	if (accepted)   	{ @@ -2253,9 +2195,6 @@ BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,  BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )  {  	BOOL handled = FALSE; -	// fetch contents of this folder, as context menu can depend on contents -	// still, user would have to open context menu again to see the changes -	gInventory.fetchDescendentsOf(getListener()->getUUID());  	if( isOpen() )  	{ @@ -2311,11 +2250,11 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )  BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )  {  	/* Disable outfit double click to wear -	const LLUUID &cat_uuid = getListener()->getUUID(); +	const LLUUID &cat_uuid = getViewModelItem()->getUUID();  	const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);  	if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)  	{ -		getListener()->performAction(NULL, NULL,"replaceoutfit"); +		getViewModelItem()->performAction(NULL, NULL,"replaceoutfit");  		return TRUE;  	}  	*/ @@ -2594,30 +2533,31 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,  {  	// ignore sort order for landmarks in the Favorites folder.  	// they should be always sorted as in Favorites bar. See EXT-719 -	if (a->getSortGroup() == SG_ITEM -		&& b->getSortGroup() == SG_ITEM -		&& a->getInventoryType() == LLInventoryType::IT_LANDMARK -		&& b->getInventoryType() == LLInventoryType::IT_LANDMARK) -	{ +	//TODO RN: fix sorting in favorites folder +	//if (a->getSortGroup() == SG_ITEM +	//	&& b->getSortGroup() == SG_ITEM +	//	&& a->getInventoryType() == LLInventoryType::IT_LANDMARK +	//	&& b->getInventoryType() == LLInventoryType::IT_LANDMARK) +	//{ -		static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +	//	static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); -		LLUUID a_uuid = a->getParentFolder()->getUUID(); -		LLUUID b_uuid = b->getParentFolder()->getUUID(); +	//	LLUUID a_uuid = a->getParentFolder()->getUUID(); +	//	LLUUID b_uuid = b->getParentFolder()->getUUID(); -		if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) -		{ -			// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem -			// or to LLInvFVBridge -			LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a))->getItem(); -			LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b))->getItem(); -			if (!aitem || !bitem) -				return false; -			S32 a_sort = aitem->getSortField(); -			S32 b_sort = bitem->getSortField(); -			return a_sort < b_sort; -		} -	} +	//	if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) +	//	{ +	//		// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem +	//		// or to LLInvFVBridge +	//		LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a))->getItem(); +	//		LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b))->getItem(); +	//		if (!aitem || !bitem) +	//			return false; +	//		S32 a_sort = aitem->getSortField(); +	//		S32 b_sort = bitem->getSortField(); +	//		return a_sort < b_sort; +	//	} +	//}  	// We sort by name if we aren't sorting by date  	// OR if these are folders and we are sorting folders by name. @@ -2645,7 +2585,7 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,  	if (by_name)  	{ -		S32 compare = LLStringUtil::compareDict(a->getLabel(), b->getLabel()); +		S32 compare = LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName());  		if (0 == compare)  		{  			return (a->getCreationDate() > b->getCreationDate()); @@ -2661,7 +2601,7 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,  		time_t second_create = b->getCreationDate();  		if (first_create == second_create)  		{ -			return (LLStringUtil::compareDict(a->getLabel(), b->getLabel()) < 0); +			return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0);  		}  		else  		{ diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index b7588223da..7bcc9dd0a2 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -31,11 +31,10 @@  #include "lluiimage.h"  class LLFolderView; -class LLFolderViewModelItemInventory; +class LLFolderViewModelItem;  class LLFolderViewFolder;  class LLFolderViewFunctor; -class LLInventoryFilter; -class LLViewerInventoryItem; +class LLFolderViewFilter;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLFolderViewItem @@ -57,8 +56,8 @@ public:  													icon_overlay,  // for links  													folder_arrow_image,  													selection_image; -		Optional<LLFolderView*>					root; -		Mandatory<LLFolderViewModelItemInventory*>	listener; +		Optional<LLFolderView*>						root; +		Mandatory<LLFolderViewModelItem*>			listener;  		Optional<S32>								folder_indentation, // pixels  													item_height, @@ -98,7 +97,7 @@ protected:  	S32							mLabelWidth;  	bool						mLabelWidthDirty;  	LLFolderViewFolder*			mParentFolder; -	LLFolderViewModelItemInventory*	mListener; +	LLFolderViewModelItem*		mListener;  	BOOL						mIsCurSelection;  	BOOL						mSelectPending;  	LLFontGL::StyleFlags		mLabelStyle; @@ -112,7 +111,8 @@ protected:  	S32							mItemHeight;  	BOOL						mPassedFilter;  	S32							mLastFilterGeneration; -	std::string::size_type		mStringMatchOffset; +	//TODO RN: create interface for string highlighting +	//std::string::size_type		mStringMatchOffset;  	F32							mControlLabelRotation;  	LLFolderView*				mRoot;  	BOOL						mDragAndDropTarget; @@ -159,8 +159,8 @@ public:  	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );  	virtual S32 getItemHeight(); -	// applies filters to control visibility of inventory items -	virtual void filter( LLInventoryFilter& filter); +	// applies filters to control visibility of items +	virtual void filter( LLFolderViewFilter& filter);  	// updates filter serial number and optionally propagated value up to root  	S32		getLastFilterGeneration() { return mLastFilterGeneration; } @@ -230,8 +230,8 @@ public:  	LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );  	LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE ); -	const LLFolderViewModelItemInventory* getListener( void ) const { return mListener; } -	LLFolderViewModelItemInventory* getListener( void ) { return mListener; } +	const LLFolderViewModelItem* getViewModelItem( void ) const { return mListener; } +	LLFolderViewModelItem* getViewModelItem( void ) { return mListener; }  	// just rename the object.  	void rename(const std::string& new_name); @@ -277,41 +277,10 @@ public:  		EAcceptance* accept,  		std::string& tooltip_msg); -	// Gets the inventory item if it exists (null otherwise) -	LLViewerInventoryItem * getInventoryItem(void); -	// open -	virtual void preview(void); -  private:  	static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts  }; -class LLInventorySort -{ -public: -	LLInventorySort(U32 order) -	:	mSortOrder(0), -		mByDate(false), -		mSystemToTop(false), -		mFoldersByName(false) -	{ -		mSortOrder = order; -		mByDate = (order & LLInventoryFilter::SO_DATE); -		mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); -		mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME); -	} - -	bool isByDate() { return mByDate; } -	U32 getSortOrder() { return mSortOrder; } - -	bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b); -private: -	U32  mSortOrder; -	bool mByDate; -	bool mSystemToTop; -	bool mFoldersByName; -}; -  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLFolderViewFolder  // @@ -379,8 +348,8 @@ public:  	BOOL hasFilteredDescendants(S32 filter_generation);  	BOOL hasFilteredDescendants(); -	// applies filters to control visibility of inventory items -	virtual void filter( LLInventoryFilter& filter); +	// applies filters to control visibility of items +	virtual void filter( LLFolderViewFilter& filter);  	virtual void setFiltered(BOOL filtered, S32 filter_generation);  	virtual BOOL getFiltered();  	virtual BOOL getFiltered(S32 filter_generation); @@ -388,7 +357,7 @@ public:  	virtual void dirtyFilter();  	// folder-specific filtering (filter status propagates top down instead of bottom up) -	void filterFolder(LLInventoryFilter& filter); +	void filterFolder(LLFolderViewFilter& filter);  	void setFilteredFolder(bool filtered, S32 filter_generation);  	bool getFilteredFolder(S32 filter_generation); @@ -496,12 +465,12 @@ public:  	virtual void draw(); -	folders_t::iterator getFoldersBegin() const { return mFolders.begin(); } -	folders_t::iterator getFoldersEnd() const { return mFolders.end(); } +	folders_t::iterator getFoldersBegin() { return mFolders.begin(); } +	folders_t::iterator getFoldersEnd() { return mFolders.end(); }  	folders_t::size_type getFoldersCount() const { return mFolders.size(); } -	items_t::iterator getItemsBegin() const { return mItems.begin(); } -	items_t::iterator getItemsEnd() const { return mItems.end(); } +	items_t::const_iterator getItemsBegin() const { return mItems.begin(); } +	items_t::const_iterator getItemsEnd() const { return mItems.end(); }  	items_t::size_type getItemsCount() const { return mItems.size(); }  	LLFolderViewFolder* getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfolderviewmodel.h index 76e051d12f..b81a81f837 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfolderviewmodel.h @@ -1,5 +1,5 @@  /**  - * @file llfoldervieweventlistener.h + * @file llfolderviewmodel.h   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code @@ -28,6 +28,7 @@  #include "lldarray.h"	// *TODO: convert to std::vector  #include "llfoldertype.h"  #include "llfontgl.h"	// just for StyleFlags enum +#include "llfolderviewitem.h"  #include "llinventorytype.h"  #include "llpermissionsflags.h"  #include "llpointer.h" @@ -55,6 +56,16 @@ class LLFolderViewFolder;  class LLFolderViewFilter  {  public: +	enum EFilterBehavior +	{ +		FILTER_NONE,				// nothing to do, already filtered +		FILTER_RESTART,				// restart filtering from scratch +		FILTER_LESS_RESTRICTIVE,	// existing filtered items will certainly pass this filter +		FILTER_MORE_RESTRICTIVE		// if you didn't pass the previous filter, you definitely won't pass this one +	}; + +public: +  	LLFolderViewFilter() {}  	virtual ~LLFolderViewFilter() {} @@ -69,6 +80,8 @@ public:  	virtual void 				setEmptyLookupMessage(const std::string& message) = 0;  	const virtual std::string&	getEmptyLookupMessage() const = 0; +	virtual bool				showAllResults() const = 0; +  	// +-------------------------------------------------------------------+  	// + Status  	// +-------------------------------------------------------------------+ @@ -91,7 +104,8 @@ public:  	// +-------------------------------------------------------------------+  	// + Default  	// +-------------------------------------------------------------------+ -	virtual BOOL 				isNotDefault() const = 0; +	virtual bool 				isDefault() const = 0; +	virtual bool 				isNotDefault() const = 0;  	virtual void 				markDefault() = 0;  	virtual void 				resetDefault() = 0; @@ -103,8 +117,9 @@ public:  	virtual S32 				getFirstRequiredGeneration() const = 0;  }; -struct LLFolderViewModelInterface +class LLFolderViewModelInterface  { +public:  	virtual void requestSortAll() = 0;  	virtual void requestSort(class LLFolderViewFolder*) = 0; @@ -130,15 +145,11 @@ struct LLFolderViewModelCommon : public LLFolderViewModelInterface  	}  protected: -	bool needsSort(class LLFolderViewModelItem* item) -	{ -		return item->getSortVersion() < mTargetSortVersion; -	} +	bool needsSort(class LLFolderViewModelItem* item);  	S32 mTargetSortVersion;  }; -  // 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 @@ -185,6 +196,8 @@ public:  	virtual LLToolDragAndDrop::ESource getDragSource() const = 0;  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0; +	virtual bool hasChildren() const = 0; +  	// This method will be called to determine if a drop can be  	// performed, and will set drop to TRUE if a drop is  	// requested. Returns TRUE if a drop is possible/happened, @@ -208,7 +221,7 @@ public:  	void requestSort() { mSortVersion = -1; }  	S32 getSortVersion() { return mSortVersion; } -	void setSortVersion(S32 version) { mSortVersion = VERSION;} +	void setSortVersion(S32 version) { mSortVersion = version;}  protected:  	S32 mSortVersion; @@ -219,6 +232,7 @@ class LLFolderViewModel : public LLFolderViewModelCommon  {  protected:  	LLFolderViewModel() {} +	virtual ~LLFolderViewModel() {}  	typedef SORT_TYPE		SortType;  	typedef ITEM_TYPE		ItemType; @@ -226,13 +240,13 @@ protected:  	typedef FILTER_TYPE		FilterType;  	virtual const SortType& getSorter() const 		 { return mSorter; } -	virtual void setSorter(const SortType& type) 	 { mSorter = sorter; requestSortAll(); } -	virtual FilterType& getFilter() const 			 { return mFilter; } +	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); } +	virtual FilterType& getFilter()					 { return mFilter; }  	virtual void setFilter(const FilterType& filter) { mFilter = filter; }  public: -	struct ViewModelCompare() +	struct ViewModelCompare  	{  		ViewModelCompare(const SortType& sorter)  		:	mSorter(sorter) @@ -240,46 +254,47 @@ public:  		int operator () (const LLFolderViewItem* a, const LLFolderViewItem* b)  		{ -			return mSorter(static_cast<const ItemType*>(a->getListener()), static_cast<const ItemType*>(b->getListener())); +			return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));  		}  		int operator () (const LLFolderViewFolder* a, const LLFolderViewFolder* b)  		{ -			return mSorter(static_cast<const ItemType*>(a->getListener()), static_cast<const ItemType*>(b->getListener())); +			return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));  		}  		const SortType& mSorter; -	} +	};  	void sort(LLFolderViewFolder* folder)  	{ -		if (needsSort(folder)) +		if (needsSort(folder->getViewModelItem()))  		{  			std::sort(folder->getFoldersBegin(), folder->getFoldersEnd(), ViewModelCompare(getSorter()));  			std::sort(folder->getItemsBegin(), folder->getItemsEnd(), ViewModelCompare(getSorter())); -			folder->getListener()->setSortVersion(mTargetSortVersion); +			folder->getViewModelItem()->setSortVersion(mTargetSortVersion);  			folder->requestArrange();  		}  	} +	//TODO RN: fix this  	void filter(LLFolderViewFolder* folder)  	{ -		FilterType& filter = getFilter(); -		for (std::list<LLFolderViewItem*>::iterator it = folder->getItemsBegin(), end_it = folder->getItemsEnd(); +		/*FilterType& filter = getFilter(); +		for (std::list<LLFolderViewItem*>::const_iterator it = folder->getItemsBegin(), end_it = folder->getItemsEnd();  			it != end_it;  			++it)  		{  			LLFolderViewItem* child_item = *it; -			child_item->setFiltered(filter(static_cast<ItemType*>(child_item->getListener())), filter.getCurrentGeneration()) +			child_item->setFiltered(filter.checkFolder(static_cast<ItemType*>(child_item->getViewModelItem())), filter.getCurrentGeneration());  		} -		for (std::list<LLFolderViewFolder*>::iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd(); +		for (std::list<LLFolderViewFolder*>::const_iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd();  			it != end_it;  			++it)  		{  			LLFolderViewItem* child_folder = *it; -			child_folder->setFiltered(filter(static_cast<ItemType*>(child_folder->getListener())), filter.getCurrentGeneration()) -		} +			child_folder->setFiltered(filter.check(static_cast<ItemType*>(child_folder->getViewModelItem())), filter.getCurrentGeneration()); +		}*/  	}  protected: @@ -288,6 +303,10 @@ protected:  }; +bool LLFolderViewModelCommon::needsSort(class LLFolderViewModelItem* item) +{ +	return item->getSortVersion() < mTargetSortVersion; +} diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d0d2215361..b51bbf7bfe 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -208,7 +208,11 @@ const std::string& LLInvFVBridge::getName() const  const std::string& LLInvFVBridge::getDisplayName() const  { -	return getName(); +	if(mDisplayName.empty()) +	{ +		buildDisplayName(); +	} +	return mDisplayName;  }  // Folders have full perms @@ -1292,7 +1296,7 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const  				void * cargo_data = (void *) obj;  				std::string tooltip_msg; -				can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg); +				can_list = outbox_itemp->getViewModelItem()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);  			}  		}  	} @@ -1407,7 +1411,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		LLFolderViewItem* folder_view_itemp =   mInventoryPanel.get()->getItemByID(itemp->getParentUUID());  		if (!folder_view_itemp) return; -		folder_view_itemp->getListener()->pasteFromClipboard(); +		folder_view_itemp->getViewModelItem()->pasteFromClipboard();  		return;  	}  	else if ("paste_link" == action) @@ -1419,7 +1423,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		LLFolderViewItem* folder_view_itemp =   mInventoryPanel.get()->getItemByID(itemp->getParentUUID());  		if (!folder_view_itemp) return; -		folder_view_itemp->getListener()->pasteLinkFromClipboard(); +		folder_view_itemp->getViewModelItem()->pasteLinkFromClipboard();  		return;  	}  	else if (isMarketplaceCopyAction(action)) @@ -1530,24 +1534,15 @@ PermissionMask LLItemBridge::getPermissionMask() const  	return perm_mask;  } -const std::string& LLItemBridge::getDisplayName() const +void LLItemBridge::buildDisplayName()  { -	if(mDisplayName.empty()) +	if(getItem())  	{ -		buildDisplayName(getItem(), mDisplayName); -	} -	return mDisplayName; -} - -void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) -{ -	if(item) -	{ -		name.assign(item->getName()); +		mDisplayName.assign(getItem()->getName());  	}  	else  	{ -		name.assign(LLStringUtil::null); +		mDisplayName.assign(LLStringUtil::null);  	}  } @@ -1665,11 +1660,11 @@ BOOL LLItemBridge::renameItem(const std::string& new_name)  	{  		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);  		new_item->rename(new_name); -		buildDisplayName(new_item, mDisplayName);  		new_item->updateServer(FALSE);  		model->updateItem(new_item);  		model->notifyObservers(); +		buildDisplayName();  	}  	// return FALSE because we either notified observers (& therefore  	// rebuilt) or we didn't update. @@ -1821,9 +1816,37 @@ void LLFolderBridge::selectItem()  	// Have no fear: the first thing start() does is to test if everything for that folder has been fetched...  	LLInventoryModelBackgroundFetch::instance().start(getUUID(), true);  } -std::string& LLFolderBridge::getDisplayName() const + +void LLFolderBridge::buildDisplayName()  { -	return mDisplayName; +	LLFolderType::EType preferred_type = getPreferredType(); + +	// *TODO: to be removed when database supports multi language. This is a +	// temporary attempt to display the inventory folder in the user locale. +	// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID +	//		it uses the same way to find localized string + +	// HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder) +	// Translation of Accessories folder in Library inventory folder +	bool accessories = false; +	if(getName() == "Accessories") +	{ +		//To ensure that Accessories folder is in Library we have to check its parent folder. +		//Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model +		LLInventoryCategory* cat = gInventory.getCategory(getUUID()); +		if(cat) +		{ +			const LLUUID& parent_folder_id = cat->getParentUUID(); +			accessories = (parent_folder_id == gInventory.getLibraryRootFolderID()); +		} +	} + +	//"Accessories" inventory category has folder type FT_NONE. So, this folder +	//can not be detected as protected with LLFolderType::lookupIsProtectedType +	if (accessories || LLFolderType::lookupIsProtectedType(preferred_type)) +	{ +		LLTrans::findString(mDisplayName, "InvFolder " + getName()); +	};  } @@ -1884,11 +1907,11 @@ public:  	LLIsItemRemovable() : mPassed(TRUE) {}  	virtual void doFolder(LLFolderViewFolder* folder)  	{ -		mPassed &= folder->getListener()->isItemRemovable(); +		mPassed &= folder->getViewModelItem()->isItemRemovable();  	}  	virtual void doItem(LLFolderViewItem* item)  	{ -		mPassed &= item->getListener()->isItemRemovable(); +		mPassed &= item->getViewModelItem()->isItemRemovable();  	}  	BOOL mPassed;  }; @@ -3084,7 +3107,7 @@ void LLFolderBridge::pasteFromClipboard()  						void * cargo_data = (void *) item;  						std::string tooltip_msg; -						can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg); +						can_list = outbox_itemp->getViewModelItem()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);  					}  				} @@ -3494,6 +3517,11 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  {  	sSelf.markDead(); +	// fetch contents of this folder, as context menu can depend on contents +	// still, user would have to open context menu again to see the changes +	gInventory.fetchDescendentsOf(getUUID()); + +  	menuentry_vec_t items;  	menuentry_vec_t disabled_items; @@ -3510,7 +3538,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	menu.arrangeAndClear();  } -BOOL LLFolderBridge::hasChildren() const +bool LLFolderBridge::hasChildren() const  {  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE; @@ -3802,9 +3830,9 @@ void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)  	LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback();  	LLInventoryPanel* panel = mInventoryPanel.get();  	LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; -	if (drag_over_item && drag_over_item->getListener()) +	if (drag_over_item && drag_over_item->getViewModelItem())  	{ -		cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID()); +		cb.get()->setTargetLandmarkId(drag_over_item->getViewModelItem()->getUUID());  	}  	copy_inventory_item( @@ -4004,7 +4032,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				if (itemp)  				{  					LLUUID srcItemId = inv_item->getUUID(); -					LLUUID destItemId = itemp->getListener()->getUUID(); +					LLUUID destItemId = itemp->getViewModelItem()->getUUID();  					gInventory.rearrangeFavoriteLandmarks(srcItemId, destItemId);  				}  			} @@ -4394,15 +4422,6 @@ void LLSoundBridge::openItem()  	}  } -void LLSoundBridge::previewItem() -{ -	LLViewerInventoryItem* item = getItem(); -	if(item) -	{ -		send_sound_trigger(item->getAssetUUID(), 1.0); -	} -} -  void LLSoundBridge::openSoundPreview(void* which)  {  	LLSoundBridge *me = (LLSoundBridge *)which; @@ -5409,11 +5428,10 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name)  	{  		LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);  		new_item->rename(new_name); -		buildDisplayName(new_item, mDisplayName);  		new_item->updateServer(FALSE);  		model->updateItem(new_item); -  		model->notifyObservers(); +		buildDisplayName();  		if (isAgentAvatarValid())  		{ @@ -6013,16 +6031,6 @@ void LLMeshBridge::openItem()  	}  } -void LLMeshBridge::previewItem() -{ -	LLViewerInventoryItem* item = getItem(); -	if(item) -	{ -		// preview mesh -	} -} - -  void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  {  	lldebugs << "LLMeshBridge::buildContextMenu()" << llendl; diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 114144c8a4..bc5ac24c70 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -29,7 +29,7 @@  #include "llcallingcard.h"  #include "llfloaterproperties.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h"  #include "llinventorypanel.h" @@ -96,7 +96,6 @@ public:  	virtual std::string getLabelSuffix() const { return LLStringUtil::null; }  	virtual void openItem() {}  	virtual void closeItem() {} -	virtual void previewItem() {openItem();}  	virtual void showProperties();  	virtual BOOL isItemRenameable() const { return TRUE; }  	//virtual BOOL renameItem(const std::string& new_name) {} @@ -126,6 +125,8 @@ public:  	virtual LLInventoryType::EType getInventoryType() const { return mInvType; }  	virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }          EInventorySortGroup getSortGroup()  const { return SG_ITEM; } +	virtual LLInventoryObject* getInventoryObject() const; +  	//--------------------------------------------------------------------  	// Convenience functions for adding various common menu options. @@ -142,7 +143,6 @@ protected:  protected:  	LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid); -	LLInventoryObject* getInventoryObject() const;  	LLInventoryModel* getInventoryModel() const;  	LLInventoryFilter* getInventoryFilter() const; @@ -167,13 +167,16 @@ protected:  									 BOOL restamp);  	void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch);  protected: -	LLHandle<LLInventoryPanel> mInventoryPanel; -	LLFolderView* mRoot; -	const LLUUID mUUID;	// item id -	LLInventoryType::EType mInvType; +	LLHandle<LLInventoryPanel>	mInventoryPanel; +	LLFolderView*				mRoot; +	const LLUUID				mUUID;	// item id +	LLInventoryType::EType		mInvType;  	bool						mIsLink;  	LLTimer						mTimeSinceRequestStart; +	mutable std::string			mDisplayName; +  	void purgeItem(LLInventoryModel *model, const LLUUID &uuid); +	virtual void buildDisplayName();  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -209,7 +212,6 @@ public:  	virtual void restoreToWorld();  	virtual void gotoItem();  	virtual LLUIImagePtr getIcon() const; -	virtual const std::string& getDisplayName() const;  	virtual std::string getLabelSuffix() const;  	virtual LLFontGL::StyleFlags getLabelStyle() const;  	virtual PermissionMask getPermissionMask() const; @@ -218,7 +220,7 @@ public:  	virtual BOOL renameItem(const std::string& new_name);  	virtual BOOL removeItem();  	virtual BOOL isItemCopyable() const; -	virtual BOOL hasChildren() const { return FALSE; } +	virtual bool hasChildren() const { return FALSE; }  	virtual BOOL isUpToDate() const { return TRUE; }  	/*virtual*/ void clearDisplayName() { mDisplayName.clear(); } @@ -228,9 +230,8 @@ public:  protected:  	BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);  	virtual BOOL isItemPermissive() const; -	static void buildDisplayName(LLInventoryItem* item, std::string& name); +	virtual void buildDisplayName(); -	mutable std::string mDisplayName;  };  class LLFolderBridge : public LLInvFVBridge @@ -248,7 +249,7 @@ public:  	BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg);  	BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg); -        const std::string& getDisplayName() const; +    virtual void buildDisplayName();  	virtual void performAction(LLInventoryModel* model, std::string action);  	virtual void openItem(); @@ -271,7 +272,7 @@ public:  	virtual void pasteFromClipboard();  	virtual void pasteLinkFromClipboard();  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags); -	virtual BOOL hasChildren() const; +	virtual bool hasChildren() const;  	virtual BOOL dragOrDrop(MASK mask, BOOL drop,  							EDragAndDropType cargo_type,  							void* cargo_data, @@ -331,6 +332,7 @@ public:  	static void staticFolderOptionsMenu();  private: +  	bool							mCallingCards;  	bool							mWearables;  	bool							mIsLoading; @@ -365,7 +367,6 @@ public:  				  const LLUUID& uuid) :  		LLItemBridge(inventory, root, uuid) {}  	virtual void openItem(); -	virtual void previewItem();  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);  	static void openSoundPreview(void*);  }; @@ -555,7 +556,6 @@ class LLMeshBridge : public LLItemBridge  public:  	virtual LLUIImagePtr getIcon() const;  	virtual void openItem(); -	virtual void previewItem();  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);  protected: diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 5de3f0cb4e..1d25a7a1f9 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -29,7 +29,7 @@  #include "llinventoryfilter.h"  // viewer includes -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llfolderviewitem.h"  #include "llinventorymodel.h"  #include "llinventorymodelbackgroundfetch.h" @@ -92,7 +92,7 @@ LLInventoryFilter::~LLInventoryFilter()  BOOL LLInventoryFilter::check(const LLFolderViewItem* item)   {  	// Clipboard cut items are *always* filtered so we need this value upfront -	const LLFolderViewEventListener* listener = item->getListener(); +	const LLFolderViewEventListener* listener = item->getViewModelItem();  	const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);  	// If it's a folder and we're showing all folders, return automatically. @@ -140,7 +140,7 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const  		return false;  	} -	const LLFolderViewModelItemInventory* listener = folder->getListener(); +	const LLFolderViewModelItemInventory* listener = folder->getViewModelItem();  	if (!listener)  	{  		llwarns << "Folder view event listener not found." << llendl; @@ -155,6 +155,13 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const  bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  { +	// when applying a filter, matching folders get their contents downloaded first +	if (isNotDefault() +		&& !gInventory.isCategoryComplete(getUUID()))) +	{ +		LLInventoryModelBackgroundFetch::instance().start(getViewModelItem()->getUUID()); +	} +  	// Always check against the clipboard  	const BOOL passed_clipboard = checkAgainstClipboard(folder_id); @@ -181,7 +188,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const  { -	const LLFolderViewModelItemInventory* listener = item->getListener(); +	const LLFolderViewModelItemInventory* listener = item->getViewModelItem();  	if (!listener) return FALSE;  	LLInventoryType::EType object_type = listener->getInventoryType(); @@ -349,11 +356,11 @@ bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const  BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const  { -	const LLFolderViewModelItemInventory* listener = item->getListener(); +	const LLFolderViewModelItemInventory* listener = item->getViewModelItem();  	if (!listener) return FALSE;  	PermissionMask perm = listener->getPermissionMask(); -	const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getListener()); +	const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getViewModelItem());  	if (bridge && bridge->isLink())  	{  		const LLUUID& linked_uuid = gInventory.getLinkedItemID(bridge->getUUID()); @@ -377,7 +384,7 @@ bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) con  BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const  { -	const LLFolderViewModelItemInventory* listener = item->getListener(); +	const LLFolderViewModelItemInventory* listener = item->getViewModelItem();  	if (!listener) return TRUE;  	const LLUUID object_id = listener->getUUID(); @@ -408,9 +415,9 @@ BOOL LLInventoryFilter::isDefault() const  }  // has user modified default filter params? -BOOL LLInventoryFilter::isNotDefault() const +bool LLInventoryFilter::isNotDefault() const  { -	BOOL not_default = FALSE; +	bool not_default = FALSE;  	not_default |= (mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes);  	not_default |= (mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes); @@ -1125,6 +1132,12 @@ LLInventoryFilter& LLInventoryFilter::operator=( const  LLInventoryFilter&  othe  	fromParams(other.toParams());  } +bool LLInventoryFilter::showAllResults() const +{ +	return hasFilterString(); +} + +  bool LLInventoryFilter::FilterOps::DateRange::validateBlock( bool   emit_errors /*= true*/ )  { diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 4434008958..746e9a2820 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -29,6 +29,7 @@  #include "llinventorytype.h"  #include "llpermissionsflags.h" +#include "llfolderviewmodel.h"  class LLFolderViewItem;  class LLFolderViewFolder; @@ -44,14 +45,6 @@ public:  		SHOW_NO_FOLDERS  	}; -	enum EFilterBehavior -	{ -		FILTER_NONE,				// nothing to do, already filtered -		FILTER_RESTART,				// restart filtering from scratch -		FILTER_LESS_RESTRICTIVE,	// existing filtered items will certainly pass this filter -		FILTER_MORE_RESTRICTIVE		// if you didn't pass the previous filter, you definitely won't pass this one -	}; -  	enum EFilterType	{  		FILTERTYPE_NONE = 0,  		FILTERTYPE_OBJECT = 0x1 << 0,	// normal default search-by-object-type @@ -89,7 +82,7 @@ public:  				max_date("max_date", time_max())  			{} -			bool validateBlock(bool emit_errors = true); +			bool validateBlock(bool emit_errors = true) const;  		};  		struct Params : public LLInitParam::Block<Params> @@ -200,6 +193,9 @@ public:  	bool 				checkAgainstFilterLinks(const LLFolderViewItem* item) const;  	bool				checkAgainstClipboard(const LLUUID& object_id) const; +	bool				showAllResults() const; + +  	std::string::size_type getStringMatchOffset() const;  	std::string::size_type getStringMatchOffset(LLFolderViewItem* item)   const; @@ -262,24 +258,6 @@ public:  private:  	bool				areDateLimitsSet(); -	struct FilterOps -	{ -		FilterOps(); -		U32 			mFilterTypes; - -		U64				mFilterObjectTypes; // For _OBJECT -		U64				mFilterWearableTypes; -		U64				mFilterCategoryTypes; // For _CATEGORY -		LLUUID      	mFilterUUID; // for UUID - -		time_t			mMinDate; -		time_t			mMaxDate; -		U32				mHoursAgo; -		EFolderShow		mShowFolderState; -		PermissionMask	mPermissions; -		U64				mFilterLinks; -	}; -  	U32						mOrder;  	U32 					mLastLogoff; @@ -287,7 +265,6 @@ private:  	FilterOps				mFilterOps;  	FilterOps				mDefaultFilterOps; -	std::string::size_type	mSubStringMatchOffset;  	std::string				mFilterSubString;  	std::string				mFilterSubStringOrig;  	const std::string		mName; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index ab5b082915..1e494c3ef1 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -948,7 +948,7 @@ void LLSaveFolderState::setApply(BOOL apply)  void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)  {  	LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER); -	LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); +	LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getViewModelItem();  	if(!bridge) return;  	if(mApply) diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d60b819da8..401daf6353 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -59,7 +59,7 @@ static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;  //  // class LLFolderViewModelInventory  // -void LLFolderViewModelInventory::requestSort(class LLFolderViewFolder*   folder) +void LLFolderViewModelInventory::requestSort(class LLFolderViewFolder* folder)  {  	base_t::requestSort(folder);  	if (getSorter().isByDate()) @@ -78,7 +78,7 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )  	if (!needsSort(folder)) return; -	LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(folder->getListener()); +	LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem());  	if (modelp->getUUID().isNull()) return;  	for (std::list<LLFolderViewFolder*>::iterator it =   folder->getFoldersBegin(), end_it = folder->getFoldersEnd(); @@ -91,8 +91,8 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )  		if (child_folderp->getFoldersCount() > 0)  		{  			time_t most_recent_folder_time = -				static_cast<LLFolderViewModelItemInventory*>(child_folderp->getFoldersBegin()->getListener())->getCreationDate(); -			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getListener()); +				static_cast<LLFolderViewModelItemInventory*>(child_folderp->getFoldersBegin()->getViewModelItem())->getCreationDate(); +			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());  			if (most_recent_folder_time > modelp->getCreationDate())  			{  				modelp->setCreationDate(most_recent_folder_time); @@ -101,9 +101,9 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )  		if (child_folderp->getItemsCount() > 0)			  		{  			time_t most_recent_item_time = -				static_cast<LLFolderViewModelItemInventory*>(child_folderp->getItemsBegin()->getListener())->getCreationDate(); +				static_cast<LLFolderViewModelItemInventory*>(child_folderp->getItemsBegin()->getViewModelItem())->getCreationDate(); -			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getListener()); +			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem());  			if (most_recent_item_time > modelp->getCreationDate())  			{  				modelp->setCreationDate(most_recent_item_time); @@ -474,7 +474,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  			if (view_item)  			{  				// Request refresh on this item (also flags for filtering) -				LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getListener(); +				LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();  				if(bridge)  				{	// Clear the display name first, so it gets properly re-built during refresh()  					bridge->clearDisplayName(); @@ -493,7 +493,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  			if (model_item && view_item)  			{  				view_item->destroyView(); -                                removeItemID(view_item->getListener()->getUUID()); +                                removeItemID(view_item->getViewModelItem()->getUUID());  			}  			view_item = buildNewViews(item_id);  			view_folder = dynamic_cast<LLFolderViewFolder *>(view_item); @@ -563,14 +563,14 @@ void LLInventoryPanel::modelChanged(U32 mask)  							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.  							view_item->getParentFolder()->extractItem(view_item);  							view_item->addToFolder(new_parent); -							addItemID(view_item->getListener()->getUUID(), view_item); +							addItemID(view_item->getViewModelItem()->getUUID(), view_item);  						}  						else   						{  							// Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that   							// doesn't include trash).  Just remove the item's UI.  							view_item->destroyView(); -                                                        removeItemID(view_item->getListener()->getUUID()); +                                                        removeItemID(view_item->getViewModelItem()->getUUID());  						}  					}  				} @@ -583,7 +583,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  			{  				// Remove the item's UI.  				view_item->destroyView(); -                                removeItemID(view_item->getListener()->getUUID()); +                                removeItemID(view_item->getViewModelItem()->getUUID());  			}  		}  	} @@ -615,7 +615,7 @@ void LLInventoryPanel::onIdle(void *userdata)  const LLUUID& LLInventoryPanel::getRootFolderID() const  { -	return mFolderRoot->getListener()->getUUID(); +	return mFolderRoot->getViewModelItem()->getUUID();  }  void LLInventoryPanel::initializeViews() @@ -654,7 +654,7 @@ LLFolderViewItem* LLInventoryPanel::rebuildViewsFor(const LLUUID& id)  	if (old_view)  	{  		old_view->destroyView(); -                removeItemID(old_view->getListener()->getUUID()); +                removeItemID(old_view->getViewModelItem()->getUUID());  	}  	return buildNewViews(id); @@ -727,7 +727,7 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge  LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)  {   	LLInventoryObject const* objectp = gInventory.getObject(id); - 	LLUUID root_id = mFolderRoot->getListener()->getUUID(); + 	LLUUID root_id = mFolderRoot->getViewModelItem()->getUUID();   	LLFolderViewFolder* parent_folder = NULL;  	LLFolderViewItem* itemp = NULL; @@ -786,7 +786,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)    			if (itemp)    			{    				itemp->addToFolder(parent_folder); -				addItemID(itemp->getListener()->getUUID(), itemp); +				addItemID(itemp->getViewModelItem()->getUUID(), itemp);     			}  		}  	} @@ -836,8 +836,8 @@ void LLInventoryPanel::openStartFolderOrMyInventory()  	{  		LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);  		if (fchild -			&& fchild->getListener() -				&& fchild->getListener()->getUUID() == gInventory.getRootFolderID()) +			&& fchild->getViewModelItem() +				&& fchild->getViewModelItem()->getUUID() == gInventory.getRootFolderID())  		{  			fchild->setOpen(TRUE);  			break; @@ -854,7 +854,7 @@ void LLInventoryPanel::openSelected()  {  	LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem();  	if(!folder_item) return; -	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); +	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem();  	if(!bridge) return;  	bridge->openItem();  } @@ -980,7 +980,7 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it  	mCompletionObserver->reset();  	for (std::deque<LLFolderViewItem*>::const_iterator it = items.begin(); it != items.end(); ++it)  	{ -		LLUUID id = (*it)->getListener()->getUUID(); +		LLUUID id = (*it)->getViewModelItem()->getUUID();  		LLViewerInventoryItem* inv_item = mInventory->getItem(id);  		if (inv_item && !inv_item->isFinished()) @@ -1028,11 +1028,11 @@ bool LLInventoryPanel::beginIMSession()  		if(folder_item)   		{ -			LLFolderViewEventListener* fve_listener = folder_item->getListener(); +			LLFolderViewEventListener* fve_listener = folder_item->getViewModelItem();  			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))  			{ -				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); +				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getViewModelItem();  				if(!bridge) return true;  				LLViewerInventoryCategory* cat = bridge->getCategory();  				if(!cat) return true; @@ -1066,7 +1066,7 @@ bool LLInventoryPanel::beginIMSession()  			}  			else  			{ -				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); +				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getViewModelItem();  				if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)  				{ @@ -1113,7 +1113,7 @@ bool LLInventoryPanel::attachObject(const LLSD& userdata)  		 set_iter != selected_items.end();   		 ++set_iter)  	{ -		items.push_back((*set_iter)->getListener()->getUUID()); +		items.push_back((*set_iter)->getItemViewModel()->getUUID());  	}  	// Attach selected items. @@ -1292,7 +1292,7 @@ LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");  LLFolderViewItem* LLInventoryPanel::getItemByID(const LLUUID& id)  {  	LLFastTimer _(FTM_GET_ITEM_BY_ID); -	if (id == mFolderRoot->getListener()->getUUID()) +	if (id == mFolderRoot->getViewModelItem()->getUUID())  	{  		return mFolderRoot;  	} @@ -1317,7 +1317,7 @@ LLFolderViewFolder* LLInventoryPanel::getFolderByID(const LLUUID& id)  void LLInventoryPanel::setSelectionByID( const LLUUID& obj_id, BOOL    take_keyboard_focus )  {  	LLFolderViewItem* itemp = getItemByID(obj_id); -	if(itemp && itemp->getListener()) +	if(itemp && itemp->getViewModelItem())  	{  		itemp->arrangeAndSet(TRUE, take_keyboard_focus);  		mSelectThisID.setNull(); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 7cf82bf268..467c508aa0 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -39,25 +39,58 @@  #include "lluictrlfactory.h"  #include <set> -class LLFolderView; -class LLFolderViewFolder; -class LLFolderViewItem; -class LLInventoryFilter; -class LLInventoryModel;  class LLInvFVBridge;  class LLInventoryFVBridgeBuilder; -class LLMenuBarGL; -class LLCheckBoxCtrl; -class LLSpinCtrl; -class LLTextBox; -class LLIconCtrl; -class LLSaveFolderState; -class LLFilterEditor; -class LLTabContainer;  class LLInvPanelComplObserver; +class LLFolderViewModelItemInventory +	:	public LLFolderViewModelItemCommon +{ +public: +	virtual const LLUUID& getUUID() const = 0; +	virtual time_t getCreationDate() const = 0;	// UTC seconds +	virtual void setCreationDate(time_t creation_date_utc) = 0; +	virtual PermissionMask getPermissionMask() const = 0; +	virtual LLFolderType::EType getPreferredType() const = 0; +	virtual void showProperties(void) = 0; +	virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make   into pure virtual. +	virtual BOOL isUpToDate() const = 0; +	virtual bool hasChildren() const = 0; +	virtual LLInventoryType::EType getInventoryType() const = 0; +	virtual void performAction(LLInventoryModel* model, std::string action)   = 0; +	virtual LLWearableType::EType getWearableType() const = 0; +	virtual EInventorySortGroup getSortGroup() const = 0; +	virtual LLInventoryObject* getInventoryObject() const = 0; +}; + +class LLInventorySort +{ +public: +	LLInventorySort(U32 order) +		:	mSortOrder(0), +		mByDate(false), +		mSystemToTop(false), +		mFoldersByName(false) +	{ +		mSortOrder = order; +		mByDate = (order & LLInventoryFilter::SO_DATE); +		mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); +		mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME); +	} + +	bool isByDate() { return mByDate; } +	U32 getSortOrder() { return mSortOrder; } + +	bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b); +private: +	U32  mSortOrder; +	bool mByDate; +	bool mSystemToTop; +	bool mFoldersByName; +}; +  class LLFolderViewModelInventory -:	public LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> +	:	public LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter>  {  	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t; @@ -200,8 +233,8 @@ public:  	void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);  	void updateSelection(); -	LLFolderViewModelInventory* getViewModel() { return &mViewModel; } -	const LLFolderViewModelInventory* getViewModel() const { return   &mViewModel; } +	LLFolderViewModelInventory* getFolderViewModel() { return &mViewModel; } +	const LLFolderViewModelInventory* getFolderViewModel() const { return   &mViewModel; }  protected:  	void openStartFolderOrMyInventory(); // open the first level of inventory @@ -276,25 +309,4 @@ private:  	LLUUID				mStartFolderID;  }; -class LLFolderViewModelItemInventory -	:	public LLFolderViewModelItemCommon -{ -public: -	virtual const LLUUID& getUUID() const = 0; -	virtual time_t getCreationDate() const = 0;	// UTC seconds -	virtual void setCreationDate(time_t creation_date_utc) = 0; -	virtual PermissionMask getPermissionMask() const = 0; -	virtual LLFolderType::EType getPreferredType() const = 0; -	virtual void previewItem( void ) = 0; -	virtual void showProperties(void) = 0; -	virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make   into pure virtual. -	virtual BOOL isUpToDate() const = 0; -	virtual BOOL hasChildren() const = 0; -	virtual LLInventoryType::EType getInventoryType() const = 0; -	virtual void performAction(LLInventoryModel* model, std::string action)   = 0; -	virtual LLWearableType::EType getWearableType() const = 0; -	virtual EInventorySortGroup getSortGroup() const; -	virtual void requestSort(const LLInventorySort& sorter); -}; -  #endif // LL_LLINVENTORYPANEL_H diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 234fa7590d..54ad2bcb76 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -102,7 +102,7 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)  	// Counting only folders that pass the filter.  	// The listener check allow us to avoid counting the folder view  	// object itself because it has no listener assigned. -	if (folder->hasFilteredDescendants() && folder->getListener()) +	if (folder->hasFilteredDescendants() && folder->getViewModelItem())  	{  		if (folder->isOpen())  		{ @@ -138,7 +138,7 @@ private:  // virtual  void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)  { -	if (folder->getListener() && folder->getListener()->getUUID() == mFolderID) +	if (folder->getViewModelItem() && folder->getViewModelItem()->getUUID() == mFolderID)  	{  		if (!folder->isOpen())  		{ @@ -286,7 +286,7 @@ void LLLandmarksPanel::onShowProfile()  	if(!cur_item)  		return; -	cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about"); +	cur_item->getViewModelItem()->performAction(mCurrentSelectedList->getModel(),"about");  }  // virtual @@ -299,7 +299,7 @@ void LLLandmarksPanel::onTeleport()  		return;  	} -	LLFolderViewModelItem* listenerp = current_item->getListener(); +	LLFolderViewModelItem* listenerp = current_item->getViewModelItem();  	if (listenerp && listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{  		listenerp->openItem(); @@ -360,7 +360,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()  	LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem();  	if (!cur_item) return; -	LLFolderViewModelItem* listenerp = cur_item->getListener(); +	LLFolderViewModelItem* listenerp = cur_item->getViewModelItem();  	if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{  		LLSD key; @@ -418,7 +418,7 @@ void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_  bool LLLandmarksPanel::isLandmarkSelected() const   {  	LLFolderViewItem* current_item = getCurSelectedItem(); -	if(current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) +	if(current_item && current_item->getViewModelItem()->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{  		return true;  	} @@ -441,9 +441,9 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const  void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)  {  	LLFolderViewItem* cur_item = getCurSelectedItem(); -	if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) +	if(cur_item && cur_item->getViewModelItem()->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{  -		LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb); +		LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getViewModelItem()->getUUID(), cb);  		if (landmark)  		{  			cb(landmark); @@ -510,7 +510,7 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)  	{  		LLFolderViewItem* cur_item = getCurSelectedItem();  		if (!cur_item) return; -		LLUUID id = cur_item->getListener()->getUUID(); +		LLUUID id = cur_item->getViewModelItem()->getUUID();  		LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);  		doActionOnCurSelectedLandmark(boost::bind(  				&LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data)); @@ -738,7 +738,7 @@ void LLLandmarksPanel::onActionsButtonClick()  		if(!cur_item)  			return; -		LLFolderViewModelItem* listenerp = cur_item->getListener(); +		LLFolderViewModelItem* listenerp = cur_item->getViewModelItem();  		if(!listenerp)  			return; @@ -795,17 +795,17 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const  		if (item && mCurrentSelectedList == mLandmarksInventoryPanel)  		{  			LLFolderViewModelItem* folder_bridge = NULL; -			if (item-> getListener()->getInventoryType() +			if (item-> getViewModelItem()->getInventoryType()  					== LLInventoryType::IT_LANDMARK)  			{  				// for a landmark get parent folder bridge -				folder_bridge = item->getParentFolder()->getListener(); +				folder_bridge = item->getParentFolder()->getViewModelItem();  			} -			else if (item-> getListener()->getInventoryType() +			else if (item-> getViewModelItem()->getInventoryType()  					== LLInventoryType::IT_CATEGORY)  			{  				// for a folder get its own bridge -				folder_bridge = item->getListener(); +				folder_bridge = item->getViewModelItem();  			}  			menu_create_inventory_item(mCurrentSelectedList, @@ -836,7 +836,7 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const  	{      	LLFolderViewItem* cur_item = getCurSelectedItem();  		if(cur_item) -			LLLandmarkActions::copySLURLtoClipboard(cur_item->getListener()->getUUID()); +			LLLandmarkActions::copySLURLtoClipboard(cur_item->getViewModelItem()->getUUID());  	}  	else if ( "paste" == command_name)  	{ @@ -1015,7 +1015,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  			LLFolderViewItem* cur_item = root_folder_view->getCurSelectedItem();  			if (!cur_item) return false; -			LLViewerInventoryItem* inv_item = cur_item->getInventoryItem(); +			LLViewerInventoryItem* inv_item = static_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(cur_item->getViewModelItem())->getInventoryObject());  			if (!inv_item) return false;  			LLUUID asset_uuid = inv_item->getAssetUUID(); @@ -1116,12 +1116,12 @@ void LLLandmarksPanel::onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param)  			// If no item is found it might be a folder id.  			if (!item) continue; -			LLFolderViewModelItem* listenerp = item->getListener(); +			LLFolderViewModelItem* listenerp = item->getViewModelItem();  			if(!listenerp) continue;  			// Trash category itself should not be included because it can't be  			// actually restored from trash. -			are_all_items_in_trash &= listenerp->isItemInTrash() &&    (*iter)->getListener()->getUUID() != trash_id; +			are_all_items_in_trash &= listenerp->isItemInTrash() &&    (*iter)->getItemViewModel()->getUUID() != trash_id;  			// If there are any selected items in Trash including the Trash category itself  			// we show "Restore Item" in context menu and hide other irrelevant items. @@ -1160,7 +1160,7 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold  	bool can_be_modified = false;  	// landmarks can be modified in any other accordion... -	if (item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) +	if (item->getViewModelItem()->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{  		can_be_modified = true; @@ -1198,7 +1198,7 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold  	if (can_be_modified)  	{ -		LLFolderViewModelItemInventory* listenerp = item->getListener(); +		LLFolderViewModelItemInventory* listenerp = item->getViewModelItem();  		if ("cut" == command_name)  		{ diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a7970bde24..fbdbce61bd 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -977,7 +977,7 @@ void LLPanelMainInventory::saveTexture(const LLSD& userdata)  		return;  	} -	const LLUUID& item_id = current_item->getListener()->getUUID(); +	const LLUUID& item_id = current_item->getViewModelItem()->getUUID();  	LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);  	if (preview_texture)  	{ @@ -1050,7 +1050,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		{  			return;  		} -		const LLUUID item_id = current_item->getListener()->getUUID(); +		const LLUUID item_id = current_item->getViewModelItem()->getUUID();  		LLViewerInventoryItem *item = gInventory.getItem(item_id);  		if (item)  		{ @@ -1065,7 +1065,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		{  			return;  		} -		current_item->getListener()->performAction(getActivePanel()->getModel(), "goto"); +		current_item->getViewModelItem()->performAction(getActivePanel()->getModel(), "goto");  	}  	if (command_name == "find_links") @@ -1075,8 +1075,8 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		{  			return;  		} -		const LLUUID& item_id = current_item->getListener()->getUUID(); -		const std::string &item_name = current_item->getListener()->getName(); +		const LLUUID& item_id = current_item->getViewModelItem()->getUUID(); +		const std::string &item_name = current_item->getViewModelItem()->getName();  		mFilterSubString = item_name;  		LLInventoryFilter *filter = mActivePanel->getFilter();  		filter->setFilterSubString(item_name); @@ -1094,11 +1094,11 @@ bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)  	LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();  	if (current_item)   	{ -		LLViewerInventoryItem *inv_item = current_item->getInventoryItem(); +		LLViewerInventoryItem *inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());  		if(inv_item)  		{  			bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); -			LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType(); +			LLInventoryType::EType curr_type = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryType();  			return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);  		}  	} @@ -1123,7 +1123,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  			{  				const LLUUID &item_id = (*iter);  				LLFolderViewItem *item = *iter; -				const LLFolderViewModelItemInventory *listener = item->getListener(); +				const LLFolderViewModelItemInventory *listener = item->getViewModelItem();  				llassert(listener);  				if (!listener) return FALSE;  				can_delete &= listener->isItemRemovable(); @@ -1141,7 +1141,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  	{  		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();  		if (!current_item) return FALSE; -		const LLUUID& item_id = current_item->getListener()->getUUID(); +		const LLUUID& item_id = current_item->getViewModelItem()->getUUID();  		const LLViewerInventoryItem *item = gInventory.getItem(item_id);  		if (item && item->getIsLinkType() && !item->getIsBrokenLink())  		{ @@ -1157,7 +1157,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  		if (selection_set.size() != 1) return FALSE;  		LLFolderViewItem* current_item = root->getCurSelectedItem();  		if (!current_item) return FALSE; -		const LLUUID& item_id = current_item->getListener()->getUUID(); +		const LLUUID& item_id = current_item->getViewModelItem()->getUUID();  		const LLInventoryObject *obj = gInventory.getObject(item_id);  		if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))  		{ @@ -1170,7 +1170,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  	{  		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();  		if (!current_item) return FALSE; -		const LLUUID& item_id = current_item->getListener()->getUUID(); +		const LLUUID& item_id = current_item->getViewModelItem()->getUUID();  		const LLViewerInventoryItem *item = gInventory.getItem(item_id);  		if (item && item->getIsBrokenLink())  		{ diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index 6804342106..8a07d6d516 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -94,7 +94,7 @@ LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()  	mInventoryPanel->setShape(inventory_placeholder_rect);  	// Set the sort order newest to oldest -	mInventoryPanel->getViewModel()->setSorter(LLInventoryFilter::SO_DATE); +	mInventoryPanel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_DATE);  	mInventoryPanel->getFilter()->markDefault();  	// Set selection callback for proper update of inventory status buttons diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp index b5c7c4ca88..7db01d9059 100644 --- a/indra/newview/llpanelmarketplaceoutboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp @@ -29,7 +29,7 @@  #include "llpanelmarketplaceoutboxinventory.h"  #include "llfolderviewitem.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h"  #include "llpanellandmarks.h" diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 3d7d9d573e..240c5b2da4 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -113,7 +113,6 @@ public:  	virtual void openItem();  	virtual BOOL canOpenItem() const { return FALSE; }  	virtual void closeItem() {} -	virtual void previewItem();  	virtual void selectItem() {}  	virtual BOOL isItemRenameable() const;  	virtual BOOL renameItem(const std::string& new_name); @@ -352,11 +351,6 @@ void LLTaskInvFVBridge::openItem()  	lldebugs << "LLTaskInvFVBridge::openItem()" << llendl;  } -void LLTaskInvFVBridge::previewItem() -{ -	openItem(); -} -  BOOL LLTaskInvFVBridge::isItemRenameable() const  {  	if(gAgent.isGodlike()) return TRUE; @@ -1754,7 +1748,7 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li  				view = LLUICtrlFactory::create<LLFolderViewItem> (params);  			}  			view->addToFolder(folder); -                        addItemID(view->getListener()->getUUID(), view); +                        addItemID(view->getViewModelItem()->getUUID(), view);  		}  	} diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 4abc7fea0e..a95d27f992 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -270,7 +270,7 @@ private:  		if (inventory_panel->getVisible())  		{ -			inventory_panel->getViewModel()->setSorter(sort_order); +			inventory_panel->getFolderViewModel()->setSorter(sort_order);  		}  		else  		{ @@ -1310,7 +1310,7 @@ void LLPanelOutfitEdit::getCurrentItemUUID(LLUUID& selected_id)  		LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();  		if (!curr_item) return; -		LLFolderViewModelItemInventory* listenerp  = curr_item->getListener(); +		LLFolderViewModelItemInventory* listenerp  = curr_item->getViewModelItem();  		if (!listenerp) return;  		selected_id = listenerp->getUUID(); @@ -1332,7 +1332,7 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list)  			it != end_it;  			++it)  		{ -			uuid_list.push_back((*it)->getListener()->getUUID()); +			uuid_list.push_back((*it)->getItemViewModel()->getUUID());  		}  	}  	else if (mWearablesListViewPanel->getVisible()) @@ -1384,7 +1384,7 @@ void LLPanelOutfitEdit::saveListSelection()  		for (std::set<LLFolderViewItem*>::const_iterator item_id =    selected_ids.begin(); item_id != selected_ids.end(); ++item_id)  		{ -			mWearableItemsList->selectItemByUUID((*item_id)->getListener()->getUUID(),    true); +			mWearableItemsList->selectItemByUUID((*item_id)->getItemViewModel()->getUUID(),    true);  		}  		mWearableItemsList->scrollToShowFirstSelectedItem();  	} diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 1de26660bc..da5ce7d4b7 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -30,7 +30,7 @@  #include "llplacesinventorypanel.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llfolderview.h"  #include "llinventorybridge.h"  #include "llinventoryfunctions.h" @@ -162,7 +162,7 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)  	// then determine its type and set necessary menu handle  	if (getCurSelectedItem())  	{ -		LLInventoryType::EType inventory_type = getCurSelectedItem()->getListener()->getInventoryType(); +		LLInventoryType::EType inventory_type = getCurSelectedItem()->getViewModelItem()->getInventoryType();  		inventory_type_menu_handle_t::iterator it_handle = mMenuHandlesByInventoryType.find(inventory_type);  		if (it_handle != mMenuHandlesByInventoryType.end()) diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index f069da5869..194aa7f71b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -38,7 +38,7 @@  #include "llfiltereditor.h"  #include "llfloaterreg.h"  #include "llfloaterworldmap.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "lloutfitobserver.h"  #include "llpaneleditwearable.h"  #include "llpaneloutfitsinventory.h" diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index cc578b5799..f3d32e7a67 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -473,7 +473,7 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)  		}  	} -	current_item->getListener()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action); +	current_item->getViewModelItem()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);  }  void LLSidepanelInventory::onWearButtonClicked() @@ -663,7 +663,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()  			return NULL;  		}  	} -	const LLUUID &item_id = current_item->getListener()->getUUID(); +	const LLUUID &item_id = current_item->getViewModelItem()->getUUID();  	LLInventoryItem *item = gInventory.getItem(item_id);  	return item;  } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index ad2db966bd..a995f07df7 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -39,7 +39,7 @@  #include "llfocusmgr.h"  #include "llviewertexture.h"  #include "llfolderview.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  #include "llinventory.h"  #include "llinventoryfunctions.h"  #include "llinventorymodelbackgroundfetch.h" @@ -800,7 +800,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem  	if (items.size())  	{  		LLFolderViewItem* first_item = items.front(); -		LLInventoryItem* itemp = gInventory.getItem(first_item->getListener()->getUUID()); +		LLInventoryItem* itemp = gInventory.getItem(first_item->getViewModelItem()->getUUID());  		mNoCopyTextureSelected = FALSE;  		if (itemp)  		{ | 
