/** * @file quickprefs.cpp * @brief Quick preferences access panel for bottomtray * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * Copyright (C) 2011, WoLf Loonie @ Second Life * * 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 "quickprefs.h" #include "llboost.h" #include "llcombobox.h" #include "llwlparamset.h" #include "llwlparammanager.h" #include "llwaterparammanager.h" #include "llfloatereditsky.h" #include "llmultisliderctrl.h" #include "lltimectrl.h" #include "llenvmanager.h" #include "llviewercontrol.h" FloaterQuickPrefs::FloaterQuickPrefs(const LLSD& key) : LLTransientDockableFloater(NULL,true,key) { } FloaterQuickPrefs::~FloaterQuickPrefs() { } void FloaterQuickPrefs::onOpen(const LLSD& key) { } void FloaterQuickPrefs::initCallbacks(void) { LLWLParamManager& param_mgr = LLWLParamManager::instance(); getChild("WaterPresetsCombo")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onChangeWaterPreset, this, _1)); getChild("WLPresetsCombo")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onChangeSkyPreset, this, _1)); getChild("WLPrevPreset")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onClickSkyPrev, this)); getChild("WLNextPreset")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onClickSkyNext, this)); getChild("WWPrevPreset")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onClickWaterPrev, this)); getChild("WWNextPreset")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onClickWaterNext, this)); getChild("UseRegionWL")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onClickRegionWL, this)); getChild("WLSunPos")->setCommitCallback(boost::bind(&FloaterQuickPrefs::onSunMoved, this, _1, ¶m_mgr.mLightnorm)); } BOOL FloaterQuickPrefs::postBuild() { mWaterPresetsCombo = getChild("WaterPresetsCombo"); mWLPresetsCombo = getChild("WLPresetsCombo"); mWLSunPos = getChild("WLSunPos"); LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); if (mWaterPresetsCombo != NULL) { std::list user_presets, system_presets; LLWaterParamManager::instance().getPresetNames(user_presets, system_presets); // Add user presets first. for (std::list::const_iterator mIt = user_presets.begin(); mIt != user_presets.end(); ++mIt) { if((*mIt).length()>0) mWaterPresetsCombo->add(*mIt); } if (user_presets.size() > 0) { mWaterPresetsCombo->addSeparator(); } // Add system presets. for (std::list::const_iterator mIt = system_presets.begin(); mIt != system_presets.end(); ++mIt) { if((*mIt).length()>0) mWaterPresetsCombo->add(*mIt); } mWaterPresetsCombo->selectByValue(env_mgr.getWaterPresetName()); } if (mWLPresetsCombo != NULL) { LLWLParamManager::preset_name_list_t user_presets, sys_presets, region_presets; LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets); // Add user presets. for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) { if((*it).length()>0) mWLPresetsCombo->add(*it); } if (!user_presets.empty()) { mWLPresetsCombo->addSeparator(); } // Add system presets. for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it) { if((*it).length()>0) mWLPresetsCombo->add(*it); } mWLPresetsCombo->selectByValue(env_mgr.getSkyPresetName()); } mWLSunPos->addSlider(12.f); initCallbacks(); return LLDockableFloater::postBuild(); } void FloaterQuickPrefs::onChangeWaterPreset(LLUICtrl* ctrl) { std::string data = ctrl->getValue().asString(); if(!data.empty()) { LLEnvManagerNew::instance().setUseWaterPreset(data, (bool)gSavedSettings.getBOOL("FSInterpolateWater")); LLWaterParamManager::instance().getParamSet(data, LLWaterParamManager::instance().mCurParams); } } void FloaterQuickPrefs::onChangeSkyPreset(LLUICtrl* ctrl) { std::string data = ctrl->getValue().asString(); if(!data.empty()) { LLEnvManagerNew::instance().setUseSkyPreset(data, (bool)gSavedSettings.getBOOL("FSInterpolateSky")); LLWLParamManager::instance().getParamSet(LLWLParamKey(data, LLEnvKey::SCOPE_LOCAL), LLWLParamManager::instance().mCurParams); } } void FloaterQuickPrefs::deactivateAnimator() { LLWLParamManager::instance().mAnimator.deactivate(); } void FloaterQuickPrefs::onClickWaterPrev() { LLWaterParamManager& mgr = LLWaterParamManager::instance(); LLWaterParamSet& currentParams = mgr.mCurParams; std::map param_list = LLWaterParamManager::instance().getPresets(); // find place of current param std::map::iterator mIt = param_list.find(currentParams.mName); // if at the beginning, loop if(mIt == param_list.begin()) { std::map::iterator last = param_list.end(); last--; mIt = last; } else { mIt--; } deactivateAnimator(); mWaterPresetsCombo->setSimple(mIt->first); LLEnvManagerNew::instance().setUseWaterPreset(mIt->first, (bool)gSavedSettings.getBOOL("FSInterpolateWater")); mgr.getParamSet(mIt->first, mgr.mCurParams); } void FloaterQuickPrefs::onClickWaterNext() { LLWaterParamManager& mgr = LLWaterParamManager::instance(); LLWaterParamSet& currentParams = mgr.mCurParams; std::map param_list = mgr.getPresets(); // find place of current param std::map::iterator mIt = param_list.find(currentParams.mName); // if at the end, loop std::map::iterator last = param_list.end(); last--; if(mIt == param_list.end()) { mIt = param_list.begin(); } else { mIt++; } deactivateAnimator(); mWaterPresetsCombo->setSimple(mIt->first); LLEnvManagerNew::instance().setUseWaterPreset(mIt->first, (bool)gSavedSettings.getBOOL("FSInterpolateWater")); mgr.getParamSet(mIt->first, mgr.mCurParams); } void FloaterQuickPrefs::onClickSkyPrev() { LLWLParamManager& mgr = LLWLParamManager::instance(); std::map param_list = mgr.getParamList(); // find place of current param std::map::iterator mIt; mIt = param_list.find(LLWLParamKey(mgr.mCurParams.mName, LLEnvKey::SCOPE_LOCAL)); // shouldn't happen unless you delete every preset but Default if (mIt == param_list.end()) { llwarns << "No more presets left!" << llendl; return; } // if at the beginning, loop if (mIt == param_list.begin()) { std::map::iterator last = param_list.end(); last--; mIt = last; } else { mIt--; } deactivateAnimator(); mWLPresetsCombo->setSimple(mIt->first.name); LLEnvManagerNew::instance().setUseSkyPreset(mIt->first.name, (bool)gSavedSettings.getBOOL("FSInterpolateSky")); mgr.getParamSet(mIt->first, mgr.mCurParams); } void FloaterQuickPrefs::onClickSkyNext() { LLWLParamManager& mgr = LLWLParamManager::instance(); std::map param_list = mgr.getParamList(); // find place of current param std::map::iterator mIt; mIt = param_list.find(LLWLParamKey(mgr.mCurParams.mName, LLEnvKey::SCOPE_LOCAL)); // shouldn't happen unless you delete every preset but Default if (mIt == param_list.end()) { llwarns << "No more presets left!" << llendl; return; } // if at the end, loop std::map::iterator last = param_list.end(); last--; if (mIt == last) { mIt = param_list.begin(); } else { mIt++; } deactivateAnimator(); mWLPresetsCombo->setSimple(mIt->first.name); LLEnvManagerNew::instance().setUseSkyPreset(mIt->first.name, (bool)gSavedSettings.getBOOL("FSInterpolateSky")); mgr.getParamSet(mIt->first, mgr.mCurParams); } void FloaterQuickPrefs::draw() { syncControls(); LLFloater::draw(); } static F32 sun_pos_to_time24(F32 sun_pos) { return fmodf(sun_pos * 24.0f + 6, 24.0f); } void FloaterQuickPrefs::syncControls() { bool err; LLWLParamManager& param_mgr = LLWLParamManager::instance(); F32 time24 = sun_pos_to_time24(param_mgr.mCurParams.getFloat("sun_angle", err) / F_TWO_PI); mWLSunPos->setCurSliderValue(time24, TRUE); std::string current_wlpreset = param_mgr.mCurParams.mName; if (mWLPresetsCombo->getValue().asString() != current_wlpreset) { mWLPresetsCombo->setSimple(current_wlpreset); } std::string current_waterpreset = LLWaterParamManager::instance().mCurParams.mName; if (mWaterPresetsCombo->getValue().asString() != current_waterpreset) { mWaterPresetsCombo->setSimple(current_waterpreset); } } void FloaterQuickPrefs::onSunMoved(LLUICtrl* ctrl, void* userdata) { F32 val = mWLSunPos->getCurSliderValue() / 24.0f; LLWLParamManager& mgr = LLWLParamManager::instance(); mgr.mAnimator.setDayTime((F64)val); mgr.mAnimator.deactivate(); mgr.mAnimator.update(mgr.mCurParams); } void FloaterQuickPrefs::onClickRegionWL() { mWLPresetsCombo->setSimple(LLStringExplicit("Default")); mWaterPresetsCombo->setSimple(LLStringExplicit("Default")); LLEnvManagerNew::instance().useRegionSettings(); LLWLParamManager::instance().getParamSet(LLWLParamKey("Default", LLEnvKey::SCOPE_LOCAL), LLWLParamManager::instance().mCurParams); }