Merge pull request #26362 from ksooo/estuary-rework-pvr-info-dialog
[xbmc.git] / xbmc / video / dialogs / GUIDialogCMSSettings.cpp
blobc7945523ee3e3cad4c526553b29a4d16b164b5dc
1 /*
2 * Copyright (C) 2005-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 "GUIDialogCMSSettings.h"
11 #include "FileItem.h"
12 #include "FileItemList.h"
13 #include "GUIPassword.h"
14 #include "ServiceBroker.h"
15 #include "addons/Skin.h"
16 #include "cores/VideoPlayer/VideoRenderers/ColorManager.h"
17 #include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
18 #include "filesystem/Directory.h"
19 #include "guilib/GUIWindowManager.h"
20 #include "profiles/ProfileManager.h"
21 #include "settings/Settings.h"
22 #include "settings/SettingsComponent.h"
23 #include "settings/lib/Setting.h"
24 #include "settings/lib/SettingDefinitions.h"
25 #include "settings/lib/SettingsManager.h"
26 #include "utils/URIUtils.h"
27 #include "utils/Variant.h"
28 #include "utils/log.h"
29 #include "video/VideoDatabase.h"
31 #include <memory>
32 #include <vector>
34 #define SETTING_VIDEO_CMSENABLE "videoscreen.cmsenabled"
35 #define SETTING_VIDEO_CMSMODE "videoscreen.cmsmode"
36 #define SETTING_VIDEO_CMS3DLUT "videoscreen.cms3dlut"
37 #define SETTING_VIDEO_CMSWHITEPOINT "videoscreen.cmswhitepoint"
38 #define SETTING_VIDEO_CMSPRIMARIES "videoscreen.cmsprimaries"
39 #define SETTING_VIDEO_CMSGAMMAMODE "videoscreen.cmsgammamode"
40 #define SETTING_VIDEO_CMSGAMMA "videoscreen.cmsgamma"
41 #define SETTING_VIDEO_CMSLUTSIZE "videoscreen.cmslutsize"
43 CGUIDialogCMSSettings::CGUIDialogCMSSettings()
44 : CGUIDialogSettingsManualBase(WINDOW_DIALOG_CMS_OSD_SETTINGS, "DialogSettings.xml")
45 { }
47 CGUIDialogCMSSettings::~CGUIDialogCMSSettings() = default;
49 void CGUIDialogCMSSettings::SetupView()
51 CGUIDialogSettingsManualBase::SetupView();
53 SetHeading(36560);
54 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_OKAY_BUTTON);
55 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_CUSTOM_BUTTON);
56 SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON, 15067);
59 void CGUIDialogCMSSettings::InitializeSettings()
61 CGUIDialogSettingsManualBase::InitializeSettings();
63 const std::shared_ptr<CSettingCategory> category = AddCategory("cms", -1);
64 if (category == NULL)
66 CLog::Log(LOGERROR, "CGUIDialogCMSSettings: unable to setup settings");
67 return;
70 // get all necessary setting groups
71 const std::shared_ptr<CSettingGroup> groupColorManagement = AddGroup(category);
72 if (groupColorManagement == NULL)
74 CLog::Log(LOGERROR, "CGUIDialogCMSSettings: unable to setup settings");
75 return;
78 bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml");
80 TranslatableIntegerSettingOptions entries;
82 // create "depsCmsEnabled" for settings depending on CMS being enabled
83 CSettingDependency dependencyCmsEnabled(SettingDependencyType::Enable, GetSettingsManager());
84 dependencyCmsEnabled.Or()->Add(std::make_shared<CSettingDependencyCondition>(
85 SETTING_VIDEO_CMSENABLE, "true", SettingDependencyOperator::Equals, false,
86 GetSettingsManager()));
87 SettingDependencies depsCmsEnabled;
88 depsCmsEnabled.push_back(dependencyCmsEnabled);
90 // create "depsCms3dlut" for 3dlut settings
91 CSettingDependency dependencyCms3dlut(SettingDependencyType::Visible, GetSettingsManager());
92 dependencyCms3dlut.And()->Add(std::make_shared<CSettingDependencyCondition>(
93 SETTING_VIDEO_CMSMODE, std::to_string(CMS_MODE_3DLUT), SettingDependencyOperator::Equals,
94 false, GetSettingsManager()));
95 SettingDependencies depsCms3dlut;
96 depsCms3dlut.push_back(dependencyCmsEnabled);
97 depsCms3dlut.push_back(dependencyCms3dlut);
99 // create "depsCmsIcc" for display settings with icc profile
100 CSettingDependency dependencyCmsIcc(SettingDependencyType::Visible, GetSettingsManager());
101 dependencyCmsIcc.And()->Add(std::make_shared<CSettingDependencyCondition>(
102 SETTING_VIDEO_CMSMODE, std::to_string(CMS_MODE_PROFILE), SettingDependencyOperator::Equals,
103 false, GetSettingsManager()));
104 SettingDependencies depsCmsIcc;
105 depsCmsIcc.push_back(dependencyCmsEnabled);
106 depsCmsIcc.push_back(dependencyCmsIcc);
108 // create "depsCmsGamma" for effective gamma adjustment (not available with bt.1886)
109 CSettingDependency dependencyCmsGamma(SettingDependencyType::Visible, GetSettingsManager());
110 dependencyCmsGamma.And()->Add(std::make_shared<CSettingDependencyCondition>(
111 SETTING_VIDEO_CMSGAMMAMODE, std::to_string(CMS_TRC_BT1886), SettingDependencyOperator::Equals,
112 true, GetSettingsManager()));
113 SettingDependencies depsCmsGamma;
114 depsCmsGamma.push_back(dependencyCmsEnabled);
115 depsCmsGamma.push_back(dependencyCmsIcc);
116 depsCmsGamma.push_back(dependencyCmsGamma);
118 const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
120 // color management settings
121 AddToggle(groupColorManagement, SETTING_VIDEO_CMSENABLE, 36560, SettingLevel::Basic, settings->GetBool(SETTING_VIDEO_CMSENABLE));
123 int currentMode = settings->GetInt(SETTING_VIDEO_CMSMODE);
124 entries.clear();
125 // entries.push_back(TranslatableIntegerSettingOption(16039, CMS_MODE_OFF)); // FIXME: get from CMS class
126 entries.emplace_back(36580, CMS_MODE_3DLUT);
127 #ifdef HAVE_LCMS2
128 entries.emplace_back(36581, CMS_MODE_PROFILE);
129 #endif
130 std::shared_ptr<CSettingInt> settingCmsMode = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSMODE, 36562, SettingLevel::Basic, currentMode, entries);
131 settingCmsMode->SetDependencies(depsCmsEnabled);
133 std::string current3dLUT = settings->GetString(SETTING_VIDEO_CMS3DLUT);
134 std::shared_ptr<CSettingString> settingCms3dlut = AddList(groupColorManagement, SETTING_VIDEO_CMS3DLUT, 36564, SettingLevel::Basic, current3dLUT, Cms3dLutsFiller, 36564);
135 settingCms3dlut->SetDependencies(depsCms3dlut);
137 // display settings
138 int currentWhitepoint = settings->GetInt(SETTING_VIDEO_CMSWHITEPOINT);
139 entries.clear();
140 entries.emplace_back(36586, CMS_WHITEPOINT_D65);
141 entries.emplace_back(36587, CMS_WHITEPOINT_D93);
142 std::shared_ptr<CSettingInt> settingCmsWhitepoint = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSWHITEPOINT, 36568, SettingLevel::Basic, currentWhitepoint, entries);
143 settingCmsWhitepoint->SetDependencies(depsCmsIcc);
145 int currentPrimaries = settings->GetInt(SETTING_VIDEO_CMSPRIMARIES);
146 entries.clear();
147 entries.emplace_back(36588, CMS_PRIMARIES_AUTO);
148 entries.emplace_back(36589, CMS_PRIMARIES_BT709);
149 entries.emplace_back(36579, CMS_PRIMARIES_BT2020);
150 entries.emplace_back(36590, CMS_PRIMARIES_170M);
151 entries.emplace_back(36591, CMS_PRIMARIES_BT470M);
152 entries.emplace_back(36592, CMS_PRIMARIES_BT470BG);
153 entries.emplace_back(36593, CMS_PRIMARIES_240M);
154 std::shared_ptr<CSettingInt> settingCmsPrimaries = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSPRIMARIES, 36570, SettingLevel::Basic, currentPrimaries, entries);
155 settingCmsPrimaries->SetDependencies(depsCmsIcc);
157 int currentGammaMode = settings->GetInt(SETTING_VIDEO_CMSGAMMAMODE);
158 entries.clear();
159 entries.emplace_back(36582, CMS_TRC_BT1886);
160 entries.emplace_back(36583, CMS_TRC_INPUT_OFFSET);
161 entries.emplace_back(36584, CMS_TRC_OUTPUT_OFFSET);
162 entries.emplace_back(36585, CMS_TRC_ABSOLUTE);
163 std::shared_ptr<CSettingInt> settingCmsGammaMode = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSGAMMAMODE, 36572, SettingLevel::Basic, currentGammaMode, entries);
164 settingCmsGammaMode->SetDependencies(depsCmsIcc);
166 float currentGamma = settings->GetInt(SETTING_VIDEO_CMSGAMMA)/100.0f;
167 if (currentGamma == 0.0f)
168 currentGamma = 2.20f;
169 std::shared_ptr<CSettingNumber> settingCmsGamma = AddSlider(groupColorManagement, SETTING_VIDEO_CMSGAMMA, 36574, SettingLevel::Basic, currentGamma, 36597, 1.6, 0.05, 2.8, 36574, usePopup);
170 settingCmsGamma->SetDependencies(depsCmsGamma);
172 int currentLutSize = settings->GetInt(SETTING_VIDEO_CMSLUTSIZE);
173 entries.clear();
174 entries.emplace_back(36594, 4);
175 entries.emplace_back(36595, 6);
176 entries.emplace_back(36596, 8);
177 std::shared_ptr<CSettingInt> settingCmsLutSize = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSLUTSIZE, 36576, SettingLevel::Basic, currentLutSize, entries);
178 settingCmsLutSize->SetDependencies(depsCmsIcc);
181 void CGUIDialogCMSSettings::OnSettingChanged(const std::shared_ptr<const CSetting>& setting)
183 if (setting == NULL)
184 return;
186 CGUIDialogSettingsManualBase::OnSettingChanged(setting);
188 const std::string &settingId = setting->GetId();
189 if (settingId == SETTING_VIDEO_CMSENABLE)
190 CServiceBroker::GetSettingsComponent()->GetSettings()->SetBool(SETTING_VIDEO_CMSENABLE, (std::static_pointer_cast<const CSettingBool>(setting)->GetValue()));
191 else if (settingId == SETTING_VIDEO_CMSMODE)
192 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSMODE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
193 else if (settingId == SETTING_VIDEO_CMS3DLUT)
194 CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(SETTING_VIDEO_CMS3DLUT, std::static_pointer_cast<const CSettingString>(setting)->GetValue());
195 else if (settingId == SETTING_VIDEO_CMSWHITEPOINT)
196 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSWHITEPOINT, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
197 else if (settingId == SETTING_VIDEO_CMSPRIMARIES)
198 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSPRIMARIES, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
199 else if (settingId == SETTING_VIDEO_CMSGAMMAMODE)
200 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMAMODE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
201 else if (settingId == SETTING_VIDEO_CMSGAMMA)
202 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMA, static_cast<float>(std::static_pointer_cast<const CSettingNumber>(setting)->GetValue())*100);
203 else if (settingId == SETTING_VIDEO_CMSLUTSIZE)
204 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSLUTSIZE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
207 bool CGUIDialogCMSSettings::OnBack(int actionID)
209 Save();
210 return CGUIDialogSettingsBase::OnBack(actionID);
213 bool CGUIDialogCMSSettings::Save()
215 CLog::Log(LOGINFO, "CGUIDialogCMSSettings: Save() called");
216 CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
218 return true;
221 void CGUIDialogCMSSettings::Cms3dLutsFiller(const SettingConstPtr& setting,
222 std::vector<StringSettingOption>& list,
223 std::string& current,
224 void* data)
226 // get 3dLut directory from settings
227 CFileItemList items;
229 // list .3dlut files
230 std::string current3dlut = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(SETTING_VIDEO_CMS3DLUT);
231 if (!current3dlut.empty())
232 current3dlut = URIUtils::GetDirectory(current3dlut);
233 XFILE::CDirectory::GetDirectory(current3dlut, items, ".3dlut", XFILE::DIR_FLAG_DEFAULTS);
235 for (int i = 0; i < items.Size(); i++)
237 list.emplace_back(items[i]->GetLabel(), items[i]->GetPath());