diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp')
-rw-r--r-- | xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp new file mode 100644 index 0000000..73816df --- /dev/null +++ b/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "GUIDialogPeripheralSettings.h" + +#include "FileItem.h" +#include "ServiceBroker.h" +#include "addons/Skin.h" +#include "dialogs/GUIDialogYesNo.h" +#include "games/controllers/Controller.h" +#include "games/controllers/ControllerManager.h" +#include "guilib/GUIMessage.h" +#include "peripherals/Peripherals.h" +#include "settings/SettingAddon.h" +#include "settings/lib/Setting.h" +#include "settings/lib/SettingSection.h" +#include "utils/Variant.h" +#include "utils/log.h" + +#include <string_view> +#include <utility> + +using namespace KODI; +using namespace PERIPHERALS; + +// Settings for peripherals +constexpr std::string_view SETTING_APPEARANCE = "appearance"; + +CGUIDialogPeripheralSettings::CGUIDialogPeripheralSettings() + : CGUIDialogSettingsManualBase(WINDOW_DIALOG_PERIPHERAL_SETTINGS, "DialogSettings.xml"), + m_item(NULL) +{ +} + +CGUIDialogPeripheralSettings::~CGUIDialogPeripheralSettings() +{ + if (m_item != NULL) + delete m_item; + + m_settingsMap.clear(); +} + +bool CGUIDialogPeripheralSettings::OnMessage(CGUIMessage& message) +{ + if (message.GetMessage() == GUI_MSG_CLICKED && + message.GetSenderId() == CONTROL_SETTINGS_CUSTOM_BUTTON) + { + OnResetSettings(); + return true; + } + + return CGUIDialogSettingsManualBase::OnMessage(message); +} + +void CGUIDialogPeripheralSettings::RegisterPeripheralManager(CPeripherals& manager) +{ + m_manager = &manager; +} + +void CGUIDialogPeripheralSettings::UnregisterPeripheralManager() +{ + m_manager = nullptr; +} + +void CGUIDialogPeripheralSettings::SetFileItem(const CFileItem* item) +{ + if (item == NULL) + return; + + if (m_item != NULL) + delete m_item; + + m_item = new CFileItem(*item); +} + +void CGUIDialogPeripheralSettings::OnSettingChanged(const std::shared_ptr<const CSetting>& setting) +{ + if (setting == NULL) + return; + + CGUIDialogSettingsManualBase::OnSettingChanged(setting); + + const std::string& settingId = setting->GetId(); + + // we need to copy the new value of the setting from the copy to the + // original setting + std::map<std::string, std::shared_ptr<CSetting>>::iterator itSetting = + m_settingsMap.find(settingId); + if (itSetting == m_settingsMap.end()) + return; + + itSetting->second->FromString(setting->ToString()); + + // Get peripheral associated with this setting + PeripheralPtr peripheral; + if (m_item != nullptr) + peripheral = CServiceBroker::GetPeripherals().GetByPath(m_item->GetPath()); + + if (!peripheral) + return; + + if (settingId == SETTING_APPEARANCE) + { + // Get the controller profile of the new appearance + GAME::ControllerPtr controller; + + if (setting->GetType() == SettingType::String) + { + std::shared_ptr<const CSettingString> settingString = + std::static_pointer_cast<const CSettingString>(setting); + const std::string& addonId = settingString->GetValue(); + + if (m_manager != nullptr) + controller = m_manager->GetControllerProfiles().GetController(addonId); + } + + if (controller) + peripheral->SetControllerProfile(controller); + } +} + +bool CGUIDialogPeripheralSettings::Save() +{ + if (m_item == NULL || m_initialising) + return true; + + PeripheralPtr peripheral = CServiceBroker::GetPeripherals().GetByPath(m_item->GetPath()); + if (!peripheral) + return true; + + peripheral->PersistSettings(); + + return true; +} + +void CGUIDialogPeripheralSettings::OnResetSettings() +{ + if (m_item == NULL) + return; + + PeripheralPtr peripheral = CServiceBroker::GetPeripherals().GetByPath(m_item->GetPath()); + if (!peripheral) + return; + + if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{10041}, CVariant{10042})) + return; + + // reset the settings in the peripheral + peripheral->ResetDefaultSettings(); + + // re-create all settings and their controls + SetupView(); +} + +void CGUIDialogPeripheralSettings::SetupView() +{ + CGUIDialogSettingsManualBase::SetupView(); + + SetHeading(m_item->GetLabel()); + SET_CONTROL_LABEL(CONTROL_SETTINGS_OKAY_BUTTON, 186); + SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON, 222); + SET_CONTROL_LABEL(CONTROL_SETTINGS_CUSTOM_BUTTON, 409); +} + +void CGUIDialogPeripheralSettings::InitializeSettings() +{ + if (m_item == NULL) + { + m_initialising = false; + return; + } + + m_initialising = true; + bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml"); + + PeripheralPtr peripheral = CServiceBroker::GetPeripherals().GetByPath(m_item->GetPath()); + if (!peripheral) + { + CLog::Log(LOGDEBUG, "{} - no peripheral", __FUNCTION__); + m_initialising = false; + return; + } + + m_settingsMap.clear(); + CGUIDialogSettingsManualBase::InitializeSettings(); + + const std::shared_ptr<CSettingCategory> category = AddCategory("peripheralsettings", -1); + if (category == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); + return; + } + + const std::shared_ptr<CSettingGroup> group = AddGroup(category); + if (group == NULL) + { + CLog::Log(LOGERROR, "CGUIDialogPeripheralSettings: unable to setup settings"); + return; + } + + std::vector<SettingPtr> settings = peripheral->GetSettings(); + for (auto& setting : settings) + { + if (setting == NULL) + continue; + + if (!setting->IsVisible()) + { + CLog::Log(LOGDEBUG, "{} - invisible", __FUNCTION__); + continue; + } + + // we need to create a copy of the setting because the CSetting instances + // are destroyed when leaving the dialog + SettingPtr settingCopy; + switch (setting->GetType()) + { + case SettingType::Boolean: + { + std::shared_ptr<CSettingBool> settingBool = std::make_shared<CSettingBool>( + setting->GetId(), *std::static_pointer_cast<CSettingBool>(setting)); + settingBool->SetControl(GetCheckmarkControl()); + + settingCopy = std::static_pointer_cast<CSetting>(settingBool); + break; + } + + case SettingType::Integer: + { + std::shared_ptr<CSettingInt> settingInt = std::make_shared<CSettingInt>( + setting->GetId(), *std::static_pointer_cast<CSettingInt>(setting)); + if (settingInt->GetTranslatableOptions().empty()) + settingInt->SetControl(GetSliderControl("integer", false, -1, usePopup, -1, "{:d}")); + else + settingInt->SetControl(GetSpinnerControl("string")); + + settingCopy = std::static_pointer_cast<CSetting>(settingInt); + break; + } + + case SettingType::Number: + { + std::shared_ptr<CSettingNumber> settingNumber = std::make_shared<CSettingNumber>( + setting->GetId(), *std::static_pointer_cast<CSettingNumber>(setting)); + settingNumber->SetControl(GetSliderControl("number", false, -1, usePopup, -1, "{:2.2f}")); + + settingCopy = std::static_pointer_cast<CSetting>(settingNumber); + break; + } + + case SettingType::String: + { + if (auto settingAsAddon = std::dynamic_pointer_cast<const CSettingAddon>(setting)) + { + std::shared_ptr<CSettingAddon> settingAddon = + std::make_shared<CSettingAddon>(setting->GetId(), *settingAsAddon); + + // Control properties + const std::string format = "addon"; + const bool delayed = false; + const int heading = -1; + const bool hideValue = false; + const bool showInstalledAddons = true; + const bool showInstallableAddons = true; + const bool showMoreAddons = false; + + settingAddon->SetControl(GetButtonControl(format, delayed, heading, hideValue, + showInstalledAddons, showInstallableAddons, + showMoreAddons)); + + GAME::ControllerPtr controller = peripheral->ControllerProfile(); + if (controller) + settingAddon->SetValue(controller->ID()); + + settingCopy = std::static_pointer_cast<CSetting>(settingAddon); + } + else + { + std::shared_ptr<CSettingString> settingString = std::make_shared<CSettingString>( + setting->GetId(), *std::static_pointer_cast<CSettingString>(setting)); + settingString->SetControl(GetEditControl("string")); + + settingCopy = std::static_pointer_cast<CSetting>(settingString); + } + break; + } + + default: + //! @todo add more types if needed + CLog::Log(LOGDEBUG, "{} - unknown type", __FUNCTION__); + break; + } + + if (settingCopy != NULL && settingCopy->GetControl() != NULL) + { + settingCopy->SetLevel(SettingLevel::Basic); + group->AddSetting(settingCopy); + m_settingsMap.insert(std::make_pair(setting->GetId(), setting)); + } + } + + m_initialising = false; +} |