From ed7173c987cf4a5de2f3c9b9d792e5ac4006e833 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Thu, 28 Jun 2012 23:29:58 -0700
Subject: [PATCH] CHUI-101 WIP Make LLFolderview general purpose filtering
 mostly working

---
 indra/newview/llfolderview.cpp                | 124 ++++++++----------
 indra/newview/llfolderviewitem.cpp            |   5 +-
 indra/newview/llinventorybridge.cpp           |  47 +++----
 indra/newview/llinventorybridge.h             |   3 +
 indra/newview/llinventorypanel.cpp            |  37 ++++--
 indra/newview/llinventorypanel.h              |  18 ++-
 .../llpanelmarketplaceinboxinventory.cpp      |   1 +
 .../llpanelmarketplaceoutboxinventory.cpp     |   1 +
 indra/newview/llplacesinventorybridge.cpp     |   5 +
 indra/newview/llplacesinventorybridge.h       |   1 +
 indra/newview/llplacesinventorypanel.cpp      |   1 +
 11 files changed, 135 insertions(+), 108 deletions(-)

diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index a37fc7714be..0f7809d4b4f 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -182,7 +182,6 @@ LLFolderView::LLFolderView(const Params& p)
 	mAutoSelectOverride(FALSE),
 	mNeedsAutoRename(FALSE),
 	mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME),	// This gets overridden by a pref immediately
-	mFilter(new LLInventoryFilter(LLInventoryFilter::Params().name(p.title))),
 	mShowSelectionContext(FALSE),
 	mShowSingleSelection(FALSE),
 	mArrangeGeneration(0),
@@ -288,9 +287,6 @@ LLFolderView::~LLFolderView( void )
 	mItems.clear();
 	mFolders.clear();
 
-	delete mFilter;
-	mFilter = NULL;
-
 	delete mViewModel;
 	mViewModel = NULL;
 }
