[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / settings / windows / GUIWindowSettingsCategory.cpp
blob9e3168ba617d0424ccff5a9269b0f1a0c048d780
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 "GUIWindowSettingsCategory.h"
11 #include "GUIPassword.h"
12 #include "GUIUserMessages.h"
13 #include "ServiceBroker.h"
14 #include "input/actions/Action.h"
15 #include "input/actions/ActionIDs.h"
16 #include "settings/DisplaySettings.h"
17 #include "settings/Settings.h"
18 #include "settings/SettingsComponent.h"
19 #include "settings/lib/SettingSection.h"
20 #include "settings/windows/GUIControlSettings.h"
21 #include "utils/log.h"
22 #include "view/ViewStateSettings.h"
24 #include <string>
26 #define SETTINGS_SYSTEM WINDOW_SETTINGS_SYSTEM - WINDOW_SETTINGS_START
27 #define SETTINGS_SERVICE WINDOW_SETTINGS_SERVICE - WINDOW_SETTINGS_START
28 #define SETTINGS_PVR WINDOW_SETTINGS_MYPVR - WINDOW_SETTINGS_START
29 #define SETTINGS_PLAYER WINDOW_SETTINGS_PLAYER - WINDOW_SETTINGS_START
30 #define SETTINGS_MEDIA WINDOW_SETTINGS_MEDIA - WINDOW_SETTINGS_START
31 #define SETTINGS_INTERFACE WINDOW_SETTINGS_INTERFACE - WINDOW_SETTINGS_START
32 #define SETTINGS_GAMES WINDOW_SETTINGS_MYGAMES - WINDOW_SETTINGS_START
34 #define CONTROL_BTN_LEVELS 20
36 typedef struct {
37 int id;
38 std::string name;
39 } SettingGroup;
41 static const SettingGroup s_settingGroupMap[] = { { SETTINGS_SYSTEM, "system" },
42 { SETTINGS_SERVICE, "services" },
43 { SETTINGS_PVR, "pvr" },
44 { SETTINGS_PLAYER, "player" },
45 { SETTINGS_MEDIA, "media" },
46 { SETTINGS_INTERFACE, "interface" },
47 { SETTINGS_GAMES, "games" } };
49 #define SettingGroupSize sizeof(s_settingGroupMap) / sizeof(SettingGroup)
51 CGUIWindowSettingsCategory::CGUIWindowSettingsCategory()
52 : CGUIDialogSettingsManagerBase(WINDOW_SETTINGS_SYSTEM, "SettingsCategory.xml"),
53 m_settings(CServiceBroker::GetSettingsComponent()->GetSettings())
55 // set the correct ID range...
56 m_idRange.clear();
57 m_idRange.push_back(WINDOW_SETTINGS_SYSTEM);
58 m_idRange.push_back(WINDOW_SETTINGS_SERVICE);
59 m_idRange.push_back(WINDOW_SETTINGS_MYPVR);
60 m_idRange.push_back(WINDOW_SETTINGS_PLAYER);
61 m_idRange.push_back(WINDOW_SETTINGS_MEDIA);
62 m_idRange.push_back(WINDOW_SETTINGS_INTERFACE);
63 m_idRange.push_back(WINDOW_SETTINGS_MYGAMES);
66 CGUIWindowSettingsCategory::~CGUIWindowSettingsCategory() = default;
68 bool CGUIWindowSettingsCategory::OnMessage(CGUIMessage &message)
70 switch (message.GetMessage())
72 case GUI_MSG_WINDOW_INIT:
74 m_iSection = message.GetParam2() - CGUIDialogSettingsManagerBase::GetID();
75 CGUIDialogSettingsManagerBase::OnMessage(message);
76 m_returningFromSkinLoad = false;
78 if (!message.GetStringParam(0).empty())
79 FocusElement(message.GetStringParam(0));
81 return true;
84 case GUI_MSG_FOCUSED:
86 if (!m_returningFromSkinLoad)
87 CGUIDialogSettingsManagerBase::OnMessage(message);
88 return true;
91 case GUI_MSG_LOAD_SKIN:
93 if (IsActive())
94 m_returningFromSkinLoad = true;
95 break;
98 case GUI_MSG_NOTIFY_ALL:
100 if (message.GetParam1() == GUI_MSG_WINDOW_RESIZE)
102 if (IsActive() && CDisplaySettings::GetInstance().GetCurrentResolution() != CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution())
104 CDisplaySettings::GetInstance().SetCurrentResolution(CServiceBroker::GetWinSystem()->GetGfxContext().GetVideoResolution(), true);
105 CreateSettings();
108 break;
111 case GUI_MSG_PLAYBACK_STARTED:
112 case GUI_MSG_PLAYBACK_ENDED:
113 case GUI_MSG_PLAYBACK_STOPPED:
115 if (IsActive())
117 UpdateSettings();
119 break;
123 return CGUIDialogSettingsManagerBase::OnMessage(message);
126 bool CGUIWindowSettingsCategory::OnAction(const CAction &action)
128 switch (action.GetID())
130 case ACTION_SETTINGS_LEVEL_CHANGE:
132 //Test if we can access the new level
133 if (!g_passwordManager.CheckSettingLevelLock(CViewStateSettings::GetInstance().GetNextSettingLevel(), true))
134 return false;
136 CViewStateSettings::GetInstance().CycleSettingLevel();
137 CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
139 // try to keep the current position
140 std::string oldCategory;
141 if (m_iCategory >= 0 && m_iCategory < (int)m_categories.size())
142 oldCategory = m_categories[m_iCategory]->GetId();
144 SET_CONTROL_LABEL(CONTROL_BTN_LEVELS, 10036 + (int)CViewStateSettings::GetInstance().GetSettingLevel());
145 // only re-create the categories, the settings will be created later
146 SetupControls(false);
148 m_iCategory = 0;
149 // try to find the category that was previously selected
150 if (!oldCategory.empty())
152 for (int i = 0; i < (int)m_categories.size(); i++)
154 if (m_categories[i]->GetId() == oldCategory)
156 m_iCategory = i;
157 break;
162 CreateSettings();
163 return true;
166 default:
167 break;
170 return CGUIDialogSettingsManagerBase::OnAction(action);
173 bool CGUIWindowSettingsCategory::OnBack(int actionID)
175 Save();
176 return CGUIDialogSettingsManagerBase::OnBack(actionID);
179 void CGUIWindowSettingsCategory::OnWindowLoaded()
181 SET_CONTROL_LABEL(CONTROL_BTN_LEVELS, 10036 + (int)CViewStateSettings::GetInstance().GetSettingLevel());
182 CGUIDialogSettingsManagerBase::OnWindowLoaded();
185 int CGUIWindowSettingsCategory::GetSettingLevel() const
187 return (int)CViewStateSettings::GetInstance().GetSettingLevel();
190 SettingSectionPtr CGUIWindowSettingsCategory::GetSection()
192 for (const SettingGroup& settingGroup : s_settingGroupMap)
194 if (settingGroup.id == m_iSection)
195 return m_settings->GetSection(settingGroup.name);
198 return NULL;
201 bool CGUIWindowSettingsCategory::Save()
203 m_settings->Save();
205 return true;
208 CSettingsManager* CGUIWindowSettingsCategory::GetSettingsManager() const
210 return m_settings->GetSettingsManager();
213 void CGUIWindowSettingsCategory::FocusElement(const std::string& elementId)
215 for (size_t i = 0; i < m_categories.size(); ++i)
217 if (m_categories[i]->GetId() == elementId)
219 SET_CONTROL_FOCUS(CONTROL_SETTINGS_START_BUTTONS + i, 0);
220 return;
222 for (const auto& group: m_categories[i]->GetGroups())
224 for (const auto& setting : group->GetSettings())
226 if (setting->GetId() == elementId)
228 SET_CONTROL_FOCUS(CONTROL_SETTINGS_START_BUTTONS + i, 0);
230 auto control = GetSettingControl(elementId);
231 if (control)
232 SET_CONTROL_FOCUS(control->GetID(), 0);
233 else
234 CLog::Log(LOGERROR,
235 "CGUIWindowSettingsCategory: failed to get control for setting '{}'.",
236 elementId);
237 return;
242 CLog::Log(LOGERROR,
243 "CGUIWindowSettingsCategory: failed to set focus. unknown category/setting id '{}'.",
244 elementId);