From 6bb496625f4492fabd44bd0e86acb8b599df8c43 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 8 Oct 2018 20:27:10 +0300
Subject: SL-9746 [EEP] Local Texture options should work with EEP

---
 indra/newview/llfloatereditextdaycycle.cpp         | 80 +++++++++++++++++++++-
 indra/newview/llfloaterfixedenvironment.cpp        | 58 ++++++++++++++++
 indra/newview/lllocalbitmaps.cpp                   | 13 ++++
 indra/newview/lllocalbitmaps.h                     |  1 +
 indra/newview/llpaneleditsky.cpp                   |  6 +-
 .../newview/skins/default/xui/en/notifications.xml | 16 +++++
 indra/newview/skins/default/xui/en/strings.xml     |  7 ++
 7 files changed, 175 insertions(+), 6 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 840b392f5d..e1220e5592 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -34,6 +34,7 @@
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "llloadingindicator.h"
+#include "lllocalbitmaps.h"
 #include "llmultisliderctrl.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
@@ -346,7 +347,7 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
         getChild<LLButton>(track_tabs[idx + 1], true)->setLabel(formatted_label.getString());
     }
 
-    for (int i = 2; i < LLSettingsDay::TRACK_MAX; i++) //skies #2 through #4
+    for (U32 i = 2; i < LLSettingsDay::TRACK_MAX; i++) //skies #2 through #4
     {
         getChild<LLButton>(track_tabs[i])->setEnabled(extended_env);
     }
@@ -513,6 +514,81 @@ void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
         return;
     }
 
+    // brute-force local texture scan
+    for (U32 i = 0; i <= LLSettingsDay::TRACK_MAX; i++)
+    {
+        LLSettingsDay::CycleTrack_t &day_track = dayclone->getCycleTrack(i);
+
+        LLSettingsDay::CycleTrack_t::iterator iter = day_track.begin();
+        LLSettingsDay::CycleTrack_t::iterator end = day_track.end();
+        S32 frame_num = 0;
+
+        while (iter != end)
+        {
+            frame_num++;
+            std::string desc;
+            bool is_local = false; // because getString can be empty
+            if (i == LLSettingsDay::TRACK_WATER)
+            {
+                LLSettingsWater::ptr_t water = std::static_pointer_cast<LLSettingsWater>(iter->second);
+                if (water)
+                {
+                    // LLViewerFetchedTexture and check for FTT_LOCAL_FILE or check LLLocalBitmapMgr
+                    if (LLLocalBitmapMgr::isLocal(water->getNormalMapID()))
+                    {
+                        desc = LLTrans::getString("EnvironmentNormalMap");
+                        is_local = true;
+                    }
+                    else if (LLLocalBitmapMgr::isLocal(water->getTransparentTextureID()))
+                    {
+                        desc = LLTrans::getString("EnvironmentTransparent");
+                        is_local = true;
+                    }
+                }
+            }
+            else
+            {
+                LLSettingsSky::ptr_t sky = std::static_pointer_cast<LLSettingsSky>(iter->second);
+                if (sky)
+                {
+                    if (LLLocalBitmapMgr::isLocal(sky->getSunTextureId()))
+                    {
+                        desc = LLTrans::getString("EnvironmentSun");
+                        is_local = true;
+                    }
+                    else if (LLLocalBitmapMgr::isLocal(sky->getMoonTextureId()))
+                    {
+                        desc = LLTrans::getString("EnvironmentMoon");
+                        is_local = true;
+                    }
+                    else if (LLLocalBitmapMgr::isLocal(sky->getCloudNoiseTextureId()))
+                    {
+                        desc = LLTrans::getString("EnvironmentCloudNoise");
+                        is_local = true;
+                    }
+                    else if (LLLocalBitmapMgr::isLocal(sky->getBloomTextureId()))
+                    {
+                        desc = LLTrans::getString("EnvironmentBloom");
+                        is_local = true;
+                    }
+                }
+            }
+
+            if (is_local)
+            {
+                LLSD args;
+                LLButton* button = getChild<LLButton>(track_tabs[i], true);
+                args["TRACK"] = button->getCurrentLabel();
+                args["FRAME"] = iter->first * 100; // %
+                args["FIELD"] = desc;
+                args["FRAMENO"] = frame_num;
+                LLNotificationsUtil::add("WLLocalTextureDayBlock", args);
+                return;
+            }
+            iter++;
+        }
+    }
+
     if (ctrl_action == ACTION_SAVE)
     {
         doApplyUpdateInventory(dayclone);
@@ -817,7 +893,7 @@ void LLFloaterEditExtDayCycle::selectTrack(U32 track_index, bool force )
         return;
     }
 
-    for (int i = 0; i < LLSettingsDay::TRACK_MAX; i++) // use max value
+    for (U32 i = 0; i < LLSettingsDay::TRACK_MAX; i++) // use max value
     {
         getChild<LLButton>(track_tabs[i], true)->setToggleState(i == mCurrentTrack);
     }
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index 5cd99e6ad2..201c6679b3 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -37,6 +37,7 @@
 #include "llsliderctrl.h"
 #include "lltabcontainer.h"
 #include "llfilepicker.h"
+#include "lllocalbitmaps.h"
 #include "llsettingspicker.h"
 #include "llviewermenufile.h" // LLFilePickerReplyThread
 #include "llviewerparcelmgr.h"
@@ -51,6 +52,7 @@
 #include "llenvironment.h"
 #include "llagent.h"
 #include "llparcel.h"
+#include "lltrans.h"
 
 #include "llsettingsvo.h"
 #include "llinventorymodel.h"