@@ -302,6 +298,9 @@ BOOL LLFolderView::canFocusChildren() const
 
 BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
 {
+	LLFolderViewFolder::addFolder(folder);
+
+	mFolders.remove(folder);
 	// enforce sort order of My Inventory followed by Library
 	if (((LLFolderViewModelItemInventory*)folder->getViewModelItem())->getUUID() == gInventory.getLibraryRootFolderID())
 	{
@@ -311,12 +310,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
 	{
 		mFolders.insert(mFolders.begin(), folder);
 	}
-	folder->setOrigin(0, 0);
-	folder->reshape(getRect().getWidth(), 0);
-	folder->setVisible(FALSE);
-	addChild( folder );
-	folder->getViewModelItem()->dirtyFilter();
-	folder->requestArrange();
+
 	return TRUE;
 }
 
@@ -717,7 +711,7 @@ void LLFolderView::draw()
 	}
 	else if (mShowEmptyMessage)
 	{
-		if (!mViewModel->contentsReady() || getLastFilterGeneration() < mFilter->getFirstSuccessGeneration())
+		if (!mViewModel->contentsReady() || getLastFilterGeneration() < getFolderViewModel()->getFilter()->getFirstSuccessGeneration())
 		{
 			// TODO RN: Get this from filter
 			mStatusText = LLTrans::getString("Searching");
@@ -952,37 +946,36 @@ void LLFolderView::openSelectedItems( void )
 {
 	if(getVisible() && getEnabled())
 	{
-		// TODO RN: move to LLFolderViewModelInventory
-		//if (mSelectedItems.size() == 1)
-		//{
-		//	mSelectedItems.front()->openItem();
-		//}
-		//else
-		//{
-		//	LLMultiPreview* multi_previewp = new LLMultiPreview();
-		//	LLMultiProperties* multi_propertiesp = new LLMultiProperties();
-
-		//	selected_items_t::iterator item_it;
-		//	for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
-		//	{
-		//		// IT_{OBJECT,ATTACHMENT} creates LLProperties
-		//		// floaters; others create LLPreviews.  Put
-		//		// each one in the right type of container.
-		//		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);
-		//		else
-		//			LLFloater::setFloaterHost(multi_previewp);
-		//		(*item_it)->openItem();
-		//	}
-
-		//	LLFloater::setFloaterHost(NULL);
-		//	// *NOTE: LLMulti* will safely auto-delete when open'd
-		//	// without any children.
-		//	multi_previewp->openFloater(LLSD());
-		//	multi_propertiesp->openFloater(LLSD());
-		//}
+		if (mSelectedItems.size() == 1)
+		{
+			mSelectedItems.front()->openItem();
+		}
+		else
+		{
+			LLMultiPreview* multi_previewp = new LLMultiPreview();
+			LLMultiProperties* multi_propertiesp = new LLMultiProperties();
+
+			selected_items_t::iterator item_it;
+			for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+			{
+				// IT_{OBJECT,ATTACHMENT} creates LLProperties
+				// floaters; others create LLPreviews.  Put
+				// each one in the right type of container.
+				LLFolderViewModelItemInventory* listener = static_cast<LLFolderViewModelItemInventory*>((*item_it)->getViewModelItem());
+				bool is_prop = listener && (listener->getInventoryType() == LLInventoryType::IT_OBJECT || listener->getInventoryType() == LLInventoryType::IT_ATTACHMENT);
+				if (is_prop)
+					LLFloater::setFloaterHost(multi_propertiesp);
+				else
+					LLFloater::setFloaterHost(multi_previewp);
+				listener->openItem();
+			}
+
+			LLFloater::setFloaterHost(NULL);
+			// *NOTE: LLMulti* will safely auto-delete when open'd
+			// without any children.
+			multi_previewp->openFloater(LLSD());
+			multi_propertiesp->openFloater(LLSD());
+		}
 	}
 }
 
@@ -990,28 +983,27 @@ void LLFolderView::propertiesSelectedItems( void )
 {
 	if(getVisible() && getEnabled())
 	{
-		// TODO RN: move to LLFolderViewModelInventory
-		//if (mSelectedItems.size() == 1)
-		//{
-		//	LLFolderViewItem* folder_item = mSelectedItems.front();
-		//	if(!folder_item) return;
-		//	folder_item->getViewModelItem()->showProperties();
-		//}
-		//else
-		//{
-		//	LLMultiProperties* multi_propertiesp = new LLMultiProperties();
+		if (mSelectedItems.size() == 1)
+		{
+			LLFolderViewItem* folder_item = mSelectedItems.front();
+			if(!folder_item) return;
+			folder_item->getViewModelItem()->showProperties();
+		}
+		else
+		{
+			LLMultiProperties* multi_propertiesp = new LLMultiProperties();
 
-		//	LLFloater::setFloaterHost(multi_propertiesp);
+			LLFloater::setFloaterHost(multi_propertiesp);
 
-		//	selected_items_t::iterator item_it;
-		//	for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
-		//	{
-		//		(*item_it)->getViewModelItem()->showProperties();
-		//	}
+			selected_items_t::iterator item_it;
+			for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+			{
+				(*item_it)->getViewModelItem()->showProperties();
+			}
 
-		//	LLFloater::setFloaterHost(NULL);
-		//	multi_propertiesp->openFloater(LLSD());
-		//}
+			LLFloater::setFloaterHost(NULL);
+			multi_propertiesp->openFloater(LLSD());
+		}
 	}
 }
 
@@ -1943,11 +1935,11 @@ void LLFolderView::doIdle()
 	
 	LLFastTimer t2(FTM_INVENTORY);
 
-	if (mFilter->isModified() && mFilter->isNotDefault())
+	if (getFolderViewModel()->getFilter()->isModified() && getFolderViewModel()->getFilter()->isNotDefault())
 	{
 		mNeedsAutoSelect = TRUE;
 	}
-	mFilter->clearModified();
+	getFolderViewModel()->getFilter()->clearModified();
 
 	// filter to determine visibility before arranging
 	filter(*(getFolderViewModel()->getFilter()));
@@ -1958,7 +1950,7 @@ void LLFolderView::doIdle()
 		LLFastTimer t3(FTM_AUTO_SELECT);
 		// select new item only if a filtered item not currently selected
 		LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
-		if (!mAutoSelectOverride && (!selected_itemp || selected_itemp->passedFilter()))
+		if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getViewModelItem()->potentiallyVisible()))
 		{
 			// these are named variables to get around gcc not binding non-const references to rvalues
 			// and functor application is inherently non-const to allow for stateful functors
@@ -1968,7 +1960,7 @@ void LLFolderView::doIdle()
 
 		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
 		// Used by LLPlacesFolderView.
-		if (mFilter->showAllResults())
+		if (getFolderViewModel()->getFilter()->showAllResults())
 		{
 			// these are named variables to get around gcc not binding non-const references to rvalues
 			// and functor application is inherently non-const to allow for stateful functors
@@ -1979,7 +1971,7 @@ void LLFolderView::doIdle()
 		scrollToShowSelection();
 	}
 
-	BOOL filter_finished = getLastFilterGeneration() >= mFilter->getCurrentGeneration() 
+	BOOL filter_finished = getLastFilterGeneration() >= getFolderViewModel()->getFilter()->getCurrentGeneration() 
 						&& mViewModel->contentsReady();
 	if (filter_finished 
 		|| gFocusMgr.childHasKeyboardFocus(inventory_panel) 
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index f65a13be1e4..685a4cbf497 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -123,7 +123,10 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
 	mListener(p.listener),
 	mIsMouseOverTitle(false)
 {
-	mListener->setFolderViewItem(this);
+	if (mListener)
+	{
+		mListener->setFolderViewItem(this);
+	}
 }
 
 BOOL LLFolderViewItem::postBuild()
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 45a2bffa6b4..002278601ac 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1026,6 +1026,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
 										   LLAssetType::EType actual_asset_type,
 										   LLInventoryType::EType inv_type,
 										   LLInventoryPanel* inventory,
+										   LLFolderViewModelInventory* view_model,
 										   LLFolderView* root,
 										   const LLUUID& uuid,
 										   U32 flags)
@@ -1151,12 +1152,13 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
 		default:
 			llinfos << "Unhandled asset type (llassetstorage.h): "
 					<< (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << llendl;
-			break;
+			break;	
 	}
 
 	if (new_listener)
 	{
 		new_listener->mInvType = inv_type;
+		new_listener->setRootViewModel(view_model);
 	}
 
 	return new_listener;
@@ -1332,6 +1334,7 @@ LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset
 														LLAssetType::EType actual_asset_type,
 														LLInventoryType::EType inv_type,
 														LLInventoryPanel* inventory,
+														LLFolderViewModelInventory* view_model,
 														LLFolderView* root,
 														const LLUUID& uuid,
 														U32 flags /* = 0x00 */) const
