summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRider Linden <rider@lindenlab.com>2018-05-30 17:08:28 -0700
committerRider Linden <rider@lindenlab.com>2018-05-30 17:08:28 -0700
commit2ddad24c4d5e64711cdbffd98e290d3da8e9714a (patch)
tree41d0e42d9c6ecef131651910402c6eb7cc66ec18 /indra
parentacaf57100eade61262d73cf5b318c4545e921bd5 (diff)
Timeline behavior in day cycle edit.
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llmultislider.cpp30
-rw-r--r--indra/llui/llmultislider.h1
-rw-r--r--indra/llui/llmultisliderctrl.h4
-rw-r--r--indra/newview/llenvironment.h6
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp358
-rw-r--r--indra/newview/llfloatereditextdaycycle.h22
-rw-r--r--indra/newview/llsettingsvo.cpp2
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_save_settings.xml2
9 files changed, 240 insertions, 187 deletions
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 93045a6578..5cfe79267f 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -210,6 +210,19 @@ void LLMultiSlider::setCurSlider(const std::string& name)
}
}
+F32 LLMultiSlider::getSliderValueFromX(S32 xpos) const
+{
+ S32 left_edge = mThumbWidth / 2;
+ S32 right_edge = getRect().getWidth() - (mThumbWidth / 2);
+
+ xpos += mMouseOffset;
+ xpos = llclamp(xpos, left_edge, right_edge);
+
+ F32 t = F32(xpos - left_edge) / (right_edge - left_edge);
+
+ return((t * (mMaxValue - mMinValue)) + mMinValue);
+}
+
void LLMultiSlider::resetCurSlider()
{
mCurSlider = LLStringUtil::null;
@@ -359,14 +372,15 @@ BOOL LLMultiSlider::handleHover(S32 x, S32 y, MASK mask)
{
if( gFocusMgr.getMouseCapture() == this )
{
- S32 left_edge = mThumbWidth/2;
- S32 right_edge = getRect().getWidth() - (mThumbWidth/2);
-
- x += mMouseOffset;
- x = llclamp( x, left_edge, right_edge );
-
- F32 t = F32(x - left_edge) / (right_edge - left_edge);
- setCurSliderValue(t * (mMaxValue - mMinValue) + mMinValue );
+// S32 left_edge = mThumbWidth/2;
+// S32 right_edge = getRect().getWidth() - (mThumbWidth/2);
+//
+// x += mMouseOffset;
+// x = llclamp( x, left_edge, right_edge );
+//
+// F32 t = F32(x - left_edge) / (right_edge - left_edge);
+// setCurSliderValue(t * (mMaxValue - mMinValue) + mMinValue );
+ setCurSliderValue(getSliderValueFromX(x));
onCommit();
getWindow()->setCursor(UI_CURSOR_ARROW);
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index 927063a5fd..0177597da2 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -72,6 +72,7 @@ public:
virtual ~LLMultiSlider();
void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
F32 getSliderValue(const std::string& name) const;
+ F32 getSliderValueFromX(S32 xpos) const;
const std::string& getCurSlider() const { return mCurSlider; }
F32 getCurSliderValue() const { return getSliderValue(mCurSlider); }
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index 84378ff7b2..5c4777ebd0 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -74,7 +74,7 @@ protected:
public:
virtual ~LLMultiSliderCtrl();
- F32 getSliderValue(const std::string& name) const;
+ F32 getSliderValue(const std::string& name) const { return mMultiSlider->getSliderValue(name); }
void setSliderValue(const std::string& name, F32 v, BOOL from_event = FALSE);
virtual void setValue(const LLSD& value );
@@ -99,6 +99,8 @@ public:
void setMaxValue(F32 max_value) {mMultiSlider->setMaxValue(max_value);}
void setIncrement(F32 increment) {mMultiSlider->setIncrement(increment);}
+ F32 getSliderValueFromX(S32 x) const { return mMultiSlider->getSliderValueFromX(x); }
+
/// for adding and deleting sliders
const std::string& addSlider();
const std::string& addSlider(F32 val);
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 398c97ebe9..32ce99ccc9 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -129,6 +129,8 @@ public:
typedef boost::signals2::signal<void()> change_signal_t;
typedef std::function<void(S32, EnvironmentInfo::ptr_t)> environment_apply_fn;
+ typedef std::array<F32, 4> altitude_list_t;
+
virtual ~LLEnvironment();
void loadPreferences();
@@ -217,6 +219,8 @@ public:
S32 calculateSkyTrackForAltitude(F64 altitude);
+ const altitude_list_t & getRegionAltitudes() const { return mTrackAltitudes; }
+
protected:
virtual void initSingleton();
@@ -338,7 +342,7 @@ private:
change_signal_t mDayCycleListChange;
S32 mCurrentTrack;
- std::array<F32, 4> mTrackAltitudes;
+ altitude_list_t mTrackAltitudes;
DayInstance::ptr_t getEnvironmentInstance(EnvSelection_t env, bool create = false);
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index f4de71426e..706dd99fc9 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -58,36 +58,37 @@
#include "llenvironment.h"
#include "lltrans.h"
-static const std::string track_tabs[] = {
- "water_track",
- "sky1_track",
- "sky2_track",
- "sky3_track",
- "sky4_track",
-};
-
-// For flyout
-const std::string XML_FLYOUTMENU_FILE("menu_save_settings.xml");
-// From menu_save_settings.xml, consider moving into flyout since it should be supported by flyout either way
-const std::string ACTION_SAVE("save_settings");
-const std::string ACTION_SAVEAS("save_as_new_settings");
-const std::string ACTION_APPLY_LOCAL("apply_local");
-const std::string ACTION_APPLY_PARCEL("apply_parcel");
-const std::string ACTION_APPLY_REGION("apply_region");
-
-const F32 DAY_CYCLE_PLAY_TIME_SECONDS = 60;
-
-
//=========================================================================
-// **RIDER**
+namespace {
+ const std::string track_tabs[] = {
+ "water_track",
+ "sky1_track",
+ "sky2_track",
+ "sky3_track",
+ "sky4_track",
+ };
+
+ // For flyout
+ const std::string XML_FLYOUTMENU_FILE("menu_save_settings.xml");
+ // From menu_save_settings.xml, consider moving into flyout since it should be supported by flyout either way
+ const std::string ACTION_SAVE("save_settings");
+ const std::string ACTION_SAVEAS("save_as_new_settings");
+ const std::string ACTION_APPLY_LOCAL("apply_local");
+ const std::string ACTION_APPLY_PARCEL("apply_parcel");
+ const std::string ACTION_APPLY_REGION("apply_region");
+
+ const F32 DAY_CYCLE_PLAY_TIME_SECONDS = 60;
+
+ const F32 FRAME_SLOP_FACTOR = 0.025f;
+}
+//=========================================================================
const std::string LLFloaterEditExtDayCycle::KEY_INVENTORY_ID("inventory_id");
const std::string LLFloaterEditExtDayCycle::KEY_LIVE_ENVIRONMENT("live_environment");
const std::string LLFloaterEditExtDayCycle::KEY_DAY_LENGTH("day_length");
-// **RIDER**
-
-LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
+//=========================================================================
+LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key) :
LLFloater(key),
mFlyoutControl(NULL),
mCancelButton(NULL),
@@ -96,15 +97,14 @@ LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key):
mTimeSlider(NULL),
mFramesSlider(NULL),
mCurrentTimeLabel(NULL),
- // **RIDER**
mImportButton(nullptr),
mInventoryId(),
mInventoryItem(nullptr),
mSkyBlender(),
mWaterBlender(),
mScratchSky(),
- mScratchWater()
- // **RIDER**
+ mScratchWater(),
+ mIsPlaying(false)
{
mCommitCallbackRegistrar.add("DayCycle.Track", [this](LLUICtrl *ctrl, const LLSD &data) { onTrackSelectionCallback(data); });
@@ -139,17 +139,20 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
mFlyoutControl = new LLFlyoutComboBtnCtrl(this, "save_btn", "btn_flyout", XML_FLYOUTMENU_FILE);
mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
- mCancelButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this));
- mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onTimeSliderMoved, this));
- mFramesSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onFrameSliderCallback, this));
- mAddFrameButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddTrack, this));
- mDeleteFrameButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onRemoveTrack, this));
+ mCancelButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onBtnCancel(); });
+ mTimeSlider->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onTimeSliderMoved(); });
+ mAddFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onAddTrack(); });
+ mDeleteFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onRemoveTrack(); });
mImportButton->setCommitCallback([this](LLUICtrl *, const LLSD &){ onButtonImport(); });
- mTimeSlider->addSlider(0);
+ mFramesSlider->setCommitCallback([this](LLUICtrl *, const LLSD &data) { onFrameSliderCallback(data); });
+ mFramesSlider->setDoubleClickCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask){ onFrameSliderDoubleClick(x, y, mask); });
+ mFramesSlider->setMouseDownCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask){ onFrameSliderMouseDown(x, y, mask); });
+ mFramesSlider->setMouseUpCallback([this](LLUICtrl*, S32 x, S32 y, MASK mask){ onFrameSliderMouseUp(x, y, mask); });
+ mTimeSlider->addSlider(0);
- getChild<LLButton>("sky4_track", true)->setToggleState(true);
+ //getChild<LLButton>("sky1_track", true)->setToggleState(true);
return TRUE;
}
@@ -159,8 +162,6 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT);
LLEnvironment::instance().updateEnvironment();
- // **RIDER**
-
mEditingEnv = LLEnvironment::ENV_NONE;
mEditDay.reset();
if (key.has(KEY_INVENTORY_ID))
@@ -184,10 +185,6 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
mDayLength.value(key[KEY_DAY_LENGTH].asReal());
}
- // **RIDER**
-
- selectTrack(mCurrentTrack);
-
// time labels
mCurrentTimeLabel->setTextArg("[PRCNT]", std::string("0"));
const S32 max_elm = 5;
@@ -221,6 +218,16 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key)
}
mCurrentTimeLabel->setTextArg("[DSC]", std::string());
}
+
+ const LLEnvironment::altitude_list_t &altitudes = LLEnvironment::instance().getRegionAltitudes();
+
+ for (S32 idx = 1; idx < 4; ++idx)
+ {
+ std::stringstream label;
+ label << altitudes[idx] << "m";
+ getChild<LLButton>(track_tabs[idx + 1], true)->setTextArg("[DSC]", label.str());
+ }
+
}
void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
@@ -313,49 +320,14 @@ void LLFloaterEditExtDayCycle::onAddTrack()
if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
{
- // **RIDER**
// scratch water should always have the current water settings.
setting = mScratchWater->buildClone();
-// if (mSliderKeyMap.empty())
-// {
-// // No existing points, use defaults
-// setting = LLSettingsVOWater::buildDefaultWater();
-// }
-// else
-// {
-// // clone existing element, since we are intentionally dropping slider on time selection, copy from tab panels
-// LLView* tab_container = mWaterTabLayoutContainer->getChild<LLView>("water_tabs"); //can't extract panels directly, since it is in 'tuple'
-// LLPanelSettingsWaterMainTab* panel = dynamic_cast<LLPanelSettingsWaterMainTab*>(tab_container->getChildView("water_panel"));
-// if (panel)
-// {
-// setting = panel->getWater()->buildClone();
-// }
-// }
- // **RIDER**
mEditDay->setWaterAtKeyframe(std::dynamic_pointer_cast<LLSettingsWater>(setting), frame);
}
else
{
- // **RIDER**
// scratch sky should always have the current sky settings.
setting = mScratchSky->buildClone();
-// if (mSliderKeyMap.empty())
-// {
-// // No existing points, use defaults
-// setting = LLSettingsVOSky::buildDefaultSky();
-// }
-// else
-// {
-// // clone existing element, since we are intentionally dropping slider on time selection, copy from tab panels
-// LLView* tab_container = mSkyTabLayoutContainer->getChild<LLView>("sky_tabs"); //can't extract panels directly, since they are in 'tuple'
-//
-// LLPanelSettingsSky* panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("atmosphere_panel"));
-// if (panel)
-// {
-// setting = panel->getSky()->buildClone();
-// }
-// }
- // **RIDER**
mEditDay->setSkyAtKeyframe(std::dynamic_pointer_cast<LLSettingsSky>(setting), frame, mCurrentTrack);
}
@@ -413,77 +385,132 @@ void LLFloaterEditExtDayCycle::onPlayActionCallback(const LLSD& user_data)
}
}
-void LLFloaterEditExtDayCycle::onFrameSliderCallback()
+void LLFloaterEditExtDayCycle::onFrameSliderCallback(const LLSD &data)
{
- if (mSliderKeyMap.size() == 0)
+ //LL_WARNS("LAPRAS") << "LLFloaterEditExtDayCycle::onFrameSliderCallback(" << data << ")" << LL_ENDL;
+
+ std::string curslider = mFramesSlider->getCurSlider();
+
+ LL_WARNS("LAPRAS") << "Current slider set to \"" << curslider << "\"" << LL_ENDL;
+ F32 sliderpos(0.0);
+
+ if (curslider.empty())
{
- mLastFrameSlider.clear();
- return;
+ S32 x(0), y(0);
+ LLUI::getMousePositionLocal(mFramesSlider, &x, &y);
+
+ sliderpos = mFramesSlider->getSliderValueFromX(x);
}
- // make sure we have a slider
- const std::string& cur_sldr = mFramesSlider->getCurSlider();
- if (cur_sldr.empty())
+ else
{
- mLastFrameSlider.clear();
- return;
+ sliderpos = mFramesSlider->getCurSliderValue();
}
- F32 new_frame = mFramesSlider->getCurSliderValue();
- // todo: add safety 2.5% checks
- keymap_t::iterator iter = mSliderKeyMap.find(cur_sldr);
- if (iter != mSliderKeyMap.end() && mEditDay->getSettingsAtKeyframe(new_frame, mCurrentTrack).get() == NULL)
+ mTimeSlider->setCurSliderValue(sliderpos);
+// if (mSliderKeyMap.size() == 0)
+// {
+// mLastFrameSlider.clear();
+// return;
+// }
+// // make sure we have a slider
+// const std::string& cur_sldr = mFramesSlider->getCurSlider();
+// if (cur_sldr.empty())
+// {
+// mLastFrameSlider.clear();
+// return;
+// }
+//
+// F32 new_frame = mFramesSlider->getCurSliderValue();
+// // todo: add safety 2.5% checks
+// keymap_t::iterator iter = mSliderKeyMap.find(cur_sldr);
+// if (iter != mSliderKeyMap.end() && mEditDay->getSettingsAtKeyframe(new_frame, mCurrentTrack).get() == NULL)
+// {
+// if (gKeyboard->currentMask(TRUE) == MASK_SHIFT)
+// {
+// LL_DEBUGS() << "Copying frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
+// LLSettingsBase::ptr_t new_settings;
+//
+// // mEditDay still remembers old position, add copy at new position
+// if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
+// {
+// LLSettingsWaterPtr_t water_ptr = std::dynamic_pointer_cast<LLSettingsWater>(iter->second.pSettings)->buildClone();
+// mEditDay->setWaterAtKeyframe(water_ptr, new_frame);
+// new_settings = water_ptr;
+// }
+// else
+// {
+// LLSettingsSkyPtr_t sky_ptr = std::dynamic_pointer_cast<LLSettingsSky>(iter->second.pSettings)->buildClone();
+// mEditDay->setSkyAtKeyframe(sky_ptr, new_frame, mCurrentTrack);
+// new_settings = sky_ptr;
+// }
+//
+// // mSliderKeyMap still remembers old position, for simplicity, just move it to be identical to slider
+// F32 old_frame = iter->second.mFrame;
+// iter->second.mFrame = new_frame;
+// // slider already moved old frame, create new one in old place
+// addSliderFrame(old_frame, new_settings, false /*because we are going to reselect new one*/);
+// // reselect new frame
+// mFramesSlider->setCurSlider(iter->first);
+// }
+// else
+// {
+// LL_DEBUGS() << "Moving frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
+// if (mEditDay->moveTrackKeyframe(mCurrentTrack, iter->second.mFrame, new_frame))
+// {
+// iter->second.mFrame = new_frame;
+// }
+// }
+// }
+//
+// mTimeSlider->setCurSliderValue(new_frame);
+//
+// if (mLastFrameSlider != cur_sldr)
+// {
+// // technically should not be possible for both frame and slider to change
+// // but for safety, assume that they can change independently and both
+// mLastFrameSlider = cur_sldr;
+// updateTabs();
+// }
+// else
+// {
+// updateButtons();
+// updateTimeAndLabel();
+// }
+}
+
+void LLFloaterEditExtDayCycle::onFrameSliderDoubleClick(S32 x, S32 y, MASK mask)
+{
+ onAddTrack();
+}
+
+void LLFloaterEditExtDayCycle::onFrameSliderMouseDown(S32 x, S32 y, MASK mask)
+{
+ stopPlay();
+ F32 sliderpos = mFramesSlider->getSliderValueFromX(x);
+
+ std::string slidername = mFramesSlider->getCurSlider();
+
+ if (!slidername.empty())
{
- if (gKeyboard->currentMask(TRUE) == MASK_SHIFT)
- {
- LL_DEBUGS() << "Copying frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
- LLSettingsBase::ptr_t new_settings;
-
- // mEditDay still remembers old position, add copy at new position
- if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
- {
- LLSettingsWaterPtr_t water_ptr = std::dynamic_pointer_cast<LLSettingsWater>(iter->second.pSettings)->buildClone();
- mEditDay->setWaterAtKeyframe(water_ptr, new_frame);
- new_settings = water_ptr;
- }
- else
- {
- LLSettingsSkyPtr_t sky_ptr = std::dynamic_pointer_cast<LLSettingsSky>(iter->second.pSettings)->buildClone();
- mEditDay->setSkyAtKeyframe(sky_ptr, new_frame, mCurrentTrack);
- new_settings = sky_ptr;
- }
-
- // mSliderKeyMap still remembers old position, for simplicity, just move it to be identical to slider
- F32 old_frame = iter->second.mFrame;
- iter->second.mFrame = new_frame;
- // slider already moved old frame, create new one in old place
- addSliderFrame(old_frame, new_settings, false /*because we are going to reselect new one*/);
- // reselect new frame
- mFramesSlider->setCurSlider(iter->first);
- }
- else
+ F32 sliderval = mFramesSlider->getSliderValue(slidername);
+
+ LL_WARNS("LAPRAS") << "Selected vs mouse delta = " << (sliderval - sliderpos) << LL_ENDL;
+
+ if (fabs(sliderval - sliderpos) > FRAME_SLOP_FACTOR)
{
- LL_DEBUGS() << "Moving frame from " << iter->second.mFrame << " to " << new_frame << LL_ENDL;
- if (mEditDay->moveTrackKeyframe(mCurrentTrack, iter->second.mFrame, new_frame))
- {
- iter->second.mFrame = new_frame;
- }
+ mFramesSlider->resetCurSlider();
}
}
+ LL_WARNS("LAPRAS") << "DOWN: X=" << x << " Y=" << y << " MASK=" << mask << " Position=" << sliderpos << LL_ENDL;
+}
- mTimeSlider->setCurSliderValue(new_frame);
+void LLFloaterEditExtDayCycle::onFrameSliderMouseUp(S32 x, S32 y, MASK mask)
+{
+ F32 sliderpos = mFramesSlider->getSliderValueFromX(x);
- if (mLastFrameSlider != cur_sldr)
- {
- // technically should not be possible for both frame and slider to change
- // but for safety, assume that they can change independently and both
- mLastFrameSlider = cur_sldr;
- updateTabs();
- }
- else
- {
- updateButtons();
- updateTimeAndLabel();
- }
+ LL_WARNS("LAPRAS") << " UP: X=" << x << " Y=" << y << " MASK=" << mask << " Position=" << sliderpos << LL_ENDL;
+ mTimeSlider->setCurSliderValue(sliderpos);
+ selectFrame(sliderpos);
}
void LLFloaterEditExtDayCycle::onTimeSliderMoved()
@@ -491,23 +518,21 @@ void LLFloaterEditExtDayCycle::onTimeSliderMoved()
selectFrame(mTimeSlider->getCurSliderValue());
}
-void LLFloaterEditExtDayCycle::selectTrack(U32 track_index)
+void LLFloaterEditExtDayCycle::selectTrack(U32 track_index, bool force )
{
mCurrentTrack = track_index;
LLButton* button = getChild<LLButton>(track_tabs[track_index], true);
- if (button->getToggleState())
+ if (button->getToggleState() && !force)
{
return;
}
for (int i = 0; i < LLSettingsDay::TRACK_MAX; i++) // use max value
{
- getChild<LLButton>(track_tabs[i], true)->setToggleState(false);
+ getChild<LLButton>(track_tabs[i], true)->setToggleState(i == track_index);
}
- button->setToggleState(true);
-
- bool show_water = mCurrentTrack == LLSettingsDay::TRACK_WATER;
+ bool show_water = (mCurrentTrack == LLSettingsDay::TRACK_WATER);
mSkyTabLayoutContainer->setVisible(!show_water);
mWaterTabLayoutContainer->setVisible(show_water);
updateSlider();
@@ -517,20 +542,21 @@ void LLFloaterEditExtDayCycle::selectFrame(F32 frame)
{
mFramesSlider->resetCurSlider();
- mTimeSlider->setCurSliderValue(frame);
keymap_t::iterator iter = mSliderKeyMap.begin();
keymap_t::iterator end_iter = mSliderKeyMap.end();
while (iter != end_iter)
{
- if (iter->second.mFrame == frame)
+ if (fabs(iter->second.mFrame - frame) <= FRAME_SLOP_FACTOR)
{
mFramesSlider->setCurSlider(iter->first);
+ frame = iter->second.mFrame;
break;
}
iter++;
}
+ mTimeSlider->setCurSliderValue(frame);
// block or update tabs according to new selection
updateTabs();
}
@@ -554,24 +580,6 @@ void LLFloaterEditExtDayCycle::clearTabs()
void LLFloaterEditExtDayCycle::updateTabs()
{
-// std::string sldr = mFramesSlider->getCurSlider();
-// if (sldr.empty())
-// {
-// // keep old settings for duplicating if there are any
-// setWaterTabsEnabled(FALSE);
-// setSkyTabsEnabled(FALSE);
-// }
-// else if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
-// {
-// const LLSettingsWaterPtr_t p_water = sldr.empty() ? LLSettingsWaterPtr_t(NULL) : mEditDay->getWaterAtKeyframe(mFramesSlider->getCurSliderValue());
-// updateWaterTabs(p_water);
-// }
-// else
-// {
-// const LLSettingsSkyPtr_t p_sky = sldr.empty() ? LLSettingsSkyPtr_t(NULL) : mEditDay->getSkyAtKeyframe(mFramesSlider->getCurSliderValue(), mCurrentTrack);
-// updateSkyTabs(p_sky);
-// }
-
reblendSettings();
syncronizeTabs();
@@ -658,6 +666,7 @@ void LLFloaterEditExtDayCycle::updateButtons()
void LLFloaterEditExtDayCycle::updateSlider()
{
+ F32 frame_position = mTimeSlider->getCurSliderValue();
mFramesSlider->clear();
mSliderKeyMap.clear();
@@ -671,7 +680,6 @@ void LLFloaterEditExtDayCycle::updateSlider()
{
// update positions
mLastFrameSlider = mFramesSlider->getCurSlider();
- mTimeSlider->setCurSliderValue(mFramesSlider->getCurSliderValue());
updateTabs();
}
else
@@ -680,6 +688,8 @@ void LLFloaterEditExtDayCycle::updateSlider()
clearTabs();
mLastFrameSlider.clear();
}
+
+ selectFrame(frame_position);
}
void LLFloaterEditExtDayCycle::updateTimeAndLabel()
@@ -749,11 +759,11 @@ LLFloaterEditExtDayCycle::connection_t LLFloaterEditExtDayCycle::setEditCommitSi
return mCommitSignal.connect(cb);
}
-// **RIDER**
void LLFloaterEditExtDayCycle::loadInventoryItem(const LLUUID &inventoryId)
{
if (inventoryId.isNull())
{
+ LL_WARNS("SETTINGS") << "Attempt to load NULL inventory ID" << LL_ENDL;
mInventoryItem = nullptr;
mInventoryId.setNull();
return;
@@ -771,6 +781,14 @@ void LLFloaterEditExtDayCycle::loadInventoryItem(const LLUUID &inventoryId)
return;
}
+ if (mInventoryItem->getAssetUUID().isNull())
+ {
+ LL_WARNS("SETTINGS") << "Asset ID in inventory item is NULL (" << mInventoryId << ")" << LL_ENDL;
+ mInventoryId.setNull();
+ mInventoryItem = nullptr;
+ return;
+ }
+
LLSettingsVOBase::getSettingsAsset(mInventoryItem->getAssetUUID(),
[this](LLUUID asset_id, LLSettingsBase::ptr_t settins, S32 status, LLExtStat) { onAssetLoaded(asset_id, settins, status); });
}
@@ -810,10 +828,13 @@ void LLFloaterEditExtDayCycle::loadLiveEnvironment(LLEnvironment::EnvSelection_t
void LLFloaterEditExtDayCycle::updateEditEnvironment(void)
{
+
S32 skytrack = (mCurrentTrack) ? mCurrentTrack : 1;
mSkyBlender = std::make_shared<LLTrackBlenderLoopingManual>(mScratchSky, mEditDay, skytrack);
mWaterBlender = std::make_shared<LLTrackBlenderLoopingManual>(mScratchWater, mEditDay, LLSettingsDay::TRACK_WATER);
+ selectTrack(1, true);
+
reblendSettings();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, mScratchSky, mScratchWater);
@@ -978,7 +999,8 @@ void LLFloaterEditExtDayCycle::doImportFromDisk()
}
mEditDay = legacyday;
-
+ mCurrentTrack = 1;
+ updateSlider();
updateEditEnvironment();
syncronizeTabs();
refresh();
@@ -1012,10 +1034,10 @@ bool LLFloaterEditExtDayCycle::canApplyParcel() const
LLEnvironment::instance().isExtendedEnvironmentEnabled();
}
-// **RIDER**
-
void LLFloaterEditExtDayCycle::startPlay()
{
+ mIsPlaying = true;
+ mFramesSlider->resetCurSlider();
mPlayTimer.reset();
mPlayTimer.start();
gIdleCallbacks.addFunction(onIdlePlay, this);
@@ -1027,8 +1049,14 @@ void LLFloaterEditExtDayCycle::startPlay()
void LLFloaterEditExtDayCycle::stopPlay()
{
+ if (!mIsPlaying)
+ return;
+
+ mIsPlaying = false;
gIdleCallbacks.deleteFunction(onIdlePlay, this);
mPlayTimer.stop();
+ F32 frame = mTimeSlider->getCurSliderValue();
+ selectFrame(frame);
getChild<LLView>("play_layout", true)->setVisible(TRUE);
getChild<LLView>("pause_layout", true)->setVisible(FALSE);
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index f2462ee1cc..bee5e17b95 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -91,9 +91,12 @@ private:
// time slider moved
void onTimeSliderMoved();
// a frame moved or frame selection changed
- void onFrameSliderCallback();
+ void onFrameSliderCallback(const LLSD &);
+ void onFrameSliderDoubleClick(S32 x, S32 y, MASK mask);
+ void onFrameSliderMouseDown(S32 x, S32 y, MASK mask);
+ void onFrameSliderMouseUp(S32 x, S32 y, MASK mask);
- void selectTrack(U32 track_index);
+ void selectTrack(U32 track_index, bool force = false);
void selectFrame(F32 frame);
void clearTabs();
void updateTabs();
@@ -139,10 +142,10 @@ private:
U32 mCurrentTrack;
std::string mLastFrameSlider;
- LLButton* mCancelButton;
- LLButton* mAddFrameButton;
- LLButton* mDeleteFrameButton;
- LLButton* mImportButton;
+ LLButton* mCancelButton;
+ LLButton* mAddFrameButton;
+ LLButton* mDeleteFrameButton;
+ LLButton* mImportButton;
LLMultiSliderCtrl* mTimeSlider;
LLMultiSliderCtrl* mFramesSlider;
@@ -160,10 +163,11 @@ private:
LLSettingsWater::ptr_t mScratchWater;
// **RIDER**
- LLFlyoutComboBtnCtrl * mFlyoutControl;
+ LLFlyoutComboBtnCtrl * mFlyoutControl;
- LLFrameTimer mPlayTimer;
- F32 mPlayStartFrame; // an env frame
+ LLFrameTimer mPlayTimer;
+ F32 mPlayStartFrame; // an env frame
+ bool mIsPlaying;
edit_commit_signal_t mCommitSignal;
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index ed3c18ef4e..1ac607cd1f 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -240,7 +240,7 @@ void LLSettingsVOBase::onAssetDownloadComplete(LLVFS *vfs, const LLUUID &asset_i
}
else
{
- LL_WARNS("SETTINGS") << "Error retrieving asset asset_id. Status code=" << status << " ext_status=" << ext_status << LL_ENDL;
+ LL_WARNS("SETTINGS") << "Error retrieving asset asset_id. Status code=" << status << "(" << LLAssetStorage::getErrorString(status) << ") ext_status=" << ext_status << LL_ENDL;
}
callback(asset_id, settings, status, ext_status);
}
diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
index 1b07d1aa27..86c580f354 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
@@ -121,7 +121,7 @@
<button
follows="left|top"
height="23"
- label="Sky 1"
+ label="Ground Level"
layout="topleft"
top_pad="0"
left="10"
diff --git a/indra/newview/skins/default/xui/en/menu_save_settings.xml b/indra/newview/skins/default/xui/en/menu_save_settings.xml
index fcdd711366..0d52d9b16e 100644
--- a/indra/newview/skins/default/xui/en/menu_save_settings.xml
+++ b/indra/newview/skins/default/xui/en/menu_save_settings.xml
@@ -21,7 +21,7 @@
</menu_item_call>
<menu_item_call
name="apply_local"
- label="Apply Locally">
+ label="Apply Only To Myself">
<menu_item_call.on_click
function="FlyoutCombo.Button.Action"
userdata="local" />