@@ -340,6 +342,62 @@ void LLFloaterFixedEnvironment::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
 {
     std::string ctrl_action = ctrl->getName();
 
+    std::string local_desc;
+    bool is_local = false; // because getString can be empty
+    if (mSettings->getSettingsType() == "water")
+    {
+        LLSettingsWater::ptr_t water = std::static_pointer_cast<LLSettingsWater>(mSettings);
+        if (water)
+        {
+            // LLViewerFetchedTexture and check for FTT_LOCAL_FILE or check LLLocalBitmapMgr
+            if (LLLocalBitmapMgr::isLocal(water->getNormalMapID()))
+            {
+                local_desc = LLTrans::getString("EnvironmentNormalMap");
+                is_local = true;
+            }
+            else if (LLLocalBitmapMgr::isLocal(water->getTransparentTextureID()))
+            {
+                local_desc = LLTrans::getString("EnvironmentTransparent");
+                is_local = true;
+            }
+        }
+    }
+    else if (mSettings->getSettingsType() == "sky")
+    {
+        LLSettingsSky::ptr_t sky = std::static_pointer_cast<LLSettingsSky>(mSettings);
+        if (sky)
+        {
+            if (LLLocalBitmapMgr::isLocal(sky->getSunTextureId()))
+            {
+                local_desc = LLTrans::getString("EnvironmentSun");
+                is_local = true;
+            }
+            else if (LLLocalBitmapMgr::isLocal(sky->getMoonTextureId()))
+            {
+                local_desc = LLTrans::getString("EnvironmentMoon");
+                is_local = true;
+            }
+            else if (LLLocalBitmapMgr::isLocal(sky->getCloudNoiseTextureId()))
+            {
+                local_desc = LLTrans::getString("EnvironmentCloudNoise");
+                is_local = true;
+            }
+            else if (LLLocalBitmapMgr::isLocal(sky->getBloomTextureId()))
+            {
+                local_desc = LLTrans::getString("EnvironmentBloom");
+                is_local = true;
+            }
+        }
+    }
+
+    if (is_local)
+    {
+        LLSD args;
+        args["FIELD"] = local_desc;
+        LLNotificationsUtil::add("WLLocalTextureFixedBlock", args);
+        return;
+    }
+
     if (ctrl_action == ACTION_SAVE)
     {
         doApplyUpdateInventory();
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
index 760325b652..47b6da708c 100644
--- a/indra/newview/lllocalbitmaps.cpp
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -976,6 +976,19 @@ LLUUID LLLocalBitmapMgr::getWorldID(LLUUID tracking_id)
 	return world_id;
 }
 
+bool LLLocalBitmapMgr::isLocal(const LLUUID world_id)
+{
+    for (local_list_iter iter = sBitmapList.begin(); iter != sBitmapList.end(); iter++)
+    {
+        LLLocalBitmap* unit = *iter;
+        if (unit->getWorldID() == world_id)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 std::string LLLocalBitmapMgr::getFilename(LLUUID tracking_id)
 {
 	std::string filename = "";
diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h
index ee4161fb45..3b33091fdb 100644
--- a/indra/newview/lllocalbitmaps.h
+++ b/indra/newview/lllocalbitmaps.h
@@ -123,6 +123,7 @@ class LLLocalBitmapMgr
 		static bool 		checkTextureDimensions(std::string filename);
 
 		static LLUUID       getWorldID(LLUUID tracking_id);
+		static bool         isLocal(const LLUUID world_id);
 		static std::string  getFilename(LLUUID tracking_id);
 		
 		static void         feedScrollList(LLScrollListCtrl* ctrl);
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 0d8c9a988a..972b849510 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -258,7 +258,6 @@ BOOL LLPanelSettingsSkyCloudTab::postBuild()
     getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudMapChanged(); });
     getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setDefaultImageAssetID(LLSettingsSky::GetDefaultCloudNoiseTextureId());
     getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setAllowNoTexture(TRUE);
-    getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setAllowLocalTexture(FALSE);
 
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_X)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudDensityChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudDensityChanged(); });
@@ -348,7 +347,8 @@ void LLPanelSettingsSkyCloudTab::onCloudScrollChanged()
 
 void LLPanelSettingsSkyCloudTab::onCloudMapChanged()
 {
-    mSkySettings->setCloudNoiseTextureId(getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->getValue().asUUID());
+    LLTextureCtrl* ctrl = getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP);
+    mSkySettings->setCloudNoiseTextureId(ctrl->getValue().asUUID());
     setIsDirty();
 }
 
@@ -391,13 +391,11 @@ BOOL LLPanelSettingsSkySunMoonTab::postBuild()
     getChild<LLTextureCtrl>(FIELD_SKY_SUN_IMAGE)->setBlankImageAssetID(LLSettingsSky::GetBlankSunTextureId());
     getChild<LLTextureCtrl>(FIELD_SKY_SUN_IMAGE)->setDefaultImageAssetID(LLSettingsSky::GetBlankSunTextureId());
     getChild<LLTextureCtrl>(FIELD_SKY_SUN_IMAGE)->setAllowNoTexture(TRUE);
-    getChild<LLTextureCtrl>(FIELD_SKY_SUN_IMAGE)->setAllowLocalTexture(FALSE);
     getChild<LLUICtrl>(FIELD_SKY_MOON_ROTATION)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonRotationChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_MOON_IMAGE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonImageChanged(); });
     getChild<LLTextureCtrl>(FIELD_SKY_MOON_IMAGE)->setDefaultImageAssetID(LLSettingsSky::GetDefaultMoonTextureId());
     getChild<LLTextureCtrl>(FIELD_SKY_MOON_IMAGE)->setBlankImageAssetID(LLSettingsSky::GetBlankSunTextureId());
     getChild<LLTextureCtrl>(FIELD_SKY_MOON_IMAGE)->setAllowNoTexture(TRUE);
-    getChild<LLTextureCtrl>(FIELD_SKY_MOON_IMAGE)->setAllowLocalTexture(FALSE);
     getChild<LLUICtrl>(FIELD_SKY_MOON_SCALE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonScaleChanged(); });
     getChild<LLUICtrl>(FIELD_SKY_MOON_BRIGHTNESS)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMoonBrightnessChanged(); });
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 69503cdbf2..23e1701dc6 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6071,6 +6071,22 @@ This day cycle file references a missing sky file: [SKY].
 Sorry, the settings couldn't be applied to the region. Reason: [FAIL_REASON]
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="WLLocalTextureDayBlock"
+   type="alertmodal">
+A Local texture is in use on track [TRACK], frame #[FRAMENO] ([FRAME]%) in field [FIELD].
+Settings may not be saved using local textures.
+  </notification>
+    
+  <notification
+   icon="alertmodal.tga"
+   name="WLLocalTextureFixedBlock"
+   type="alertmodal">
+A local texture is in use in field [FIELD].
+Settings may not be saved using local textures.
+  </notification>
+
   <notification
    functor="GenericAcknowledge"
    icon="alertmodal.tga"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 8681c867bd..39c2cb79ad 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2782,6 +2782,13 @@ If you continue to receive this message, please contact Second Life support for
 	<string name="RegionSettings">Region Settings</string>
 	<string name="NoEnvironmentSettings">This Region does not support environmental settings.</string>
 
+	<string name="EnvironmentSun">Sun</string>
+	<string name="EnvironmentMoon">Moon</string>
+	<string name="EnvironmentBloom">Bloom</string>
+	<string name="EnvironmentCloudNoise">Cloud Noise</string>
+	<string name="EnvironmentNormalMap">Normal Map</string>
+	<string name="EnvironmentTransparent">Transparent</string>
+
 	<!-- panel classified -->
 	<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
 	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-- 
