From cf460b13bee894684d0ca1bcb5bbc9eb38df719c Mon Sep 17 00:00:00 2001 From: "Graham Linden graham@lindenlab.com" Date: Mon, 12 Mar 2018 16:24:16 +0100 Subject: De-duplicate sRGB conversion funcs from many shaders and unify on using the version that works on OSX. Add more logging to shader loading about fallbacks and loading succcess. Add frag shaders for sharing sRGB and normal encode/decode via GL shader linkage. --- indra/llui/llui.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra/llui') diff --git a/indra/llui/llui.h b/indra/llui/llui.h index d7151dbee9..111f6472cd 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -33,7 +33,6 @@ #include "llcontrol.h" #include "llcoord.h" #include "llcontrol.h" -#include "llglslshader.h" #include "llinitparam.h" #include "llregistry.h" #include "llrender2dutils.h" @@ -49,7 +48,6 @@ // for initparam specialization #include "llfontgl.h" - class LLUUID; class LLWindow; class LLView; -- cgit v1.3 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(-) (limited to 'indra/llui') 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.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(-) (limited to 'indra/llui') 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">