From 7a0a580eddf4fb7608d1bd84b7eccd2653075184 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Thu, 17 May 2018 15:50:27 +0300 Subject: MAINT-8344 Prevent multislider from locking in infinit cycle --- indra/llui/llmultislider.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index 0aa3e17075..aab77c2bd8 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -334,10 +334,15 @@ void LLMultiSlider::deleteSlider(const std::string& name) void LLMultiSlider::clear() { - while(mThumbRects.size() > 0) { + while(mThumbRects.size() > 0 && mValue.size() > 0) { deleteCurSlider(); } + if (mThumbRects.size() > 0 || mValue.size() > 0) + { + LL_WARNS() << "Failed to fully clear Multi slider" << LL_ENDL; + } + LLF32UICtrl::clear(); } -- cgit v1.2.3 From e4973e0f92b524e7f9c2d10745f4c5e3a8557284 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Fri, 18 May 2018 21:09:42 +0300 Subject: MAINT-8344 Day Cycle Editor (part 3) --- indra/llui/llmultislider.cpp | 42 +- indra/llui/llmultislider.h | 1 + indra/llui/llmultisliderctrl.cpp | 5 + indra/llui/llmultisliderctrl.h | 1 + indra/newview/llfloatereditextdaycycle.cpp | 994 ++++++--------------- indra/newview/llfloatereditextdaycycle.h | 69 +- indra/newview/llpanelenvironment.cpp | 4 +- .../default/xui/en/floater_edit_ext_day_cycle.xml | 45 +- 8 files changed, 365 insertions(+), 796 deletions(-) diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index aab77c2bd8..93045a6578 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -196,7 +196,11 @@ void LLMultiSlider::setValue(const LLSD& value) F32 LLMultiSlider::getSliderValue(const std::string& name) const { - return (F32)mValue[name].asReal(); + if (mValue.has(name)) + { + return (F32)mValue[name].asReal(); + } + return 0; } void LLMultiSlider::setCurSlider(const std::string& name) @@ -206,6 +210,11 @@ void LLMultiSlider::setCurSlider(const std::string& name) } } +void LLMultiSlider::resetCurSlider() +{ + mCurSlider = LLStringUtil::null; +} + const std::string& LLMultiSlider::addSlider() { return addSlider(mInitialValue); @@ -421,20 +430,23 @@ BOOL LLMultiSlider::handleMouseDown(S32 x, S32 y, MASK mask) } } - // Find the offset of the actual mouse location from the center of the thumb. - if (mThumbRects[mCurSlider].pointInRect(x,y)) + if (!mCurSlider.empty()) { - mMouseOffset = (mThumbRects[mCurSlider].mLeft + mThumbWidth/2) - x; - } - else - { - mMouseOffset = 0; - } + // Find the offset of the actual mouse location from the center of the thumb. + if (mThumbRects[mCurSlider].pointInRect(x,y)) + { + mMouseOffset = (mThumbRects[mCurSlider].mLeft + mThumbWidth/2) - x; + } + else + { + mMouseOffset = 0; + } - // Start dragging the thumb - // No handler needed for focus lost since this class has no state that depends on it. - gFocusMgr.setMouseCapture( this ); - mDragStartThumbRect = mThumbRects[mCurSlider]; + // Start dragging the thumb + // No handler needed for focus lost since this class has no state that depends on it. + gFocusMgr.setMouseCapture( this ); + mDragStartThumbRect = mThumbRects[mCurSlider]; + } } make_ui_sound("UISndClick"); @@ -551,7 +563,7 @@ void LLMultiSlider::draw() thumb_imagep->drawSolid(mDragStartThumbRect, mThumbCenterColor.get() % 0.3f); // draw the highlight - if (hasFocus()) + if (hasFocus() && !mCurSlider.empty()) { thumb_imagep->drawBorder(mThumbRects[mCurSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth()); } @@ -583,7 +595,7 @@ void LLMultiSlider::draw() else { // draw highlight - if (hasFocus()) + if (hasFocus() && !mCurSlider.empty()) { thumb_imagep->drawBorder(mThumbRects[mCurSlider], gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth()); } diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h index 2b422e89c9..927063a5fd 100644 --- a/indra/llui/llmultislider.h +++ b/indra/llui/llmultislider.h @@ -76,6 +76,7 @@ public: const std::string& getCurSlider() const { return mCurSlider; } F32 getCurSliderValue() const { return getSliderValue(mCurSlider); } void setCurSlider(const std::string& name); + void resetCurSlider(); void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); } /*virtual*/ void setValue(const LLSD& value); diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index c460a08afc..a982d431b3 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -213,6 +213,11 @@ void LLMultiSliderCtrl::setCurSlider(const std::string& name) mCurValue = mMultiSlider->getCurSliderValue(); } +void LLMultiSliderCtrl::resetCurSlider() +{ + mMultiSlider->resetCurSlider(); +} + BOOL LLMultiSliderCtrl::setLabelArg( const std::string& key, const LLStringExplicit& text ) { BOOL res = FALSE; diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h index b6a3542376..84378ff7b2 100644 --- a/indra/llui/llmultisliderctrl.h +++ b/indra/llui/llmultisliderctrl.h @@ -84,6 +84,7 @@ public: const std::string& getCurSlider() const { return mMultiSlider->getCurSlider(); } F32 getCurSliderValue() const { return mCurValue; } void setCurSlider(const std::string& name); + void resetCurSlider(); void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mMultiSlider->getCurSlider(), val, from_event); } virtual void setMinValue(const LLSD& min_value) { setMinValue((F32)min_value.asReal()); } diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index c57add32fe..ad759d13ff 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -43,10 +43,13 @@ // newview #include "llagent.h" +//#include "llflyoutcombobtnctrl.h" //Todo: get rid of this and LLSaveOutfitComboBtn, make a proper UI element/button/pannel instead #include "llregioninfomodel.h" #include "llviewerregion.h" #include "llpaneleditwater.h" #include "llpaneleditsky.h" +//#include "llsettingsvo.h" +//#include "llinventorymodel.h" #include "llenvironment.h" #include "lltrans.h" @@ -59,47 +62,75 @@ static const std::string track_tabs[] = { "sky4_track", }; +// For flyout +/*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"); -LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key): +const std::string XML_FLYOUTMENU_FILE("menu_save_settings.xml");*/ + + +LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key): LLFloater(key), mSaveButton(NULL), mCancelButton(NULL), + mUploadButton(NULL), mDayLength(0), mDayOffset(0), mCurrentTrack(4), mTimeSlider(NULL), mFramesSlider(NULL), + //mFlyoutControl(NULL), mCurrentTimeLabel(NULL) -// , mTimeCtrl(NULL) -// , mMakeDefaultCheckBox(NULL) -// , { mCommitCallbackRegistrar.add("DayCycle.Track", boost::bind(&LLFloaterEditExtDayCycle::onTrackSelectionCallback, this, _2)); } +LLFloaterEditExtDayCycle::~LLFloaterEditExtDayCycle() +{ + // Todo: consider remaking mFlyoutControl into class that initializes intself with floater, + // completes at postbuild, e t c... + // (make it into actual button?, In such case XML_FLYOUTMENU_FILE will be specified in xml) + //delete mFlyoutControl; +} + +void LLFloaterEditExtDayCycle::openFloater(LLSettingsDay::ptr_t settings, S64Seconds daylength, S64Seconds dayoffset) +{ + mSavedDay = settings; + mEditDay = settings->buildClone(); + mDayLength = daylength; + mDayOffset = dayoffset; + LLFloater::openFloater(); +} + // virtual BOOL LLFloaterEditExtDayCycle::postBuild() { - getChild("add_frame")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddTrack, this)); - getChild("delete_frame")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onRemoveTrack, this)); getChild("day_cycle_name")->setKeystrokeCallback(boost::bind(&LLFloaterEditExtDayCycle::onCommitName, this, _1, _2), NULL); mSaveButton = getChild("save_btn", true); mCancelButton = getChild("cancel_btn", true); mUploadButton = getChild("upload_btn", true); + mAddFrameButton = getChild("add_frame", true); + mDeleteFrameButton = getChild("delete_frame", true); mTimeSlider = getChild("WLTimeSlider"); mFramesSlider = getChild("WLDayCycleFrames"); mSkyTabLayoutContainer = getChild("frame_settings_sky", true); mWaterTabLayoutContainer = getChild("frame_settings_water", true); mCurrentTimeLabel = getChild("current_time", true); - //initCallbacks(); + //mFlyoutControl = new LLFlyoutComboBtnCtrl(this, "save_btn", "btn_flyout", XML_FLYOUTMENU_FILE); + //mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); }); - mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this)); + mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this)); mCancelButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this)); - mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onUpload, this)); + mUploadButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnUpload, 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)); mTimeSlider->addSlider(0); @@ -111,21 +142,13 @@ BOOL LLFloaterEditExtDayCycle::postBuild() void LLFloaterEditExtDayCycle::onOpen(const LLSD& key) { - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT); - LLEnvironment::instance().updateEnvironment(); - - + if (mEditDay.get() == NULL) { - // TODO/TEMP - LLEnvironment::EnvSelection_t env = LLEnvironment::ENV_REGION; // should not be used - LLSettingsDay::ptr_t pday = LLEnvironment::instance().getEnvironmentDay(env); - mEditDay = pday->buildClone(); // pday should be passed as parameter - - S64Seconds daylength = LLEnvironment::instance().getEnvironmentDayLength(env); - S64Seconds dayoffset = LLEnvironment::instance().getEnvironmentDayOffset(env); - mDayLength = daylength; // should be passed as parameter - mDayOffset = dayoffset; // should be passed as parameter + LL_WARNS() << "Uninitialized day settings, closing floater" << LL_ENDL; + closeFloater(); } + LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_EDIT); + LLEnvironment::instance().updateEnvironment(); LLLineEditor* name_field = getChild("day_cycle_name"); name_field->setText(mEditDay->getName()); @@ -137,17 +160,32 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key) const S32 max_elm = 5; if (mDayLength.value() != 0) { - F32Hours hrs; + S32Hours hrs; + S32Minutes minutes; + S64Seconds total; + //LLDate date; LLUIString formatted_label = getString("time_label"); for (int i = 0; i < max_elm; i++) { - // Todo: if possible, find a better way, both to get string and child names - hrs = ((mDayLength / (max_elm - 1)) * i) + mDayOffset; - formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); + total = ((mDayLength / (max_elm - 1)) * i) + mDayOffset; + hrs = total; + minutes = total - hrs; + + //date = LLDate(((mDayLength / (max_elm - 1)) * i) + mDayOffset); + //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M"))); + //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); + + formatted_label.setArg("[HH]", llformat("%d", hrs.value())); + formatted_label.setArg("[MM]", llformat("%d", abs(minutes.value()))); getChild("p" + llformat("%d", i), true)->setTextArg("[DSC]", formatted_label.getString()); } hrs = mDayOffset; - formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); + minutes = mDayOffset - hrs; + //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); + //date = LLDate(mDayOffset); + //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M"))); + formatted_label.setArg("[HH]", llformat("%d", hrs.value())); + formatted_label.setArg("[MM]", llformat("%d", abs(minutes.value()))); mCurrentTimeLabel->setTextArg("[DSC]", formatted_label.getString()); } else @@ -158,13 +196,6 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key) } mCurrentTimeLabel->setTextArg("[DSC]", std::string()); } - - //todo: add time slider setting - - /*list_name_id_t getSkyList() const; - list_name_id_t getWaterList() const; - - getChild("sky4_track", true)->setToggleState(true);*/ } void LLFloaterEditExtDayCycle::onClose(bool app_quitting) @@ -177,65 +208,6 @@ void LLFloaterEditExtDayCycle::onClose(bool app_quitting) } } - -void LLFloaterEditExtDayCycle::onUpload() -{ - LLSettingsVOBase::createInventoryItem( mEditDay ); - -#if 0 - LLSettingsVOBase::storeAsAsset(mEditDay); - - LLTransactionID tid; - tid.generate(); - LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - const std::string filename = asset_id_to_filename(mAssetID, LL_PATH_CACHE); - if (!exportFile(filename)) - { - std::string buffer = llformat("Unable to save '%s' to wearable file.", mName.c_str()); - LL_WARNS() << buffer << LL_ENDL; - - LLSD args; - args["NAME"] = mName; - LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args); - return; - } - - if (gSavedSettings.getBOOL("LogWearableAssetSave")) - { - const std::string log_filename = asset_id_to_filename(mAssetID, LL_PATH_LOGS); - exportFile(log_filename); - } - - // save it out to database - if (gAssetStorage) - { - /* - std::string url = gAgent.getRegion()->getCapability("NewAgentInventory"); - if (!url.empty()) - { - LL_INFOS() << "Update Agent Inventory via capability" << LL_ENDL; - LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); - body["asset_type"] = LLAssetType::lookup(getAssetType()); - body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); - body["name"] = getName(); - body["description"] = getDescription(); - LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, filename)); - } - else - { - } - */ - LLWearableSaveData* data = new LLWearableSaveData; - data->mType = mType; - gAssetStorage->storeAssetData(filename, mTransactionID, getAssetType(), - &LLViewerWearable::onSaveNewAssetComplete, - (void*)data); - } -#endif -} - void LLFloaterEditExtDayCycle::onVisibilityChange(BOOL new_visibility) { if (new_visibility) @@ -250,47 +222,123 @@ void LLFloaterEditExtDayCycle::onVisibilityChange(BOOL new_visibility) } } +/*void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data) +{ + std::string ctrl_action = ctrl->getName(); + + if (ctrl_action == ACTION_SAVE) + { + mSavedDay = mEditDay; + //doApplyUpdateInventory(); + } + else if (ctrl_action == ACTION_SAVEAS) + { + //doApplyCreateNewInventory(); + LLSettingsVOBase::createInventoryItem(mEditDay, NULL); + } + else if ((ctrl_action == ACTION_APPLY_LOCAL) || + (ctrl_action == ACTION_APPLY_PARCEL) || + (ctrl_action == ACTION_APPLY_REGION)) + { + //doApplyEnvironment(ctrl_action); + // Shouldn't be supported? + } + else + { + LL_WARNS("ENVIRONMENT") << "Unknown settings action '" << ctrl_action << "'" << LL_ENDL; + } + + if (!mCommitSignal.empty()) + mCommitSignal(mEditDay); + closeFloater(); + }*/ + void LLFloaterEditExtDayCycle::onBtnSave() { + mSavedDay = mEditDay; + + //no longer needed? if (!mCommitSignal.empty()) mCommitSignal(mEditDay); + closeFloater(); } void LLFloaterEditExtDayCycle::onBtnCancel() { - closeFloater(); + closeFloater(); +} + +void LLFloaterEditExtDayCycle::onBtnUpload() +{ + LLSettingsVOBase::createInventoryItem(mEditDay); + //closeFloater(); } void LLFloaterEditExtDayCycle::onAddTrack() { + // todo: 2.5% safety zone + std::string sldr_key = mFramesSlider->getCurSlider(); F32 frame = mTimeSlider->getCurSliderValue(); LLSettingsBase::ptr_t setting; - // todo: expand to generate from panels instead of using defaults - if (mEditDay->getSettingsAtKeyframe(frame, mCurrentTrack).get() != NULL) //temp check? todo: disable button in such cases + if (mEditDay->getSettingsAtKeyframe(frame, mCurrentTrack).get() != NULL) { return; } - if (mCurrentTrack == 0) + + if (mCurrentTrack == LLSettingsDay::TRACK_WATER) { - setting = LLSettingsVOWater::buildDefaultWater(); + 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("water_tabs"); //can't extract panels directly, since it is in 'tuple' + LLPanelSettingsWaterMainTab* panel = dynamic_cast(tab_container->getChildView("water_panel")); + if (panel) + { + setting = panel->getWater()->buildClone(); + } + } mEditDay->setWaterAtKeyframe(std::dynamic_pointer_cast(setting), frame); } else { - setting = LLSettingsVOSky::buildDefaultSky(); + 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("sky_tabs"); //can't extract panels directly, since they are in 'tuple' + + LLPanelSettingsSky* panel = dynamic_cast(tab_container->getChildView("atmosphere_panel")); + if (panel) + { + setting = panel->getSky()->buildClone(); + } + } mEditDay->setSkyAtKeyframe(std::dynamic_pointer_cast(setting), frame, mCurrentTrack); } + addSliderFrame(frame, setting); updateTabs(); } void LLFloaterEditExtDayCycle::onRemoveTrack() { - F32 frame = mTimeSlider->getCurSliderValue(); - mEditDay->removeTrackKeyframe(mCurrentTrack, frame); + std::string sldr_key = mFramesSlider->getCurSlider(); + if (!sldr_key.empty()) + { + return; + } removeCurrentSliderFrame(); - //mFramesSlider->deleteCurSlider(); + updateButtons(); } void LLFloaterEditExtDayCycle::onCommitName(class LLLineEditor* caller, void* user_data) @@ -306,14 +354,14 @@ void LLFloaterEditExtDayCycle::onTrackSelectionCallback(const LLSD& user_data) void LLFloaterEditExtDayCycle::onFrameSliderCallback() { - if (mFramesSlider->getValue().size() == 0) + if (mSliderKeyMap.size() == 0) { mLastFrameSlider.clear(); return; } // make sure we have a slider const std::string& cur_sldr = mFramesSlider->getCurSlider(); - if (cur_sldr == "") + if (cur_sldr.empty()) { mLastFrameSlider.clear(); return; @@ -322,7 +370,7 @@ void LLFloaterEditExtDayCycle::onFrameSliderCallback() F32 new_frame = mFramesSlider->getCurSliderValue(); // todo: add safety checks, user shouldn't be capable of moving one frame over another or move missing frame keymap_t::iterator iter = mSliderKeyMap.find(cur_sldr); - if (iter != mSliderKeyMap.end() && /*temp? until disabling mechanics*/ mEditDay->getSettingsAtKeyframe(new_frame, mCurrentTrack).get() == NULL) + if (iter != mSliderKeyMap.end() && mEditDay->getSettingsAtKeyframe(new_frame, mCurrentTrack).get() == NULL) { LL_DEBUGS() << "Moving frame from " << iter->second.first << " to " << new_frame << LL_ENDL; if (mEditDay->moveTrackKeyframe(mCurrentTrack, iter->second.first, new_frame)) @@ -331,6 +379,8 @@ void LLFloaterEditExtDayCycle::onFrameSliderCallback() } } + mTimeSlider->setCurSliderValue(new_frame); + if (mLastFrameSlider != cur_sldr) { // technically should not be possible for both frame and slider to change @@ -338,29 +388,33 @@ void LLFloaterEditExtDayCycle::onFrameSliderCallback() mLastFrameSlider = cur_sldr; updateTabs(); } - // updateTrack(); - // reset last known position + else + { + updateButtons(); + updateTimeAndLabel(); + } } void LLFloaterEditExtDayCycle::onTimeSliderMoved() { - // Todo: safety checks - // Update label - F32 time = mTimeSlider->getCurSliderValue(); - mCurrentTimeLabel->setTextArg("[PRCNT]", llformat("%.0f", time * 100)); - if (mDayLength.value() != 0) - { - F32Hours hrs = (mDayLength * time) + mDayOffset; - LLUIString formatted_label = getString("time_label"); - formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); - mCurrentTimeLabel->setTextArg("[DSC]", formatted_label.getString()); - } - else + mFramesSlider->resetCurSlider(); + + keymap_t::iterator iter = mSliderKeyMap.begin(); + keymap_t::iterator end_iter = mSliderKeyMap.end(); + F32 frame = mTimeSlider->getCurSliderValue(); + while (iter != end_iter) { - mCurrentTimeLabel->setTextArg("[DSC]", std::string()); + if (iter->second.first == frame) + { + mFramesSlider->setCurSlider(iter->first); + break; + } + iter++; } - //Todo: update something related to time/play? + // Todo: safety checks + updateTabs(); + //Todo: update something related to time/play/blending? } void LLFloaterEditExtDayCycle::selectTrack(U32 track_index) @@ -373,60 +427,78 @@ void LLFloaterEditExtDayCycle::selectTrack(U32 track_index) return; } - for (int i = 0; i < 5; i++) // yse max value + for (int i = 0; i < LLSettingsDay::TRACK_MAX; i++) // use max value { getChild(track_tabs[i], true)->setToggleState(false); } button->setToggleState(true); - bool show_water = mCurrentTrack == 0; + bool show_water = mCurrentTrack == LLSettingsDay::TRACK_WATER; mSkyTabLayoutContainer->setVisible(!show_water); mWaterTabLayoutContainer->setVisible(show_water); updateSlider(); } -void LLFloaterEditExtDayCycle::updateTabs() +void LLFloaterEditExtDayCycle::clearTabs() { - if (mCurrentTrack == 0) + // todo: instead init with defaults? + if (mCurrentTrack == LLSettingsDay::TRACK_WATER) { - updateWaterTabs(); + const LLSettingsWaterPtr_t p_water = LLSettingsWaterPtr_t(NULL); + updateWaterTabs(p_water); } else { - updateSkyTabs(); + const LLSettingsSkyPtr_t p_sky = LLSettingsSkyPtr_t(NULL); + updateSkyTabs(p_sky); } + updateButtons(); + updateTimeAndLabel(); } -void LLFloaterEditExtDayCycle::updateWaterTabs() +void LLFloaterEditExtDayCycle::updateTabs() { - // todo: substitute with mSliderKeyMap? - const LLSettingsWaterPtr_t p_water = mEditDay->getWaterAtKeyframe(mFramesSlider->getCurSliderValue()); + // TODO: either prevent user from editing existing settings or clone them to not affect saved frames + std::string sldr = mFramesSlider->getCurSlider(); + if (sldr.empty()) + { + // keep old settings for duplicating if there are any + // TODO: disable tabs to prevent editing without nulling settings + } + 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); + } + updateButtons(); + updateTimeAndLabel(); +} - // Compiler warnings from getChild about LLPanelSettingsWaterMainTab not being complete/missing params constructor... - // Todo: fix class to work with getChild()? - LLView* tab_container = mWaterTabLayoutContainer->getChild("water_tabs"); //can't extract panels directly, since they are in 'tuple' +void LLFloaterEditExtDayCycle::updateWaterTabs(const LLSettingsWaterPtr_t &p_water) +{ + LLView* tab_container = mWaterTabLayoutContainer->getChild("water_tabs"); //can't extract panels directly, since it is in 'tuple' LLPanelSettingsWaterMainTab* panel = dynamic_cast(tab_container->getChildView("water_panel")); if (panel) { - panel->setWater(p_water); // todo: Null disables + panel->setWater(p_water); } } -void LLFloaterEditExtDayCycle::updateSkyTabs() +void LLFloaterEditExtDayCycle::updateSkyTabs(const LLSettingsSkyPtr_t &p_sky) { - // todo: substitute with mSliderKeyMap? - const LLSettingsSkyPtr_t p_sky = mEditDay->getSkyAtKeyframe(mFramesSlider->getCurSliderValue(), mCurrentTrack); - LLView* tab_container = mSkyTabLayoutContainer->getChild("sky_tabs"); //can't extract panels directly, since they are in 'tuple' - // Compiler warnings from getChild about tabs... - // Todo: fix class LLPanelSettingsSky* panel; panel = dynamic_cast(tab_container->getChildView("atmosphere_panel")); if (panel) { - panel->setSky(p_sky); // todo: Null disables + panel->setSky(p_sky); } panel = dynamic_cast(tab_container->getChildView("clouds_panel")); if (panel) @@ -440,51 +512,107 @@ void LLFloaterEditExtDayCycle::updateSkyTabs() } } +void LLFloaterEditExtDayCycle::updateButtons() +{ + F32 frame = mTimeSlider->getCurSliderValue(); + LLSettingsBase::ptr_t settings = mEditDay->getSettingsAtKeyframe(frame, mCurrentTrack); + mAddFrameButton->setEnabled(settings.get() == NULL ? TRUE : FALSE); + mDeleteFrameButton->setEnabled(mSliderKeyMap.size() > 0 ? TRUE : FALSE); +} + void LLFloaterEditExtDayCycle::updateSlider() { mFramesSlider->clear(); mSliderKeyMap.clear(); + std::string new_slider; + F32 frame = 0; LLSettingsDay::CycleTrack_t track = mEditDay->getCycleTrack(mCurrentTrack); - for (auto &frame : track) + for (auto &track_frame : track) + { + // multi slider distinguishes elements by key/name in string format + // store names to map to be able to recall dependencies + frame = track_frame.first; + new_slider = mFramesSlider->addSlider(frame); + mSliderKeyMap[new_slider] = framedata_t(frame, track_frame.second); + } + + mLastFrameSlider = new_slider; + + if (mSliderKeyMap.size() > 0) { - addSliderFrame(frame.first, frame.second); + mTimeSlider->setCurSliderValue(frame); + updateTabs(); + } + else + { + // disable panels + clearTabs(); } } +void LLFloaterEditExtDayCycle::updateTimeAndLabel() +{ + F32 time = mTimeSlider->getCurSliderValue(); + mCurrentTimeLabel->setTextArg("[PRCNT]", llformat("%.0f", time * 100)); + if (mDayLength.value() != 0) + { + LLUIString formatted_label = getString("time_label"); + + //F32Hours hrs = (mDayLength * time) + mDayOffset; + //LLDate date((mDayLength * time) + mDayOffset); + //formatted_label.setArg("[TIME]", llformat("%.1f", hrs.value())); + //formatted_label.setArg("[TIME]", date.toHTTPDateString(std::string("%H:%M"))); + + S64Seconds total = (mDayLength * time) + mDayOffset; + S32Hours hrs = total; + S32Minutes minutes = total - hrs; + + formatted_label.setArg("[HH]", llformat("%d", hrs.value())); + formatted_label.setArg("[MM]", llformat("%d", abs(minutes.value()))); + mCurrentTimeLabel->setTextArg("[DSC]", formatted_label.getString()); + } + else + { + mCurrentTimeLabel->setTextArg("[DSC]", std::string()); + } + + // Update blender here: +} + void LLFloaterEditExtDayCycle::addSliderFrame(const F32 frame, LLSettingsBase::ptr_t setting) { // multi slider distinguishes elements by key/name in string format - // store names to map to be able to recal dependencies + // store names to map to be able to recall dependencies std::string new_slider = mFramesSlider->addSlider(frame); mSliderKeyMap[new_slider] = framedata_t(frame, setting); mLastFrameSlider = new_slider; + mTimeSlider->setCurSliderValue(frame); updateTabs(); } void LLFloaterEditExtDayCycle::removeCurrentSliderFrame() { std::string sldr = mFramesSlider->getCurSlider(); + if (sldr.empty()) + { + return; + } mFramesSlider->deleteCurSlider(); keymap_t::iterator iter = mSliderKeyMap.find(sldr); if (iter != mSliderKeyMap.end()) { LL_DEBUGS() << "Removing frame from " << iter->second.first << LL_ENDL; mSliderKeyMap.erase(iter); + mEditDay->removeTrackKeyframe(mCurrentTrack, iter->second.first); } + mLastFrameSlider = mFramesSlider->getCurSlider(); + mTimeSlider->setCurSliderValue(mFramesSlider->getCurSliderValue()); updateTabs(); } -/*void LLFloaterEditExtDayCycle::updateTrack() -{ - LLMultiSliderCtrl* slider = getChild("WLDayCycleKeys"); - //mEditDay->getTrackKeyframes - - // todo make tracks named to allow movement -}*/ - //------------------------------------------------------------------------- LLFloaterEditExtDayCycle::connection_t LLFloaterEditExtDayCycle::setEditCommitSignal(LLFloaterEditExtDayCycle::edit_commit_signal_t::slot_type cb) @@ -492,565 +620,3 @@ LLFloaterEditExtDayCycle::connection_t LLFloaterEditExtDayCycle::setEditCommitSi return mCommitSignal.connect(cb); } -// -// virtual -// void LLFloaterEditExtDayCycle::draw() -// { -// syncTimeSlider(); -// LLFloater::draw(); -// } -// -// void LLFloaterEditExtDayCycle::initCallbacks(void) -// { -// #if 0 -// mDayCycleNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleNameEdited, this), NULL); -// mDayCyclesCombo->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleSelected, this)); -// mDayCyclesCombo->setTextEntryCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleNameEdited, this)); -// mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onTimeSliderMoved, this)); -// mKeysSlider->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyTimeMoved, this)); -// mTimeCtrl->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyTimeChanged, this)); -// mSkyPresetsCombo->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onKeyPresetChanged, this)); -// -// getChild("WLAddKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddKey, this)); -// getChild("WLDeleteKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onDeleteKey, this)); -// -// mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this)); -// mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditExtDayCycle::dumpTrack, this)); -// getChild("cancel")->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnCancel, this)); -// -// // Connect to env manager events. -// LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); -// env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionSettingsChange, this)); -// gAgent.addRegionChangedCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionChange, this)); -// env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionSettingsApplied, this, _1)); -// // Connect to day cycle manager events. -// LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEditExtDayCycle::onDayCycleListChange, this)); -// -// // Connect to sky preset list changes. -// LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditExtDayCycle::onSkyPresetListChange, this)); -// -// -// // Connect to region info updates. -// LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditExtDayCycle::onRegionInfoUpdate, this)); -// #endif -// } -// -// void LLFloaterEditExtDayCycle::syncTimeSlider() -// { -// #if 0 -// // set time -// mTimeSlider->setCurSliderValue((F32)LLWLParamManager::getInstance()->mAnimator.getDayTime() * sHoursPerDay); -// #endif -// } -// -// void LLFloaterEditExtDayCycle::loadTrack() -// { -// // clear the slider -// mKeysSlider->clear(); -// mSliderToKey.clear(); -// -// // add sliders -// -// LL_DEBUGS() << "Adding " << LLWLParamManager::getInstance()->mDay.mTimeMap.size() << " keys to slider" << LL_ENDL; -// -// LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; -// for (std::map::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it) -// { -// addSliderKey(it->first * sHoursPerDay, it->second); -// } -// -// // set drop-down menu to match preset of currently-selected keyframe (one is automatically selected initially) -// const std::string& cur_sldr = mKeysSlider->getCurSlider(); -// if (strlen(cur_sldr.c_str()) > 0) // only do this if there is a curSldr, otherwise we put an invalid entry into the map -// { -// mSkyPresetsCombo->selectByValue(mSliderToKey[cur_sldr].keyframe.toStringVal()); -// } -// -// syncTimeSlider(); -// } -// -// void LLFloaterEditExtDayCycle::applyTrack() -// { -// #if 0 -// LL_DEBUGS() << "Applying track (" << mSliderToKey.size() << ")" << LL_ENDL; -// -// // if no keys, do nothing -// if (mSliderToKey.size() == 0) -// { -// LL_DEBUGS() << "No keys, not syncing" << LL_ENDL; -// return; -// } -// -// llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size()); -// -// // create a new animation track -// LLWLParamManager::getInstance()->mDay.clearKeyframes(); -// -// // add the keys one by one -// for (std::map::iterator it = mSliderToKey.begin(); -// it != mSliderToKey.end(); ++it) -// { -// LLWLParamManager::getInstance()->mDay.addKeyframe(it->second.time / sHoursPerDay, -// it->second.keyframe); -// } -// -// // set the param manager's track to the new one -// LLWLParamManager::getInstance()->resetAnimator( -// mTimeSlider->getCurSliderValue() / sHoursPerDay, false); -// -// LLWLParamManager::getInstance()->mAnimator.update( -// LLWLParamManager::getInstance()->mCurParams); -// #endif -// } - -// void LLFloaterEditExtDayCycle::refreshDayCyclesList() -// { -// #if 0 -// llassert(isNewDay() == false); -// -// mDayCyclesCombo->removeall(); -// -// #if 0 // Disable editing existing day cycle until the workflow is clear enough. -// const LLSD& region_day = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle(); -// if (region_day.size() > 0) -// { -// LLWLParamKey key(getRegionName(), LLEnvKey::SCOPE_REGION); -// mDayCyclesCombo->add(key.name, key.toLLSD()); -// mDayCyclesCombo->addSeparator(); -// } -// #endif -// -// LLDayCycleManager::preset_name_list_t user_days, sys_days; -// LLDayCycleManager::instance().getPresetNames(user_days, sys_days); -// -// // Add user days. -// for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it) -// { -// mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); -// } -// -// if (user_days.size() > 0) -// { -// mDayCyclesCombo->addSeparator(); -// } -// -// // Add system days. -// for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it) -// { -// mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); -// } -// -// mDayCyclesCombo->setLabel(getString("combo_label")); -// #endif -// } -// -// -// -// void LLFloaterEditExtDayCycle::onKeyTimeChanged() -// { -// #if 0 -// // if no keys, skipped -// if (mSliderToKey.size() == 0) -// { -// return; -// } -// -// F32 time24 = mTimeCtrl->getTime24(); -// -// const std::string& cur_sldr = mKeysSlider->getCurSlider(); -// mKeysSlider->setCurSliderValue(time24, TRUE); -// F32 time = mKeysSlider->getCurSliderValue() / sHoursPerDay; -// -// // now set the key's time in the sliderToKey map -// LL_DEBUGS() << "Setting key time: " << time << LL_ENDL; -// mSliderToKey[cur_sldr].time = time; -// -// applyTrack(); -// #endif -// } -// -// -// void LLFloaterEditExtDayCycle::onAddKey() -// { -// #if 0 -// llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size()); -// -// S32 max_sliders; -// LLEnvKey::EScope scope = LLEnvKey::SCOPE_LOCAL; // *TODO: editing region day cycle -// switch (scope) -// { -// case LLEnvKey::SCOPE_LOCAL: -// max_sliders = 20; // *HACK this should be LLWLPacketScrubber::MAX_LOCAL_KEY_FRAMES; -// break; -// case LLEnvKey::SCOPE_REGION: -// max_sliders = 12; // *HACK this should be LLWLPacketScrubber::MAX_REGION_KEY_FRAMES; -// break; -// default: -// max_sliders = (S32) mKeysSlider->getMaxValue(); -// break; -// } -// -// #if 0 -// if ((S32)mSliderToKey.size() >= max_sliders) -// { -// LLSD args; -// args["SCOPE"] = LLEnvManagerNew::getScopeString(scope); -// args["MAX"] = max_sliders; -// LLNotificationsUtil::add("DayCycleTooManyKeyframes", args, LLSD(), LLNotificationFunctorRegistry::instance().DONOTHING); -// return; -// } -// #endif -// -// // add the slider key -// std::string key_val = mSkyPresetsCombo->getSelectedValue().asString(); -// LLWLParamKey sky_params(key_val); -// llassert(!sky_params.name.empty()); -// -// F32 time = mTimeSlider->getCurSliderValue(); -// addSliderKey(time, sky_params); -// -// // apply the change to current day cycles -// applyTrack(); -// #endif -// } -// - -// #if 0 -// LLWLParamKey LLFloaterEditExtDayCycle::getSelectedDayCycle() -// { -// LLWLParamKey dc_key; -// -// if (mDayCycleNameEditor->getVisible()) -// { -// dc_key.name = mDayCycleNameEditor->getText(); -// dc_key.scope = LLEnvKey::SCOPE_LOCAL; -// } -// else -// { -// LLSD combo_val = mDayCyclesCombo->getValue(); -// -// if (!combo_val.isArray()) // manually typed text -// { -// dc_key.name = combo_val.asString(); -// dc_key.scope = LLEnvKey::SCOPE_LOCAL; -// } -// else -// { -// dc_key.fromLLSD(combo_val); -// } -// } -// -// return dc_key; -// } -// #endif -// -// bool LLFloaterEditExtDayCycle::isNewDay() const -// { -// return mKey.asString() == "new"; -// } -// -// void LLFloaterEditExtDayCycle::dumpTrack() -// { -// #if 0 -// LL_DEBUGS("Windlight") << "Dumping day cycle" << LL_ENDL; -// -// LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; -// for (std::map::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it) -// { -// F32 time = it->first * 24.0f; -// S32 h = (S32) time; -// S32 m = (S32) ((time - h) * 60.0f); -// LL_DEBUGS("Windlight") << llformat("(%.3f) %02d:%02d", time, h, m) << " => " << it->second.name << LL_ENDL; -// } -// #endif -// } -// -// void LLFloaterEditExtDayCycle::enableEditing(bool enable) -// { -// mSkyPresetsCombo->setEnabled(enable); -// mTimeCtrl->setEnabled(enable); -// getChild("day_cycle_slider_panel")->setCtrlsEnabled(enable); -// mSaveButton->setEnabled(enable); -// mMakeDefaultCheckBox->setEnabled(enable); -// } -// -// void LLFloaterEditExtDayCycle::reset() -// { -// #if 0 -// // clear the slider -// mKeysSlider->clear(); -// mSliderToKey.clear(); -// -// refreshSkyPresetsList(); -// -// if (isNewDay()) -// { -// mDayCycleNameEditor->setValue(LLSD()); -// F32 time = 0.5f * sHoursPerDay; -// mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name -// mTimeSlider->setCurSliderValue(time); -// -// addSliderKey(time, LLWLParamKey("Default", LLEnvKey::SCOPE_LOCAL)); -// onKeyTimeMoved(); // update the time control and sky sky combo -// -// applyTrack(); -// } -// else -// { -// refreshDayCyclesList(); -// -// // Disable controls until a day cycle to edit is selected. -// enableEditing(false); -// } -// #endif -// } -// -// void LLFloaterEditExtDayCycle::saveRegionDayCycle() -// { -// #if 0 -// LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); -// LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; // the day cycle being edited -// -// // Get current day cycle and the sky preset it references. -// LLSD day_cycle = cur_dayp.asLLSD(); -// LLSD sky_map; -// cur_dayp.getSkyMap(sky_map); -// -// // Apply it to the region. -// LLEnvironmentSettings new_region_settings; -// new_region_settings.saveParams(day_cycle, sky_map, env_mgr.getRegionSettings().getWaterParams(), 0.0f); -// -// #if 1 -// LLEnvManagerNew::instance().setRegionSettings(new_region_settings); -// #else // Temporary disabled ability to upload new region settings from the Day Cycle Editor. -// if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings)) -// { -// LL_WARNS() << "Error applying region environment settings" << LL_ENDL; -// return; -// } -// -// setApplyProgress(true); -// #endif -// #endif -// } -// -// void LLFloaterEditExtDayCycle::setApplyProgress(bool started) -// { -// LLLoadingIndicator* indicator = getChild("progress_indicator"); -// -// indicator->setVisible(started); -// -// if (started) -// { -// indicator->start(); -// } -// else -// { -// indicator->stop(); -// } -// } -// -// bool LLFloaterEditExtDayCycle::getApplyProgress() const -// { -// return getChild("progress_indicator")->getVisible(); -// } -// -// void LLFloaterEditExtDayCycle::onDeleteKey() -// { -// #if 0 -// if (mSliderToKey.size() == 0) -// { -// return; -// } -// else if (mSliderToKey.size() == 1) -// { -// LLNotifications::instance().add("EnvCannotDeleteLastDayCycleKey", LLSD(), LLSD()); -// return; -// } -// -// // delete from map -// const std::string& sldr_name = mKeysSlider->getCurSlider(); -// std::map::iterator mIt = mSliderToKey.find(sldr_name); -// mSliderToKey.erase(mIt); -// -// mKeysSlider->deleteCurSlider(); -// -// if (mSliderToKey.size() == 0) -// { -// return; -// } -// -// const std::string& name = mKeysSlider->getCurSlider(); -// mSkyPresetsCombo->selectByValue(mSliderToKey[name].keyframe.toStringVal()); -// F32 time24 = mSliderToKey[name].time; -// -// mTimeCtrl->setTime24(time24); -// -// applyTrack(); -// #endif -// } -// -// void LLFloaterEditExtDayCycle::onRegionSettingsChange() -// { -// #if 0 -// LL_DEBUGS("Windlight") << "Region settings changed" << LL_ENDL; -// -// if (getApplyProgress()) // our region settings have being applied -// { -// setApplyProgress(false); -// -// // Change preference if requested. -// if (mMakeDefaultCheckBox->getValue()) -// { -// LL_DEBUGS("Windlight") << "Changed environment preference to region settings" << LL_ENDL; -// LLEnvManagerNew::instance().setUseRegionSettings(true); -// } -// -// closeFloater(); -// } -// #endif -// } -// -// void LLFloaterEditExtDayCycle::onRegionChange() -// { -// #if 0 -// LL_DEBUGS("Windlight") << "Region changed" << LL_ENDL; -// -// // If we're editing the region day cycle -// if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION) -// { -// reset(); // undoes all unsaved changes -// } -// #endif -// } -// -// void LLFloaterEditExtDayCycle::onRegionSettingsApplied(bool success) -// { -// LL_DEBUGS("Windlight") << "Region settings applied: " << success << LL_ENDL; -// -// if (!success) -// { -// // stop progress indicator -// setApplyProgress(false); -// } -// } -// -// void LLFloaterEditExtDayCycle::onRegionInfoUpdate() -// { -// #if 0 -// LL_DEBUGS("Windlight") << "Region info updated" << LL_ENDL; -// bool can_edit = true; -// -// // If we've selected the region day cycle for editing. -// if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION) -// { -// // check whether we have the access -// can_edit = LLEnvManagerNew::canEditRegionSettings(); -// } -// -// enableEditing(can_edit); -// #endif -// } -// -// void LLFloaterEditExtDayCycle::onDayCycleNameEdited() -// { -// #if 0 -// // Disable saving a day cycle having empty name. -// LLWLParamKey key = getSelectedDayCycle(); -// mSaveButton->setEnabled(!key.name.empty()); -// #endif -// } -// -// void LLFloaterEditExtDayCycle::onDayCycleSelected() -// { -// #if 0 -// -// LLSD day_data; -// LLWLParamKey dc_key = getSelectedDayCycle(); -// bool can_edit = true; -// -// if (dc_key.scope == LLEnvKey::SCOPE_LOCAL) -// { -// if (!LLDayCycleManager::instance().getPreset(dc_key.name, day_data)) -// { -// LL_WARNS() << "No day cycle named " << dc_key.name << LL_ENDL; -// return; -// } -// } -// else -// { -// day_data = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle(); -// if (day_data.size() == 0) -// { -// LL_WARNS() << "Empty region day cycle" << LL_ENDL; -// llassert(day_data.size() > 0); -// return; -// } -// -// can_edit = LLEnvManagerNew::canEditRegionSettings(); -// } -// -// // We may need to add or remove region skies from the list. -// refreshSkyPresetsList(); -// -// F32 slider_time = mTimeSlider->getCurSliderValue() / sHoursPerDay; -// LLWLParamManager::instance().applyDayCycleParams(day_data, dc_key.scope, slider_time); -// loadTrack(); -// #endif -// enableEditing(false); -// } -// -// bool LLFloaterEditExtDayCycle::onSaveAnswer(const LLSD& notification, const LLSD& response) -// { -// S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -// -// // If they choose save, do it. Otherwise, don't do anything -// if (option == 0) -// { -// onSaveConfirmed(); -// } -// -// return false; -// } -// -// void LLFloaterEditExtDayCycle::onSaveConfirmed() -// { -// #if 0 -// std::string name = getSelectedDayCycle().name; -// -// // Save preset. -// LLSD data = LLWLParamManager::instance().mDay.asLLSD(); -// LL_DEBUGS("Windlight") << "Saving day cycle " << name << ": " << data << LL_ENDL; -// LLDayCycleManager::instance().savePreset(name, data); -// -// // Change preference if requested. -// if (mMakeDefaultCheckBox->getValue()) -// { -// LL_DEBUGS("Windlight") << name << " is now the new preferred day cycle" << LL_ENDL; -// LLEnvManagerNew::instance().setUseDayCycle(name); -// } -// #endif -// closeFloater(); -// } -// -// void LLFloaterEditExtDayCycle::onDayCycleListChange() -// { -// if (!isNewDay()) -// { -// refreshDayCyclesList(); -// } -// } -// -// void LLFloaterEditExtDayCycle::onSkyPresetListChange() -// { -// refreshSkyPresetsList(); -// -// // Refresh sliders from the currently visible day cycle. -// loadTrack(); -// } -// -// static -// std::string LLFloaterEditExtDayCycle::getRegionName() -// { -// return gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown"); -// } diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h index c67cfdd274..46b34de5c7 100644 --- a/indra/newview/llfloatereditextdaycycle.h +++ b/indra/newview/llfloatereditextdaycycle.h @@ -37,6 +37,7 @@ class LLLineEditor; class LLMultiSliderCtrl; class LLTextBox; class LLTimeCtrl; +//class LLFlyoutComboBtnCtrl; typedef std::shared_ptr LLSettingsBasePtr_t; @@ -52,15 +53,14 @@ public: typedef boost::signals2::connection connection_t; LLFloaterEditExtDayCycle(const LLSD &key); + ~LLFloaterEditExtDayCycle(); + + void openFloater(LLSettingsDay::ptr_t settings, S64Seconds daylength = S64Seconds(0), S64Seconds dayoffset = S64Seconds(0)); BOOL postBuild(); - void onOpen(const LLSD& key); + void onOpen(const LLSD& key); void onClose(bool app_quitting); - - /*TEMP*/ - void onUpload(); - void onVisibilityChange(BOOL new_visibility); // /*virtual*/ void draw(); @@ -79,8 +79,10 @@ private: // // /// refresh the sky presets combobox +// void onButtonApply(LLUICtrl *ctrl, const LLSD &data); void onBtnSave(); void onBtnCancel(); + void onBtnUpload(); void onAddTrack(); void onRemoveTrack(); void onCommitName(class LLLineEditor* caller, void* user_data); @@ -89,49 +91,16 @@ private: void onFrameSliderCallback(); /// a frame moved or frame selection changed void selectTrack(U32 track_index); + void clearTabs(); void updateTabs(); - void updateSkyTabs(); - void updateWaterTabs(); + void updateWaterTabs(const LLSettingsWaterPtr_t &p_water); + void updateSkyTabs(const LLSettingsSkyPtr_t &p_sky); + void updateButtons(); void updateSlider(); //track to slider + void updateTimeAndLabel(); void addSliderFrame(const F32 frame, LLSettingsBase::ptr_t setting); void removeCurrentSliderFrame(); - //void updateTrack(); // slider->track, todo: better name -// /// refresh the day cycle combobox -// void refreshDayCyclesList(); -// -// /// add a slider to the track -// -// void initCallbacks(); -// // LLWLParamKey getSelectedDayCycle(); -// bool isNewDay() const; -// void dumpTrack(); -// void enableEditing(bool enable); -// void reset(); -// void saveRegionDayCycle(); -// -// void setApplyProgress(bool started); -// bool getApplyProgress() const; -// -// void onKeyTimeChanged(); /// a key frame's time changed -// void onAddKey(); /// new key added on slider -// void onDeleteKey(); /// a key frame deleted -// -// void onRegionSettingsChange(); -// void onRegionChange(); -// void onRegionSettingsApplied(bool success); -// void onRegionInfoUpdate(); -// -// void onDayCycleNameEdited(); -// void onDayCycleSelected(); -// -// bool onSaveAnswer(const LLSD& notification, const LLSD& response); -// void onSaveConfirmed(); -// -// void onDayCycleListChange(); -// void onSkyPresetListChange(); -// -// static std::string getRegionName(); LLSettingsDay::ptr_t mSavedDay; LLSettingsDay::ptr_t mEditDay; @@ -140,11 +109,11 @@ private: U32 mCurrentTrack; std::string mLastFrameSlider; - LLButton* mSaveButton; - LLButton* mCancelButton; + LLButton* mSaveButton; + LLButton* mCancelButton; LLButton* mUploadButton; - - edit_commit_signal_t mCommitSignal; + LLButton* mAddFrameButton; + LLButton* mDeleteFrameButton; LLMultiSliderCtrl* mTimeSlider; LLMultiSliderCtrl* mFramesSlider; @@ -152,10 +121,14 @@ private: LLView* mWaterTabLayoutContainer; LLTextBox* mCurrentTimeLabel; +// LLFlyoutComboBtnCtrl * mFlyoutControl; // not a View! + + edit_commit_signal_t mCommitSignal; + // map of sliders to parameters typedef std::pair framedata_t; typedef std::map keymap_t; - keymap_t mSliderKeyMap; + keymap_t mSliderKeyMap; //slider keys[old_frames], shadows mFramesSlider }; #endif // LL_LLFloaterEditExtDayCycle_H diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index ab1c7502bb..afbbbd424e 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -360,8 +360,8 @@ void LLPanelEnvironmentInfo::onBtnEdit() if (dayeditor) { - dayeditor->setEditCommitSignal(boost::bind(&LLPanelEnvironmentInfo::onEditiCommited, this, _1)); - dayeditor->openFloater(); + dayeditor->setEditCommitSignal(boost::bind(&LLPanelEnvironmentInfo::onEditiCommited, this, _1)); //Not needed? + dayeditor->openFloater(mEditingDayCycle, F32Hours(mDayLengthSlider->getValue().asReal()), F32Hours(mDayOffsetSlider->getValue().asReal())); } } 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 3b63d0018c..bab902001f 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 @@ -15,7 +15,7 @@ To edit your day cycle, adjust the controls below and click "Save". - ([TIME] hr) + ([HH]:[MM]) + visible="true"> + visible="true">