cgit v1.2.3


From 83b508a656aebedff915b2fdcd292432a8aaa7b2 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Tue, 9 Oct 2018 21:36:25 +0300
Subject: Backed out SL-9733 - more work needs to be done

---
 indra/newview/llinventorypanel.cpp                 | 408 ++++++++-------------
 indra/newview/llinventorypanel.h                   |   4 +-
 .../default/xui/en/floater_my_environments.xml     |   5 +-
 .../default/xui/en/floater_settings_picker.xml     |   5 +-
 4 files changed, 164 insertions(+), 258 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index d8c2de649e..002c7a3215 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -46,18 +46,12 @@
 #include "llnotificationsutil.h"
 #include "llpreview.h"
 #include "llsidepanelinventory.h"
-#include "llstartup.h"
 #include "lltrans.h"
 #include "llviewerattachmenu.h"
 #include "llviewerfoldertype.h"
 #include "llvoavatarself.h"
 
-class LLInventoryRecentItemsPanel;
-class LLAssetFilteredInventoryPanel;
-
 static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
-static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
-static LLDefaultChildRegistry::Register<LLAssetFilteredInventoryPanel> t_asset_filtered_inv_panel("asset_filtered_inv_panel");
 
 const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
 const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
@@ -277,9 +271,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
 	mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
 	mInventory->addObserver(mCompletionObserver);
 
-	// Build view of inventory if we need default full hierarchy and inventory ready, otherwise do in onIdle.
-	// Initializing views takes a while so always do it onIdle if viewer already loaded.
-	if (mInventory->isInventoryUsable() && !mViewsInitialized && LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
+	// Build view of inventory if we need default full hierarchy and inventory ready,
+	// otherwise wait for idle callback.
+	if (mInventory->isInventoryUsable() && !mViewsInitialized)
 	{
 		initializeViews();
 	}
@@ -457,204 +451,198 @@ LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
 	return getFilter().getShowFolderState();
 }
 
-void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item)
+// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
+static LLTrace::BlockTimerStatHandle FTM_REFRESH("Inventory Refresh");
+void LLInventoryPanel::modelChanged(U32 mask)
 {
-	LLFolderViewItem* view_item = getItemByID(item_id);
-	LLFolderViewModelItemInventory* viewmodel_item = 
-		static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
+	LL_RECORD_BLOCK_TIME(FTM_REFRESH);
 
-	// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item
-	// to folder is the fast way to get a folder without searching through folders tree.
-	LLFolderViewFolder* view_folder = NULL;
+	if (!mViewsInitialized) return;
+	
+	const LLInventoryModel* model = getModel();
+	if (!model) return;
 
-	// Check requires as this item might have already been deleted
-	// as a child of its deleted parent.
-	if (model_item && view_item)
-	{
-		view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
-	}
+	const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
+	if (changed_items.empty()) return;
 
-	//////////////////////////////
-	// LABEL Operation
-	// Empty out the display name for relabel.
-	if (mask & LLInventoryObserver::LABEL)
+	for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+		 items_iter != changed_items.end();
+		 ++items_iter)
 	{
-		if (view_item)
-		{
-			// Request refresh on this item (also flags for filtering)
-			LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();
-			if(bridge)
-			{
-				// Clear the display name first, so it gets properly re-built during refresh()
-				bridge->clearDisplayName();
+		const LLUUID& item_id = (*items_iter);
+		const LLInventoryObject* model_item = model->getObject(item_id);
+		LLFolderViewItem* view_item = getItemByID(item_id);
+		LLFolderViewModelItemInventory* viewmodel_item = 
+			static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
 
-				view_item->refresh();
-			}
-			LLFolderViewFolder* parent = view_item->getParentFolder();
-			if(parent)
-			{
-				parent->getViewModelItem()->dirtyDescendantsFilter();
-			}
-		}
-	}
+		// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item
+		// to folder is the fast way to get a folder without searching through folders tree.
+		LLFolderViewFolder* view_folder = NULL;
 
-	//////////////////////////////
-	// REBUILD Operation
-	// Destroy and regenerate the UI.
-	if (mask & LLInventoryObserver::REBUILD)
-	{
-		if (model_item && view_item && viewmodel_item)
+		// Check requires as this item might have already been deleted
+		// as a child of its deleted parent.
+		if (model_item && view_item)
 		{
-			const LLUUID& idp = viewmodel_item->getUUID();
-			view_item->destroyView();
-			removeItemID(idp);
+			view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
 		}
-		view_item = buildNewViews(item_id);
-		viewmodel_item = 
-			static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
-		view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
-	}
 
-	//////////////////////////////
-	// INTERNAL Operation
-	// This could be anything.  For now, just refresh the item.
-	if (mask & LLInventoryObserver::INTERNAL)
-	{
-		if (view_item)
+		//////////////////////////////
+		// LABEL Operation
+		// Empty out the display name for relabel.
+		if (mask & LLInventoryObserver::LABEL)
 		{
-			view_item->refresh();
+			if (view_item)
+			{
+				// Request refresh on this item (also flags for filtering)
+				LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();
+				if(bridge)
+				{	// Clear the display name first, so it gets properly re-built during refresh()
+					bridge->clearDisplayName();
+
+					view_item->refresh();
+				}
+				LLFolderViewFolder* parent = view_item->getParentFolder();
+				if(parent)
+				{
+					parent->getViewModelItem()->dirtyDescendantsFilter();
+				}
+			}
 		}
-	}
 
-	//////////////////////////////
-	// SORT Operation
-	// Sort the folder.
-	if (mask & LLInventoryObserver::SORT)
-	{
-		if (view_folder)
+		//////////////////////////////
+		// REBUILD Operation
+		// Destroy and regenerate the UI.
+		if (mask & LLInventoryObserver::REBUILD)
 		{
-			view_folder->getViewModelItem()->requestSort();
+			if (model_item && view_item && viewmodel_item)
+			{
+				const LLUUID& idp = viewmodel_item->getUUID();
+				view_item->destroyView();
+				removeItemID(idp);
+			}
+			view_item = buildNewViews(item_id);
+			viewmodel_item = 
+				static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
+			view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
 		}
-	}
 
