diff options
| -rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llfloatereditdaycycle.cpp | 130 | ||||
| -rw-r--r-- | indra/newview/llfloatereditdaycycle.h | 10 | ||||
| -rw-r--r-- | indra/newview/llfloaterregioninfo.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llregioninfomodel.cpp | 106 | ||||
| -rw-r--r-- | indra/newview/llregioninfomodel.h | 82 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llwldaycycle.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llwldaycycle.h | 5 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml | 10 | 
10 files changed, 362 insertions, 11 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8e6453e8db..4c88cd4561 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -414,6 +414,7 @@ set(viewer_SOURCE_FILES      llproductinforequest.cpp      llprogressview.cpp      llrecentpeople.cpp +    llregioninfomodel.cpp      llregionposition.cpp      llremoteparcelrequest.cpp      llsavedsettingsglue.cpp @@ -964,6 +965,7 @@ set(viewer_HEADER_FILES      llproductinforequest.h      llprogressview.h      llrecentpeople.h +    llregioninfomodel.h      llregionposition.h      llremoteparcelrequest.h      llresourcedata.h diff --git a/indra/newview/llfloatereditdaycycle.cpp b/indra/newview/llfloatereditdaycycle.cpp index 2ff6901652..a62f348129 100644 --- a/indra/newview/llfloatereditdaycycle.cpp +++ b/indra/newview/llfloatereditdaycycle.cpp @@ -32,6 +32,7 @@  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcombobox.h" +#include "llloadingindicator.h"  #include "llmultisliderctrl.h"  #include "llnotifications.h"  #include "llnotificationsutil.h" @@ -42,6 +43,7 @@  #include "llagent.h"  #include "lldaycyclemanager.h"  #include "llenvmanager.h" +#include "llregioninfomodel.h"  #include "llviewerregion.h"  #include "llwlparammanager.h" @@ -138,6 +140,15 @@ void LLFloaterEditDayCycle::initCallbacks(void)  	mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnSave, this));  	mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditDayCycle::dumpTrack, this));  	getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnCancel, this)); + +	// Connect to env manager events. +	LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); +	env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsChange, this)); +	env_mgr.setRegionChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionChange, this)); +	env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsApplied, this, _1)); + +	// Connect to region info updates. +	LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditDayCycle::onRegionInfoUpdate, this));  }  void LLFloaterEditDayCycle::syncTimeSlider() @@ -500,6 +511,50 @@ void LLFloaterEditDayCycle::reset()  	}  } +void LLFloaterEditDayCycle::saveRegionDayCycle() +{ +	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 (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings)) +	{ +		llwarns << "Error applying region environment settings" << llendl; +		return; +	} + +	setApplyProgress(true); +} + +void LLFloaterEditDayCycle::setApplyProgress(bool started) +{ +	LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator"); + +	indicator->setVisible(started); + +	if (started) +	{ +		indicator->start(); +	} +	else +	{ +		indicator->stop(); +	} +} + +bool LLFloaterEditDayCycle::getApplyProgress() const +{ +	return getChild<LLLoadingIndicator>("progress_indicator")->getVisible(); +} +  void LLFloaterEditDayCycle::onDeleteKey()  {  	if (mSliderToKey.size() == 0) @@ -533,6 +588,62 @@ void LLFloaterEditDayCycle::onDeleteKey()  	applyTrack();  } +void LLFloaterEditDayCycle::onRegionSettingsChange() +{ +	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" << llendl; +			LLEnvManagerNew::instance().setUseRegionSettings(true); +		} + +		closeFloater(); +	} +} + +void LLFloaterEditDayCycle::onRegionChange() +{ +	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 +	} +} + +void LLFloaterEditDayCycle::onRegionSettingsApplied(bool success) +{ +	LL_DEBUGS("Windlight") << "Region settings applied: " << success << LL_ENDL; + +	if (!success) +	{ +		// stop progress indicator +		setApplyProgress(false); +	} +} + +void LLFloaterEditDayCycle::onRegionInfoUpdate() +{ +	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 = canEditRegionSettings(); +	} + +	enableEditing(can_edit); +} +  void LLFloaterEditDayCycle::onDayCycleNameEdited()  {  	// Disable saving a day cycle having empty name. @@ -544,6 +655,7 @@ void LLFloaterEditDayCycle::onDayCycleSelected()  {  	LLSD day_data;  	LLWLParamKey dc_key = getSelectedDayCycle(); +	bool can_edit = true;  	if (dc_key.scope == LLEnvKey::SCOPE_LOCAL)  	{ @@ -562,6 +674,8 @@ void LLFloaterEditDayCycle::onDayCycleSelected()  			llassert(day_data.size() > 0);  			return;  		} + +		can_edit = canEditRegionSettings();  	}  	F32 slider_time = mTimeSlider->getCurSliderValue() / sHoursPerDay; @@ -569,7 +683,7 @@ void LLFloaterEditDayCycle::onDayCycleSelected()  	LLWLParamManager::instance().applyDayCycleParams(day_data, dc_key.scope, slider_time);  	loadTrack(); -	enableEditing(true); +	enableEditing(can_edit);  }  void LLFloaterEditDayCycle::onBtnSave() @@ -579,7 +693,8 @@ void LLFloaterEditDayCycle::onBtnSave()  	if (selected_day.scope == LLEnvKey::SCOPE_REGION)  	{ -		llwarns << "Saving to a local day cycle" << llendl; +		saveRegionDayCycle(); +		return;  	}  	std::string name = selected_day.name; @@ -660,3 +775,14 @@ std::string LLFloaterEditDayCycle::getRegionName()  {  	return gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");  } + +// static +bool LLFloaterEditDayCycle::canEditRegionSettings() +{ +	LLViewerRegion* region = gAgent.getRegion(); +	BOOL owner_or_god = gAgent.isGodlike() || (region && region->getOwner() == gAgent.getID()); +	BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager()); + +	LL_DEBUGS("Windlight") << "Can edit region settings: " << owner_or_god_or_manager << LL_ENDL; +	return owner_or_god_or_manager; +} diff --git a/indra/newview/llfloatereditdaycycle.h b/indra/newview/llfloatereditdaycycle.h index 742608712b..0a2ba32dfe 100644 --- a/indra/newview/llfloatereditdaycycle.h +++ b/indra/newview/llfloatereditdaycycle.h @@ -78,6 +78,10 @@ private:  	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 @@ -86,6 +90,11 @@ private:  	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(); @@ -95,6 +104,7 @@ private:  	void onSaveConfirmed();  	static std::string getRegionName(); +	static bool canEditRegionSettings();  	/// convenience class for holding keyframes mapped to sliders  	struct SliderKey diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 2778671e24..39ed2534b2 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -3538,13 +3538,9 @@ bool LLPanelEnvironmentInfo::getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sk  		// Create sky map from the day cycle.  		{ -			std::map<LLWLParamKey, LLWLParamSet> refs;  			LLWLDayCycle tmp_day; -  			tmp_day.loadDayCycle(day_cycle, dc.scope); -			tmp_day.getSkyRefs(refs); - -			sky_map = LLWLParamManager::createSkyMap(refs); +			tmp_day.getSkyMap(sky_map);  		}  	} diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp new file mode 100644 index 0000000000..a74fb81355 --- /dev/null +++ b/indra/newview/llregioninfomodel.cpp @@ -0,0 +1,106 @@ +/**  + * @file llregioninfomodel.cpp + * @brief Region info model + * + * $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 "llregioninfomodel.h" + +// libs +#include "message.h" + +// viewers + +void LLRegionInfoModel::reset() +{ +	mSimAccess			= 0; +	mAgentLimit			= 0; + +	mRegionFlags		= 0; +	mEstateID			= 0; +	mParentEstateID		= 0; + +	mPricePerMeter		= 0; +	mRedirectGridX		= 0; +	mRedirectGridY		= 0; + +	mBillableFactor		= 0.0f; +	mObjectBonusFactor	= 0.0f; +	mWaterHeight		= 0.0f; +	mTerrainRaiseLimit	= 0.0f; +	mTerrainLowerLimit	= 0.0f; +	mSunHour			= 0.0f; + +	mUseEstateSun		= false; + +	mSimType.clear(); +	mSimName.clear(); +} + +LLRegionInfoModel::LLRegionInfoModel() +{ +	reset(); +} + +boost::signals2::connection LLRegionInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb) +{ +	return mUpdateSignal.connect(cb); +} + +void LLRegionInfoModel::update(LLMessageSystem* msg) +{ +	reset(); + +	msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName); +	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID); +	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID); +	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags); +	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess); +	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit); +	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor); +	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, mBillableFactor); +	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, mWaterHeight); +	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, mTerrainRaiseLimit); +	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, mTerrainLowerLimit); +	msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_PricePerMeter, mPricePerMeter); +	msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridX, mRedirectGridX); +	msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridY, mRedirectGridY); + +	msg->getBOOL(_PREHASH_RegionInfo, _PREHASH_UseEstateSun, mUseEstateSun); + +	// actually the "last set" sun hour, not the current sun hour. JC +	msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour); + +	// the only reasonable way to decide if we actually have any data is to +	// check to see if any of these fields have nonzero sizes +	if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 || +		msg->getSize(_PREHASH_RegionInfo2, "ProductName") > 0) +	{ +		msg->getString(_PREHASH_RegionInfo2, "ProductName", mSimType); +	} + +	// Let interested parties know that region info has been updated. +	mUpdateSignal(); +} diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h new file mode 100644 index 0000000000..87e1b35ff8 --- /dev/null +++ b/indra/newview/llregioninfomodel.h @@ -0,0 +1,82 @@ +/**  + * @file llregioninfomodel.h + * @brief Region info model + * + * $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_LLREGIONINFOMODEL_H +#define LL_LLREGIONINFOMODEL_H + +class LLMessageSystem; + +#include "llsingleton.h" + +/** + * Contains region info, notifies interested parties of its changes. + */ +class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel> +{ +	LOG_CLASS(LLRegionInfoModel); + +public: +	typedef boost::signals2::signal<void()> update_signal_t; +	boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); + +	// *TODO: Add getters and make the data private. +	U8			mSimAccess; +	U8			mAgentLimit; + +	U32			mRegionFlags; +	U32			mEstateID; +	U32			mParentEstateID; + +	S32			mPricePerMeter; +	S32			mRedirectGridX; +	S32			mRedirectGridY; + +	F32			mBillableFactor; +	F32			mObjectBonusFactor; +	F32			mWaterHeight; +	F32			mTerrainRaiseLimit; +	F32			mTerrainLowerLimit; +	F32			mSunHour; + +	BOOL		mUseEstateSun; + +	std::string	mSimName; +	std::string	mSimType; + +protected: +	friend class LLSingleton<LLRegionInfoModel>; +	friend class LLViewerRegion; + +	LLRegionInfoModel(); +	void update(LLMessageSystem* msg); + +private: +	void reset(); + +	update_signal_t mUpdateSignal; +}; + +#endif // LL_LLREGIONINFOMODEL_H diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 6f4dff5819..7762b8755d 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -54,6 +54,7 @@  #include "llfloaterreporter.h"  #include "llfloaterregioninfo.h"  #include "llhttpnode.h" +#include "llregioninfomodel.h"  #include "llsdutil.h"  #include "llstartup.h"  #include "lltrans.h" @@ -642,9 +643,11 @@ std::string LLViewerRegion::accessToShortString(U8 sim_access)  void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)  {  	// send it to 'observers' +	// *TODO: switch the floaters to using LLRegionInfoModel  	LLFloaterGodTools::processRegionInfo(msg);  	LLFloaterRegionInfo::processRegionInfo(msg);  	LLFloaterReporter::processRegionInfo(msg); +	LLRegionInfoModel::instance().update(msg);  }  void LLViewerRegion::setCacheID(const LLUUID& id) diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp index 8dca9c5ecb..ca5b65f0da 100644 --- a/indra/newview/llwldaycycle.cpp +++ b/indra/newview/llwldaycycle.cpp @@ -158,15 +158,15 @@ LLSD LLWLDayCycle::asLLSD()  	return day_data;  } -bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) +bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const  {  	bool result = true;  	LLWLParamManager& wl_mgr = LLWLParamManager::instance();  	refs.clear(); -	for (std::map<F32, LLWLParamKey>::iterator iter = mTimeMap.begin(); iter != mTimeMap.end(); ++iter) +	for (std::map<F32, LLWLParamKey>::const_iterator iter = mTimeMap.begin(); iter != mTimeMap.end(); ++iter)  	{ -		LLWLParamKey& key = iter->second; +		const LLWLParamKey& key = iter->second;  		if (!wl_mgr.getParamSet(key, refs[key]))  		{  			llwarns << "Cannot find sky [" << key.name << "] referenced by a day cycle" << llendl; @@ -177,6 +177,19 @@ bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs)  	return result;  } +bool LLWLDayCycle::getSkyMap(LLSD& sky_map) const +{ +	std::map<LLWLParamKey, LLWLParamSet> refs; + +	if (!getSkyRefs(refs)) +	{ +		return false; +	} + +	sky_map = LLWLParamManager::createSkyMap(refs); +	return true; +} +  void LLWLDayCycle::clearKeyframes()  {  	lldebugs << "Clearing key frames" << llendl; diff --git a/indra/newview/llwldaycycle.h b/indra/newview/llwldaycycle.h index e5bc82bb6c..9dbfad294a 100644 --- a/indra/newview/llwldaycycle.h +++ b/indra/newview/llwldaycycle.h @@ -78,7 +78,10 @@ public:  	LLSD asLLSD();  	// get skies referenced by this day cycle -	bool getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs); +	bool getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const; + +	// get referenced skies as LLSD +	bool getSkyMap(LLSD& sky_map) const;  	/// clear keyframes  	void clearKeyframes(); diff --git a/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml index 79dac60486..6cfa67f766 100644 --- a/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml @@ -455,6 +455,14 @@       top_delta="-1"       value="6:00 AM"       width="75"/>  +        <loading_indicator +         height="23" +         layout="topleft" +         left="25" +         name="progress_indicator" +         top="417" +         visible="false" +         width="23" />          <check_box           follows="top|left"           height="10" @@ -471,6 +479,7 @@           layout="topleft"           left_pad="0"           name="save" +         top="417"           width="70"/>          <button           follows="bottom|right" @@ -479,5 +488,6 @@           layout="topleft"           left_pad="15"           name="cancel" +         top_delta="0"           width="70"/>   </floater>  | 
