diff options
-rwxr-xr-x | indra/newview/llfloaterpreference.cpp | 50 | ||||
-rwxr-xr-x | indra/newview/llfloaterpreference.h | 8 | ||||
-rw-r--r-- | indra/newview/llpresetsmanager.cpp | 96 | ||||
-rw-r--r-- | indra/newview/llpresetsmanager.h | 9 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml | 5 |
5 files changed, 137 insertions, 31 deletions
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 39f37f4e50..e8590fc9dc 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -109,6 +109,7 @@ #include "lllogininstance.h" // to check if logged in yet #include "llsdserialize.h" #include "llpresetsmanager.h" +#include "llviewercontrol.h" const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; @@ -742,7 +743,13 @@ void LLFloaterPreference::onOpen(const LLSD& key) saveSettings(); // Make sure there is a default preference file - + std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, PRESETS_DIR, PRESETS_GRAPHIC_DIR, "default.xml"); + if (!gDirUtilp->fileExists(default_file)) + { + LL_WARNS() << "No " << default_file << " found -- creating one" << LL_ENDL; + // Write current graphic settings to default.xml + LLPresetsManager::getInstance()->savePreset("Default"); + } } void LLFloaterPreference::onVertexShaderEnable() @@ -1873,6 +1880,7 @@ LLPanelPreference::LLPanelPreference() { mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1)); + mCommitCallbackRegistrar.add("Pref.Preset", boost::bind(&LLPanelPreference::onChangePreset, this)); } //virtual @@ -2070,6 +2078,19 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl) } } +void LLPanelPreference::onChangePreset() +{ + LLComboBox* combo = getChild<LLComboBox>("graphic_preset_combo"); + std::string name = combo->getSimple(); + + LLPresetsManager::getInstance()->loadPreset(name); + LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); + if (instance) + { + instance->refreshEnabledGraphics(); + } +} + class LLPanelPreferencePrivacy : public LLPanelPreference { public: @@ -2113,28 +2134,43 @@ static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preferenc BOOL LLPanelPreferenceGraphics::postBuild() { - LLComboBox* graphic_preset = getChild<LLComboBox>("graphic_preset_combo"); - graphic_preset->setLabel(getString("graphic_preset_combo_label")); + LLComboBox* combo = getChild<LLComboBox>("graphic_preset_combo"); + combo->setLabel(getString("graphic_preset_combo_label")); + + setPresetNamesInCombobox(); + + LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelPreferenceGraphics::onPresetsListChange, this)); + + return LLPanelPreference::postBuild(); +} + +void LLPanelPreferenceGraphics::onPresetsListChange() +{ + setPresetNamesInCombobox(); +} + +void LLPanelPreferenceGraphics::setPresetNamesInCombobox() +{ + LLComboBox* combo = getChild<LLComboBox>("graphic_preset_combo"); + combo->clearRows(); std::string presets_dir = LLPresetsManager::getGraphicPresetsDir(); if (!presets_dir.empty()) { - LLPresetsManager::getInstance()->loadPresetsFromDir(presets_dir); + LLPresetsManager::getInstance()->loadPresetNamesFromDir(presets_dir); std::list<std::string> preset_names; LLPresetsManager::getInstance()->getPresetNames(preset_names); for (std::list<std::string>::const_iterator it = preset_names.begin(); it != preset_names.end(); ++it) { const std::string& name = *it; - graphic_preset->add(name, LLSD().with(0, name)); + combo->add(name, LLSD().with(0, name)); } } else { LL_WARNS() << "Could not obtain graphic presets path" << LL_ENDL; } - - return LLPanelPreference::postBuild(); } void LLPanelPreferenceGraphics::draw() diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 1b42444c9e..66442a0b51 100755 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -220,7 +220,9 @@ public: // This function squirrels away the current values of the controls so that // cancel() can restore them. virtual void saveSettings(); - + + void onChangePreset(); + class Updater; protected: @@ -248,11 +250,13 @@ public: void cancel(); void saveSettings(); void setHardwareDefaults(); + void setPresetNamesInCombobox(); static const std::string getPresetsPath(); + protected: bool hasDirtyChilds(); void resetDirtyChilds(); - + void onPresetsListChange(); }; class LLFloaterPreferenceProxy : public LLFloater diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index d97e9312e2..8fd9024fef 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -26,17 +26,15 @@ #include "llviewerprecompiledheaders.h" +#include <boost/assign/list_of.hpp> + #include "llpresetsmanager.h" #include "lldiriterator.h" -#include "lluictrlfactory.h" #include "llsdserialize.h" +#include "lluictrlfactory.h" #include "llviewercontrol.h" -static const std::string PRESETS_DIR = "presets"; -static const std::string GRAPHIC_DIR = "graphic"; -static const std::string CAMERA_DIR = "camera"; - LLPresetsManager::LLPresetsManager() { } @@ -66,7 +64,7 @@ std::string LLPresetsManager::getUserDir(const std::string& subdirectory) std::string LLPresetsManager::getGraphicPresetsDir() { - return getUserDir(GRAPHIC_DIR); + return getUserDir(PRESETS_GRAPHIC_DIR); } void LLPresetsManager::getPresetNames(preset_name_list_t& presets) const @@ -75,43 +73,103 @@ void LLPresetsManager::getPresetNames(preset_name_list_t& presets) const } -void LLPresetsManager::loadPresetsFromDir(const std::string& dir) +void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir) { LL_INFOS("AppInit") << "Loading presets from " << dir << LL_ENDL; mPresetNames.clear(); LLDirIterator dir_iter(dir, "*.xml"); - while (1) + bool found = true; + while (found) { std::string file; - if (!dir_iter.next(file)) + found = dir_iter.next(file); + + if (found) { - break; // no more files + std::string path = gDirUtilp->add(dir, file); + std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true)); + mPresetNames.push_back(name); } - - std::string path = gDirUtilp->add(dir, file); - std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true)); - mPresetNames.push_back(name); } } -void LLPresetsManager::savePreset(const std::string & name) +void LLPresetsManager::savePreset(const std::string& name) { llassert(!name.empty()); + // This ugliness is the current list of all the control variables in the graphics and hardware + // preferences floaters. Additions or subtractions to the floaters must also be reflected here. + std::vector<std::string> name_list = boost::assign::list_of + ("RenderQualityPerformance") + ("RenderFarClip") + ("RenderMaxPartCount") + ("RenderGlowResolutionPow") + ("RenderTerrainDetail") + ("RenderAvatarLODFactor") + ("RenderAvatarMaxVisible") + ("RenderUseImpostors") + ("RenderTerrainLODFactor") + ("RenderTreeLODFactor") + ("RenderVolumeLODFactor") + ("RenderFlexTimeFactor") + ("RenderTransparentWater") + ("RenderObjectBump") + ("RenderLocalLights") + ("VertexShaderEnable") + ("RenderAvatarVP") + ("RenderAvatarCloth") + ("RenderReflectionDetail") + ("WindLightUseAtmosShaders") + ("WLSkyDetail") + ("RenderDeferred") + ("RenderDeferredSSAO") + ("RenderDepthOfField") + ("RenderShadowDetail") + + ("RenderAnisotropic") + ("RenderFSAASamples") + ("RenderGamma") + ("RenderVBOEnable") + ("RenderCompressTextures") + ("TextureMemory") + ("RenderFogRatio"); + // make an empty llsd LLSD paramsData(LLSD::emptyMap()); - std::string pathName(getUserDir(GRAPHIC_DIR) + LLURI::escape(name) + ".xml"); -// Get all graphic settings -// paramsData = mParamList[name].getAll(); + for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it) + { + std::string ctrl_name = *it; + LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get(); + std::string comment = ctrl->getComment(); + std::string type = gSavedSettings.typeEnumToString(ctrl->type()); + LLSD value = ctrl->getValue(); + + paramsData[ctrl_name]["Comment"] = comment; + paramsData[ctrl_name]["Persist"] = 1; + paramsData[ctrl_name]["Type"] = type; + paramsData[ctrl_name]["Value"] = value; + } + + std::string pathName(getUserDir(PRESETS_GRAPHIC_DIR) + "\\" + LLURI::escape(name) + ".xml"); // write to file llofstream presetsXML(pathName); LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY); presetsXML.close(); + + // signal interested parties + mPresetListChangeSignal(); +} + +void LLPresetsManager::loadPreset(const std::string& name) +{ + std::string pathName(getUserDir(PRESETS_GRAPHIC_DIR) + "\\" + LLURI::escape(name) + ".xml"); + + gSavedSettings.loadFromFile(pathName, false, true); } bool LLPresetsManager::removeParamSet(const std::string& name, bool delete_from_disk) @@ -129,7 +187,7 @@ bool LLPresetsManager::removeParamSet(const std::string& name, bool delete_from_ // remove from file system if requested if (delete_from_disk) { - if (gDirUtilp->deleteFilesInDir(getUserDir(GRAPHIC_DIR), LLURI::escape(name) + ".xml") < 1) + if (gDirUtilp->deleteFilesInDir(getUserDir(PRESETS_GRAPHIC_DIR), LLURI::escape(name) + ".xml") < 1) { LL_WARNS("Presets") << "Error removing preset " << name << " from disk" << LL_ENDL; } diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h index b9a79a7736..5bf85b835a 100644 --- a/indra/newview/llpresetsmanager.h +++ b/indra/newview/llpresetsmanager.h @@ -30,6 +30,10 @@ #include <list> #include <map> +static const std::string PRESETS_DIR = "presets"; +static const std::string PRESETS_GRAPHIC_DIR = "graphic"; +static const std::string PRESETS_CAMERA_DIR = "camera"; + class LLPresetsManager : public LLSingleton<LLPresetsManager> { public: @@ -37,12 +41,13 @@ public: typedef boost::signals2::signal<void()> preset_list_signal_t; void getPresetNames(preset_name_list_t& presets) const; - void loadPresetsFromDir(const std::string& dir); + void loadPresetNamesFromDir(const std::string& dir); void savePreset(const std::string & name); + void loadPreset(const std::string & name); static std::string getGraphicPresetsDir(); bool removeParamSet(const std::string& name, bool delete_from_disk); - /// Emitted when a preset gets added or deleted. + /// Emitted when a preset gets loaded or deleted. boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb); preset_name_list_t mPresetNames; diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 371a5fd48e..2cbba946d4 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -30,7 +30,10 @@ max_chars="100" name="graphic_preset_combo" top_delta="0" - width="150"/> + width="150"> + <combo_box.commit_callback + function="Pref.Preset" /> + </combo_box> <button follows="top|left" height="23" |