-	// We don't typically care which of these masks the item is actually flagged with, since the masks
-	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
-	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
-	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
-	// resynchronized.
-	if (mask & (LLInventoryObserver::STRUCTURE |
-				LLInventoryObserver::ADD |
-				LLInventoryObserver::REMOVE))
-	{
 		//////////////////////////////
-		// ADD Operation
-		// Item exists in memory but a UI element hasn't been created for it.
-		if (model_item && !view_item)
+		// INTERNAL Operation
+		// This could be anything.  For now, just refresh the item.
+		if (mask & LLInventoryObserver::INTERNAL)
 		{
-			// Add the UI element for this item.
-			buildNewViews(item_id);
-			// Select any newly created object that has the auto rename at top of folder root set.
-			if(mFolderRoot.get()->getRoot()->needsAutoRename())
+			if (view_item)
 			{
-				setSelection(item_id, FALSE);
+				view_item->refresh();
 			}
-			updateFolderLabel(model_item->getParentUUID());
 		}
 
 		//////////////////////////////
-		// STRUCTURE Operation
-		// This item already exists in both memory and UI.  It was probably reparented.
-		else if (model_item && view_item)
+		// SORT Operation
+		// Sort the folder.
+		if (mask & LLInventoryObserver::SORT)
 		{
-			LLFolderViewFolder* old_parent = view_item->getParentFolder();
-			// Don't process the item if it is the root
-			if (old_parent)
+			if (view_folder)
 			{
-				LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent->getViewModelItem());
-				LLFolderViewFolder* new_parent =   (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
-				// Item has been moved.
-				if (old_parent != new_parent)
+				view_folder->getViewModelItem()->requestSort();
+			}
+		}	
+
+		// We don't typically care which of these masks the item is actually flagged with, since the masks
+		// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+		// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+		// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
+		// resynchronized.
+		if (mask & (LLInventoryObserver::STRUCTURE |
+					LLInventoryObserver::ADD |
+					LLInventoryObserver::REMOVE))
+		{
+			//////////////////////////////
+			// ADD Operation
+			// Item exists in memory but a UI element hasn't been created for it.
+			if (model_item && !view_item)
+			{
+				// Add the UI element for this item.
+				buildNewViews(item_id);
+				// Select any newly created object that has the auto rename at top of folder root set.
+				if(mFolderRoot.get()->getRoot()->needsAutoRename())
 				{
-					if (new_parent != NULL)
+					setSelection(item_id, FALSE);
+				}
+				updateFolderLabel(model_item->getParentUUID());
+			}
+
+			//////////////////////////////
+			// STRUCTURE Operation
+			// This item already exists in both memory and UI.  It was probably reparented.
+			else if (model_item && view_item)
+			{
+				LLFolderViewFolder* old_parent = view_item->getParentFolder();
+				// Don't process the item if it is the root
+				if (old_parent)
+				{
+					LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent->getViewModelItem());
+					LLFolderViewFolder* new_parent =   (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
+					// Item has been moved.
+					if (old_parent != new_parent)
 					{
-						// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
-						view_item->addToFolder(new_parent);
-						addItemID(viewmodel_item->getUUID(), view_item);
-						if (mInventory)
+						if (new_parent != NULL)
 						{
-							const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-							if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen())
+							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+							view_item->addToFolder(new_parent);
+							addItemID(viewmodel_item->getUUID(), view_item);
+							if (mInventory)
 							{
-								setSelection(item_id, FALSE);
+								const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+								if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen())
+								{
+									setSelection(item_id, FALSE);
+								}
 							}
+							updateFolderLabel(model_item->getParentUUID());
 						}
-						updateFolderLabel(model_item->getParentUUID());
-					}
-					else 
-					{
-						// Remove the item ID before destroying the view because the view-model-item gets
-						// destroyed when the view is destroyed
-						removeItemID(viewmodel_item->getUUID());
+						else 
+						{
+							// Remove the item ID before destroying the view because the view-model-item gets
+							// destroyed when the view is destroyed
+                            removeItemID(viewmodel_item->getUUID());
 
-						// 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();
-					}
-					if(viewmodel_folder)
-					{
-						updateFolderLabel(viewmodel_folder->getUUID());
+							// 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();
+						}
+						if(viewmodel_folder)
+						{
+							updateFolderLabel(viewmodel_folder->getUUID());
+						}
+						old_parent->getViewModelItem()->dirtyDescendantsFilter();
 					}
-					old_parent->getViewModelItem()->dirtyDescendantsFilter();
 				}
 			}
-		}
-
-		//////////////////////////////
-		// REMOVE Operation
-		// This item has been removed from memory, but its associated UI element still exists.
-		else if (!model_item && view_item && viewmodel_item)
-		{
-			// Remove the item's UI.
-			LLFolderViewFolder* parent = view_item->getParentFolder();
-			removeItemID(viewmodel_item->getUUID());
-			view_item->destroyView();
-			if(parent)
+			
+			//////////////////////////////
+			// REMOVE Operation
+			// This item has been removed from memory, but its associated UI element still exists.
+			else if (!model_item && view_item && viewmodel_item)
 			{
-				parent->getViewModelItem()->dirtyDescendantsFilter();
-				LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
-				if(viewmodel_folder)
+				// Remove the item's UI.
+				LLFolderViewFolder* parent = view_item->getParentFolder();
+				removeItemID(viewmodel_item->getUUID());
+				view_item->destroyView();
+				if(parent)
 				{
-					updateFolderLabel(viewmodel_folder->getUUID());
+					parent->getViewModelItem()->dirtyDescendantsFilter();
+					LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
+					if(viewmodel_folder)
+					{
+						updateFolderLabel(viewmodel_folder->getUUID());
+					}
 				}
 			}
 		}
 	}
 }
 
-// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
-static LLTrace::BlockTimerStatHandle FTM_REFRESH("Inventory Refresh");
-void LLInventoryPanel::modelChanged(U32 mask)
-{
-	LL_RECORD_BLOCK_TIME(FTM_REFRESH);
-
-	if (!mViewsInitialized) return;
-	
-	const LLInventoryModel* model = getModel();
-	if (!model) return;
-
-	const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
-	if (changed_items.empty()) return;
-
-	for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
-		 items_iter != changed_items.end();
-		 ++items_iter)
-	{
-		const LLUUID& item_id = (*items_iter);
-		const LLInventoryObject* model_item = model->getObject(item_id);
-		itemChanged(item_id, mask, model_item);
-	}
-}
-
 LLUUID LLInventoryPanel::getRootFolderID()
 {
     LLUUID root_id;
@@ -849,17 +837,14 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
 
 LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
 {
-    LLInventoryObject const* objectp = gInventory.getObject(id);
-    return buildNewViews(id, objectp);
-}
-
-LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryObject const* objectp)
-{
-    if (!objectp)
+ 	LLInventoryObject const* objectp = gInventory.getObject(id);
+	
+	if (!objectp)
     {
         return NULL;
     }
-    LLFolderViewItem* folder_view_item = getItemByID(id);
+
+	LLFolderViewItem* folder_view_item = getItemByID(id);
 
     const LLUUID &parent_id = objectp->getParentUUID();
 	LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
@@ -988,7 +973,6 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryO
 				 ++item_iter)
 			{
 				const LLViewerInventoryItem* item = (*item_iter);
-                if (item->getType() == LLAssetType::AT_SETTINGS)
 				buildNewViews(item->getUUID());
 			}
 		}
