void CSettingsManager::OnSettingPropertyChanged(const CSetting *setting, const char *propertyName) { CSharedLock lock(m_settingsCritical); if (!m_loaded || setting == NULL) return; SettingMap::const_iterator settingIt = m_settings.find(setting->GetId()); if (settingIt == m_settings.end()) return; Setting settingData = settingIt->second; // now that we have a copy of the setting's data, we can leave the lock lock.Leave(); for (CallbackSet::iterator callback = settingData.callbacks.begin(); callback != settingData.callbacks.end(); ++callback) (*callback)->OnSettingPropertyChanged(setting, propertyName); // check the changed property and if it may have an influence on the // children of the setting SettingDependencyType dependencyType = SettingDependencyTypeNone; if (StringUtils::EqualsNoCase(propertyName, "enabled")) dependencyType = SettingDependencyTypeEnable; else if (StringUtils::EqualsNoCase(propertyName, "visible")) dependencyType = SettingDependencyTypeVisible; if (dependencyType != SettingDependencyTypeNone) { for (std::set<std::string>::const_iterator childIt = settingIt->second.children.begin(); childIt != settingIt->second.children.end(); ++childIt) UpdateSettingByDependency(*childIt, dependencyType); } }
void CSettingsManager::OnSettingChanged(const CSetting *setting) { CSharedLock lock(m_settingsCritical); if (!m_loaded || setting == NULL) return; SettingMap::const_iterator settingIt = m_settings.find(setting->GetId()); if (settingIt == m_settings.end()) return; Setting settingData = settingIt->second; // now that we have a copy of the setting's data, we can leave the lock lock.Leave(); for (CallbackSet::iterator callback = settingData.callbacks.begin(); callback != settingData.callbacks.end(); ++callback) (*callback)->OnSettingChanged(setting); // now handle any settings which depend on the changed setting const SettingDependencyMap& deps = GetDependencies(setting); for (SettingDependencyMap::const_iterator depsIt = deps.begin(); depsIt != deps.end(); ++depsIt) { for (SettingDependencies::const_iterator depIt = depsIt->second.begin(); depIt != depsIt->second.end(); ++depIt) UpdateSettingByDependency(depsIt->first, *depIt); } }
void CSettingsManager::UpdateSettingByDependency(const std::string &settingId, const CSettingDependency &dependency) { UpdateSettingByDependency(settingId, dependency.GetType()); }