From d6959f179f326a5b1846b7498b439dab496e8350 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Wed, 8 Sep 2021 22:11:57 -0400 Subject: [PATCH] More cleanup to graphics preset system. Make largely independent of preference floater --- indra/newview/llfloaterpreference.cpp | 6 -- indra/newview/llpresetsmanager.cpp | 81 +++++++++++++++++++++++---- indra/newview/llpresetsmanager.h | 11 ++-- 3 files changed, 77 insertions(+), 21 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 0c5919a1a90..fea41bbe04d 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1100,8 +1100,6 @@ void LLFloaterPreference::setHardwareDefaults() LLAvatarComplexityControls::setIndirectControls(); refreshEnabledGraphics(); - gSavedSettings.setString("PresetGraphicActive", ""); - LLPresetsManager::getInstance()->triggerChangeSignal(); LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); child_list_t::const_iterator iter = tabcontainer->getChildList()->begin(); @@ -2894,11 +2892,7 @@ void LLPanelPreferenceGraphics::setPresetText() if (hasDirtyChilds() && !preset_graphic_active.empty()) { - gSavedSettings.setString("PresetGraphicActive", ""); preset_graphic_active.clear(); - // This doesn't seem to cause an infinite recursion. This trigger is needed to cause the pulldown - // panel to update. - LLPresetsManager::getInstance()->triggerChangeSignal(); } if (!preset_graphic_active.empty()) diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index 3e948625ae9..07d36503d13 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -44,14 +44,25 @@ LLPresetsManager::LLPresetsManager() { - // Start watching camera controls as soon as the preset - // manager gets initialized + // Connect preset signals + startWatching(PRESETS_GRAPHIC); startWatching(PRESETS_CAMERA); } LLPresetsManager::~LLPresetsManager() { - mCameraChangedSignal.disconnect(); + for (auto& signal : mGraphicsChangedSignals) + { + signal.disconnect(); + } + mGraphicsChangedSignals.clear(); + + + for (auto& signal : mCameraChangedSignals) + { + signal.disconnect(); + } + mCameraChangedSignals.clear(); } void LLPresetsManager::triggerChangeCameraSignal() @@ -120,7 +131,43 @@ void LLPresetsManager::startWatching(const std::string& subdirectory) } else { - mCameraChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&settingChanged)); + mCameraChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::cameraSettingChanged, this))); + } + } + } + } + else if (PRESETS_GRAPHIC == subdirectory) + { + std::vector<std::string> name_list; + getGraphicsControlNames(name_list); + + for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it) + { + std::string ctrl_name = *it; + if (gSavedSettings.controlExists(ctrl_name)) + { + LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl(ctrl_name); + if (cntrl_ptr.isNull()) + { + LL_WARNS("Init") << "Unable to set signal on global setting '" << ctrl_name + << "'" << LL_ENDL; + } + else + { + mGraphicsChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::graphicsSettingChanged, this))); + } + } + else if (gSavedPerAccountSettings.controlExists(ctrl_name)) + { + LLPointer<LLControlVariable> cntrl_ptr = gSavedPerAccountSettings.getControl(ctrl_name); + if (cntrl_ptr.isNull()) + { + LL_WARNS("Init") << "Unable to set signal on global setting '" << ctrl_name + << "'" << LL_ENDL; + } + else + { + mGraphicsChangedSignals.push_back(cntrl_ptr->getCommitSignal()->connect(boost::bind(&LLPresetsManager::graphicsSettingChanged, this))); } } } @@ -219,26 +266,36 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& subdirectory, p presets = mPresetNames; } -bool LLPresetsManager::mCameraDirty = false; -bool LLPresetsManager::mIgnoreChangedSignal = false; +bool LLPresetsManager::sCameraDirty = false; void LLPresetsManager::setCameraDirty(bool dirty) { - mCameraDirty = dirty; + sCameraDirty = dirty; } bool LLPresetsManager::isCameraDirty() { - return mCameraDirty; + return sCameraDirty; +} + +void LLPresetsManager::graphicsSettingChanged() +{ + static LLCachedControl<std::string> graphic_preset_active(gSavedSettings, "PresetGraphicActive", ""); + if (!graphic_preset_active().empty() && !mIgnoreChangedSignal) + { + gSavedSettings.setString("PresetGraphicActive", ""); + + // Hack call because this is a static routine + LLPresetsManager::getInstance()->triggerChangeSignal(); + } } -void LLPresetsManager::settingChanged() +void LLPresetsManager::cameraSettingChanged() { setCameraDirty(true); static LLCachedControl<std::string> preset_camera_active(gSavedSettings, "PresetCameraActive", ""); - std::string preset_name = preset_camera_active; - if (!preset_name.empty() && !mIgnoreChangedSignal) + if (!preset_camera_active().empty() && !mIgnoreChangedSignal) { gSavedSettings.setString("PresetCameraActive", ""); @@ -360,8 +417,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap(); if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0) { + mIgnoreChangedSignal = true; // use the recommended setting as an initial one (MAINT-6435) gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger()); + mIgnoreChangedSignal = false; } // Add dynamic controls to default preset diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h index fac8a1725ef..33a243ed2de 100644 --- a/indra/newview/llpresetsmanager.h +++ b/indra/newview/llpresetsmanager.h @@ -99,12 +99,15 @@ class LLPresetsManager final : public LLSingleton<LLPresetsManager> void getGraphicsControlNames(std::vector<std::string>& names); void getCameraControlNames(std::vector<std::string>& names); - static void settingChanged(); + void graphicsSettingChanged(); + void cameraSettingChanged(); - boost::signals2::connection mCameraChangedSignal; + std::vector<boost::signals2::connection> mGraphicsChangedSignals; + std::vector<boost::signals2::connection> mCameraChangedSignals; - static bool mCameraDirty; - static bool mIgnoreChangedSignal; + bool mIgnoreChangedSignal = false; + + static bool sCameraDirty; }; #endif // LL_PRESETSMANAGER_H -- GitLab