@@ -1716,6 +1700,8 @@ bool LLInventoryPanel::isSelectionRemovable()
 /************************************************************************/
 /* Recent Inventory Panel related class                                 */
 /************************************************************************/
+class LLInventoryRecentItemsPanel;
+static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
 
 static const LLRecentInventoryBridgeBuilder RECENT_ITEMS_BUILDER;
 class LLInventoryRecentItemsPanel : public LLInventoryPanel
@@ -1745,82 +1731,6 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
 }
 
-/************************************************************************/
-/* Asset Pre-Filtered Inventory Panel related class                     */
-/* Exchanges filter's flexibility for speed of generation and           */
-/* improved performance                                                 */
-/************************************************************************/
-class LLAssetFilteredInventoryPanel : public LLInventoryPanel
-{
-public:
-    struct Params
-        : public LLInitParam::Block<Params, LLInventoryPanel::Params>
-    {
-        Mandatory<std::string>	filter_asset_type;
-
-        Params() : filter_asset_type("filter_asset_type") {}
-    };
-
-    void initFromParams(const Params& p);
-protected:
-    LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) { mAcceptsDragAndDrop = false; }
-    friend class LLUICtrlFactory;
-public:
-    ~LLAssetFilteredInventoryPanel() {}
-
-protected:
-    /*virtual*/ LLFolderViewItem*	buildNewViews(const LLUUID& id);
-    /*virtual*/ void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item);
-
-private:
-    LLAssetType::EType mAssetType;
-};
-
-
-void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
-{
-    mAssetType = LLAssetType::lookup(p.filter_asset_type.getValue());
-    LLInventoryPanel::initFromParams(p);
-    U64 filter_cats = getFilter().getFilterCategoryTypes();
-    filter_cats &= ~(1ULL << LLFolderType::FT_TRASH);
-    filter_cats &= ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS);
-    getFilter().setFilterCategoryTypes(filter_cats);
-    // turn off marketplace for recent items
-    getFilter().setFilterNoMarketplaceFolder();
-}
-
-LLFolderViewItem*	LLAssetFilteredInventoryPanel::buildNewViews(const LLUUID& id)
-{
-    LLInventoryObject const* objectp = gInventory.getObject(id);
-
-    if (!objectp)
-    {
-        return NULL;
-    }
-
-    if (objectp->getType() != mAssetType && objectp->getType() != LLAssetType::AT_CATEGORY)
-    {
-        return NULL;
-    }
-
-    return LLInventoryPanel::buildNewViews(id, objectp);
-}
-
-void	LLAssetFilteredInventoryPanel::itemChanged(const LLUUID& id, U32 mask, const LLInventoryObject* model_item)
-{
-    if (!model_item)
-    {
-        return;
-    }
-
-    if (model_item->getType() != mAssetType && model_item->getType() != LLAssetType::AT_CATEGORY)
-    {
-        return;
-    }
-
-    LLInventoryPanel::itemChanged(id, mask, model_item);
-}
-
 namespace LLInitParam
 {
 	void TypeValues<LLFolderType::EType>::declareValues()
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index b968b19d9a..90fd659522 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -319,9 +319,7 @@ protected:
 	static LLUIColor			sLibraryColor;
 	static LLUIColor			sLinkColor;
 	
-	virtual LLFolderViewItem*	buildNewViews(const LLUUID& id);
-	LLFolderViewItem*			buildNewViews(const LLUUID& id, LLInventoryObject const* objectp);
-	virtual void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item);
+	LLFolderViewItem*	buildNewViews(const LLUUID& id);
 	BOOL				getIsHiddenFolderType(LLFolderType::EType folder_type) const;
 	
     virtual LLFolderView * createFolderRoot(LLUUID root_id );
diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml
index 4384c01033..a11a2c1200 100644
--- a/indra/newview/skins/default/xui/en/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml
@@ -102,7 +102,7 @@
                     background_visible="true"
                     bg_alpha_color="DkGray2"
                     border="true">
-                <asset_filtered_inv_panel
+                <inventory_panel
                        left="0"
                        top="0"
                        right="-1"
@@ -110,8 +110,7 @@
                        allow_multi_select="false"
                        follows="all"
                        layout="topleft"
-                       name="pnl_settings"
-                       filter_asset_type="settings"/>
+                       name="pnl_settings"/>
             </panel>
         </layout_panel>
         <layout_panel
diff --git a/indra/newview/skins/default/xui/en/floater_settings_picker.xml b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
index 7cc2c517ca..2862d1ae37 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
@@ -57,7 +57,7 @@
               bottom="-2"
               background_visible="true"
               bg_alpha_color="DkGray2">
-                <asset_filtered_inv_panel
+                <inventory_panel
                     allow_multi_select="false"
                     suppress_folder_menu="true"
                     bg_visible="true"
@@ -68,8 +68,7 @@
                     name="pnl_inventory"
                     top="1"
                     right="-4"
-                    bottom="-1"
-                    filter_asset_type="settings" />
+                    bottom="-1" />
             </panel>
         </layout_panel>
         <layout_panel name="temp"
-- 
cgit v1.2.3


From fdde250d58403c00f3b74f7503b48f624bbdf408 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 10 Oct 2018 16:10:16 +0300
Subject: SL-9733 Added prefiltered inventory panel to prevent creation of
 unneeded views

---
 indra/newview/llinventorypanel.cpp                 | 406 +++++++++++++--------
 indra/newview/llinventorypanel.h                   |   4 +-
 .../default/xui/en/floater_my_environments.xml     |   5 +-
 .../default/xui/en/floater_settings_picker.xml     |   5 +-
 .../skins/default/xui/en/floater_texture_ctrl.xml  |   5 +-
 5 files changed, 259 insertions(+), 166 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 002c7a3215..fb010fa858 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -46,12 +46,18 @@
 #include "llnotificationsutil.h"
 #include "llpreview.h"
 #include "llsidepanelinventory.h"
