summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/llenvironment.cpp48
-rw-r--r--indra/newview/llenvironment.h10
-rw-r--r--indra/newview/llfloateravatarpicker.cpp55
-rw-r--r--indra/newview/llfloatercolorpicker.cpp52
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp140
-rw-r--r--indra/newview/llfloatereditextdaycycle.h5
-rw-r--r--indra/newview/llfloaterexperiencepicker.cpp55
-rw-r--r--indra/newview/llfloaterfixedenvironment.cpp13
-rw-r--r--indra/newview/llpanelenvironment.cpp155
-rw-r--r--indra/newview/llsettingspicker.cpp91
-rw-r--r--indra/newview/llsettingspicker.h16
-rw-r--r--indra/newview/llsettingsvo.cpp87
-rw-r--r--indra/newview/llsettingsvo.h12
-rw-r--r--indra/newview/lltexturectrl.cpp58
-rw-r--r--indra/newview/lltrackpicker.cpp126
-rw-r--r--indra/newview/lltrackpicker.h58
-rw-r--r--indra/newview/skins/default/xui/en/floater_pick_track.xml129
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_environment.xml3
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml5
21 files changed, 726 insertions, 401 deletions
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/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/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..aa16747fe3 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,48 @@ void LLFloaterEditExtDayCycle::onRemoveFrame()
void LLFloaterEditExtDayCycle::onCloneTrack()
{
+ 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;
+ }
}
@@ -1049,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();
@@ -1228,8 +1273,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 +1553,7 @@ void LLFloaterEditExtDayCycle::synchronizeTabs()
mEditSky = psettingS;
doCloseInventoryFloater();
+ doCloseTrackFloater();
setTabsData(tabs, psettingS, canedit);
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, mEditSky, mEditWater);
@@ -1704,15 +1749,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;
}
@@ -1741,6 +1786,7 @@ bool LLFloaterEditExtDayCycle::canApplyParcel() const
void LLFloaterEditExtDayCycle::startPlay()
{
doCloseInventoryFloater();
+ doCloseTrackFloater();
mIsPlaying = true;
mFramesSlider->resetCurSlider();
@@ -1814,6 +1860,38 @@ void LLFloaterEditExtDayCycle::clearDirtyFlag()
}
+void LLFloaterEditExtDayCycle::doOpenTrackFloater(const LLSD &args)
+{
+ 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()); });
+ }
+
+ 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 +1910,16 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ
picker->setSettingsFilter(type);
picker->setSettingsItemId(curritem);
+ 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);
- picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER);
}
void LLFloaterEditExtDayCycle::doCloseInventoryFloater(bool quitting)
@@ -1929,26 +2014,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();
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index e808ab8a46..f50c9f7e5f 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(const LLSD &args);
+ 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/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index ce231973c7..5eac6b317b 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)
@@ -729,15 +730,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 +819,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/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp
index 55b579d0a2..8f279c07ba 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)
{
@@ -309,11 +343,12 @@ std::string LLPanelEnvironmentInfo::getInventoryNameForAssetId(LLUUID asset_id)
std::string LLPanelEnvironmentInfo::getNameForTrackIndex(S32 index)
{
std::string invname;
-
- LL_WARNS("LAPRAS") << "mDayCycleName='" << mCurrentEnvironment->mDayCycleName << "'" << LL_ENDL;
if (mCurrentEnvironment->mDayCycleName.empty())
{
invname = mCurrentEnvironment->mNameList[index];
+
+ if (!isRegion() && invname.empty())
+ invname = getString("str_region_env");
}
else if (!mCurrentEnvironment->mDayCycle->isTrackEmpty(index))
{
@@ -338,7 +373,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;
@@ -546,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 cycle runs over all labels to get accurate one
- // 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/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp
index 7aa9cf0ae8..e2d6d43ae3 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";
@@ -76,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();
@@ -136,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);
@@ -173,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
@@ -187,66 +190,13 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)
label = getString(STR_TITLE_SETTINGS);
}
setTitle(prefix + " " + label);
-
- mInventoryPanel->setFilterSettingsTypes(filter);
}
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();
}
@@ -289,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())
@@ -315,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)
@@ -359,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 941fe752b0..859f92fbe8 100644
--- a/indra/newview/llsettingspicker.h
+++ b/indra/newview/llsettingspicker.h
@@ -45,7 +45,12 @@ class LLInventoryPanel;
class LLFloaterSettingsPicker : public LLFloater
{
public:
- typedef std::function<void (LLUUID id)> commit_callback_t;
+ 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;
@@ -66,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;
@@ -109,7 +115,7 @@ private:
LLHandle<LLView> mOwnerHandle;
LLUUID mSettingItemID;
LLUUID mSettingAssetID;
- bool mTrackWater;
+ ETrackMode mTrackMode;
LLFilterEditor * mFilterEdit;
LLInventoryPanel * mInventoryPanel;
@@ -117,8 +123,6 @@ private:
F32 mContextConeOpacity;
PermissionMask mImmediateFilterPermMask;
-// PermissionMask mDnDFilterPermMask;
-// PermissionMask mNonImmediateFilterPermMask;
bool mActive;
bool mNoCopySettingsSelected;
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/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..bc918f4bd7
--- /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(const 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..dab3b72915
--- /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(const 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>
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/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml
index 32b6e56acd..77858ecbc4 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"
@@ -250,7 +251,6 @@
enabled="false"
top_delta="3"
left_pad="21"
- xxxleft="-160"
height="20"
layout="topleft"
name="edt_invname_alt1"
@@ -295,7 +295,6 @@
enabled="false"
top_delta="3"
left_pad="21"
- xxxleft="-160"
height="20"
layout="topleft"
name="edt_invname_alt2"
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>