@@ -1340,6 +1343,7 @@ LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset
 									   actual_asset_type,
 									   inv_type,
 									   inventory,
+									   view_model,
 									   root,
 									   uuid,
 									   flags);
@@ -6472,41 +6476,30 @@ LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
 	LLAssetType::EType actual_asset_type,
 	LLInventoryType::EType inv_type,
 	LLInventoryPanel* inventory,
+	LLFolderViewModelInventory* view_model,
 	LLFolderView* root,
 	const LLUUID& uuid,
 	U32 flags /*= 0x00*/ ) const
 {
 	LLInvFVBridge* new_listener = NULL;
-	switch(asset_type)
+	if (asset_type == LLAssetType::AT_CATEGORY 
+		&& actual_asset_type != LLAssetType::AT_LINK_FOLDER)
 	{
-	case LLAssetType::AT_CATEGORY:
-		if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
-		{
-			// *TODO: Create a link folder handler instead if it is necessary
-			new_listener = LLInventoryFVBridgeBuilder::createBridge(
-				asset_type,
-				actual_asset_type,
-				inv_type,
-				inventory,
-				root,
-				uuid,
-				flags);
-			break;
-		}
 		new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid);
-		break;
-	default:
-		new_listener = LLInventoryFVBridgeBuilder::createBridge(
-			asset_type,
-			actual_asset_type,
-			inv_type,
-			inventory,
-			root,
-			uuid,
-			flags);
+		new_listener->setRootViewModel(view_model);
+	}
+	else
+	{
+		new_listener = LLInventoryFVBridgeBuilder::createBridge(asset_type,
+																actual_asset_type,
+																inv_type,
+																inventory,
+																view_model,
+																root,
+																uuid,
+																flags);
 	}
 	return new_listener;
-
 }
 
 // EOF
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index b0582d003d1..e235d9cf5ff 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -66,6 +66,7 @@ class LLInvFVBridge : public LLFolderViewModelItemInventory
 									   LLAssetType::EType actual_asset_type,
 									   LLInventoryType::EType inv_type,
 									   LLInventoryPanel* inventory,
+									   LLFolderViewModelInventory* view_model,
 									   LLFolderView* root,
 									   const LLUUID& uuid,
 									   U32 flags = 0x00);
@@ -196,6 +197,7 @@ class LLInventoryFVBridgeBuilder
 										LLAssetType::EType actual_asset_type,
 										LLInventoryType::EType inv_type,
 										LLInventoryPanel* inventory,
+										LLFolderViewModelInventory* view_model,
 										LLFolderView* root,
 										const LLUUID& uuid,
 										U32 flags = 0x00) const;
@@ -645,6 +647,7 @@ class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
 		LLAssetType::EType actual_asset_type,
 		LLInventoryType::EType inv_type,
 		LLInventoryPanel* inventory,