+#include "llstartup.h"
 #include "lltrans.h"
 #include "llviewerattachmenu.h"
 #include "llviewerfoldertype.h"
 #include "llvoavatarself.h"
 
+class LLInventoryRecentItemsPanel;
+class LLAssetFilteredInventoryPanel;
+
 static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
+static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
+static LLDefaultChildRegistry::Register<LLAssetFilteredInventoryPanel> t_asset_filtered_inv_panel("asset_filtered_inv_panel");
 
 const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
 const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
@@ -271,9 +277,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
 	mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
 	mInventory->addObserver(mCompletionObserver);
 
-	// Build view of inventory if we need default full hierarchy and inventory ready,
-	// otherwise wait for idle callback.
-	if (mInventory->isInventoryUsable() && !mViewsInitialized)
+	// Build view of inventory if we need default full hierarchy and inventory ready, otherwise do in onIdle.
+	// Initializing views takes a while so always do it onIdle if viewer already loaded.
+	if (mInventory->isInventoryUsable() && !mViewsInitialized && LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
 	{
 		initializeViews();
 	}
@@ -451,198 +457,204 @@ LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
 	return getFilter().getShowFolderState();
 }
 
-// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
-static LLTrace::BlockTimerStatHandle FTM_REFRESH("Inventory Refresh");
-void LLInventoryPanel::modelChanged(U32 mask)
+void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item)
 {
-	LL_RECORD_BLOCK_TIME(FTM_REFRESH);
+	LLFolderViewItem* view_item = getItemByID(item_id);
+	LLFolderViewModelItemInventory* viewmodel_item = 
+		static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
 
-	if (!mViewsInitialized) return;
-	
-	const LLInventoryModel* model = getModel();
-	if (!model) return;
+	// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item
+	// to folder is the fast way to get a folder without searching through folders tree.
+	LLFolderViewFolder* view_folder = NULL;
 
-	const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
-	if (changed_items.empty()) return;
+	// Check requires as this item might have already been deleted
+	// as a child of its deleted parent.
+	if (model_item && view_item)
+	{
+		view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
+	}
 
-	for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
-		 items_iter != changed_items.end();
-		 ++items_iter)
+	//////////////////////////////
+	// LABEL Operation
+	// Empty out the display name for relabel.
+	if (mask & LLInventoryObserver::LABEL)
 	{
-		const LLUUID& item_id = (*items_iter);
-		const LLInventoryObject* model_item = model->getObject(item_id);
-		LLFolderViewItem* view_item = getItemByID(item_id);
-		LLFolderViewModelItemInventory* viewmodel_item = 
-			static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
+		if (view_item)
+		{
+			// Request refresh on this item (also flags for filtering)
+			LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();
+			if(bridge)
+			{
+				// Clear the display name first, so it gets properly re-built during refresh()
+				bridge->clearDisplayName();
 
-		// LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item
-		// to folder is the fast way to get a folder without searching through folders tree.
-		LLFolderViewFolder* view_folder = NULL;
+				view_item->refresh();
+			}
+			LLFolderViewFolder* parent = view_item->getParentFolder();
+			if(parent)
+			{
+				parent->getViewModelItem()->dirtyDescendantsFilter();
+			}
+		}
+	}
 
-		// Check requires as this item might have already been deleted
-		// as a child of its deleted parent.
-		if (model_item && view_item)
+	//////////////////////////////
+	// REBUILD Operation
+	// Destroy and regenerate the UI.
+	if (mask & LLInventoryObserver::REBUILD)
+	{
+		if (model_item && view_item && viewmodel_item)
 		{
-			view_folder = dynamic_cast<LLFolderViewFolder*>(view_item);
+			const LLUUID& idp = viewmodel_item->getUUID();
+			view_item->destroyView();
+			removeItemID(idp);
 		}
+		view_item = buildNewViews(item_id);
+		viewmodel_item = 
+			static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
+		view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
+	}
 
-		//////////////////////////////
-		// LABEL Operation
-		// Empty out the display name for relabel.
-		if (mask & LLInventoryObserver::LABEL)
+	//////////////////////////////
+	// INTERNAL Operation
+	// This could be anything.  For now, just refresh the item.
+	if (mask & LLInventoryObserver::INTERNAL)
+	{
+		if (view_item)
 		{
-			if (view_item)
-			{
-				// Request refresh on this item (also flags for filtering)
-				LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getViewModelItem();
-				if(bridge)
-				{	// Clear the display name first, so it gets properly re-built during refresh()
-					bridge->clearDisplayName();
-
-					view_item->refresh();
-				}
-				LLFolderViewFolder* parent = view_item->getParentFolder();
-				if(parent)
-				{
-					parent->getViewModelItem()->dirtyDescendantsFilter();
-				}
-			}
+			view_item->refresh();
 		}
+	}
 
-		//////////////////////////////
-		// REBUILD Operation
-		// Destroy and regenerate the UI.
-		if (mask & LLInventoryObserver::REBUILD)
+	//////////////////////////////
+	// SORT Operation
+	// Sort the folder.
+	if (mask & LLInventoryObserver::SORT)
+	{
+		if (view_folder)
 		{
-			if (model_item && view_item && viewmodel_item)
-			{
-				const LLUUID& idp = viewmodel_item->getUUID();
-				view_item->destroyView();
-				removeItemID(idp);
-			}
-			view_item = buildNewViews(item_id);
-			viewmodel_item = 
-				static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
-			view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
+			view_folder->getViewModelItem()->requestSort();
 		}
+	}
 
