Merge pull request #24470 from fuzzard/release_20.3
[xbmc.git] / xbmc / settings / SkinSettings.cpp
blob71ff616c6c931e11fc3e29692e01706cd22bd40f
1 /*
2 * Copyright (C) 2013-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "SkinSettings.h"
11 #include "GUIInfoManager.h"
12 #include "ServiceBroker.h"
13 #include "addons/Skin.h"
14 #include "guilib/GUIComponent.h"
15 #include "settings/Settings.h"
16 #include "settings/SettingsComponent.h"
17 #include "utils/StringUtils.h"
18 #include "utils/XBMCTinyXML.h"
19 #include "utils/log.h"
21 #include <memory>
22 #include <mutex>
23 #include <string>
25 #define XML_SKINSETTINGS "skinsettings"
27 CSkinSettings::CSkinSettings()
29 Clear();
32 CSkinSettings::~CSkinSettings() = default;
34 CSkinSettings& CSkinSettings::GetInstance()
36 static CSkinSettings sSkinSettings;
37 return sSkinSettings;
40 int CSkinSettings::TranslateString(const std::string &setting)
42 return g_SkinInfo->TranslateString(setting);
45 const std::string& CSkinSettings::GetString(int setting) const
47 return g_SkinInfo->GetString(setting);
50 void CSkinSettings::SetString(int setting, const std::string &label)
52 g_SkinInfo->SetString(setting, label);
55 int CSkinSettings::TranslateBool(const std::string &setting)
57 return g_SkinInfo->TranslateBool(setting);
60 bool CSkinSettings::GetBool(int setting) const
62 return g_SkinInfo->GetBool(setting);
65 int CSkinSettings::GetInt(int setting) const
67 return g_SkinInfo->GetInt(setting);
70 void CSkinSettings::SetBool(int setting, bool set)
72 g_SkinInfo->SetBool(setting, set);
75 void CSkinSettings::Reset(const std::string &setting)
77 g_SkinInfo->Reset(setting);
80 std::set<ADDON::CSkinSettingPtr> CSkinSettings::GetSettings() const
82 return g_SkinInfo->GetSkinSettings();
85 ADDON::CSkinSettingPtr CSkinSettings::GetSetting(const std::string& settingId)
87 return g_SkinInfo->GetSkinSetting(settingId);
90 std::shared_ptr<const ADDON::CSkinSetting> CSkinSettings::GetSetting(
91 const std::string& settingId) const
93 return g_SkinInfo->GetSkinSetting(settingId);
96 void CSkinSettings::Reset()
98 g_SkinInfo->Reset();
100 CGUIInfoManager& infoMgr = CServiceBroker::GetGUI()->GetInfoManager();
101 infoMgr.ResetCache();
102 infoMgr.GetInfoProviders().GetGUIControlsInfoProvider().ResetContainerMovingCache();
105 bool CSkinSettings::Load(const TiXmlNode *settings)
107 if (settings == nullptr)
108 return false;
110 const TiXmlElement *rootElement = settings->FirstChildElement(XML_SKINSETTINGS);
112 // return true in the case skinsettings is missing. It just means that
113 // it's been migrated and it's not an error
114 if (rootElement == nullptr)
116 CLog::Log(LOGDEBUG, "CSkinSettings: no <skinsettings> tag found");
117 return true;
120 std::unique_lock<CCriticalSection> lock(m_critical);
121 m_settings.clear();
122 m_settings = ADDON::CSkinInfo::ParseSettings(rootElement);
124 return true;
127 bool CSkinSettings::Save(TiXmlNode *settings) const
129 if (settings == nullptr)
130 return false;
132 // nothing to do here because skin settings saving has been migrated to CSkinInfo
134 return true;
137 void CSkinSettings::Clear()
139 std::unique_lock<CCriticalSection> lock(m_critical);
140 m_settings.clear();
143 void CSkinSettings::MigrateSettings(const std::shared_ptr<ADDON::CSkinInfo>& skin)
145 if (skin == nullptr)
146 return;
148 std::unique_lock<CCriticalSection> lock(m_critical);
150 bool settingsMigrated = false;
151 const std::string& skinId = skin->ID();
152 std::set<ADDON::CSkinSettingPtr> settingsCopy(m_settings.begin(), m_settings.end());
153 for (const auto& setting : settingsCopy)
155 if (!StringUtils::StartsWith(setting->name, skinId + "."))
156 continue;
158 std::string settingName = setting->name.substr(skinId.size() + 1);
160 if (setting->GetType() == "string")
162 int settingNumber = skin->TranslateString(settingName);
163 if (settingNumber >= 0)
164 skin->SetString(settingNumber, std::dynamic_pointer_cast<ADDON::CSkinSettingString>(setting)->value);
166 else if (setting->GetType() == "bool")
168 int settingNumber = skin->TranslateBool(settingName);
169 if (settingNumber >= 0)
170 skin->SetBool(settingNumber, std::dynamic_pointer_cast<ADDON::CSkinSettingBool>(setting)->value);
173 m_settings.erase(setting);
174 settingsMigrated = true;
177 if (settingsMigrated)
179 // save the skin's settings
180 skin->SaveSettings();
182 // save the guisettings.xml
183 CServiceBroker::GetSettingsComponent()->GetSettings()->Save();