diff options
| author | Rider Linden <rider@lindenlab.com> | 2018-01-23 12:03:03 -0800 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2018-01-23 12:03:03 -0800 | 
| commit | 5e544ee35d70fa9e27774ba30ccae06aa6d4d5f9 (patch) | |
| tree | 5628cb72728e0a074944d4af56214a12aece4144 /indra/newview | |
| parent | 6489598d57571d5b984cb37eec4dd4421ce86c2a (diff) | |
Adding a couple files that got skipped.
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | indra/newview/llfloatereditextdaycycle.cpp | 872 | ||||
| -rw-r--r-- | indra/newview/llfloatereditextdaycycle.h | 135 | ||||
| -rw-r--r-- | indra/newview/llpanelenvironment.cpp | 396 | ||||
| -rw-r--r-- | indra/newview/llpanelenvironment.h | 80 | ||||
| -rw-r--r-- | indra/newview/llviewerfloaterreg.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml | 485 | 
7 files changed, 1974 insertions, 1 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 673f251da2..0c3de2826f 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -224,6 +224,7 @@ set(viewer_SOURCE_FILES      llfloaterdeleteprefpreset.cpp      llfloaterdestinations.cpp      llfloatereditdaycycle.cpp +    llfloatereditextdaycycle.cpp      llfloatereditsky.cpp      llfloatereditwater.cpp      llfloaterenvironmentsettings.cpp @@ -838,7 +839,7 @@ set(viewer_HEADER_FILES      llfloaterconversationpreview.h      llfloaterdeleteprefpreset.h      llfloaterdestinations.h -    llfloatereditdaycycle.h +    llfloatereditextdaycycle.h      llfloatereditsky.h      llfloatereditwater.h      llfloaterenvironmentsettings.h diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp new file mode 100644 index 0000000000..c62ef85b02 --- /dev/null +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -0,0 +1,872 @@ +/**  + * @file llfloatereditextdaycycle.cpp + * @brief Floater to create or edit a day cycle + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatereditextdaycycle.h" + +// libs +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llloadingindicator.h" +#include "llmultisliderctrl.h" +#include "llnotifications.h" +#include "llnotificationsutil.h" +#include "llspinctrl.h" +#include "lltimectrl.h" + +// newview +#include "llagent.h" +#include "llregioninfomodel.h" +#include "llviewerregion.h" + +#include "llenvironment.h" +#include "lltrans.h" + +const F32 LLFloaterEditExtDayCycle::sHoursPerDay = 24.0f; + +LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key) +:	LLFloater(key) +,	mDayCycleNameEditor(NULL) +,	mDayCyclesCombo(NULL) +,	mTimeSlider(NULL) +,	mKeysSlider(NULL) +,	mSkyPresetsCombo(NULL) +,	mTimeCtrl(NULL) +,	mMakeDefaultCheckBox(NULL) +,	mSaveButton(NULL) +{ +} + +// virtual +BOOL LLFloaterEditExtDayCycle::postBuild() +{ +	mDayCycleNameEditor = getChild<LLLineEditor>("day_cycle_name"); +	mDayCyclesCombo = getChild<LLComboBox>("day_cycle_combo"); + +	mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider"); +	mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys"); +	mSkyPresetsCombo = getChild<LLComboBox>("WLSkyPresets"); +	mTimeCtrl = getChild<LLTimeCtrl>("time"); +	mSaveButton = getChild<LLButton>("save"); +	mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb"); + +	initCallbacks(); + +	// add the time slider +	mTimeSlider->addSlider(); + +	return TRUE; +} + +// virtual +void LLFloaterEditExtDayCycle::onOpen(const LLSD& key) +{ +	bool new_day = isNewDay(); +	std::string param = key.asString(); +	std::string floater_title = getString(std::string("title_") + param); +	std::string hint = getString(std::string("hint_" + param)); + +	// Update floater title. +	setTitle(floater_title); + +	// Update the hint at the top. +	getChild<LLUICtrl>("hint")->setValue(hint); + +	// Hide the hint to the right of the combo if we're invoked to create a new preset. +	getChildView("note")->setVisible(!new_day); + +	// Switch between the day cycle presets combobox and day cycle name input field. +	mDayCyclesCombo->setVisible(!new_day); +	mDayCycleNameEditor->setVisible(new_day); + +	// TODO: Make sure only one instance of the floater exists? + +	reset(); +} + +// virtual +void LLFloaterEditExtDayCycle::onClose(bool app_quitting) +{ +	if (!app_quitting) // there's no point to change environment if we're quitting +	{ +        LLEnvironment::instance().applyChosenEnvironment(); +	} +} + +// 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<LLButton>("WLAddKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onAddKey, this)); +	getChild<LLButton>("WLDeleteKey")->setClickedCallback(boost::bind(&LLFloaterEditExtDayCycle::onDeleteKey, this)); + +	mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditExtDayCycle::onBtnSave, this)); +	mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditExtDayCycle::dumpTrack, this)); +	getChild<LLButton>("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<F32, LLWLParamKey>::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<std::string, SliderKey>::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::refreshSkyPresetsList() +{ +#if 0 +	// Don't allow selecting region skies for a local day cycle, +	// because thus we may end up with invalid day cycle. +	bool include_region_skies = getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION; + +	mSkyPresetsCombo->removeall(); + +	LLWLParamManager::preset_name_list_t region_presets; +	LLWLParamManager::preset_name_list_t user_presets, sys_presets; +	LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets); + +	if (include_region_skies) +	{ +		// Add region presets. +		for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it) +		{ +			std::string preset_name = *it; +			std::string item_title = preset_name + " (" + getRegionName() + ")"; +			mSkyPresetsCombo->add(preset_name, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toStringVal()); +		} + +		if (!region_presets.empty()) +		{ +			mSkyPresetsCombo->addSeparator(); +		} +	} + +	// Add user presets. +	for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) +	{ +		mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +	} + +	if (!user_presets.empty()) +	{ +		mSkyPresetsCombo->addSeparator(); +	} + +	// Add system presets. +	for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it) +	{ +		mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +	} + +	// set defaults on combo boxes +	mSkyPresetsCombo->selectFirstItem(); +#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::onTimeSliderMoved() +{ +#if 0 +	/// get the slider value +	F32 val = mTimeSlider->getCurSliderValue() / sHoursPerDay; + +	// set the value, turn off animation +	LLWLParamManager::getInstance()->mAnimator.setDayTime((F64)val); +	LLWLParamManager::getInstance()->mAnimator.deactivate(); + +	// then call update once +	LLWLParamManager::getInstance()->mAnimator.update( +		LLWLParamManager::getInstance()->mCurParams); +#endif +} + +void LLFloaterEditExtDayCycle::onKeyTimeMoved() +{ +#if 0 +	if (mKeysSlider->getValue().size() == 0) +	{ +		return; +	} + +	// make sure we have a slider +	const std::string& cur_sldr = mKeysSlider->getCurSlider(); +	if (cur_sldr == "") +	{ +		return; +	} + +	F32 time24 = mKeysSlider->getCurSliderValue(); + +	// check to see if a key exists +	LLWLParamKey key = mSliderToKey[cur_sldr].keyframe; +	LL_DEBUGS() << "Setting key time: " << time24 << LL_ENDL; +	mSliderToKey[cur_sldr].time = time24; + +	// if it exists, turn on check box +	mSkyPresetsCombo->selectByValue(key.toStringVal()); + +	mTimeCtrl->setTime24(time24); + +	applyTrack(); +#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::onKeyPresetChanged() +{ +#if 0 +	// do nothing if no sliders +	if (mKeysSlider->getValue().size() == 0) +	{ +		return; +	} + +	// change the map + +	std::string stringVal = mSkyPresetsCombo->getSelectedValue().asString(); +	LLWLParamKey new_key(stringVal); +	llassert(!new_key.name.empty()); +	const std::string& cur_sldr = mKeysSlider->getCurSlider(); + +	// if null, don't use +	if (cur_sldr == "") +	{ +		return; +	} + +	mSliderToKey[cur_sldr].keyframe = new_key; + +	// Apply changes to current day cycle. +	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 +void LLFloaterEditExtDayCycle::addSliderKey(F32 time, LLWLParamKey keyframe) +{ +	// make a slider +	const std::string& sldr_name = mKeysSlider->addSlider(time); +	if (sldr_name.empty()) +	{ +		return; +	} + +	// set the key +	SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue()); + +	llassert_always(sldr_name != LLStringUtil::null); + +	// add to map +	mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey)); + +	llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size()); +} +#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<F32, LLWLParamKey>::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<LLPanel>("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<LLLoadingIndicator>("progress_indicator"); + +	indicator->setVisible(started); + +	if (started) +	{ +		indicator->start(); +	} +	else +	{ +		indicator->stop(); +	} +} + +bool LLFloaterEditExtDayCycle::getApplyProgress() const +{ +	return getChild<LLLoadingIndicator>("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<std::string, SliderKey>::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); +} + +void LLFloaterEditExtDayCycle::onBtnSave() +{ +#if 0 +	LLDayCycleManager& day_mgr = LLDayCycleManager::instance(); +	LLWLParamKey selected_day = getSelectedDayCycle(); + +	if (selected_day.scope == LLEnvKey::SCOPE_REGION) +	{ +		saveRegionDayCycle(); +		closeFloater(); +		return; +	} + +	std::string name = selected_day.name; +	if (name.empty()) +	{ +		// *TODO: show an alert +		LL_WARNS() << "Empty day cycle name" << LL_ENDL; +		return; +	} + +	// Don't allow overwriting system presets. +	if (day_mgr.isSystemPreset(name)) +	{ +		LLNotificationsUtil::add("WLNoEditDefault"); +		return; +	} + +	// Save, ask for confirmation for overwriting an existing preset. +	if (day_mgr.presetExists(name)) +	{ +		LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditExtDayCycle::onSaveAnswer, this, _1, _2)); +	} +	else +	{ +		// new preset, hence no confirmation needed +		onSaveConfirmed(); +	} +#endif +} + +void LLFloaterEditExtDayCycle::onBtnCancel() +{ +	closeFloater(); +} + +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 new file mode 100644 index 0000000000..bed5db14b2 --- /dev/null +++ b/indra/newview/llfloatereditextdaycycle.h @@ -0,0 +1,135 @@ +/**  + * @file llfloatereditextdaycycle.h + * @brief Floater to create or edit a day cycle + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATEREDITEXTDAYCYCLE_H +#define LL_LLFLOATEREDITEXTDAYCYCLE_H + +#include "llfloater.h" + +class LLCheckBoxCtrl; +class LLComboBox; +class LLLineEditor; +class LLMultiSliderCtrl; +class LLTimeCtrl; + +/** + * Floater for creating or editing a day cycle. + */ +class LLFloaterEditExtDayCycle : public LLFloater +{ +	LOG_CLASS(LLFloaterEditExtDayCycle); + +public: +	LLFloaterEditExtDayCycle(const LLSD &key); + +	/*virtual*/	BOOL	postBuild(); +	/*virtual*/ void	onOpen(const LLSD& key); +	/*virtual*/ void	onClose(bool app_quitting); +	/*virtual*/ void	draw(); + +private: + +	/// sync the time slider with day cycle structure +	void syncTimeSlider(); + +	// 	makes sure key slider has what's in day cycle +	void loadTrack(); + +	/// makes sure day cycle data structure has what's in menu +	void applyTrack(); + +	/// refresh the sky presets combobox +	void refreshSkyPresetsList(); + +	/// refresh the day cycle combobox +	void refreshDayCyclesList(); + +	/// add a slider to the track +//	void addSliderKey(F32 time, LLWLParamKey keyframe); + +	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 onTimeSliderMoved();	/// time slider moved +	void onKeyTimeMoved();		/// a key frame moved +	void onKeyTimeChanged();	/// a key frame's time changed +	void onKeyPresetChanged();	/// sky preset selected +	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(); +	void onBtnSave(); +	void onBtnCancel(); + +	bool onSaveAnswer(const LLSD& notification, const LLSD& response); +	void onSaveConfirmed(); + +	void onDayCycleListChange(); +	void onSkyPresetListChange(); + +	static std::string getRegionName(); + +	/// convenience class for holding keyframes mapped to sliders +// 	struct SliderKey +// 	{ +// 	public: +// 		SliderKey(LLWLParamKey kf, F32 t) : keyframe(kf), time(t) {} +// 		SliderKey() : keyframe(), time(0.f) {} // Don't use this default constructor +//  +// 		LLWLParamKey keyframe; +// 		F32 time; +// 	}; + +	static const F32 sHoursPerDay; + +	LLLineEditor*		mDayCycleNameEditor; +	LLComboBox*			mDayCyclesCombo; +	LLMultiSliderCtrl*	mTimeSlider; +	LLMultiSliderCtrl*	mKeysSlider; +	LLComboBox*			mSkyPresetsCombo; +	LLTimeCtrl*			mTimeCtrl; +	LLCheckBoxCtrl*		mMakeDefaultCheckBox; +	LLButton*			mSaveButton; + +	// map of sliders to parameters +//	std::map<std::string, SliderKey> mSliderToKey; +}; + +#endif // LL_LLFloaterEditExtDayCycle_H diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp new file mode 100644 index 0000000000..b606e1de08 --- /dev/null +++ b/indra/newview/llpanelenvironment.cpp @@ -0,0 +1,396 @@ +/**  + * @file llpanelenvironment.cpp + * @brief LLPanelExperiences class implementation + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + + +#include "llpanelprofile.h" +#include "lluictrlfactory.h" +#include "llexperiencecache.h" +#include "llagent.h" + +#include "llviewerregion.h" +#include "llpanelenvironment.h" +#include "llslurl.h" +#include "lllayoutstack.h" + +static LLPanelInjector<LLPanelEnvironmentInfo> register_environment_panel("environment_panel"); + +LLPanelEnvironmentInfo::LLPanelEnvironmentInfo():  +    mEnableEditing(false), +    mRegionSettingsRadioGroup(NULL), +    mDayLengthSlider(NULL), +    mDayOffsetSlider(NULL), +    mAllowOverRide(NULL) +{ +} + +// virtual +BOOL LLPanelEnvironmentInfo::postBuild() +{ +    mRegionSettingsRadioGroup = getChild<LLRadioGroup>("environment_select_radio_group"); +    mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDefaultSelection, this)); + +    mDayLengthSlider = getChild<LLSliderCtrl>("day_length_sld"); +    mDayOffsetSlider = getChild<LLSliderCtrl>("day_offset_sld"); +    mAllowOverRide = getChild<LLCheckBoxCtrl>("allow_override_chk"); + +    childSetCommitCallback("edit_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnEdit, this), NULL); +    childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL); +    childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL); + +    return TRUE; +} + +// virtual +void LLPanelEnvironmentInfo::onOpen(const LLSD& key) +{ +    LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL; +    refresh(); +} + +// virtual +void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility) +{ +    // If hiding (user switched to another tab or closed the floater), +    // display user's preferred environment. +    // switching back and forth between agent's environment and the one being edited.  +    //  +} + +void LLPanelEnvironmentInfo::refresh() +{ +#if 0 +    if (gDisconnected) +    { +        return; +    } + +    populateWaterPresetsList(); +    populateSkyPresetsList(); +    populateDayCyclesList(); + +    // Init radio groups. +    const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings(); +    const LLSD& dc = settings.getWLDayCycle(); +    LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f; +    const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0; +    mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1); +    mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1); + +    setControlsEnabled(mEnableEditing); + +    setDirty(false); +#endif +} + +void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) +{ +    mRegionSettingsRadioGroup->setEnabled(enabled); + +    mDayLengthSlider->setEnabled(false); +    mDayOffsetSlider->setEnabled(false); +    mAllowOverRide->setEnabled(enabled); + +    getChildView("edit_btn")->setEnabled(false); + +    getChildView("apply_btn")->setEnabled(enabled); +    getChildView("cancel_btn")->setEnabled(enabled); + +    if (enabled) +    { +        // Enable/disable some controls based on currently selected radio buttons. +        bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; +        getChild<LLView>("edit_btn")->setEnabled(!use_defaults); + +        mDayLengthSlider->setEnabled(!use_defaults); +        mDayOffsetSlider->setEnabled(!use_defaults); + +    } +} + +void LLPanelEnvironmentInfo::setApplyProgress(bool started) +{ +//     LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator"); +//  +//     indicator->setVisible(started); +//  +//     if (started) +//     { +//         indicator->start(); +//     } +//     else +//     { +//         indicator->stop(); +//     } +} + +void LLPanelEnvironmentInfo::setDirty(bool dirty) +{ +    getChildView("apply_btn")->setEnabled(dirty); +    getChildView("cancel_btn")->setEnabled(dirty); +} + +// void LLPanelEnvironmentInfo::sendRegionSunUpdate() +// { +// #if 0 +//     LLRegionInfoModel& region_info = LLRegionInfoModel::instance(); +//  +//     // If the region is being switched to fixed sky, +//     // change the region's sun hour according to the (fixed) sun position. +//     // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330). +//     const LLSD& sky_map = mNewRegionSettings.getSkyMap(); +//     bool region_use_fixed_sky = sky_map.size() == 1; +//     if (region_use_fixed_sky) +//     { +//         LLWLParamSet param_set; +//         llassert(sky_map.isMap()); +//         param_set.setAll(sky_map.beginMap()->second); +//         F32 sun_angle = param_set.getSunAngle(); +//  +//         LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL; +//         // convert value range from 0..2pi to 6..30 +//         region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f; +//     } +//  +//     region_info.setUseFixedSun(region_use_fixed_sky); +//     region_info.mUseEstateSun = !region_use_fixed_sky; +//     LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL; +//  +//     region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice()); +// #endif +// } + +// void LLPanelEnvironmentInfo::fixEstateSun() +// { +//     // We don't support fixed sun estates anymore and need to fix +//     // such estates for region day cycle to take effect. +//     // *NOTE: Assuming that current estate settings have arrived already. +//     LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); +//     if (estate_info.getUseFixedSun()) +//     { +//         LL_INFOS() << "Switching estate to global sun" << LL_ENDL; +//         estate_info.setUseFixedSun(false); +//         estate_info.sendEstateInfo(); +//     } +// } + +// void LLPanelEnvironmentInfo::populateWaterPresetsList() +// { +// #if 0 +//     mWaterPresetCombo->removeall(); +//  +//     // If the region already has water params, add them to the list. +//     const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings(); +//     if (region_settings.getWaterParams().size() != 0) +//     { +//         const std::string& region_name = gAgent.getRegion()->getName(); +//         mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD()); +//         mWaterPresetCombo->addSeparator(); +//     } +//  +//     std::list<std::string> user_presets, system_presets; +//     LLWaterParamManager::instance().getPresetNames(user_presets, system_presets); +//  +//     // Add local user presets first. +//     for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) +//     { +//         mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); +//     } +//  +//     if (user_presets.size() > 0) +//     { +//         mWaterPresetCombo->addSeparator(); +//     } +//  +//     // Add local system presets. +//     for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it) +//     { +//         mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); +//     } +//  +//     // There's no way to select current preset because its name is not stored on server. +// #endif +// } +//  +// void LLPanelEnvironmentInfo::populateSkyPresetsList() +// { +// #if 0 +//     mSkyPresetCombo->removeall(); +//  +//     LLWLParamManager::preset_name_list_t region_presets; +//     LLWLParamManager::preset_name_list_t user_presets, sys_presets; +//     LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets); +//  +//     // Add region presets. +//     std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown"); +//     for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it) +//     { +//         std::string preset_name = *it; +//         std::string item_title = preset_name + " (" + region_name + ")"; +//         mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); +//     } +//  +//     if (!region_presets.empty()) +//     { +//         mSkyPresetCombo->addSeparator(); +//     } +//  +//     // Add user presets. +//     for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) +//     { +//         mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +//     } +//  +//     if (!user_presets.empty()) +//     { +//         mSkyPresetCombo->addSeparator(); +//     } +//  +//     // Add system presets. +//     for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it) +//     { +//         mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +//     } +//  +//     // Select current preset. +//     LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap(); +//     if (sky_map.size() == 1) // if the region is set to fixed sky +//     { +//         std::string preset_name = sky_map.beginMap()->first; +//         mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); +//     } +// #endif +// } +//  +// void LLPanelEnvironmentInfo::populateDayCyclesList() +// { +// #if 0 +//     mDayCyclePresetCombo->removeall(); +//  +//     // If the region already has env. settings, add its day cycle to the list. +//     const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle(); +//     if (cur_region_dc.size() != 0) +//     { +//         LLViewerRegion* region = gAgent.getRegion(); +//         llassert(region != NULL); +//  +//         LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION); +//         mDayCyclePresetCombo->add(region->getName(), key.toStringVal()); +//         mDayCyclePresetCombo->addSeparator(); +//     } +//  +//     // Add local user day cycles. +//     LLDayCycleManager::preset_name_list_t user_days, sys_days; +//     LLDayCycleManager::instance().getPresetNames(user_days, sys_days); +//     for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it) +//     { +//         mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +//     } +//  +//     if (user_days.size() > 0) +//     { +//         mDayCyclePresetCombo->addSeparator(); +//     } +//  +//     // Add local system day cycles. +//     for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it) +//     { +//         mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); +//     } +//  +//     // Current day cycle is already selected. +// #endif +// } + +void LLPanelEnvironmentInfo::onSwitchDefaultSelection() +{ +    bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; +    getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults); + +    setDirty(true); +} + + +void LLPanelEnvironmentInfo::onBtnApply() +{ +    doApply(); +} + +void LLPanelEnvironmentInfo::doApply() +{ +} + +void LLPanelEnvironmentInfo::onBtnCancel() +{ +    // Reload last saved region settings. +    refresh(); +} + +void LLPanelEnvironmentInfo::onBtnEdit() +{ +} + + +// void LLPanelEnvironmentInfo::onRegionSettingschange() +// { +//     LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL; +//     refresh(); +//  +//     // Stop applying progress indicator (it may be running if it's us who initiated settings update). +//     setApplyProgress(false); +// } +//  +// void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok) +// { +//     // If applying new settings has failed, stop the indicator right away. +//     // Otherwise it will be stopped when we receive the updated settings from server. +//     if (ok) +//     { +//         // Set the region sun phase/flags according to the chosen new preferences. +//         // +//         // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481). +//         // That is caused by the simulator re-sending the region info, which in turn makes us +//         // re-request and display old region environment settings while the new ones haven't been applied yet. +//         sendRegionSunUpdate(); +//  +//         // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506). +//         fixEstateSun(); +//     } +//     else +//     { +//         setApplyProgress(false); +//  +//         // We need to re-request environment setting here, +//         // otherwise our subsequent attempts to change region settings will fail with the following error: +//         // "Unable to update environment settings because the last update your viewer saw was not the same +//         // as the last update sent from the simulator.  Try sending your update again, and if this +//         // does not work, try leaving and returning to the region." +//         //		LLEnvManagerNew::instance().requestRegionSettings(); +//     } +// } + + diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h new file mode 100644 index 0000000000..8b5238d3e2 --- /dev/null +++ b/indra/newview/llpanelenvironment.h @@ -0,0 +1,80 @@ +/**  + * @file llpanelenvironment.h + * @brief LLPanelExperiences class definition + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELENVIRONMENT_H +#define LL_LLPANELENVIRONMENT_H + +#include "llaccordionctrltab.h" +#include "llradiogroup.h" +#include "llcheckboxctrl.h" +#include "llsliderctrl.h" +#include "llsettingsdaycycle.h" + +class LLViewerRegion; + +class LLPanelEnvironmentInfo : public LLPanel +{ +    LOG_CLASS(LLPanelEnvironmentInfo); + +public: +    LLPanelEnvironmentInfo(); + +    // LLPanel +    /*virtual*/ BOOL postBuild(); +    /*virtual*/ void onOpen(const LLSD& key); + +    // LLView +    /*virtual*/ void onVisibilityChange(BOOL new_visibility); + + +    virtual void refresh(); + +protected: +    void setControlsEnabled(bool enabled); +    void setApplyProgress(bool started); +    void setDirty(bool dirty); + +    void onSwitchDefaultSelection(); + +    void onBtnApply(); +    void onBtnCancel(); +    void onBtnEdit(); + +    virtual void doApply(); // = 0; + +    /// New environment settings that are being applied to the region. +    //	LLEnvironmentSettings	mNewRegionSettings; + +    bool			mEnableEditing; + +    LLRadioGroup*	mRegionSettingsRadioGroup; +    LLSliderCtrl*   mDayLengthSlider; +    LLSliderCtrl*   mDayOffsetSlider; +    LLCheckBoxCtrl* mAllowOverRide; + +    LLSettingsDay::ptr_t mEditingDayCycle; +}; +#endif // LL_LLPANELEXPERIENCES_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c0fed2fff5..e133ef22a1 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -58,6 +58,7 @@  #include "llfloaterdeleteprefpreset.h"  #include "llfloaterdestinations.h"  #include "llfloatereditdaycycle.h" +#include "llfloatereditextdaycycle.h"  #include "llfloatereditsky.h"  #include "llfloatereditwater.h"  #include "llfloaterenvironmentsettings.h" @@ -225,6 +226,9 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("env_edit_water", "floater_edit_water_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditWater>);  	LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>); +    LLFloaterReg::add("env_edit_extdaycycle", "floater_edit_ext_daycycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditExtDayCycle>); + +      LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);      LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiences>);  	LLFloaterReg::add("experience_profile", "floater_experienceprofile.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperienceProfile>); 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 new file mode 100644 index 0000000000..d9a3ad0c4b --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml @@ -0,0 +1,485 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="381" + layout="topleft" + name="Edit Day cycle" + help_topic="day_presets" + save_rect="true" + title="Edit Day Cycle" + width="705"> + +    <string name="title_new">Create a New Day Cycle</string> +    <string name="title_edit">Edit Day Cycle</string> +    <string name="hint_new">Name your day cycle, adjust the controls to create it, and click "Save".</string> +    <string name="hint_edit">To edit your day cycle, adjust the controls below and click "Save".</string> +    <string name="combo_label">-Select a preset-</string> + +    <text +     follows="top|left|right" +     height="10" +     layout="topleft" +     left="10" +     name="hint" +     top="25" +     width="685" /> +    <text +     follows="top|left|right" +     font="SansSerif" +     height="10" +     layout="topleft" +     left="10" +     name="label" +     top_pad="25" +     width="120"> +     Preset Name: +    </text> +    <combo_box +     allow_text_entry="true" +     follows="top|left" +     layout="topleft" +     left_pad="10" +     max_chars="100" +     name="day_cycle_combo" +     top_delta="-5" +     width="200" /> +    <line_editor +     height="20" +     left_delta="0" +     name="day_cycle_name" +     top_delta="0" +     visible="true" +     width="200" /> +    <text +     follows="top|left|right" +     height="95" +     layout="topleft" +     left_pad="10" +     name="note" +     top_delta="0" +     width="345" +     wrap="true"> +     Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed. +    </text> + <!--======== Controls panel ========--> +    <text +     follows="left|top|right" +     height="10" +     layout="topleft" +     left="10"     +     name="hint_item1" +     top="100" +     width="300"> +     - Click on a tab to edit the specific sky settings and time. +    </text> +    <text +     follows="left|top|right" +     height="10" +     layout="topleft"     +     name="hint_item2" +     top_pad="10" +     width="300"> +     - Click and drag the tabs to set the transition times. +    </text> +    <text +     follows="left|top|right" +     height="10" +     layout="topleft" +     name="hint_item3" +     top_pad="10" +     width="300"> +     - Use the scrubber to preview your day cycle. +    </text> +    <panel +     follows="top|left" +     height="100" +     name="day_cycle_slider_panel" +     layout="topleft" +     left_delta="25" +     top_pad="15" +     width="660"> +        <multi_slider +         can_edit_text="true" +         control_name="WLTimeSlider" +         decimal_digits="0" +         draw_track="false" +         follows="bottom" +         height="10" +         increment="0.0833333" +         initial_value="0" +         layout="topleft" +         left="20" +         max_sliders="20" +         max_val="24" +         name="WLTimeSlider" +         show_text="false" +         top_pad="0" +         use_triangle="true" +         width="525" /> +        <multi_slider +         can_edit_text="true" +         control_name="WLDayCycleKeys" +         decimal_digits="0" +         follows="bottom" +         height="10" +         increment="0.0833333" +         initial_value="0" +         layout="topleft" +         left_delta="0" +         max_sliders="20" +         max_val="24" +         name="WLDayCycleKeys" +         show_text="false" +         top_pad="15" +         width="525" /> +        <button +         height="20" +         label="Add Key" +         label_selected="Add Key" +         layout="topleft" +         left_pad="20" +         name="WLAddKey" +         top_delta="-18" +         width="96" /> +        <button +         height="20" +         label="Delete Key" +         label_selected="Delete Key" +         layout="topleft" +         name="WLDeleteKey" +         top_pad="5" +         width="96" /> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left="8" +         name="WL12am" +         top="74" +         width="55"> +         12am +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL3am" +         top_delta="0" +         width="55"> +            3am +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL6am" +         top_delta="0" +         width="55"> +            6am +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL9amHash" +         top_delta="0" +         width="55"> +            9am +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL12pmHash" +         top_delta="0" +         width="55"> +            12pm +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL3pm" +         top_delta="0" +         width="55"> +            3pm +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL6pm" +         top_delta="0" +         width="55"> +            6pm +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL9pm" +         top_delta="0" +         width="55"> +            9pm +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         height="16" +         layout="topleft" +         left_pad="10" +         name="WL12am2" +         top_delta="0" +         width="55"> +            12am +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="14" +         layout="topleft" +         left="20" +         name="WL12amHash" +         top="54" +         width="6"> +            | +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="11" +         layout="topleft" +         left_pad="59" +         name="WL3amHash" +         top_delta="3" +         width="6"> +            I +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="14" +         layout="topleft" +         left_pad="59" +         name="WL6amHash" +         top_delta="-3" +         width="6"> +            | +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="11" +         layout="topleft" +         left_pad="59" +         name="WL9amHash2" +         top_delta="3" +         width="6"> +            I +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="14" +         layout="topleft" +         left_pad="59" +         name="WL12pmHash2" +         top_delta="-3" +         width="6"> +            | +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="11" +         layout="topleft" +         left_pad="59" +         name="WL3pmHash" +         top_delta="3" +         width="6"> +            I +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="14" +         layout="topleft" +         left_pad="59" +         name="WL6pmHash" +         top_delta="-3" +         width="6"> +            | +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="11" +         layout="topleft" +         left_pad="59" +         name="WL9pmHash" +         top_delta="3" +         width="6"> +            I +        </text> +        <text +         type="string" +         length="1" +         border_visible="true" +         follows="left|top|right" +         font="SansSerif" +         height="14" +         layout="topleft" +         left_pad="59" +         name="WL12amHash2" +         top_delta="-3" +         width="6"> +         | +        </text> +    </panel> +    <text +     type="string" +     length="1" +     border_visible="true" +     follows="left|top|right" +     font="SansSerif" +     height="16" +     layout="topleft" +     left_delta="192" +     name="WLCurKeyPresetText" +     top_pad="10" +     width="80"> +        Sky Setting: +    </text> +    <combo_box +     height="18" +     label="Preset" +     layout="topleft" +     left_pad="5" +     name="WLSkyPresets" +     width="205" /> +        <text +     type="string" +     length="1" +     border_visible="true" +     follows="left|top|right" +     font="SansSerif" +     height="16" +     layout="topleft" +     left_delta="-40" +     name="WLCurKeyTimeText" +     top_pad="15" +     width="35"> +        Time: +    </text> +    <time +     follows="left|top" +     height="16" +     label_width="0" +     layout="topleft" +     left_pad="3" +     name="time" +     top_delta="-1" +     value="6:00 AM" +     width="75"/>  +    <view_border +     bevel_style="none" +     follows="top|left" +     height="0" +     layout="topleft" +     left="10" +     name="horiz_separator" +     top_pad="20" +     width="685"/> +    <loading_indicator +     height="23" +     layout="topleft" +     left="25" +     name="progress_indicator" +     top="350" +     visible="false" +     width="23" /> +    <check_box +     follows="top|left" +     height="10" +     label="Make this my new day cycle" +     layout="topleft" +     left="310" +     name="make_default_cb" +     top_delta="13" +     width="230"/> +    <button +     follows="bottom|right" +     height="23" +     label="Save" +     layout="topleft" +     left_pad="0" +     name="save" +     top_delta="-13" +     width="70"/> +    <button +     follows="bottom|right" +     height="23" +     label="Cancel" +     layout="topleft" +     left_pad="15" +     name="cancel" +     top_delta="0" +     width="70"/> + </floater>  | 