+		LLFolderViewModelInventory* view_model,
 		LLFolderView* root,
 		const LLUUID& uuid,
 		U32 flags = 0x00) const;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index aba4c088ab9..73e20fc684e 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -234,6 +234,7 @@ void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
 																	LLAssetType::AT_CATEGORY,
 																	LLInventoryType::IT_CATEGORY,
 																	this,
+																	&mInventoryViewModel,
 																	NULL,
 																	root_id);
 	
@@ -672,7 +673,7 @@ LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool u
 	p.parent_panel = this;
 	p.tool_tip = p.name;
 	p.listener = bridge;
-	p.view_model = new LLFolderViewModelInventory();
+	p.view_model = &mInventoryViewModel;
 	p.use_label_suffix = useLabelSuffix;
 	p.allow_multiselect = mAllowMultiSelect;
 	p.show_empty_message = mShowEmptyMessage;
@@ -736,6 +737,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
   																			objectp->getType(),
   																			LLInventoryType::IT_CATEGORY,
   																			this,
+																			&mInventoryViewModel,
   																			mFolderRoot,
   																			objectp->getUUID());
   			if (new_listener)
@@ -751,6 +753,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
   																			item->getActualType(),
   																			item->getInventoryType(),
   																			this,
+																			&mInventoryViewModel,
   																			mFolderRoot,
   																			item->getUUID(),
   																			item->getFlags());
@@ -1130,7 +1133,6 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
 	if (!floater_inventory)
 	{
 		llwarns << "Could not find My Inventory floater" << llendl;
-
 		return FALSE;
 	}
 
@@ -1347,25 +1349,27 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 void LLFolderViewModelItemInventory::requestSort()
 {
 	LLFolderViewModelItemCommon::requestSort();
-	//TODO RN: need better way to get to root viewmodel, also consider reflecting hierarchy in viewmodel space as well
-	if (static_cast<LLFolderViewModelInventory*>(mFolderViewItem->getRoot()->getFolderViewModel())->getSorter().isByDate())
+	if (mRootViewModel->getSorter().isByDate())
 	{
 		// sort by date potentially affects parent folders which use a date
 		// derived from newest item in them
-		mFolderViewItem->getParentFolder()->getViewModelItem()->requestSort();
+		if (mParent)
+		{
+			mParent->requestSort();
+		}
 	}
 }
 
 bool LLFolderViewModelItemInventory::potentiallyVisible()
 {
 	return passedFilter() // we've passed the filter
-		|| getLastFilterGeneration() < mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration() // or we don't know yet
+		|| getLastFilterGeneration() < mRootViewModel->getFilter()->getFirstSuccessGeneration() // or we don't know yet
 		|| descendantsPassedFilter();
 }
 
 bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation) 
 { 
-	if (filter_generation < 0) filter_generation = mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration();
+	if (filter_generation < 0) filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration();
 	return mPassedFolderFilter 
 		&& mLastFilterGeneration >= filter_generation
 		&& (mPassedFilter || descendantsPassedFilter(filter_generation));
@@ -1373,7 +1377,7 @@ bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)
 
 bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation)
 { 
-	if (filter_generation < 0) filter_generation = mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration();
+	if (filter_generation < 0) filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration();
 	return mMostFilteredDescendantGeneration >= filter_generation; 
 }
 
@@ -1419,8 +1423,9 @@ void LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
 
 void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 {
-	if(getLastFilterGeneration() < filter.getFirstRequiredGeneration() // haven't checked descendants against minimum required generation to pass
-		|| descendantsPassedFilter(filter.getFirstRequiredGeneration())) // or at least one descendant has passed the minimum requirement
+	if(!mChildren.empty()
+		&& (getLastFilterGeneration() < filter.getFirstRequiredGeneration() // haven't checked descendants against minimum required generation to pass
+			|| descendantsPassedFilter(filter.getFirstRequiredGeneration()))) // or at least one descendant has passed the minimum requirement
 	{
 		// now query children
 		for (child_list_t::iterator iter = mChildren.begin();
@@ -1456,3 +1461,15 @@ void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 		filter.decrementFilterCount();
 	}
 }
+
+LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
+{
+	return &mInventoryViewModel;
+}
+
+
+const LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() const
+{
+	return &mInventoryViewModel;
+}
+
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 35a3f9b5e12..55edf386d55 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -42,11 +42,19 @@
 class LLInvFVBridge;
 class LLInventoryFVBridgeBuilder;
 class LLInvPanelComplObserver;
+class LLFolderViewModelInventory;
 
 class LLFolderViewModelItemInventory
 	:	public LLFolderViewModelItemCommon
 {
 public:
+	LLFolderViewModelItemInventory()
+	:	mRootViewModel(NULL)
+	{}
+	void setRootViewModel(LLFolderViewModelInventory* root_view_model)
+	{
+		mRootViewModel = root_view_model;
+	}
 	virtual const LLUUID& getUUID() const = 0;
 	virtual time_t getCreationDate() const = 0;	// UTC seconds
 	virtual void setCreationDate(time_t creation_date_utc) = 0;
@@ -68,6 +76,8 @@ class LLFolderViewModelItemInventory
 	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
 	virtual void filter( LLFolderViewFilter& filter);
 	virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
+protected:
+	LLFolderViewModelInventory* mRootViewModel;
 };
 
 class LLInventorySort
@@ -243,8 +253,8 @@ class LLInventoryPanel : public LLPanel
 	void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);
 	void updateSelection();
 	 	
