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.
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"
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
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...
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));
86 if (!m_returningFromSkinLoad
)
87 CGUIDialogSettingsManagerBase::OnMessage(message
);
91 case GUI_MSG_LOAD_SKIN
:
94 m_returningFromSkinLoad
= true;
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);
111 case GUI_MSG_PLAYBACK_STARTED
:
112 case GUI_MSG_PLAYBACK_ENDED
:
113 case GUI_MSG_PLAYBACK_STOPPED
:
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))
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);
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
)
170 return CGUIDialogSettingsManagerBase::OnAction(action
);
173 bool CGUIWindowSettingsCategory::OnBack(int actionID
)
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
);
201 bool CGUIWindowSettingsCategory::Save()
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);
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
);
232 SET_CONTROL_FOCUS(control
->GetID(), 0);
235 "CGUIWindowSettingsCategory: failed to get control for setting '{}'.",
243 "CGUIWindowSettingsCategory: failed to set focus. unknown category/setting id '{}'.",