From ac865de287b2e740acd9f6a8724301146df73ccf Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 25 Jan 2019 22:02:16 +0200
Subject: SL-1945 Day Cycle Editor Copy Track

---
 indra/llui/llfloater.cpp                           |  69 +++++++++++
 indra/llui/llfloater.h                             |  13 +++
 indra/newview/CMakeLists.txt                       |   2 +
 indra/newview/llfloateravatarpicker.cpp            |  55 +--------
 indra/newview/llfloatercolorpicker.cpp             |  52 +--------
 indra/newview/llfloatereditextdaycycle.cpp         |  60 +++++++++-
 indra/newview/llfloatereditextdaycycle.h           |   5 +
 indra/newview/llfloaterexperiencepicker.cpp        |  55 +--------
 indra/newview/llsettingspicker.cpp                 |  59 +---------
 indra/newview/llsettingspicker.h                   |   3 -
 indra/newview/lltexturectrl.cpp                    |  58 +--------
 indra/newview/lltrackpicker.cpp                    | 126 ++++++++++++++++++++
 indra/newview/lltrackpicker.h                      |  58 +++++++++
 .../skins/default/xui/en/floater_pick_track.xml    | 129 +++++++++++++++++++++
 14 files changed, 468 insertions(+), 276 deletions(-)
 create mode 100644 indra/newview/lltrackpicker.cpp
 create mode 100644 indra/newview/lltrackpicker.h
 create mode 100644 indra/newview/skins/default/xui/en/floater_pick_track.xml

(limited to 'indra')

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index a245dd8f78..d6c2c7bc55 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -37,6 +37,7 @@
 #include "lluictrlfactory.h"
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
+#include "llcriticaldamp.h" // LLSmoothInterpolation
 #include "lldir.h"
 #include "lldraghandle.h"
 #include "llfloaterreg.h"
@@ -64,6 +65,10 @@
 // use this to control "jumping" behavior when Ctrl-Tabbing
 const S32 TABBED_FLOATER_OFFSET = 0;
 
+const F32 LLFloater::CONTEXT_CONE_IN_ALPHA = 0.0f;
+const F32 LLFloater::CONTEXT_CONE_OUT_ALPHA = 1.f;
+const F32 LLFloater::CONTEXT_CONE_FADE_TIME = 0.08f;
+
 namespace LLInitParam
 {
 	void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues()
@@ -2116,6 +2121,70 @@ void LLFloater::updateTitleButtons()
 	}
 }
 
+void LLFloater::drawConeToOwner(F32 &context_cone_opacity,
+                                F32 max_cone_opacity,
+                                LLView *owner_view,
+                                F32 fade_time,
+                                F32 contex_cone_in_alpha,
+                                F32 contex_cone_out_alpha)
+{
+    if (owner_view
+        && owner_view->isInVisibleChain()
+        && hasFocus()
+        && context_cone_opacity > 0.001f
+        && gFocusMgr.childHasKeyboardFocus(this))
+    {
+        // draw cone of context pointing back to owner (e.x. texture swatch)
+        LLRect owner_rect;
+        owner_view->localRectToOtherView(owner_view->getLocalRect(), &owner_rect, this);
+        LLRect local_rect = getLocalRect();
+
+        gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+        LLGLEnable(GL_CULL_FACE);
+        gGL.begin(LLRender::QUADS);
+        {
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity);
+            gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
+            gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity);
+            gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+            gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity);
+            gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
+            gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity);
+            gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
+            gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
+
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity);
+            gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+            gGL.vertex2i(local_rect.mRight, local_rect.mTop);
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity);
+            gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
+            gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
+
+
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_out_alpha * context_cone_opacity);
+            gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
+            gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
+            gGL.color4f(0.f, 0.f, 0.f, contex_cone_in_alpha * context_cone_opacity);
+            gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
+            gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
+        }
+        gGL.end();
+    }
+
+    if (gFocusMgr.childHasMouseCapture(getDragHandle()))
+    {
+        context_cone_opacity = lerp(context_cone_opacity, max_cone_opacity, LLSmoothInterpolation::getInterpolant(fade_time));
+    }
+    else
+    {
+        context_cone_opacity = lerp(context_cone_opacity, 0.f, LLSmoothInterpolation::getInterpolant(fade_time));
+    }
+}
+
 void LLFloater::buildButtons(const Params& floater_params)
 {
 	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 165f67499b..f8c04e8a2f 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -395,6 +395,15 @@ protected:
 
 	virtual void	updateTitleButtons();
 
+	// Draws a cone from this floater to parent floater or view (owner)
+	// Modifies context_cone_opacity (interpolates according to fade time and returns new value)
+	void			drawConeToOwner(F32 &context_cone_opacity,
+									F32 max_cone_opacity,
+									LLView *owner_view,
+									F32 context_fade_time = CONTEXT_CONE_FADE_TIME,
+									F32 contex_cone_in_alpha = CONTEXT_CONE_IN_ALPHA,
+									F32 contex_cone_out_alpha = CONTEXT_CONE_OUT_ALPHA);
+
 private:
 	void			setForeground(BOOL b);	// called only by floaterview
 	void			cleanupHandles(); // remove handles to dead floaters
@@ -424,6 +433,10 @@ private:
 	void			updateTransparency(LLView* view, ETypeTransparency transparency_type);
 
 public:
+	static const F32 CONTEXT_CONE_IN_ALPHA;
+	static const F32 CONTEXT_CONE_OUT_ALPHA;
+	static const F32 CONTEXT_CONE_FADE_TIME;
+
 	// Called when floater is opened, passes mKey
 	// Public so external views or floaters can watch for this floater opening
 	commit_signal_t mOpenSignal;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 967ba2d8d9..9d4b58d216 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -605,6 +605,7 @@ set(viewer_SOURCE_FILES
     lltoolselectland.cpp
     lltoolselectrect.cpp
     lltracker.cpp
+    lltrackpicker.cpp
     lltransientdockablefloater.cpp
     lltransientfloatermgr.cpp
     lltranslate.cpp
@@ -1219,6 +1220,7 @@ set(viewer_HEADER_FILES
     lltoolselectland.h
     lltoolselectrect.h
     lltracker.h
+    lltrackpicker.h
     lltransientdockablefloater.h
     lltransientfloatermgr.h
     lltranslate.h
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index c5561fe011..abf7b7f39d 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -361,59 +361,8 @@ void LLFloaterAvatarPicker::populateFriend()
 
 void LLFloaterAvatarPicker::drawFrustum()
 {
-    if(mFrustumOrigin.get())
-    {
-        LLView * frustumOrigin = mFrustumOrigin.get();
-        LLRect origin_rect;
-        frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this);
-        // draw context cone connecting color picker with color swatch in parent floater
-        LLRect local_rect = getLocalRect();
-        if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f)
-        {
-            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-            LLGLEnable(GL_CULL_FACE);
-            gGL.begin(LLRender::QUADS);
-            {
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
-                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
-                gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
-
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-                gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-                gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
-                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
-
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-                gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-                gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-                gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
-                gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
-            }
-            gGL.end();
-        }
-
-        if (gFocusMgr.childHasMouseCapture(getDragHandle()))
-        {
-            mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(mContextConeFadeTime));
-        }
-        else
-        {
-            mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(mContextConeFadeTime));
-        }
-    }
+    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+    drawConeToOwner(mContextConeOpacity, max_opacity, mFrustumOrigin.get(), mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);
 }
 
 void LLFloaterAvatarPicker::draw()
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index ec2c9740af..1a784223c2 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -485,56 +485,8 @@ BOOL LLFloaterColorPicker::isColorChanged()
 //
 void LLFloaterColorPicker::draw()
 {
-	LLRect swatch_rect;
-	mSwatch->localRectToOtherView(mSwatch->getLocalRect(), &swatch_rect, this);
-	// draw context cone connecting color picker with color swatch in parent floater
-	LLRect local_rect = getLocalRect();
-	if (hasFocus() && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)
-	{
-		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-		LLGLEnable(GL_CULL_FACE);
-		gGL.begin(LLRender::QUADS);
-		{
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
-			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop);
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-			gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-			gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-			gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);
-			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
-
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-			gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-			gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mTop);
-			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom);
-
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-			gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-			gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-			gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-			gGL.vertex2i(swatch_rect.mRight, swatch_rect.mBottom);
-			gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mBottom);
-		}
-		gGL.end();
-	}
-
-	if (gFocusMgr.childHasMouseCapture(getDragHandle()))
-	{
-		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), 
-                                        LLSmoothInterpolation::getInterpolant(mContextConeFadeTime));
-	}
-	else
-	{
-		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(mContextConeFadeTime));
-	}
+	static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+	drawConeToOwner(mContextConeOpacity, max_opacity, mSwatch, mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);
 
 	mPipetteBtn->setToggleState(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
 	mApplyImmediateCheck->setEnabled(mActive && mCanApplyImmediately);
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index d6c104547d..33f3fcfecc 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -48,6 +48,7 @@
 #include "llviewerparcelmgr.h"
 
 #include "llsettingspicker.h"
+#include "lltrackpicker.h"
 
 // newview
 #include "llagent.h"
@@ -425,6 +426,7 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
 void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
 {
     doCloseInventoryFloater(app_quitting);
+    doCloseTrackFloater(app_quitting);
     // there's no point to change environment if we're quitting
     // or if we already restored environment
     stopPlay();
@@ -802,7 +804,7 @@ void LLFloaterEditExtDayCycle::onRemoveFrame()
 
 void LLFloaterEditExtDayCycle::onCloneTrack()
 {
-
+    doOpenTrackFloater();
 }
 
 
@@ -1228,8 +1230,7 @@ void LLFloaterEditExtDayCycle::updateButtons()
     }
 
     can_clear = (mCurrentTrack > 1) ? (!mEditDay->getCycleTrack(mCurrentTrack).empty()) : (mEditDay->getCycleTrack(mCurrentTrack).size() > 1);
-    mCloneTrack->setEnabled(can_clone && false);
-    mCloneTrack->setVisible(false);
+    mCloneTrack->setEnabled(can_clone);
     mLoadTrack->setEnabled(can_load);
     mClearTrack->setEnabled(can_clear);
 
@@ -1509,6 +1510,7 @@ void LLFloaterEditExtDayCycle::synchronizeTabs()
     mEditSky = psettingS;
 
     doCloseInventoryFloater();
+    doCloseTrackFloater();
 
     setTabsData(tabs, psettingS, canedit);
     LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, mEditSky, mEditWater);
