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.
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"
25 #define XML_SKINSETTINGS "skinsettings"
27 CSkinSettings::CSkinSettings()
32 CSkinSettings::~CSkinSettings() = default;
34 CSkinSettings
& CSkinSettings::GetInstance()
36 static CSkinSettings 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()
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)
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");
120 std::unique_lock
<CCriticalSection
> lock(m_critical
);
122 m_settings
= ADDON::CSkinInfo::ParseSettings(rootElement
);
127 bool CSkinSettings::Save(TiXmlNode
*settings
) const
129 if (settings
== nullptr)
132 // nothing to do here because skin settings saving has been migrated to CSkinInfo
137 void CSkinSettings::Clear()
139 std::unique_lock
<CCriticalSection
> lock(m_critical
);
143 void CSkinSettings::MigrateSettings(const std::shared_ptr
<ADDON::CSkinInfo
>& skin
)
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
+ "."))
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();