From b484a2736524dc52ef81dd3e3d25ee0970674fd4 Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Wed, 4 Nov 2020 18:53:56 +0200
Subject: SL-13826 Open a new inventory floater for "Find original" and "Show
 original" result

---
 indra/newview/llinventorybridge.cpp    | 20 +++++---------------
 indra/newview/llinventoryfunctions.cpp | 18 +++++++++++-------
 indra/newview/llinventorypanel.cpp     | 26 ++++++++++++++++++++++++++
 indra/newview/llinventorypanel.h       |  5 ++++-
 indra/newview/llpanelmaininventory.cpp | 15 ++++++++++++---
 indra/newview/llpanelmaininventory.h   |  3 ++-
 6 files changed, 60 insertions(+), 27 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 03123689c5..67d65547b6 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1881,6 +1881,7 @@ void LLItemBridge::gotoItem()
 			if (active_panel)
 			{
 				active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
+				active_panel->setFocus(TRUE);
 			}
 		}
 
@@ -7229,24 +7230,13 @@ void LLLinkFolderBridge::performAction(LLInventoryModel* model, std::string acti
 	}
 	LLItemBridge::performAction(model,action);
 }
+
 void LLLinkFolderBridge::gotoItem()
 {
-	const LLUUID &cat_uuid = getFolderID();
-	if (!cat_uuid.isNull())
-	{
-		LLFolderViewItem *base_folder = mInventoryPanel.get()->getItemByID(cat_uuid);
-		if (base_folder)
-		{
-			if (LLInventoryModel* model = getInventoryModel())
-			{
-				model->fetchDescendentsOf(cat_uuid);
-			}
-			base_folder->setOpen(TRUE);
-			mRoot->setSelection(base_folder,TRUE);
-			mRoot->scrollToShowSelection();
-		}
-	}
+    LLItemBridge::gotoItem();
+    LLInventoryPanel::getActiveInventoryPanel()->openFolderByID(getFolderID());
 }
+
 const LLUUID &LLLinkFolderBridge::getFolderID() const
 {
 	if (LLViewerInventoryItem *link_item = getItem())
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 646d92b9e1..9eb84ed259 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -737,9 +737,8 @@ void show_item_original(const LLUUID& item_uuid)
 	}
 
 	//sidetray inventory panel
-	LLSidepanelInventory *sidepanel_inventory =	LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+	LLSidepanelInventory *sidepanel_inventory =	LLPanelMainInventory::newWindow()->LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
 
-	bool do_reset_inventory_filter = !floater_inventory->isInVisibleChain();
 
 	LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
 	if (!active_panel) 
@@ -758,11 +757,7 @@ void show_item_original(const LLUUID& item_uuid)
 		return;
 	}
 	active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_YES);
-	
-	if(do_reset_inventory_filter)
-	{
-		reset_inventory_filter();
-	}
+	active_panel->setFocus(TRUE);
 }
 
 
@@ -2446,6 +2441,15 @@ 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 c65998cf90..740c27ae8b 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -339,6 +339,7 @@ void LLInventoryPanel::draw()
 {
 	// Select the desired item (in case it wasn't loaded when the selection was requested)
 	updateSelection();
+	updateFolderState();
 	
 	LLPanel::draw();
 }
@@ -1146,6 +1147,7 @@ void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::
 void LLInventoryPanel::clearSelection()
 {
 	mSelectThisID.setNull();
+	mOpenFolderID.setNull();
 }
 
 LLInventoryPanel::selected_items_t LLInventoryPanel::getSelectedItems() const
@@ -1646,6 +1648,30 @@ void LLInventoryPanel::updateSelection()
 	}
 }
 
+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 7cb52dc1f3..e51281b4b3 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -244,7 +244,9 @@ 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; }
 
@@ -260,7 +262,8 @@ protected:
 	void openStartFolderOrMyInventory(); // open the first level of inventory
 	void onItemsCompletion();			// called when selected items are complete
 
-    LLUUID						mSelectThisID;	
+    LLUUID						mSelectThisID;
+	LLUUID						mOpenFolderID;	
 	LLInventoryModel*			mInventory;
 	LLInventoryObserver*		mInventoryObserver;
 	LLInvPanelComplObserver*	mCompletionObserver;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 4691ee3849..813a5b3c20 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -383,15 +383,16 @@ void LLPanelMainInventory::closeAllFolders()
 	getPanel()->getRootFolder()->closeAllFolders();
 }
 
-void LLPanelMainInventory::newWindow()
+LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
 {
 	static S32 instance_num = 0;
 	instance_num = (instance_num + 1) % S32_MAX;
 
 	if (!gAgentCamera.cameraMouselook())
 	{
-		LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+		return LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
 	}
+    return NULL;
 }
 
 void LLPanelMainInventory::doCreate(const LLSD& userdata)
@@ -1343,7 +1344,15 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 		{
 			return;
 		}
-		static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
+        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");
+            }
+        }
 	}
 
 	if (command_name == "find_links")
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 903b33bdbf..40f04da6e9 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -46,6 +46,7 @@ class LLMenuButton;
 class LLMenuGL;
 class LLToggleableMenu;
 class LLFloater;
+class LLFloaterSidePanelContainer;
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLPanelMainInventory
@@ -90,7 +91,7 @@ public:
 
 	void setFocusFilterEditor();
 
-	static void newWindow();
+	static LLFloaterSidePanelContainer* newWindow();
 
 	void toggleFindOptions();
 
-- 
cgit v1.2.3