@@ -1741,6 +1743,7 @@ bool LLFloaterEditExtDayCycle::canApplyParcel() const
 void LLFloaterEditExtDayCycle::startPlay()
 {
     doCloseInventoryFloater();
+    doCloseTrackFloater();
 
     mIsPlaying = true;
     mFramesSlider->resetCurSlider();
@@ -1814,6 +1817,55 @@ void LLFloaterEditExtDayCycle::clearDirtyFlag()
 
 }
 
+void LLFloaterEditExtDayCycle::doOpenTrackFloater()
+{
+    LLFloaterTrackPicker *picker = static_cast<LLFloaterTrackPicker *>(mTrackFloater.get());
+
+    // Show the dialog
+    if (!picker)
+    {
+        picker = new LLFloaterTrackPicker(this);
+
+        mTrackFloater = picker->getHandle();
+
+        picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitTrackId(data.asInteger()); });
+    }
+
+    const LLEnvironment::altitude_list_t &altitudes = LLEnvironment::instance().getRegionAltitudes();
+    bool use_altitudes = altitudes.size() > 0 && ((mEditContext == CONTEXT_PARCEL) || (mEditContext == CONTEXT_REGION));
+
+    LLSD args = LLSD::emptyArray();
+
+    for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++)
+    {
+        LLSD track;
+        track["id"] = LLSD::Integer(i);
+        track["enabled"] = !mEditDay->isTrackEmpty(i);
+        if (use_altitudes)
+        {
+            track["altitude"] = altitudes[i - 1];
+        }
+        args.append(track);
+    }
+
+    picker->showPicker(args);
+}
+
+void LLFloaterEditExtDayCycle::doCloseTrackFloater(bool quitting)
+{
+    LLFloater* floaterp = mTrackFloater.get();
+
+    if (floaterp)
+    {
+        floaterp->closeFloater(quitting);
+    }
+}
+
+void LLFloaterEditExtDayCycle::onPickerCommitTrackId(U32 track_id)
+{
+    cloneTrack(track_id, mCurrentTrack);
+}
+
 void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID curritem)
 {
 //  LLUI::sWindow->setCursor(UI_CURSOR_WAIT);
@@ -1832,9 +1884,9 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ
 
     picker->setSettingsFilter(type);
     picker->setSettingsItemId(curritem);
+    picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);
     picker->openFloater();
     picker->setFocus(TRUE);
-    picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);
 }
 
 void LLFloaterEditExtDayCycle::doCloseInventoryFloater(bool quitting)
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index e808ab8a46..d780d5c993 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -160,6 +160,10 @@ private:
     void                        onInventoryCreated(LLUUID asset_id, LLUUID inventory_id, LLSD results);
     void                        onInventoryUpdated(LLUUID asset_id, LLUUID inventory_id, LLSD results);
 
+    void                        doOpenTrackFloater();
+    void                        doCloseTrackFloater(bool quitting = false);
+    void                        onPickerCommitTrackId(U32 track_id);
+
     void                        doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID curritem);
     void                        doCloseInventoryFloater(bool quitting = false);
     void                        onPickerCommitSetting(LLUUID item_id, S32 track);
@@ -218,6 +222,7 @@ private:
     LLFlyoutComboBtnCtrl *      mFlyoutControl;
 
     LLHandle<LLFloater>         mInventoryFloater;
+    LLHandle<LLFloater>         mTrackFloater;
 
     LLTrackBlenderLoopingManual::ptr_t  mSkyBlender;
     LLTrackBlenderLoopingManual::ptr_t  mWaterBlender;
diff --git a/indra/newview/llfloaterexperiencepicker.cpp b/indra/newview/llfloaterexperiencepicker.cpp
index bb54c57baf..c642da7b83 100644
--- a/indra/newview/llfloaterexperiencepicker.cpp
+++ b/indra/newview/llfloaterexperiencepicker.cpp
@@ -74,59 +74,8 @@ LLFloaterExperiencePicker* LLFloaterExperiencePicker::show( select_callback_t ca
 
 void LLFloaterExperiencePicker::drawFrustum()
 {
-	if(mFrustumOrigin.get())
-	{
-		LLView * frustumOrigin = mFrustumOrigin.get();
-		LLRect origin_rect;
-		frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this);
-		// draw context cone connecting color picker with color swatch in parent floater
-		LLRect local_rect = getLocalRect();
-		if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f)
-		{
-			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-			LLGLEnable(GL_CULL_FACE);
-			gGL.begin(LLRender::QUADS);
-			{
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-				gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
-				gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-				gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
-				gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop);
-
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-				gGL.vertex2i(origin_rect.mRight, origin_rect.mTop);
-				gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
-
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-				gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity);
-				gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom);
-				gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom);
-			}
-			gGL.end();
-		}
-
-		if (gFocusMgr.childHasMouseCapture(getDragHandle()))
-		{
-			mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(mContextConeFadeTime));
-		}
-		else
-		{
-			mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime));
-		}
-	}
+    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+    drawConeToOwner(mContextConeOpacity, max_opacity, mFrustumOrigin.get(), mContextConeFadeTime, mContextConeInAlpha, mContextConeOutAlpha);
 }
 
 void LLFloaterExperiencePicker::draw()
diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp
index 7aa9cf0ae8..5812fc59cd 100644
--- a/indra/newview/llsettingspicker.cpp
+++ b/indra/newview/llsettingspicker.cpp
@@ -55,10 +55,6 @@ namespace
     const std::string BTN_SELECT("btn_select");
     const std::string BTN_CANCEL("btn_cancel");
 
-    const F32 CONTEXT_CONE_IN_ALPHA(0.0f);
-    const F32 CONTEXT_CONE_OUT_ALPHA(1.0f);
-    const F32 CONTEXT_FADE_TIME(0.08f);
-
     // strings in xml
 
     const std::string STR_TITLE_PREFIX = "pick title";
@@ -194,59 +190,8 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)
 void LLFloaterSettingsPicker::draw()
 {
     LLView *owner = mOwnerHandle.get();
-    if (owner)
-    {
-        // draw cone of context pointing back to texture swatch	
-        LLRect owner_rect;
-        owner->localRectToOtherView(owner->getLocalRect(), &owner_rect, this);
-        LLRect local_rect = getLocalRect();
-        if (gFocusMgr.childHasKeyboardFocus(this) && owner->isInVisibleChain() && mContextConeOpacity > 0.001f)
-        {
-            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-            LLGLEnable(GL_CULL_FACE);
-            gGL.begin(LLRender::QUADS);
-            {
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
-                gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
-                gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
-
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-                gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
-                gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
-
-
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-                gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-                gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-                gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
-                gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
-            }
-            gGL.end();
-        }
-    }
-
-    if (gFocusMgr.childHasMouseCapture(getDragHandle()))
-    {
-        mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
-    }
-    else
-    {
-        mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
-    }
+    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+    drawConeToOwner(mContextConeOpacity, max_opacity, owner);
 
     LLFloater::draw();
 }
diff --git a/indra/newview/llsettingspicker.h b/indra/newview/llsettingspicker.h
index 941fe752b0..f5aecf4417 100644
--- a/indra/newview/llsettingspicker.h
+++ b/indra/newview/llsettingspicker.h
@@ -45,7 +45,6 @@ class LLInventoryPanel;
 class LLFloaterSettingsPicker : public LLFloater
 {
 public:
-    typedef std::function<void (LLUUID id)>                 commit_callback_t;
     typedef std::function<void()>                           close_callback_t;
     typedef std::function<void(const LLUUID& item_id)>     id_changed_callback_t;
 
@@ -117,8 +116,6 @@ private:
 
     F32                     mContextConeOpacity;
     PermissionMask          mImmediateFilterPermMask;
-//     PermissionMask          mDnDFilterPermMask;
-//     PermissionMask          mNonImmediateFilterPermMask;
 
     bool                    mActive;
     bool				    mNoCopySettingsSelected;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index a5a2eec246..5ca77ad3c3 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -70,9 +70,6 @@
 #include "lllocalbitmaps.h"
 #include "llerror.h"
 
-static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
-static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
-static const F32 CONTEXT_FADE_TIME = 0.08f;
 
 static const S32 LOCAL_TRACKING_ID_COLUMN = 1;
 
@@ -410,59 +407,8 @@ BOOL LLFloaterTexturePicker::postBuild()
 // virtual
 void LLFloaterTexturePicker::draw()
 {
-	if (mOwner)
-	{
-		// draw cone of context pointing back to texture swatch	
-		LLRect owner_rect;
-		mOwner->localRectToOtherView(mOwner->getLocalRect(), &owner_rect, this);
-		LLRect local_rect = getLocalRect();
-		if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f)
-		{
-			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-			LLGLEnable(GL_CULL_FACE);
-			gGL.begin(LLRender::QUADS);
-			{
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
-				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mTop);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
-				gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
-
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-				gGL.vertex2i(local_rect.mRight, local_rect.mTop);
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(owner_rect.mRight, owner_rect.mTop);
-				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
-
-
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_OUT_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(local_rect.mLeft, local_rect.mBottom);
-				gGL.vertex2i(local_rect.mRight, local_rect.mBottom);
-				gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
-				gGL.vertex2i(owner_rect.mRight, owner_rect.mBottom);
-				gGL.vertex2i(owner_rect.mLeft, owner_rect.mBottom);
-			}
-			gGL.end();
-		}
-	}
-
-	if (gFocusMgr.childHasMouseCapture(getDragHandle()))
-	{
-		mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
-	}
-	else
-	{
-		mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME));
-	}
+    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+    drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);
 
 	updateImageStats();
 