+	// We don't typically care which of these masks the item is actually flagged with, since the masks
+	// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+	// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+	// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
+	// resynchronized.
+	if (mask & (LLInventoryObserver::STRUCTURE |
+				LLInventoryObserver::ADD |
+				LLInventoryObserver::REMOVE))
+	{
 		//////////////////////////////
-		// INTERNAL Operation
-		// This could be anything.  For now, just refresh the item.
-		if (mask & LLInventoryObserver::INTERNAL)
+		// ADD Operation
+		// Item exists in memory but a UI element hasn't been created for it.
+		if (model_item && !view_item)
 		{
-			if (view_item)
+			// Add the UI element for this item.
+			buildNewViews(item_id);
+			// Select any newly created object that has the auto rename at top of folder root set.
+			if(mFolderRoot.get()->getRoot()->needsAutoRename())
 			{
-				view_item->refresh();
+				setSelection(item_id, FALSE);
 			}
+			updateFolderLabel(model_item->getParentUUID());
 		}
 
 		//////////////////////////////
-		// SORT Operation
-		// Sort the folder.
-		if (mask & LLInventoryObserver::SORT)
+		// STRUCTURE Operation
+		// This item already exists in both memory and UI.  It was probably reparented.
+		else if (model_item && view_item)
 		{
-			if (view_folder)
+			LLFolderViewFolder* old_parent = view_item->getParentFolder();
+			// Don't process the item if it is the root
+			if (old_parent)
 			{
-				view_folder->getViewModelItem()->requestSort();
-			}
-		}	
-
-		// We don't typically care which of these masks the item is actually flagged with, since the masks
-		// may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
-		// Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
-		// panel).  What's relevant is that the item and UI are probably out of sync and thus need to be
-		// resynchronized.
-		if (mask & (LLInventoryObserver::STRUCTURE |
-					LLInventoryObserver::ADD |
-					LLInventoryObserver::REMOVE))
-		{
-			//////////////////////////////
-			// ADD Operation
-			// Item exists in memory but a UI element hasn't been created for it.
-			if (model_item && !view_item)
-			{
-				// Add the UI element for this item.
-				buildNewViews(item_id);
-				// Select any newly created object that has the auto rename at top of folder root set.
-				if(mFolderRoot.get()->getRoot()->needsAutoRename())
+				LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent->getViewModelItem());
+				LLFolderViewFolder* new_parent =   (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
+				// Item has been moved.
+				if (old_parent != new_parent)
 				{
-					setSelection(item_id, FALSE);
-				}
-				updateFolderLabel(model_item->getParentUUID());
-			}
-
-			//////////////////////////////
-			// STRUCTURE Operation
-			// This item already exists in both memory and UI.  It was probably reparented.
-			else if (model_item && view_item)
-			{
-				LLFolderViewFolder* old_parent = view_item->getParentFolder();
-				// Don't process the item if it is the root
-				if (old_parent)
-				{
-					LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(old_parent->getViewModelItem());
-					LLFolderViewFolder* new_parent =   (LLFolderViewFolder*)getItemByID(model_item->getParentUUID());
-					// Item has been moved.
-					if (old_parent != new_parent)
+					if (new_parent != NULL)
 					{
-						if (new_parent != NULL)
+						// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+						view_item->addToFolder(new_parent);
+						addItemID(viewmodel_item->getUUID(), view_item);
+						if (mInventory)
 						{
-							// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
-							view_item->addToFolder(new_parent);
-							addItemID(viewmodel_item->getUUID(), view_item);
-							if (mInventory)
+							const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+							if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen())
 							{
-								const LLUUID trash_id = mInventory->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-								if (trash_id != model_item->getParentUUID() && (mask & LLInventoryObserver::INTERNAL) && new_parent->isOpen())
-								{
-									setSelection(item_id, FALSE);
-								}
+								setSelection(item_id, FALSE);
 							}
-							updateFolderLabel(model_item->getParentUUID());
 						}
-						else 
-						{
-							// Remove the item ID before destroying the view because the view-model-item gets
-							// destroyed when the view is destroyed
-                            removeItemID(viewmodel_item->getUUID());
+						updateFolderLabel(model_item->getParentUUID());
+					}
+					else 
+					{
+						// Remove the item ID before destroying the view because the view-model-item gets
+						// destroyed when the view is destroyed
+						removeItemID(viewmodel_item->getUUID());
 
-							// 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();
-						}
-						if(viewmodel_folder)
-						{
-							updateFolderLabel(viewmodel_folder->getUUID());
-						}
-						old_parent->getViewModelItem()->dirtyDescendantsFilter();
+						// 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();
 					}
-				}
-			}
-			
-			//////////////////////////////
-			// REMOVE Operation
-			// This item has been removed from memory, but its associated UI element still exists.
-			else if (!model_item && view_item && viewmodel_item)
-			{
-				// Remove the item's UI.
-				LLFolderViewFolder* parent = view_item->getParentFolder();
-				removeItemID(viewmodel_item->getUUID());
-				view_item->destroyView();
-				if(parent)
-				{
-					parent->getViewModelItem()->dirtyDescendantsFilter();
-					LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
 					if(viewmodel_folder)
 					{
 						updateFolderLabel(viewmodel_folder->getUUID());
 					}
+					old_parent->getViewModelItem()->dirtyDescendantsFilter();
+				}
+			}
+		}
+
+		//////////////////////////////
+		// REMOVE Operation
+		// This item has been removed from memory, but its associated UI element still exists.
+		else if (!model_item && view_item && viewmodel_item)
+		{
+			// Remove the item's UI.
+			LLFolderViewFolder* parent = view_item->getParentFolder();
+			removeItemID(viewmodel_item->getUUID());
+			view_item->destroyView();
+			if(parent)
+			{
+				parent->getViewModelItem()->dirtyDescendantsFilter();
+				LLFolderViewModelItemInventory* viewmodel_folder = static_cast<LLFolderViewModelItemInventory*>(parent->getViewModelItem());
+				if(viewmodel_folder)
+				{
+					updateFolderLabel(viewmodel_folder->getUUID());
 				}
 			}
 		}
 	}
 }
 
+// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
+static LLTrace::BlockTimerStatHandle FTM_REFRESH("Inventory Refresh");
+void LLInventoryPanel::modelChanged(U32 mask)
+{
+	LL_RECORD_BLOCK_TIME(FTM_REFRESH);
+
+	if (!mViewsInitialized) return;
+	
+	const LLInventoryModel* model = getModel();
+	if (!model) return;
+
+	const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
+	if (changed_items.empty()) return;
+
+	for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+		 items_iter != changed_items.end();
+		 ++items_iter)
+	{
+		const LLUUID& item_id = (*items_iter);
+		const LLInventoryObject* model_item = model->getObject(item_id);
+		itemChanged(item_id, mask, model_item);
+	}
+}
+
 LLUUID LLInventoryPanel::getRootFolderID()
 {
     LLUUID root_id;
@@ -837,14 +849,17 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
 
 LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
 {
- 	LLInventoryObject const* objectp = gInventory.getObject(id);
-	
-	if (!objectp)
+    LLInventoryObject const* objectp = gInventory.getObject(id);
+    return buildNewViews(id, objectp);
+}
+
+LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryObject const* objectp)
+{
+    if (!objectp)
     {
         return NULL;
     }
-
-	LLFolderViewItem* folder_view_item = getItemByID(id);
+    LLFolderViewItem* folder_view_item = getItemByID(id);
 
     const LLUUID &parent_id = objectp->getParentUUID();
 	LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
@@ -1700,8 +1715,6 @@ bool LLInventoryPanel::isSelectionRemovable()
 /************************************************************************/
 /* Recent Inventory Panel related class                                 */
 /************************************************************************/
-class LLInventoryRecentItemsPanel;
-static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
 
 static const LLRecentInventoryBridgeBuilder RECENT_ITEMS_BUILDER;
 class LLInventoryRecentItemsPanel : public LLInventoryPanel
@@ -1731,6 +1744,81 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
 	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
 }
 
