From 6ec194154be3d40f897d728925d1a565c6f8be78 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Thu, 10 Dec 2020 17:43:21 +0200
Subject: SL-13826 Show result of "Find original" and "Show original" in Main
 Inventory floater and reset the filters to guarantee success

---
 indra/newview/llinventorybridge.cpp    | 41 +++++++------------
 indra/newview/llinventoryfunctions.cpp | 73 +++++++++++++++++-----------------
 indra/newview/llinventorypanel.cpp     | 36 ++++-------------
 indra/newview/llinventorypanel.h       |  6 +--
 indra/newview/llpanelmaininventory.cpp | 15 ++-----
 indra/newview/llpanelmaininventory.h   |  6 +--
 6 files changed, 67 insertions(+), 110 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index ae96963b2a..27e222237e 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1863,29 +1863,11 @@ void LLItemBridge::restoreToWorld()
 
 void LLItemBridge::gotoItem()
 {
-	LLInventoryObject *obj = getInventoryObject();
-	if (obj && obj->getIsLinkType())
-	{
-		const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
-		if (gInventory.isObjectDescendentOf(obj->getLinkedUUID(), inbox_id))
-		{
-			LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
-			if (sidepanel_inventory && sidepanel_inventory->getInboxPanel())
-			{
-				sidepanel_inventory->getInboxPanel()->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
-			}
-		}
-		else
-		{
-			LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
-			if (active_panel)
-			{
-				active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
-				active_panel->setFocus(TRUE);
-			}
-		}
-
-	}
+    LLInventoryObject *obj = getInventoryObject();
+    if (obj && obj->getIsLinkType())
+    {
+        show_item_original(obj->getUUID());
+    }
 }
 
 LLUIImagePtr LLItemBridge::getIcon() const
@@ -7251,13 +7233,20 @@ void LLLinkFolderBridge::performAction(LLInventoryModel* model, std::string acti
 	}
 	LLItemBridge::performAction(model,action);
 }
-
 void LLLinkFolderBridge::gotoItem()
 {
     LLItemBridge::gotoItem();
-    LLInventoryPanel::getActiveInventoryPanel()->openFolderByID(getFolderID());
-}
 
+    const LLUUID &cat_uuid = getFolderID();
+    if (!cat_uuid.isNull())
+    {
+        LLFolderViewItem *base_folder = LLInventoryPanel::getActiveInventoryPanel()->getItemByID(cat_uuid);
+        if (base_folder)
+        {
+            base_folder->setOpen(TRUE);
+        }
+    }
+}
 const LLUUID &LLLinkFolderBridge::getFolderID() const
 {
 	if (LLViewerInventoryItem *link_item = getItem())
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 628363a47e..181bc48571 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -774,35 +774,45 @@ void show_item_profile(const LLUUID& item_uuid)
 
 void show_item_original(const LLUUID& item_uuid)
 {
-	LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
-	if (!floater_inventory)
-	{
-		LL_WARNS() << "Could not find My Inventory floater" << LL_ENDL;
-		return;
-	}
-
-	//sidetray inventory panel
-	LLSidepanelInventory *sidepanel_inventory =	LLPanelMainInventory::newWindow()->LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
-
+    LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+    if (!floater_inventory)
+    {
+        LL_WARNS() << "Could not find My Inventory floater" << LL_ENDL;
+        return;
+    }
+    LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+    if (sidepanel_inventory)
+    {
+        LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+        if (main_inventory)
+        {
+            main_inventory->resetFilters();
+        }
+        reset_inventory_filter();
 
-	LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
-	if (!active_panel) 
-	{
-		//this may happen when there is no floatera and other panel is active in inventory tab
+        if (!LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>("inventory")->isInVisibleChain())
+        {
+            LLFloaterReg::toggleInstanceOrBringToFront("inventory");
+        }
 
-		if	(sidepanel_inventory)
-		{
-			sidepanel_inventory->showInventoryPanel();
-		}
-	}
-	
-	active_panel = LLInventoryPanel::getActiveInventoryPanel();
-	if (!active_panel) 
-	{
-		return;
-	}
-	active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
-	active_panel->setFocus(TRUE);
+        const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
+        if (gInventory.isObjectDescendentOf(gInventory.getLinkedItemID(item_uuid), inbox_id))
+        {
+            if (sidepanel_inventory->getInboxPanel())
+            {
+                sidepanel_inventory->openInbox();
+                sidepanel_inventory->getInboxPanel()->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
+            }
+        }
+        else
+        {
+            sidepanel_inventory->selectAllItemsPanel();
+            if (sidepanel_inventory->getActivePanel())
+            {
+                sidepanel_inventory->getActivePanel()->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
+            }
+        }
+    }
 }
 
 
@@ -2486,15 +2496,6 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
     }
     else
     {
-        if (action == "goto")
-        {
-            LLSidepanelInventory *sidepanel_inventory = LLPanelMainInventory::newWindow()->LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
-            if (sidepanel_inventory && sidepanel_inventory->getMainInventoryPanel())
-            {
-                model = sidepanel_inventory->getMainInventoryPanel()->getActivePanel()->getModel();
-            }
-        }
-        
         std::set<LLFolderViewItem*>::iterator set_iter;
         for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter)
         {
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 0246878ab6..1f5dfa6d5c 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -157,7 +157,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mViewsInitialized(false),
 	mInvFVBridgeBuilder(NULL),
 	mInventoryViewModel(p.name),
-	mGroupedItemBridge(new LLFolderViewGroupedItemBridge)
+	mGroupedItemBridge(new LLFolderViewGroupedItemBridge),
+	mFocusSelection(false)
 {
 	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
 
@@ -339,7 +340,6 @@ void LLInventoryPanel::draw()
 {
 	// Select the desired item (in case it wasn't loaded when the selection was requested)
 	updateSelection();
-	updateFolderState();
 	
 	LLPanel::draw();
 }
@@ -1222,7 +1222,7 @@ void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::
 void LLInventoryPanel::clearSelection()
 {
 	mSelectThisID.setNull();
-	mOpenFolderID.setNull();
+	mFocusSelection = false;
 }
 
 LLInventoryPanel::selected_items_t LLInventoryPanel::getSelectedItems() const
@@ -1702,15 +1702,17 @@ 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->getViewModelItem())
+	if(itemp && itemp->getViewModelItem() && itemp->passedFilter())
 	{
 		itemp->arrangeAndSet(TRUE, take_keyboard_focus);
 		mSelectThisID.setNull();
+		mFocusSelection = false;
 		return;
 	}
 	else
 	{
 		// save the desired item to be selected later (if/when ready)
+		mFocusSelection = take_keyboard_focus;
 		mSelectThisID = obj_id;
 	}
 }