diff --git a/indra/newview/lltrackpicker.cpp b/indra/newview/lltrackpicker.cpp
new file mode 100644
index 0000000000..07fdb5f476
--- /dev/null
+++ b/indra/newview/lltrackpicker.cpp
@@ -0,0 +1,126 @@
+/** 
+* @author AndreyK Productengine
+* @brief LLTrackPicker class header file including related functions
+*
+* $LicenseInfo:firstyear=2018&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2018, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltrackpicker.h"
+
+#include "llradiogroup.h"
+#include "llviewercontrol.h"
+
+
+//=========================================================================
+namespace
+{
+    const std::string FLOATER_DEFINITION_XML("floater_pick_track.xml");
+
+    const std::string BTN_SELECT("btn_select");
+    const std::string BTN_CANCEL("btn_cancel");
+    const std::string RDO_TRACK_SELECTION("track_selection");
+    const std::string RDO_TRACK_PREFIX("radio_sky");
+}
+//=========================================================================
+
+LLFloaterTrackPicker::LLFloaterTrackPicker(LLView * owner, const LLSD &params) :
+    LLFloater(params),
+    mContextConeOpacity(0.0f),
+    mOwnerHandle()
+{
+    mOwnerHandle = owner->getHandle();
+    buildFromFile(FLOATER_DEFINITION_XML);
+}
+
+LLFloaterTrackPicker::~LLFloaterTrackPicker()
+{
+}
+
+BOOL LLFloaterTrackPicker::postBuild()
+{
+    childSetAction(BTN_CANCEL, [this](LLUICtrl*, const LLSD& param){ onButtonCancel(); });
+    childSetAction(BTN_SELECT, [this](LLUICtrl*, const LLSD& param){ onButtonSelect(); });
+    return TRUE;
+}
+
+void LLFloaterTrackPicker::onClose(bool app_quitting)
+{
+    if (app_quitting)
+        return;
+
+    LLView *owner = mOwnerHandle.get();
+    if (owner)
+    {
+        owner->setFocus(TRUE);
+    }
+}
+
+void LLFloaterTrackPicker::showPicker(LLSD &args)
+{
+    LLSD::array_const_iterator iter;
+    LLSD::array_const_iterator end = args.endArray();
+
+    for (iter = args.beginArray(); iter != end; ++iter)
+    {
+        S32 track_id = (*iter)["id"].asInteger();
+        bool can_enable = (*iter)["enabled"].asBoolean();
+        LLView *view = getChild<LLCheckBoxCtrl>(RDO_TRACK_PREFIX + llformat("%d", track_id), true);
+        view->setEnabled(can_enable);
+        view->setLabelArg("[ALT]", (*iter).has("altitude") ? ((*iter)["altitude"].asString() + "m") : " ");
+    }
+
+    openFloater(getKey());
+    setFocus(TRUE);
+}
+
+void LLFloaterTrackPicker::draw()
+{
+    LLView *owner = mOwnerHandle.get();
+    static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+    drawConeToOwner(mContextConeOpacity, max_opacity, owner);
+
+    LLFloater::draw();
+}
+
+void LLFloaterTrackPicker::onButtonCancel()
+{
+    closeFloater();
+}
+
+void LLFloaterTrackPicker::onButtonSelect()
+{
+    if (mCommitSignal)
+    {
+        (*mCommitSignal)(this, getChild<LLRadioGroup>(RDO_TRACK_SELECTION, true)->getSelectedValue());
+    }
+    closeFloater();
+}
+
+void LLFloaterTrackPicker::onFocusLost()
+{
+    if (isInVisibleChain())
+    {
+        closeFloater();
+    }
+}
diff --git a/indra/newview/lltrackpicker.h b/indra/newview/lltrackpicker.h
new file mode 100644
index 0000000000..601af27b61
--- /dev/null
+++ b/indra/newview/lltrackpicker.h
@@ -0,0 +1,58 @@
+/** 
+ * @file lltrackpicker.h
+ * @author AndreyK Productengine
+ * @brief LLTrackPicker class header file including related functions
+ *
+ * $LicenseInfo:firstyear=2018&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2018, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_TRACKPICKER_H
+#define LL_TRACKPICKER_H
+
+#include "llfloater.h"
+
+
+//=========================================================================
+
+class LLFloaterTrackPicker : public LLFloater
+{
+public:
+    LLFloaterTrackPicker(LLView * owner, const LLSD &params = LLSD());
+    virtual ~LLFloaterTrackPicker() override;
+
+    virtual BOOL postBuild() override;
+    virtual void onClose(bool app_quitting) override;
+    void         showPicker(LLSD &args);
+
+    virtual void            draw() override;
+
+    void         onButtonCancel();
+    void         onButtonSelect();
+
+private:
+    void                    onFocusLost() override;
+
+    F32              mContextConeOpacity;
+    LLHandle<LLView> mOwnerHandle;
+};
+
+#endif  // LL_TRACKPICKER_H
diff --git a/indra/newview/skins/default/xui/en/floater_pick_track.xml b/indra/newview/skins/default/xui/en/floater_pick_track.xml
new file mode 100644
index 0000000000..d8a9877be2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_pick_track.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<floater
+        legacy_header_height="0"
+        can_minimize="false"
+        can_resize="true"
+        height="140"
+        layout="topleft"
+        min_height="140"
+        min_width="225"
+        name="track picker"
+        help_topic="track_picker"
+        title="PICK: TRACK"
+        width="225">
+    <layout_stack name="adjuster"
+            follows="all"
+            animate="false"
+            top="0"
+            left="6"
+            right="-6"
+            bottom="-10"
+            orientation="vertical">
+        <layout_panel name="pnl_desc"
+                border="false"
+                auto_resize="false"
+                user_resize="false"
+                height="11"
+                min_height="10"
+                bg_alpha_color="blue"
+                background_visible="false">
+            <text
+                type="string"
+                length="1"
+                follows="left|top"
+                height="10"
+                layout="topleft"
+                left="5"
+                name="select_description"
+                mouse_opaque="false"
+                top="0"
+                width="300">
+                Select source sky:
+            </text>
+        </layout_panel>
+        <layout_panel name="pnl_traks"
+                border="false"
+                auto_resize="true"
+                user_resize="false"
+                height="29"
+                min_height="29"
+                bg_alpha_color="blue"
+                background_visible="false">
+            <radio_group
+                follows="all"
+                height="60"
+                layout="topleft"
+                top="0"
+                left="3"
+                right="-3"
+                bottom="-3"
+                name="track_selection"
+                width="100">
+                <radio_item
+                    height="20"
+                    label="Sky4 [ALT]"
+                    layout="topleft"
+                    left="0"
+                    name="radio_sky4"
+                    value="4"
+                    top="0"
+                    width="90" />
+                <radio_item
+                    height="20"
+                    label="Sky3 [ALT]"
+                    layout="topleft"
+                    left="0"
+                    name="radio_sky3"
+                    value="3"
+                    top_delta="20"
+                    width="90" />
+                <radio_item
+                    height="20"
+                    label="Sky2 [ALT]"
+                    layout="topleft"
+                    left="0"
+                    name="radio_sky2"
+                    value="2"
+                    top_delta="20"
+                    width="90" />
+                <radio_item
+                    height="20"
+                    label="Ground"
+                    layout="topleft"
+                    left="0"
+                    name="radio_sky1"
+                    value="1"
+                    top_delta="20"
+                    width="90" />
+            </radio_group>
+        </layout_panel>
+        <layout_panel name="pnl_ok_cancel"
+                border="false"
+                auto_resize="false"
+                user_resize="false"
+                height="29"
+                min_height="29">
+            <button
+                    follows="top|left"
+                    height="20"
+                    label="OK"
+                    label_selected="OK"
+                    layout="topleft"
+                    left="2"
+                    top="2"
+                    name="btn_select"
+                    width="100" />
+            <button
+                    follows="top|left"
+                    height="20"
+                    label="Cancel"
+                    label_selected="Cancel"
+                    layout="topleft"
+                    left_delta="110"
+                    top_delta="0"
+                    name="btn_cancel"
+                    width="100" />
+        </layout_panel>
+    </layout_stack>
+</floater>
-- 
cgit v1.2.3


From 42220977792ba7bc1fe99fedb315e0d408f3bff4 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Mon, 28 Jan 2019 17:25:44 +0200
Subject: SL-10413 FIXED environment does not change after double-clicking Sky
 Setting in Inventory the first time.

---
 indra/newview/llfloaterfixedenvironment.cpp | 1 +
 1 file changed, 1 insertion(+)

(limited to 'indra')

diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index ce231973c7..35860de7a2 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -351,6 +351,7 @@ void LLFloaterFixedEnvironment::onAssetLoaded(LLUUID asset_id, LLSettingsBase::p
     updateEditEnvironment();
     syncronizeTabs();
     refresh();
+    LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST);
 }
 
 void LLFloaterFixedEnvironment::onNameChanged(const std::string &name)
-- 
cgit v1.2.3


From fd13bdef98c169c518685a223482c922aed5db06 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 28 Jan 2019 18:32:47 +0200
Subject: SL-1945 Don't open floater if there is only one option to select from

---
 indra/newview/llfloatereditextdaycycle.cpp | 64 +++++++++++++++++++++---------
 indra/newview/llfloatereditextdaycycle.h   |  2 +-
 indra/newview/lltrackpicker.cpp            |  2 +-
 indra/newview/lltrackpicker.h              |  2 +-
 4 files changed, 48 insertions(+), 22 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 33f3fcfecc..51bbc9fb90 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -804,7 +804,48 @@ void LLFloaterEditExtDayCycle::onRemoveFrame()
 
 void LLFloaterEditExtDayCycle::onCloneTrack()
 {
-    doOpenTrackFloater();
+    const LLEnvironment::altitude_list_t &altitudes = LLEnvironment::instance().getRegionAltitudes();
+    bool use_altitudes = altitudes.size() > 0 && ((mEditContext == CONTEXT_PARCEL) || (mEditContext == CONTEXT_REGION));
+
+    LLSD args = LLSD::emptyArray();
+
+    S32 populated_counter = 0;
+    for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++)
+    {
+        LLSD track;
+        track["id"] = LLSD::Integer(i);
+        bool populated = (!mEditDay->isTrackEmpty(i)) && (i != mCurrentTrack);
+        track["enabled"] = populated;
+        if (populated)
+        {
+            populated_counter++;
+        }
+        if (use_altitudes)
+        {
+            track["altitude"] = altitudes[i - 1];
+        }
+        args.append(track);
+    }
+
+    if (populated_counter > 1)
+    {
+        doOpenTrackFloater(args);
+    }
+    else if (populated_counter > 0)
+    {
+        for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++)
+        {
+            if ((!mEditDay->isTrackEmpty(i)) && (i != mCurrentTrack))
+            {
+                onPickerCommitTrackId(i);
+            }
+        }
+    }
+    else
+    {
+        // Should not happen
+        LL_WARNS("ENVDAYEDIT") << "Tried to copy tracks, but there are no available sources" << LL_ENDL;
+    }
 }
 
 
@@ -1051,6 +1092,8 @@ void LLFloaterEditExtDayCycle::cloneTrack(const LLSettingsDay::ptr_t &source_day
         mEditDay->setSettingsAtKeyframe(psky->buildDerivedClone(), track_frame.first, dest_index);
     }
 
+    setDirtyFlag();
+
     updateSlider();
     updateTabs();
     updateButtons();
@@ -1817,7 +1860,7 @@ void LLFloaterEditExtDayCycle::clearDirtyFlag()
 
 }
 
-void LLFloaterEditExtDayCycle::doOpenTrackFloater()
+void LLFloaterEditExtDayCycle::doOpenTrackFloater(const LLSD &args)
 {
     LLFloaterTrackPicker *picker = static_cast<LLFloaterTrackPicker *>(mTrackFloater.get());
 
@@ -1831,23 +1874,6 @@ void LLFloaterEditExtDayCycle::doOpenTrackFloater()
         picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitTrackId(data.asInteger()); });
     }
 
-    const LLEnvironment::altitude_list_t &altitudes = LLEnvironment::instance().getRegionAltitudes();
-    bool use_altitudes = altitudes.size() > 0 && ((mEditContext == CONTEXT_PARCEL) || (mEditContext == CONTEXT_REGION));
-
-    LLSD args = LLSD::emptyArray();
-
-    for (U32 i = 1; i < LLSettingsDay::TRACK_MAX; i++)
-    {
-        LLSD track;
-        track["id"] = LLSD::Integer(i);
-        track["enabled"] = !mEditDay->isTrackEmpty(i);
-        if (use_altitudes)
-        {
-            track["altitude"] = altitudes[i - 1];
-        }
-        args.append(track);
-    }
-
     picker->showPicker(args);
 }
 
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index d780d5c993..f50c9f7e5f 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -160,7 +160,7 @@ private:
     void                        onInventoryCreated(LLUUID asset_id, LLUUID inventory_id, LLSD results);
     void                        onInventoryUpdated(LLUUID asset_id, LLUUID inventory_id, LLSD results);
 
-    void                        doOpenTrackFloater();
+    void                        doOpenTrackFloater(const LLSD &args);
     void                        doCloseTrackFloater(bool quitting = false);
     void                        onPickerCommitTrackId(U32 track_id);
 
diff --git a/indra/newview/lltrackpicker.cpp b/indra/newview/lltrackpicker.cpp
index 07fdb5f476..bc918f4bd7 100644
--- a/indra/newview/lltrackpicker.cpp
+++ b/indra/newview/lltrackpicker.cpp
@@ -76,7 +76,7 @@ void LLFloaterTrackPicker::onClose(bool app_quitting)
     }
 }
 
-void LLFloaterTrackPicker::showPicker(LLSD &args)
+void LLFloaterTrackPicker::showPicker(const LLSD &args)
 {
     LLSD::array_const_iterator iter;
     LLSD::array_const_iterator end = args.endArray();
diff --git a/indra/newview/lltrackpicker.h b/indra/newview/lltrackpicker.h
index 601af27b61..dab3b72915 100644
--- a/indra/newview/lltrackpicker.h
+++ b/indra/newview/lltrackpicker.h
@@ -41,7 +41,7 @@ public:
 
     virtual BOOL postBuild() override;
     virtual void onClose(bool app_quitting) override;
-    void         showPicker(LLSD &args);
+    void         showPicker(const LLSD &args);
 
     virtual void            draw() override;
 
-- 
cgit v1.2.3


From 54dc80a7091ad2225d8dee610eb50f190a742513 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 28 Jan 2019 20:09:35 +0200
Subject: SL-1932 No transfer check should work for parcel and region
 environments

---
 indra/newview/llfloatereditextdaycycle.cpp | 43 +++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 16 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 51bbc9fb90..42c73d5668 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -2007,26 +2007,37 @@ void LLFloaterEditExtDayCycle::onAssetLoadedForInsertion(LLUUID item_id, LLUUID
 
     LLInventoryItem *inv_item = gInventory.getItem(item_id);
 
-    if (inv_item
-        && mInventoryItem
-        && mInventoryItem->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())
-        && !inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+    if (inv_item && !inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
     {
-        LLSD args;
+        // Need to check if item is already no-transfer, otherwise make it no-transfer
+        bool no_transfer = false;
+        if (mInventoryItem)
+        {
+            no_transfer = mInventoryItem->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+        }
+        else
+        {
+            no_transfer = mEditDay->getFlag(LLSettingsBase::FLAG_NOTRANS);
+        }
 
-        // create and show confirmation textbox
-        LLNotificationsUtil::add("SettingsMakeNoTrans", args, LLSD(),
-            [this, cb](const LLSD&notif, const LLSD&resp)
+        if (!no_transfer)
         {
-            S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp);
-            if (opt == 0)
+            LLSD args;
+
+            // create and show confirmation textbox
+            LLNotificationsUtil::add("SettingsMakeNoTrans", args, LLSD(),
+                [this, cb](const LLSD&notif, const LLSD&resp)
             {
-                mMakeNoTrans = true;
-                mEditDay->setFlag(LLSettingsBase::FLAG_NOTRANS);
-                cb();
-            }
-        });
-        return;
+                S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp);
+                if (opt == 0)
+                {
+                    mMakeNoTrans = true;
+                    mEditDay->setFlag(LLSettingsBase::FLAG_NOTRANS);
+                    cb();
+                }
+            });
+            return;
+        }
     }
     
     cb();
-- 
cgit v1.2.3


From 714df9c4f7c9f24eae1064f45306dea01803ba09 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 28 Jan 2019 21:24:11 +0200
Subject: SL-10426 Fixed Inventory day cycle doesn't apply to the parcel from
 About Land

---
 indra/newview/llfloatereditextdaycycle.cpp |  9 ++++++++-
 indra/newview/llpanelenvironment.cpp       |  2 +-
 indra/newview/llsettingspicker.cpp         | 32 +++++++++++++++---------------
 indra/newview/llsettingspicker.h           | 13 +++++++++---
 4 files changed, 35 insertions(+), 21 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 42c73d5668..3fac5e2b1f 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -1910,7 +1910,14 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ
 
     picker->setSettingsFilter(type);
     picker->setSettingsItemId(curritem);
-    picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);
+    if (type == LLSettingsType::ST_DAYCYCLE)
+    {
+        picker->setTrackMode((mCurrentTrack == LLSettingsDay::TRACK_WATER) ? LLFloaterSettingsPicker::TRACK_WATER : LLFloaterSettingsPicker::TRACK_SKY);
+    }
+    else
+    {
+        picker->setTrackMode(LLFloaterSettingsPicker::TRACK_NONE);
+    }
     picker->openFloater();
     picker->setFocus(TRUE);
 }
diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 55b579d0a2..66202982a2 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -338,7 +338,7 @@ LLFloaterSettingsPicker * LLPanelEnvironmentInfo::getSettingsPicker(bool create)
 
         mSettingsFloater = picker->getHandle();
 
-        picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitted(data.asUUID()); });
+        picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitted(data["ItemId"].asUUID()); });
     }
 
     return picker;
diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp
index 5812fc59cd..e2d6d43ae3 100644
--- a/indra/newview/llsettingspicker.cpp
+++ b/indra/newview/llsettingspicker.cpp
@@ -72,7 +72,7 @@ LLFloaterSettingsPicker::LLFloaterSettingsPicker(LLView * owner, LLUUID initial_
     mActive(true),
     mContextConeOpacity(0.0f),
     mSettingItemID(initial_item_id),
-    mTrackWater(true),
+    mTrackMode(TRACK_NONE),
     mImmediateFilterPermMask(PERM_NONE)
 {
     mOwnerHandle = owner->getHandle();
@@ -132,6 +132,8 @@ BOOL LLFloaterSettingsPicker::postBuild()
     childSetAction(BTN_CANCEL, [this](LLUICtrl*, const LLSD& param){ onButtonCancel(); });
     childSetAction(BTN_SELECT, [this](LLUICtrl*, const LLSD& param){ onButtonSelect(); });
 
+    getChild<LLPanel>(PNL_COMBO)->setVisible(mTrackMode != TRACK_NONE);
+
     // update permission filter once UI is fully initialized
     mSavedFolderState.setApply(FALSE);
 
@@ -169,13 +171,18 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)
         filter = static_cast<S64>(0x1) << static_cast<S64>(type);
     }
 
-    bool day_cycle = (type != LLSettingsType::ST_WATER) && (type != LLSettingsType::ST_SKY);
-    getChild<LLPanel>(PNL_COMBO)->setVisible(day_cycle);
+    mInventoryPanel->setFilterSettingsTypes(filter);
+}
+
+void LLFloaterSettingsPicker::setTrackMode(ETrackMode mode)
+{
+    mTrackMode = mode;
+    getChild<LLPanel>(PNL_COMBO)->setVisible(mode != TRACK_NONE);
+
     std::string prefix = getString(STR_TITLE_PREFIX);
     std::string label;
-    if (day_cycle)
+    if (mode != TRACK_NONE)
     {
-
         label = getString(STR_TITLE_TRACK);
     }
     else
@@ -183,8 +190,6 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)
         label = getString(STR_TITLE_SETTINGS);
     }
     setTitle(prefix + " " + label);
-
-    mInventoryPanel->setFilterSettingsTypes(filter);
 }
 
 void LLFloaterSettingsPicker::draw()
@@ -234,7 +239,6 @@ void LLFloaterSettingsPicker::onFilterEdit(const std::string& search_string)
 
 void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::itemlist_t &items, bool user_action)
 {
-    bool track_picker_enabled = false;
     bool is_item = false;
     LLUUID asset_id;
     if (items.size())
@@ -260,15 +264,11 @@ void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::i
                 {
                     mChangeIDSignal(mSettingItemID);
                 }
-
-                if (bridge_model->getSettingsType() == LLSettingsType::ST_DAYCYCLE
-                    && !mNoCopySettingsSelected)
-                {
-                    track_picker_enabled = true;
-                }
             }
         }
     }
+    bool track_picker_enabled = mTrackMode != TRACK_NONE;
+
     getChild<LLView>(CMB_TRACK_SELECTION)->setEnabled(track_picker_enabled && mSettingAssetID == asset_id);
     getChild<LLView>(BTN_SELECT)->setEnabled(is_item && (!track_picker_enabled || mSettingAssetID == asset_id));
     if (track_picker_enabled && asset_id.notNull() && mSettingAssetID != asset_id)
@@ -304,11 +304,11 @@ void LLFloaterSettingsPicker::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr
     track_selection->removeall();
     LLSettingsDay::ptr_t pday = std::dynamic_pointer_cast<LLSettingsDay>(settings);
 
-    if (mTrackWater)
+    if (mTrackMode == TRACK_WATER)
     {
         track_selection->add(getString(STR_TRACK_WATER), LLSD::Integer(LLSettingsDay::TRACK_WATER), ADD_TOP, true);
     }
-    else
+    else if (mTrackMode == TRACK_SKY)
     {
         // track 1 always present
         track_selection->add(getString(STR_TRACK_GROUND), LLSD::Integer(LLSettingsDay::TRACK_GROUND_LEVEL), ADD_TOP, true);
diff --git a/indra/newview/llsettingspicker.h b/indra/newview/llsettingspicker.h
index f5aecf4417..859f92fbe8 100644
--- a/indra/newview/llsettingspicker.h
+++ b/indra/newview/llsettingspicker.h
@@ -45,6 +45,12 @@ class LLInventoryPanel;
 class LLFloaterSettingsPicker : public LLFloater
 {
 public:
+    enum ETrackMode
+    {
+        TRACK_NONE,
+        TRACK_WATER,
+        TRACK_SKY
+    };
     typedef std::function<void()>                           close_callback_t;
     typedef std::function<void(const LLUUID& item_id)>     id_changed_callback_t;
 
@@ -65,8 +71,9 @@ public:
     LLSettingsType::type_e  getSettingsFilter() const { return mSettingsType; }
 
     // Only for day cycle
-    void                    setTrackWater(bool use_water) { mTrackWater = use_water; }
-    void                    setTrackSky(bool use_sky) { mTrackWater = !use_sky; }
+    void                    setTrackMode(ETrackMode mode);
+    void                    setTrackWater() { mTrackMode = TRACK_WATER; }
+    void                    setTrackSky() { mTrackMode = TRACK_SKY; }
 
     // Takes a UUID, wraps get/setImageAssetID
     virtual void            setValue(const LLSD& value) override;
@@ -108,7 +115,7 @@ private:
     LLHandle<LLView>        mOwnerHandle;
     LLUUID                  mSettingItemID;
     LLUUID                  mSettingAssetID;
-    bool                    mTrackWater;
+    ETrackMode              mTrackMode;
 
     LLFilterEditor *        mFilterEdit;
     LLInventoryPanel *      mInventoryPanel;
-- 
cgit v1.2.3


From 347ae7a38bb2535bac4d3c497e216e3178c6e966 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 29 Jan 2019 16:49:16 +0200
Subject: SL-10430 FIXED Slider control rendering broken

---
 indra/llui/llsliderctrl.cpp | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'indra')

diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index c3c3ce04f9..3b89a8ca63 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -300,6 +300,10 @@ void LLSliderCtrl::updateSliderRect()
 
         right -= editor_width + sliderctrl_spacing;
     }
+    if (mTextBox)
+    {
+        right -= mTextBox->getRect().getWidth() + sliderctrl_spacing;
+    }
     if (mLabelBox)
     {
         left += mLabelBox->getRect().getWidth() + sliderctrl_spacing;
-- 
cgit v1.2.3


From c8a79a59c94192741c8239eac6b34e50fe835bcd Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Wed, 30 Jan 2019 18:05:27 +0200
Subject: SL-10360 Show "Region environment" text for tracks if there is no
 parcel environment used.

---
 indra/newview/llpanelenvironment.cpp                            | 3 +++
 indra/newview/skins/default/xui/en/panel_region_environment.xml | 1 +
 2 files changed, 4 insertions(+)

(limited to 'indra')

diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 66202982a2..868af617cb 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -314,6 +314,9 @@ std::string LLPanelEnvironmentInfo::getNameForTrackIndex(S32 index)
     if (mCurrentEnvironment->mDayCycleName.empty())
     {
         invname = mCurrentEnvironment->mNameList[index];
+
+        if (!isRegion() && invname.empty())
+            invname = getString("str_region_env");
     }
     else if (!mCurrentEnvironment->mDayCycle->isTrackEmpty(index))
     {
diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml
index 32b6e56acd..51926351c0 100644
--- a/indra/newview/skins/default/xui/en/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml
@@ -19,6 +19,7 @@
     <string name="str_disallowed">The estate manager does not allow changing parcel environments in this region.</string>
     <string name="str_too_small">The parcel must be at least 128 square meters to support an environment.</string>
     <string name="str_empty">(empty)</string>
+    <string name="str_region_env">(region environment)</string>
     <layout_stack 
             width="530"
             height="367"
-- 
cgit v1.2.3


From 17a4093223ce735696eb27103bfff64ef49cbe81 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 30 Jan 2019 16:29:46 +0200
Subject: SL-10279 Validate altitude input

---
 indra/newview/llpanelenvironment.cpp | 44 ++++++++++++++++++++++++++++++++----
 1 file changed, 39 insertions(+), 5 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 868af617cb..0e2c7bcaac 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -270,9 +270,43 @@ void LLPanelEnvironmentInfo::refresh()
 
         for (S32 idx = 0; idx < ALTITUDE_SLIDER_COUNT; ++idx)
         {
-            sld->addSlider(altitudes[idx + 1], alt_sliders[idx]);
-            updateAltLabel(alt_prefixes[idx], idx + 2, altitudes[idx + 1]);
-            mAltitudes[alt_sliders[idx]] = AltitudeData(idx+2, idx, altitudes[idx+1]);
+            // make sure values are in range, server is supposed to validate them,
+            // but issues happen, try to fix values in such case
+            F32 altitude = llclamp(altitudes[idx + 1], sld->getMinValue(), sld->getMaxValue());
+            bool res = sld->addSlider(altitude, alt_sliders[idx]);
+            if (!res)
+            {
+                LL_WARNS_ONCE("ENVPANEL") << "Failed to validate altitude from server for parcel id" << getParcelId() << LL_ENDL;
+                // Find a spot to insert altitude.
+                // Assuming everything alright with slider, we should find new place in 11 steps top (step 25m, no overlap 100m)
+                F32 alt_step = (altitude > (sld->getMaxValue() / 2)) ? -sld->getIncrement() : sld->getIncrement();
+                for (U32 i = 0; i < 30; i++)
+                {
+                    altitude += alt_step;
+                    if (altitude > sld->getMaxValue())
+                    {
+                        altitude = sld->getMinValue();
+                    }
+                    else if (altitude < sld->getMinValue())
+                    {
+                        altitude = sld->getMaxValue();
+                    }
+                    res = sld->addSlider(altitude, alt_sliders[idx]);
+                    if (res) break;
+                }
+                if (!res)
+                {
+                    // Something is very very wrong
+                    LL_WARNS_ONCE("ENVPANEL") << "Failed to set up altitudes for parcel id " << getParcelId() << LL_ENDL;
+                }
+                else
+                {
+                    // slider has some auto correction that might have kicked in
+                    altitude = sld->getSliderValue(alt_sliders[idx]);
+                }
+            }
+            updateAltLabel(alt_prefixes[idx], idx + 2, altitude);
+            mAltitudes[alt_sliders[idx]] = AltitudeData(idx + 2, idx, altitude);
         }
         if (sld->getCurNumSliders() != ALTITUDE_SLIDER_COUNT)
         {
@@ -310,7 +344,7 @@ std::string LLPanelEnvironmentInfo::getNameForTrackIndex(S32 index)
 {
     std::string invname;
 
-    LL_WARNS("LAPRAS") << "mDayCycleName='" << mCurrentEnvironment->mDayCycleName << "'" << LL_ENDL;
+    LL_WARNS("ENVPANEL") << "mDayCycleName='" << mCurrentEnvironment->mDayCycleName << "'" << LL_ENDL;
     if (mCurrentEnvironment->mDayCycleName.empty())
     {
         invname = mCurrentEnvironment->mNameList[index];
@@ -565,7 +599,7 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
                 if (cmp_rect.mBottom <= intr_rect.mTop && cmp_rect.mBottom >= intr_rect.mBottom)
                 {
                     // Approximate shift
-                    // We probably will need more cycle runs over all labels to get accurate one
+                    // We probably will need more runs over all labels to get accurate shift
                     // At the moment single cycle should do since we have too little elements to do something complicated
                     shift = (cmp_rect.mBottom - intr_rect.mTop) / 2;
                 }
-- 
cgit v1.2.3


From 16b47db736fed0995eaeeed77ba4dd0d310f1072 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 30 Jan 2019 21:51:59 +0200
Subject: SL-10279 Remake altitude 'bumping'

---
 indra/newview/llpanelenvironment.cpp               | 110 ++++++++++++++++-----
 .../default/xui/en/panel_region_environment.xml    |   2 -
 2 files changed, 84 insertions(+), 28 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 0e2c7bcaac..8f279c07ba 100644
--- a/indra/newview/llpanelenvironment.cpp
+++ b/indra/newview/llpanelenvironment.cpp
@@ -343,8 +343,6 @@ std::string LLPanelEnvironmentInfo::getInventoryNameForAssetId(LLUUID asset_id)
 std::string LLPanelEnvironmentInfo::getNameForTrackIndex(S32 index)
 {
     std::string invname;
-
-    LL_WARNS("ENVPANEL") << "mDayCycleName='" << mCurrentEnvironment->mDayCycleName << "'" << LL_ENDL;
     if (mCurrentEnvironment->mDayCycleName.empty())
     {
         invname = mCurrentEnvironment->mNameList[index];
@@ -583,41 +581,101 @@ void LLPanelEnvironmentInfo::readjustAltLabels()
 {
     // Re-adjust all labels
     // Very simple "adjust after the fact" method
-    // Note: labels can be in any ordered
-    for (U32 i = 0; i < ALTITUDE_SLIDER_COUNT - 1; i++)
-    {
-        LLView* view_cmp = findChild<LLView>(alt_panels[i]);
+    // Note: labels can be in any order
+
+    LLMultiSliderCtrl *sld = findChild<LLMultiSliderCtrl>(SLD_ALTITUDES);
+    if (!sld) return;
 
-        for (U32 j = i + 1; j < ALTITUDE_SLIDER_COUNT; j++)
+    LLView* view_midle = NULL;
+    U32 midle_ind = 0;
+    S32 shift_up = 0;
+    S32 shift_down = 0;
+    LLRect sld_rect = sld->getRect();
+
+    // Find the middle one
+    for (U32 i = 0; i < ALTITUDE_SLIDER_COUNT; i++)
+    {
+        LLView* cmp_view = findChild<LLView>(alt_panels[i], true);
+        if (!cmp_view) return;
+        LLRect cmp_rect = cmp_view->getRect();
+        S32 pos = 0;
+        shift_up = 0;
+        shift_down = 0;
+
+        for (U32 j = 0; j < ALTITUDE_SLIDER_COUNT; j++)
         {
-            LLView* view_intr = findChild<LLView>(alt_panels[j]);
-            if (view_cmp && view_intr)
+            if (i != j)
             {
-                LLRect cmp_rect = view_cmp->getRect();
-                LLRect intr_rect = view_intr->getRect();
-                S32 shift = 0;
-                if (cmp_rect.mBottom <= intr_rect.mTop && cmp_rect.mBottom >= intr_rect.mBottom)
+                LLView* intr_view = findChild<LLView>(alt_panels[j], true);
+                if (!intr_view) return;
+                LLRect intr_rect = intr_view->getRect();
+                if (cmp_rect.mBottom >= intr_rect.mBottom)
                 {
-                    // Approximate shift
-                    // We probably will need more runs over all labels to get accurate shift
-                    // At the moment single cycle should do since we have too little elements to do something complicated
-                    shift = (cmp_rect.mBottom - intr_rect.mTop) / 2;
+                    pos++;
                 }
-                else if (cmp_rect.mTop >= intr_rect.mBottom && cmp_rect.mTop <= intr_rect.mTop)
+                if (intr_rect.mBottom <= cmp_rect.mTop && intr_rect.mBottom >= cmp_rect.mBottom)
                 {
-                    // Approximate shift
-                    shift = (cmp_rect.mTop - intr_rect.mBottom) / 2;
+                    shift_up = cmp_rect.mTop - intr_rect.mBottom;
                 }
-                if (shift != 0)
+                else if (intr_rect.mTop >= cmp_rect.mBottom && intr_rect.mBottom <= cmp_rect.mBottom)
                 {
-                    cmp_rect.translate(0, -shift);
-                    view_cmp->setRect(cmp_rect);
-
-                    intr_rect.translate(0, shift);
-                    view_intr->setRect(intr_rect);
+                    shift_down = cmp_rect.mBottom - intr_rect.mTop;
                 }
             }
         }
+        if (pos == 1) //  middle
+        {
+            view_midle = cmp_view;
+            midle_ind = i;
+            break;
+        }
+    }
+
+    // Account for edges
+    LLRect midle_rect = view_midle->getRect();
+    F32 factor = 0.5f;
+    S32 edge_zone_height = midle_rect.getHeight() * 1.5f;
+
+    if (midle_rect.mBottom - sld_rect.mBottom < edge_zone_height)
+    {
+        factor = 1 - ((midle_rect.mBottom - sld_rect.mBottom) / (edge_zone_height * 2));
+    }
+    else if (sld_rect.mTop - midle_rect.mTop < edge_zone_height )
+    {
+        factor = ((sld_rect.mTop - midle_rect.mTop) / (edge_zone_height * 2));
+    }
+
+    S32 shift_middle = (S32)(((F32)shift_down * factor) + ((F32)shift_up * (1.f - factor)));
+    shift_down = shift_down - shift_middle;
+    shift_up = shift_up - shift_middle;
+
+    // fix crossings
+    for (U32 i = 0; i < ALTITUDE_SLIDER_COUNT; i++)
+    {
+        if (i != midle_ind)
+        {
+            LLView* trn_view = findChild<LLView>(alt_panels[i], true);
+            LLRect trn_rect = trn_view->getRect();
+
+            if (trn_rect.mBottom <= midle_rect.mTop && trn_rect.mBottom >= midle_rect.mBottom)
+            {
+                // Approximate shift
+                trn_rect.translate(0, shift_up);
+                trn_view->setRect(trn_rect);
+            }
+            else if (trn_rect.mTop >= midle_rect.mBottom && trn_rect.mBottom <= midle_rect.mBottom)
+            {
+                // Approximate shift
+                trn_rect.translate(0, shift_down);
+                trn_view->setRect(trn_rect);
+            }
+        }
+    }
+
+    if (shift_middle != 0)
+    {
+        midle_rect.translate(0, -shift_middle); //reversed relative to others
+        view_midle->setRect(midle_rect);
     }
 }
 
diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml
index 51926351c0..77858ecbc4 100644
--- a/indra/newview/skins/default/xui/en/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml
@@ -251,7 +251,6 @@
                                 enabled="false"
                                 top_delta="3"
                                 left_pad="21"
-                                xxxleft="-160"
                                 height="20"
                                 layout="topleft"
                                 name="edt_invname_alt1"
@@ -296,7 +295,6 @@
                                 enabled="false"
                                 top_delta="3"
                                 left_pad="21"
-                                xxxleft="-160"
                                 height="20"
                                 layout="topleft"
                                 name="edt_invname_alt2"
-- 
cgit v1.2.3


From c7e02b0835cbb50777c677f618c4a957e69fabee Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 30 Jan 2019 14:36:46 -0800
Subject: SL-9925: Viewer now shows an error message if import from legacy
 windlight fails.

---
 indra/llinventory/llsettingssky.cpp                | 21 ++++++
 indra/llinventory/llsettingswater.cpp              | 15 ++++
 indra/newview/llenvironment.cpp                    | 48 ++++++++++--
 indra/newview/llenvironment.h                      | 10 +--
 indra/newview/llfloatereditextdaycycle.cpp         |  6 +-
 indra/newview/llfloaterfixedenvironment.cpp        | 12 +--
 indra/newview/llsettingsvo.cpp                     | 87 ++++++++++++++--------
 indra/newview/llsettingsvo.h                       | 12 +--
 .../newview/skins/default/xui/en/notifications.xml |  7 +-
 indra/newview/skins/default/xui/en/strings.xml     |  5 ++
 10 files changed, 164 insertions(+), 59 deletions(-)

(limited to 'indra')

diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 86c8393499..f3519dc7cb 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -809,6 +809,7 @@ LLSD LLSettingsSky::translateLegacyHazeSettings(const LLSD& legacy)
 
 LLSD LLSettingsSky::translateLegacySettings(const LLSD& legacy)
 {
+    bool converted_something(false);
     LLSD newsettings(defaults());
 
     // Move legacy haze parameters to an inner map
@@ -818,23 +819,28 @@ LLSD LLSettingsSky::translateLegacySettings(const LLSD& legacy)
     if (legacyhazesettings.size() > 0)
     {
         newsettings[SETTING_LEGACY_HAZE] = legacyhazesettings;
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_CLOUD_COLOR))
     {
         newsettings[SETTING_CLOUD_COLOR] = LLColor3(legacy[SETTING_CLOUD_COLOR]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_CLOUD_POS_DENSITY1))
     {
         newsettings[SETTING_CLOUD_POS_DENSITY1] = LLColor3(legacy[SETTING_CLOUD_POS_DENSITY1]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_CLOUD_POS_DENSITY2))
     {
         newsettings[SETTING_CLOUD_POS_DENSITY2] = LLColor3(legacy[SETTING_CLOUD_POS_DENSITY2]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_CLOUD_SCALE))
     {
         newsettings[SETTING_CLOUD_SCALE] = LLSD::Real(legacy[SETTING_CLOUD_SCALE][0].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_CLOUD_SCROLL_RATE))
     {
@@ -851,53 +857,64 @@ LLSD LLSettingsSky::translateLegacySettings(const LLSD& legacy)
         }
 
         newsettings[SETTING_CLOUD_SCROLL_RATE] = cloud_scroll.getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_CLOUD_SHADOW))
     {
         newsettings[SETTING_CLOUD_SHADOW] = LLSD::Real(legacy[SETTING_CLOUD_SHADOW][0].asReal());
+        converted_something |= true;
     }
     
 
     if (legacy.has(SETTING_GAMMA))
     {
         newsettings[SETTING_GAMMA] = legacy[SETTING_GAMMA][0].asReal();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_GLOW))
     {
         newsettings[SETTING_GLOW] = LLColor3(legacy[SETTING_GLOW]).getValue();
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_MAX_Y))
     {
         newsettings[SETTING_MAX_Y] = LLSD::Real(legacy[SETTING_MAX_Y][0].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_STAR_BRIGHTNESS))
     {
         newsettings[SETTING_STAR_BRIGHTNESS] = LLSD::Real(legacy[SETTING_STAR_BRIGHTNESS].asReal() * 250.0f);
+        converted_something |= true;
     }
     if (legacy.has(SETTING_SUNLIGHT_COLOR))
     {
         newsettings[SETTING_SUNLIGHT_COLOR] = LLColor4(legacy[SETTING_SUNLIGHT_COLOR]).getValue();
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_PLANET_RADIUS))
     {
         newsettings[SETTING_PLANET_RADIUS] = LLSD::Real(legacy[SETTING_PLANET_RADIUS].asReal());
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_SKY_BOTTOM_RADIUS))
     {
         newsettings[SETTING_SKY_BOTTOM_RADIUS] = LLSD::Real(legacy[SETTING_SKY_BOTTOM_RADIUS].asReal());
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_SKY_TOP_RADIUS))
     {
         newsettings[SETTING_SKY_TOP_RADIUS] = LLSD::Real(legacy[SETTING_SKY_TOP_RADIUS].asReal());
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_SUN_ARC_RADIANS))
     {
         newsettings[SETTING_SUN_ARC_RADIANS] = LLSD::Real(legacy[SETTING_SUN_ARC_RADIANS].asReal());
+        converted_something |= true;
     }
 
     if (legacy.has(SETTING_LEGACY_EAST_ANGLE) && legacy.has(SETTING_LEGACY_SUN_ANGLE))
@@ -912,8 +929,12 @@ LLSD LLSettingsSky::translateLegacySettings(const LLSD& legacy)
 
         newsettings[SETTING_SUN_ROTATION]  = sunquat.getValue();
         newsettings[SETTING_MOON_ROTATION] = moonquat.getValue();
+        converted_something |= true;
     }
 
+    if (!converted_something)
+        return LLSD();
+
     return newsettings;
 }
 
diff --git a/indra/llinventory/llsettingswater.cpp b/indra/llinventory/llsettingswater.cpp
index 1780948f0a..d160a4ae0e 100644
--- a/indra/llinventory/llsettingswater.cpp
+++ b/indra/llinventory/llsettingswater.cpp
@@ -119,57 +119,72 @@ LLSD LLSettingsWater::defaults(const LLSettingsBase::TrackPosition& position)
 
 LLSD LLSettingsWater::translateLegacySettings(LLSD legacy)
 {
+    bool converted_something(false);
     LLSD newsettings(defaults());
 
     if (legacy.has(SETTING_LEGACY_BLUR_MULTIPLIER))
     {
         newsettings[SETTING_BLUR_MULTIPLIER] = LLSD::Real(legacy[SETTING_LEGACY_BLUR_MULTIPLIER].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_FOG_COLOR))
     {
         newsettings[SETTING_FOG_COLOR] = LLColor3(legacy[SETTING_LEGACY_FOG_COLOR]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_FOG_DENSITY))
     {
         newsettings[SETTING_FOG_DENSITY] = LLSD::Real(legacy[SETTING_LEGACY_FOG_DENSITY]);
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_FOG_MOD))
     {
         newsettings[SETTING_FOG_MOD] = LLSD::Real(legacy[SETTING_LEGACY_FOG_MOD].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_FRESNEL_OFFSET))
     {
         newsettings[SETTING_FRESNEL_OFFSET] = LLSD::Real(legacy[SETTING_LEGACY_FRESNEL_OFFSET].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_FRESNEL_SCALE))
     {
         newsettings[SETTING_FRESNEL_SCALE] = LLSD::Real(legacy[SETTING_LEGACY_FRESNEL_SCALE].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_NORMAL_MAP))
     {
         newsettings[SETTING_NORMAL_MAP] = LLSD::UUID(legacy[SETTING_LEGACY_NORMAL_MAP].asUUID());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_NORMAL_SCALE))
     {
         newsettings[SETTING_NORMAL_SCALE] = LLVector3(legacy[SETTING_LEGACY_NORMAL_SCALE]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_SCALE_ABOVE))
     {
         newsettings[SETTING_SCALE_ABOVE] = LLSD::Real(legacy[SETTING_LEGACY_SCALE_ABOVE].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_SCALE_BELOW))
     {
         newsettings[SETTING_SCALE_BELOW] = LLSD::Real(legacy[SETTING_LEGACY_SCALE_BELOW].asReal());
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_WAVE1_DIR))
     {
         newsettings[SETTING_WAVE1_DIR] = LLVector2(legacy[SETTING_LEGACY_WAVE1_DIR]).getValue();
+        converted_something |= true;
     }
     if (legacy.has(SETTING_LEGACY_WAVE2_DIR))
     {
         newsettings[SETTING_WAVE2_DIR] = LLVector2(legacy[SETTING_LEGACY_WAVE2_DIR]).getValue();
+        converted_something |= true;
     }
 
+    if (!converted_something)
+        return LLSD();
     return newsettings;
 }
 
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 9ac8bccb74..a397f0f27a 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -615,6 +615,25 @@ namespace
 
     typedef LLSettingsInjected<LLSettingsVOSky>   LLSettingsInjectedSky;
     typedef LLSettingsInjected<LLSettingsVOWater> LLSettingsInjectedWater;
+
+#if 0
+    //=====================================================================
+    class DayInjection : public LLEnvironment::DayInstance
+    {
+    public:
+        typedef std::shared_ptr<DayInjection> ptr_t;
+
+        DayInjection(LLEnvironment::EnvSelection_t env) :
+            LLEnvironment::DayInstance(env)
+        {
+        }
+
+        virtual     ~DayInjection() { };
+
+    protected:
+    private:
+    };
+#endif
 }
 
 //=========================================================================
@@ -1972,31 +1991,46 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extractLeg
 }
 
 //=========================================================================
-LLSettingsWater::ptr_t LLEnvironment::createWaterFromLegacyPreset(const std::string filename)
+LLSettingsWater::ptr_t LLEnvironment::createWaterFromLegacyPreset(const std::string filename, LLSD &messages)
 {
     std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(filename), true));
     std::string path(gDirUtilp->getDirName(filename));
 
-    LLSettingsWater::ptr_t water = LLSettingsVOWater::buildFromLegacyPresetFile(name, path);
+    LLSettingsWater::ptr_t water = LLSettingsVOWater::buildFromLegacyPresetFile(name, path, messages);
+
+    if (!water)
+    {
+        messages["NAME"] = name;
+        messages["FILE"] = filename;
+    }
     return water;
 }
 
-LLSettingsSky::ptr_t LLEnvironment::createSkyFromLegacyPreset(const std::string filename)
+LLSettingsSky::ptr_t LLEnvironment::createSkyFromLegacyPreset(const std::string filename, LLSD &messages)
 {
     std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(filename), true));
     std::string path(gDirUtilp->getDirName(filename));
 
-    LLSettingsSky::ptr_t sky = LLSettingsVOSky::buildFromLegacyPresetFile(name, path);
+    LLSettingsSky::ptr_t sky = LLSettingsVOSky::buildFromLegacyPresetFile(name, path, messages);
+    if (!sky)
+    {
+        messages["NAME"] = name;
+        messages["FILE"] = filename;
+    }
     return sky;
-
 }
 
-LLSettingsDay::ptr_t LLEnvironment::createDayCycleFromLegacyPreset(const std::string filename)
+LLSettingsDay::ptr_t LLEnvironment::createDayCycleFromLegacyPreset(const std::string filename, LLSD &messages)
 {
     std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(filename), true));
     std::string path(gDirUtilp->getDirName(filename));
 
-    LLSettingsDay::ptr_t day = LLSettingsVODay::buildFromLegacyPresetFile(name, path);
+    LLSettingsDay::ptr_t day = LLSettingsVODay::buildFromLegacyPresetFile(name, path, messages);
+    if (!day)
+    {
+        messages["NAME"] = name;
+        messages["FILE"] = filename;
+    }
     return day;
 }
 
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 415e9de6a4..09a0aea426 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -190,9 +190,9 @@ public:
     // and rotated by last cam yaw needed by water rendering shaders
     LLVector4                   getRotatedLightNorm() const;
 
-    static LLSettingsWater::ptr_t   createWaterFromLegacyPreset(const std::string filename);
-    static LLSettingsSky::ptr_t createSkyFromLegacyPreset(const std::string filename);
-    static LLSettingsDay::ptr_t createDayCycleFromLegacyPreset(const std::string filename);
+    static LLSettingsWater::ptr_t createWaterFromLegacyPreset(const std::string filename, LLSD &messages);
+    static LLSettingsSky::ptr_t createSkyFromLegacyPreset(const std::string filename, LLSD &messages);
+    static LLSettingsDay::ptr_t createDayCycleFromLegacyPreset(const std::string filename, LLSD &messages);
 
     // Construct a new day cycle based on the environment.  Replacing either the water or the sky tracks.
     LLSettingsDay::ptr_t        createDayCycleFromEnvironment(EnvSelection_t env, LLSettingsBase::ptr_t settings);
@@ -327,8 +327,8 @@ private:
                                     DayTransition(const LLSettingsSky::ptr_t &skystart, const LLSettingsWater::ptr_t &waterstart, DayInstance::ptr_t &end, LLSettingsDay::Seconds time);
         virtual                     ~DayTransition() { };
 
-        virtual void                applyTimeDelta(const LLSettingsBase::Seconds& delta);
-        virtual void                animate();
+        virtual void                applyTimeDelta(const LLSettingsBase::Seconds& delta) override;
+        virtual void                animate() override;
 
     protected:
         LLSettingsSky::ptr_t        mStartSky;
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index d6c104547d..6283008a63 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -1704,15 +1704,15 @@ void LLFloaterEditExtDayCycle::doImportFromDisk()
 
 void LLFloaterEditExtDayCycle::loadSettingFromFile(const std::vector<std::string>& filenames)
 {
+    LLSD messages;
     if (filenames.size() < 1) return;
     std::string filename = filenames[0];
     LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL;
-    LLSettingsDay::ptr_t legacyday = LLEnvironment::createDayCycleFromLegacyPreset(filename);
+    LLSettingsDay::ptr_t legacyday = LLEnvironment::createDayCycleFromLegacyPreset(filename, messages);
 
     if (!legacyday)
     {   
-        LLSD args(LLSDMap("FILE", filename));
-        LLNotificationsUtil::add("WLImportFail", args);
+        LLNotificationsUtil::add("WLImportFail", messages);
         return;
     }
 
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index ce231973c7..67c6a1bba0 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -729,15 +729,15 @@ void LLFloaterFixedEnvironmentWater::doImportFromDisk()
 
 void LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile(const std::vector<std::string>& filenames)
 {
+    LLSD messages;
     if (filenames.size() < 1) return;
     std::string filename = filenames[0];
     LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL;
-    LLSettingsWater::ptr_t legacywater = LLEnvironment::createWaterFromLegacyPreset(filename);
+    LLSettingsWater::ptr_t legacywater = LLEnvironment::createWaterFromLegacyPreset(filename, messages);
 
     if (!legacywater)
     {   
-        LLSD args(LLSDMap("FILE", filename));
-        LLNotificationsUtil::add("WLImportFail", args);
+        LLNotificationsUtil::add("WLImportFail", messages);
         return;
     }
 
@@ -818,14 +818,14 @@ void LLFloaterFixedEnvironmentSky::loadSkySettingFromFile(const std::vector<std:
 {
     if (filenames.size() < 1) return;
     std::string filename = filenames[0];
+    LLSD messages;
 
     LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL;
-    LLSettingsSky::ptr_t legacysky = LLEnvironment::createSkyFromLegacyPreset(filename);
+    LLSettingsSky::ptr_t legacysky = LLEnvironment::createSkyFromLegacyPreset(filename, messages);
 
     if (!legacysky)
     {   
-        LLSD args(LLSDMap("FILE", filename));
-        LLNotificationsUtil::add("WLImportFail", args);
+        LLNotificationsUtil::add("WLImportFail", messages);
 
         return;
     }
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index e2e7aadb61..29217b3f42 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -64,13 +64,15 @@
 #include "llinventoryobserver.h"
 #include "llinventorydefines.h"
 
+#include "lltrans.h"
+
 #undef  VERIFY_LEGACY_CONVERSION
 
 //=========================================================================
 namespace 
 {
     LLSD ensure_array_4(LLSD in, F32 fill);
-    LLSD read_legacy_preset_data(const std::string &name, const std::string& path);
+    LLSD read_legacy_preset_data(const std::string &name, const std::string& path, LLSD  &messages);
 
     //-------------------------------------------------------------------------
     class LLSettingsInventoryCB : public LLInventoryCallback
@@ -453,10 +455,15 @@ LLSettingsSky::ptr_t LLSettingsVOSky::buildSky(LLSD settings)
 }
 
 
-LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPreset(const std::string &name, const LLSD &legacy)
+LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings, LLSD &messages)
 {
 
-    LLSD newsettings = LLSettingsSky::translateLegacySettings(legacy);
+    LLSD newsettings = LLSettingsSky::translateLegacySettings(oldsettings);
+    if (newsettings.isUndefined())
+    {
+        messages["REASONS"] = LLTrans::getString("SettingTranslateError", LLSDMap("NAME", name));
+        return LLSettingsSky::ptr_t();
+    }
 
     newsettings[SETTING_NAME] = name;
 
@@ -464,6 +471,7 @@ LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPreset(const std::string &n
     LLSD results = LLSettingsBase::settingValidation(newsettings, validations);
     if (!results["success"].asBoolean())
     {
+        messages["REASONS"] = LLTrans::getString("SettingValidationError", LLSDMap("NAME", name));
         LL_WARNS("SETTINGS") << "Sky setting validation failed!\n" << results << LL_ENDL;
         LLSettingsSky::ptr_t();
     }
@@ -473,10 +481,10 @@ LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPreset(const std::string &n
 #ifdef VERIFY_LEGACY_CONVERSION
     LLSD oldsettings = LLSettingsVOSky::convertToLegacy(skyp, isAdvanced());
 
-    if (!llsd_equals(legacy, oldsettings))
+    if (!llsd_equals(oldsettings, oldsettings))
     {
         LL_WARNS("SKY") << "Conversion to/from legacy does not match!\n" 
-            << "Old: " << legacy
+            << "Old: " << oldsettings
             << "new: " << oldsettings << LL_ENDL;
     }
 
@@ -485,17 +493,17 @@ LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPreset(const std::string &n
     return skyp;
 }
 
-LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPresetFile(const std::string &name, const std::string &path)
+LLSettingsSky::ptr_t LLSettingsVOSky::buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages)
 {
-    LLSD legacy_data = read_legacy_preset_data(name, path);
+    LLSD legacy_data = read_legacy_preset_data(name, path, messages);
 
     if (!legacy_data)
-    {
+    {   // messages filled in by read_legacy_preset_data
         LL_WARNS("SETTINGS") << "Could not load legacy Windlight \"" << name << "\" from " << path << LL_ENDL;
         return ptr_t();
     }
 
-    return buildFromLegacyPreset(name, legacy_data);
+    return buildFromLegacyPreset(name, legacy_data, messages);
 }
 
 
@@ -755,15 +763,21 @@ LLSettingsWater::ptr_t LLSettingsVOWater::buildWater(LLSD settings)
 }
 
 //-------------------------------------------------------------------------
-LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPreset(const std::string &name, const LLSD &legacy)
+LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings, LLSD &messages)
 {
-    LLSD newsettings(LLSettingsWater::translateLegacySettings(legacy));
+    LLSD newsettings(LLSettingsWater::translateLegacySettings(oldsettings));
+    if (newsettings.isUndefined())
+    {
+        messages["REASONS"] = LLTrans::getString("SettingTranslateError", LLSDMap("NAME", name));
+        return LLSettingsWater::ptr_t();
+    }
 
     newsettings[SETTING_NAME] = name; 
     LLSettingsWater::validation_list_t validations = LLSettingsWater::validationList();
     LLSD results = LLSettingsWater::settingValidation(newsettings, validations);
     if (!results["success"].asBoolean())
     {
+        messages["REASONS"] = LLTrans::getString("SettingValidationError", name);
         LL_WARNS("SETTINGS") << "Water setting validation failed!: " << results << LL_ENDL;
         return LLSettingsWater::ptr_t();
     }
@@ -773,10 +787,10 @@ LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPreset(const std::strin
 #ifdef VERIFY_LEGACY_CONVERSION
     LLSD oldsettings = LLSettingsVOWater::convertToLegacy(waterp);
 
-    if (!llsd_equals(legacy, oldsettings))
+    if (!llsd_equals(oldsettings, oldsettings))
     {
         LL_WARNS("WATER") << "Conversion to/from legacy does not match!\n"
-            << "Old: " << legacy
+            << "Old: " << oldsettings
             << "new: " << oldsettings << LL_ENDL;
     }
 
@@ -784,17 +798,17 @@ LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPreset(const std::strin
     return waterp;
 }
 
-LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPresetFile(const std::string &name, const std::string &path)
+LLSettingsWater::ptr_t LLSettingsVOWater::buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages)
 {
-    LLSD legacy_data = read_legacy_preset_data(name, path);
+    LLSD legacy_data = read_legacy_preset_data(name, path, messages);
 
     if (!legacy_data)
-    {
+    {   // messages filled in by read_legacy_preset_data
         LL_WARNS("SETTINGS") << "Could not load legacy Windlight \"" << name << "\" from " << path << LL_ENDL;
         return ptr_t();
     }
 
-    return buildFromLegacyPreset(name, legacy_data);
+    return buildFromLegacyPreset(name, legacy_data, messages);
 }
 
 
@@ -959,7 +973,7 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildDay(LLSD settings)
 }
 
 //-------------------------------------------------------------------------
-LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &name, const std::string &path, const LLSD &oldsettings)
+LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &name, const std::string &path, const LLSD &oldsettings, LLSD &messages)
 {
     LLSD newsettings(defaults());
     std::set<std::string> framenames;
@@ -994,16 +1008,22 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &n
     LLSD frames(LLSD::emptyMap());
 
     {
-        LLSettingsWater::ptr_t pwater = LLSettingsVOWater::buildFromLegacyPresetFile("Default", water_path);
-        if (pwater)
-            frames["water:Default"] = pwater->getSettings();
+        LLSettingsWater::ptr_t pwater = LLSettingsVOWater::buildFromLegacyPresetFile("Default", water_path, messages);
+        if (!pwater)
+        {   // messages filled in by buildFromLegacyPresetFile
+            return LLSettingsDay::ptr_t();
+        }
+        frames["water:Default"] = pwater->getSettings();
     }
 
     for (std::set<std::string>::iterator itn = framenames.begin(); itn != framenames.end(); ++itn)
     {
-        LLSettingsSky::ptr_t psky = LLSettingsVOSky::buildFromLegacyPresetFile((*itn), sky_path);
-        if (psky)
-            frames["sky:" + (*itn)] = psky->getSettings();
+        LLSettingsSky::ptr_t psky = LLSettingsVOSky::buildFromLegacyPresetFile((*itn), sky_path, messages);
+        if (!psky)
+        {   // messages filled in by buildFromLegacyPresetFile
+            return LLSettingsDay::ptr_t();
+        }
+        frames["sky:" + (*itn)] = psky->getSettings();
     }
 
     newsettings[SETTING_FRAMES] = frames;
@@ -1012,6 +1032,7 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &n
     LLSD results = LLSettingsDay::settingValidation(newsettings, validations);
     if (!results["success"].asBoolean())
     {
+        messages["REASONS"] = LLTrans::getString("SettingValidationError", LLSDMap("NAME", name));
         LL_WARNS("SETTINGS") << "Day setting validation failed!: " << results << LL_ENDL;
         return LLSettingsDay::ptr_t();
     }
@@ -1035,17 +1056,17 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPreset(const std::string &n
     return dayp;
 }
 
-LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPresetFile(const std::string &name, const std::string &path)
+LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages)
 {
-    LLSD legacy_data = read_legacy_preset_data(name, path);
+    LLSD legacy_data = read_legacy_preset_data(name, path, messages);
 
     if (!legacy_data)
-    {
+    {   // messages filled in by read_legacy_preset_data
         LL_WARNS("SETTINGS") << "Could not load legacy Windlight \"" << name << "\" from " << path << LL_ENDL;
         return ptr_t();
     }
 
-    return buildFromLegacyPreset(name, path, legacy_data);
+    return buildFromLegacyPreset(name, path, legacy_data, messages);
 }
 
 
@@ -1348,7 +1369,7 @@ namespace
     }
 
     //---------------------------------------------------------------------
-    LLSD read_legacy_preset_data(const std::string &name, const std::string& path)
+    LLSD read_legacy_preset_data(const std::string &name, const std::string& path, LLSD &messages)
     {
         llifstream xml_file;
 
@@ -1380,6 +1401,7 @@ namespace
                 xml_file.open(full_path.c_str());
                 if (!xml_file)
                 {
+                    messages["REASONS"] = LLTrans::getString("SettingImportFileError", LLSDMap("FILE", bad_path));
                     LL_WARNS("LEGACYSETTING") << "Unable to open legacy windlight \"" << name << "\" from " << path << LL_ENDL;
                     return LLSD();
                 }
@@ -1388,7 +1410,12 @@ namespace
 
         LLSD params_data;
         LLPointer<LLSDParser> parser = new LLSDXMLParser();
-        parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED);
+        if (parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
+        {
+            xml_file.close();
+            messages["REASONS"] = LLTrans::getString("SettingParseFileError", LLSDMap("FILE", full_path));
+            return LLSD();
+        }
         xml_file.close();
 
         return params_data;
diff --git a/indra/newview/llsettingsvo.h b/indra/newview/llsettingsvo.h
index 1ad0091871..0f4b715e44 100644
--- a/indra/newview/llsettingsvo.h
+++ b/indra/newview/llsettingsvo.h
@@ -91,11 +91,11 @@ public:
 
     static ptr_t    buildSky(LLSD settings);
 
-    static ptr_t    buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings);
+    static ptr_t buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings, LLSD &messages);
     static ptr_t    buildDefaultSky();
     virtual ptr_t   buildClone() const SETTINGS_OVERRIDE;
 
-    static ptr_t    buildFromLegacyPresetFile(const std::string &name, const std::string &path);
+    static ptr_t buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages);
 
     static LLSD     convertToLegacy(const ptr_t &, bool isAdvanced);
 
@@ -125,11 +125,11 @@ public:
 
     static ptr_t    buildWater(LLSD settings);
 
-    static ptr_t    buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings);
+    static ptr_t buildFromLegacyPreset(const std::string &name, const LLSD &oldsettings, LLSD &messages);
     static ptr_t    buildDefaultWater();
     virtual ptr_t   buildClone() const SETTINGS_OVERRIDE;
 
-    static ptr_t    buildFromLegacyPresetFile(const std::string &name, const std::string &path);
+    static ptr_t buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages);
 
     static LLSD     convertToLegacy(const ptr_t &);
 protected:
@@ -156,8 +156,8 @@ public:
 
     static ptr_t    buildDay(LLSD settings);
 
-    static ptr_t    buildFromLegacyPreset(const std::string &name, const std::string &path, const LLSD &oldsettings);
-    static ptr_t    buildFromLegacyPresetFile(const std::string &name, const std::string &path);
+    static ptr_t buildFromLegacyPreset(const std::string &name, const std::string &path, const LLSD &oldsettings, LLSD &messages);
+    static ptr_t buildFromLegacyPresetFile(const std::string &name, const std::string &path, LLSD &messages);
     static ptr_t    buildFromLegacyMessage(const LLUUID &regionId, LLSD daycycle, LLSD skys, LLSD water);
     static ptr_t    buildDefaultDayCycle();
     static ptr_t    buildFromEnvironmentMessage(LLSD settings);
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 9ca9d4cd51..5ea5023c94 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -11267,7 +11267,10 @@ This Region does not support environmental settings.
    name="WLImportFail"
    persist="true"
    type="alertmodal">
-Unable to import legacy Windlight settings from [FILE].
+Unable to import legacy Windlight settings [NAME] from 
+[FILE].
+
+[REASONS]
   <tag>fail</tag>
   </notification>
 
@@ -11331,5 +11334,5 @@ You may not edit settings directly from the libary.
 Please copy to your own inventory and try again.
   <tag>fail</tag>
   </notification>
-
+  
 </notifications>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 1879ce6f32..71133f582f 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -378,6 +378,11 @@ Error in upload request.  Please visit
 http://secondlife.com/support for help fixing this problem.
 </string>
 
+    <!-- Settings errors -->
+    <string name="SettingValidationError">Validation failed for importing settings [NAME]</string>
+    <string name="SettingImportFileError">Could not open file [FILE]</string>
+    <string name="SettingParseFileError">Could not open file [FILE]</string>
+    <string name="SettingTranslateError">Could not translate legacy windlight [NAME]</string>
 	<!-- Asset Type human readable names:  these will replace variable [TYPE] in notification FailedToFindWearable* -->
 	<!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem -->
 	<string name="texture">texture</string>
-- 
cgit v1.2.3