+/************************************************************************/
+/* Asset Pre-Filtered Inventory Panel related class                     */
+/* Exchanges filter's flexibility for speed of generation and           */
+/* improved performance                                                 */
+/************************************************************************/
+class LLAssetFilteredInventoryPanel : public LLInventoryPanel
+{
+public:
+    struct Params
+        : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+    {
+        Mandatory<std::string>	filter_asset_type;
+
+        Params() : filter_asset_type("filter_asset_type") {}
+    };
+
+    void initFromParams(const Params& p);
+protected:
+    LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) { mAcceptsDragAndDrop = false; }
+    friend class LLUICtrlFactory;
+public:
+    ~LLAssetFilteredInventoryPanel() {}
+
+protected:
+    /*virtual*/ LLFolderViewItem*	buildNewViews(const LLUUID& id) override;
+    /*virtual*/ void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
+
+private:
+    LLAssetType::EType mAssetType;
+};
+
+
+void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
+{
+    mAssetType = LLAssetType::lookup(p.filter_asset_type.getValue());
+    LLInventoryPanel::initFromParams(p);
+    U64 filter_cats = getFilter().getFilterCategoryTypes();
+    filter_cats &= ~(1ULL << LLFolderType::FT_TRASH);
+    filter_cats &= ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS);
+    getFilter().setFilterCategoryTypes(filter_cats);
+    getFilter().setFilterNoMarketplaceFolder();
+}
+
+LLFolderViewItem* LLAssetFilteredInventoryPanel::buildNewViews(const LLUUID& id)
+{
+    LLInventoryObject const* objectp = gInventory.getObject(id);
+
+    if (!objectp)
+    {
+        return NULL;
+    }
+
+    if (objectp->getType() != mAssetType && objectp->getType() != LLAssetType::AT_CATEGORY)
+    {
+        return NULL;
+    }
+
+    return LLInventoryPanel::buildNewViews(id, objectp);
+}
+
+void LLAssetFilteredInventoryPanel::itemChanged(const LLUUID& id, U32 mask, const LLInventoryObject* model_item)
+{
+    if (!model_item)
+    {
+        return;
+    }
+
+    if (model_item->getType() != mAssetType && model_item->getType() != LLAssetType::AT_CATEGORY)
+    {
+        return;
+    }
+
+    LLInventoryPanel::itemChanged(id, mask, model_item);
+}
+
 namespace LLInitParam
 {
 	void TypeValues<LLFolderType::EType>::declareValues()
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 90fd659522..b968b19d9a 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -319,7 +319,9 @@ protected:
 	static LLUIColor			sLibraryColor;
 	static LLUIColor			sLinkColor;
 	
-	LLFolderViewItem*	buildNewViews(const LLUUID& id);
+	virtual LLFolderViewItem*	buildNewViews(const LLUUID& id);
+	LLFolderViewItem*			buildNewViews(const LLUUID& id, LLInventoryObject const* objectp);
+	virtual void				itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item);
 	BOOL				getIsHiddenFolderType(LLFolderType::EType folder_type) const;
 	
     virtual LLFolderView * createFolderRoot(LLUUID root_id );
diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml
index a11a2c1200..4384c01033 100644
--- a/indra/newview/skins/default/xui/en/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml
@@ -102,7 +102,7 @@
                     background_visible="true"
                     bg_alpha_color="DkGray2"
                     border="true">
-                <inventory_panel
+                <asset_filtered_inv_panel
                        left="0"
                        top="0"
                        right="-1"
@@ -110,7 +110,8 @@
                        allow_multi_select="false"
                        follows="all"
                        layout="topleft"
-                       name="pnl_settings"/>
+                       name="pnl_settings"
+                       filter_asset_type="settings"/>
             </panel>
         </layout_panel>
         <layout_panel
diff --git a/indra/newview/skins/default/xui/en/floater_settings_picker.xml b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
index 2862d1ae37..7cc2c517ca 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
@@ -57,7 +57,7 @@
               bottom="-2"
               background_visible="true"
               bg_alpha_color="DkGray2">
-                <inventory_panel
+                <asset_filtered_inv_panel
                     allow_multi_select="false"
                     suppress_folder_menu="true"
                     bg_visible="true"
@@ -68,7 +68,8 @@
                     name="pnl_inventory"
                     top="1"
                     right="-4"
-                    bottom="-1" />
+                    bottom="-1"
+                    filter_asset_type="settings" />
             </panel>
         </layout_panel>
         <layout_panel name="temp"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 53618b684b..90e2bb0923 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -152,7 +152,7 @@
      name="inventory search editor"
      top="20"
      width="231" />
-    <inventory_panel
+    <asset_filtered_inv_panel
      allow_multi_select="false"
      bg_visible="true"
      bg_alpha_color="DkGray2"
@@ -163,7 +163,8 @@
      left_delta="0"
      name="inventory panel"
      top_pad="4"
-     width="231" />
+     width="231"
+     filter_asset_type="texture"/>
      <check_box
      height="14"
      initial_value="false"
-- 
cgit v1.2.3


From 5c5d7eb1fee8194f02d86e76c1f1eadc161ff462 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 10 Oct 2018 16:11:44 +0300
Subject: =?UTF-8?q?SL-9850=20Show=20correct=20values=20for=20=E2=80=98Clou?=
 =?UTF-8?q?d=20Detail=E2=80=99=20settings?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 indra/newview/llpaneleditsky.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 1e1683c2e2..082097cdfb 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -317,7 +317,7 @@ void LLPanelSettingsSkyCloudTab::refresh()
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->setValue(cloudDensity[1]);
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_D)->setValue(cloudDensity[2]);
 
-    LLVector3 cloudDetail(mSkySettings->getCloudPosDensity1().getValue());
+    LLVector3 cloudDetail(mSkySettings->getCloudPosDensity2().getValue());
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_X)->setValue(cloudDetail[0]);
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_Y)->setValue(cloudDetail[1]);
     getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_D)->setValue(cloudDetail[2]);
-- 
cgit v1.2.3