@@ -1719,34 +1721,10 @@ void LLInventoryPanel::updateSelection()
 {
 	if (mSelectThisID.notNull())
 	{
-		setSelectionByID(mSelectThisID, false);
+		setSelectionByID(mSelectThisID, mFocusSelection);
 	}
 }
 
-void LLInventoryPanel::openFolderByID( const LLUUID& folder_id)
-{
-    LLFolderViewItem* itemp = getItemByID(folder_id);
-    if(itemp && itemp->getViewModelItem())
-    {
-        itemp->setOpen(TRUE);
-        mOpenFolderID.setNull();
-        return;
-    }
-    else
-    {
-        // save the desired folder to be open later (if/when ready)
-        mOpenFolderID = folder_id;
-    }
-}
-
-void LLInventoryPanel::updateFolderState()
-{
-    if (mOpenFolderID.notNull())
-    {
-        openFolderByID(mOpenFolderID);
-    }
-}
-
 void LLInventoryPanel::doToSelected(const LLSD& userdata)
 {
 	if (("purge" == userdata.asString()))
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 2bcc3f3c0b..447d24b959 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -244,9 +244,7 @@ public:
 	LLFolderViewItem* getItemByID(const LLUUID& id);
 	LLFolderViewFolder* getFolderByID(const LLUUID& id);
 	void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);
-	void openFolderByID(const LLUUID& folder_id);
 	void updateSelection();
-	void updateFolderState();
 
 	void setSuppressOpenItemAction(bool supress_open_item) { mSuppressOpenItemAction = supress_open_item; }
 
@@ -262,11 +260,11 @@ protected:
 	void openStartFolderOrMyInventory(); // open the first level of inventory
 	void onItemsCompletion();			// called when selected items are complete
 
-    LLUUID						mSelectThisID;
-	LLUUID						mOpenFolderID;	
+    LLUUID						mSelectThisID;	
 	LLInventoryModel*			mInventory;
 	LLInventoryObserver*		mInventoryObserver;
 	LLInvPanelComplObserver*	mCompletionObserver;
+	bool						mFocusSelection;
 	bool						mAcceptsDragAndDrop;
 	bool 						mAllowMultiSelect;
 	bool 						mAllowDrag;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 813a5b3c20..4691ee3849 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -383,16 +383,15 @@ void LLPanelMainInventory::closeAllFolders()
 	getPanel()->getRootFolder()->closeAllFolders();
 }
 
-LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
+void LLPanelMainInventory::newWindow()
 {
 	static S32 instance_num = 0;
 	instance_num = (instance_num + 1) % S32_MAX;
 
 	if (!gAgentCamera.cameraMouselook())
 	{
-		return LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+		LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
 	}
-    return NULL;
 }
 
 void LLPanelMainInventory::doCreate(const LLSD& userdata)
@@ -1344,15 +1343,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 		{
 			return;
 		}
-        LLSidepanelInventory *sidepanel_inventory = newWindow()->LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
-        if (sidepanel_inventory)
-        {
-            LLPanelMainInventory* new_inventory = sidepanel_inventory->getMainInventoryPanel();
-            if (new_inventory)
-            {
-                static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(new_inventory->getActivePanel()->getModel(), "goto");
-            }
-        }
+		static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
 	}
 
 	if (command_name == "find_links")
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 40f04da6e9..313e478bfe 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -46,7 +46,6 @@ class LLMenuButton;
 class LLMenuGL;
 class LLToggleableMenu;
 class LLFloater;
-class LLFloaterSidePanelContainer;
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLPanelMainInventory
@@ -91,10 +90,12 @@ public:
 
 	void setFocusFilterEditor();
 
-	static LLFloaterSidePanelContainer* newWindow();
+	static void newWindow();
 
 	void toggleFindOptions();
 
+    void resetFilters();
+
 protected:
 	//
 	// Misc functions
@@ -119,7 +120,6 @@ protected:
 	void doToSelected(const LLSD& userdata);
 	void closeAllFolders();
 	void doCreate(const LLSD& userdata);
-	void resetFilters();
 	void setSortBy(const LLSD& userdata);
 	void saveTexture(const LLSD& userdata);
 	bool isSaveTextureEnabled(const LLSD& userdata);
-- 
cgit v1.2.3