-	LLFolderViewModelInventory* getFolderViewModel() { return &mViewModel; }
-	const LLFolderViewModelInventory* getFolderViewModel() const { return &mViewModel; }
+	LLFolderViewModelInventory* getFolderViewModel();
+	const LLFolderViewModelInventory* getFolderViewModel() const;
 
 protected:
 	void openStartFolderOrMyInventory(); // open the first level of inventory
@@ -262,8 +272,8 @@ class LLInventoryPanel : public LLPanel
 	LLFolderView*				mFolderRoot;
 	LLScrollContainer*			mScroller;
 
-	LLFolderViewModelInventory	mViewModel;
-	
+	LLFolderViewModelInventory	mInventoryViewModel;
+
 	std::map<LLUUID, LLFolderViewItem*> mItemMap;
 	/**
 	 * Pointer to LLInventoryFVBridgeBuilder.
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index f3096e862d8..6e5a5222978 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -111,6 +111,7 @@ void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& para
 																	LLAssetType::AT_CATEGORY,
 																	LLInventoryType::IT_CATEGORY,
 																	this,
+																	&mInventoryViewModel,
 																	NULL,
 																	root_id);
 	
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
index 783eeb11b8c..2885dd62660 100644
--- a/indra/newview/llpanelmarketplaceoutboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
@@ -77,6 +77,7 @@ void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& par
 																	LLAssetType::AT_CATEGORY,
 																	LLInventoryType::IT_CATEGORY,
 																	this,
+																	&mInventoryViewModel,
 																	NULL,
 																	root_id);
 	
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index 97c5d531d2d..af29ab7ea93 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -151,6 +151,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
 	LLAssetType::EType actual_asset_type,
 	LLInventoryType::EType inv_type,
 	LLInventoryPanel* inventory,
+	LLFolderViewModelInventory* view_model,
 	LLFolderView* root,
 	const LLUUID& uuid,
 	U32 flags/* = 0x00*/) const
@@ -164,6 +165,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
 			llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
 		}
 		new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, root, uuid, flags);
+		new_listener->setRootViewModel(view_model);
 		break;
 	case LLAssetType::AT_CATEGORY:
 		if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
@@ -174,12 +176,14 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
 				actual_asset_type,
 				inv_type,
 				inventory,
+				view_model,
 				root,
 				uuid,
 				flags);
 			break;
 		}
 		new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid);
+		new_listener->setRootViewModel(view_model);
 		break;
 	default:
 		new_listener = LLInventoryFVBridgeBuilder::createBridge(
@@ -187,6 +191,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
 			actual_asset_type,
 			inv_type,
 			inventory,
+			view_model,
 			root,
 			uuid,
 			flags);
diff --git a/indra/newview/llplacesinventorybridge.h b/indra/newview/llplacesinventorybridge.h
index 52beacef9cf..791502990bf 100644
--- a/indra/newview/llplacesinventorybridge.h
+++ b/indra/newview/llplacesinventorybridge.h
@@ -89,6 +89,7 @@ class LLPlacesInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
 											LLAssetType::EType actual_asset_type,
 											LLInventoryType::EType inv_type,
 											LLInventoryPanel* inventory,
+											LLFolderViewModelInventory* view_model,
 											LLFolderView* root,
 											const LLUUID& uuid,
 											U32 flags = 0x00) const;
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 1c2d75d88c8..d95d5eac19f 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -87,6 +87,7 @@ void LLPlacesInventoryPanel::buildFolderView(const LLInventoryPanel::Params& par
 													LLAssetType::AT_CATEGORY,
 													LLInventoryType::IT_CATEGORY,
 													this,
+													&mInventoryViewModel,
 													NULL,
 													root_id);
 	p.parent_panel = this;
-- 
GitLab