diff options
Diffstat (limited to 'xbmc/guilib/GUIAction.cpp')
-rw-r--r-- | xbmc/guilib/GUIAction.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIAction.cpp b/xbmc/guilib/GUIAction.cpp new file mode 100644 index 0000000..030fdc3 --- /dev/null +++ b/xbmc/guilib/GUIAction.cpp @@ -0,0 +1,153 @@ +/* + * 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 "GUIAction.h" + +#include "GUIComponent.h" +#include "GUIInfoManager.h" +#include "GUIWindowManager.h" +#include "ServiceBroker.h" +#include "utils/StringUtils.h" + +namespace +{ +constexpr int DEFAULT_CONTROL_ID = 0; +} + +CGUIAction::CExecutableAction::CExecutableAction(const std::string& action) : m_action{action} +{ +} + +CGUIAction::CExecutableAction::CExecutableAction(const std::string& condition, + const std::string& action) + : m_condition{condition}, m_action{action} +{ +} + +std::string CGUIAction::CExecutableAction::GetCondition() const +{ + return m_condition; +} + +std::string CGUIAction::CExecutableAction::GetAction() const +{ + return m_action; +} + +bool CGUIAction::CExecutableAction::HasCondition() const +{ + return !m_condition.empty(); +} + +void CGUIAction::CExecutableAction::SetAction(const std::string& action) +{ + m_action = action; +} + +CGUIAction::CGUIAction(int controlID) +{ + SetNavigation(controlID); +} + +bool CGUIAction::ExecuteActions() const +{ + return ExecuteActions(DEFAULT_CONTROL_ID, DEFAULT_CONTROL_ID); +} + +bool CGUIAction::ExecuteActions(int controlID, int parentID, const CGUIListItemPtr &item /* = NULL */) const +{ + if (m_actions.empty()) + return false; + + CGUIInfoManager& infoMgr = CServiceBroker::GetGUI()->GetInfoManager(); + // take a copy of actions that satisfy our conditions + std::vector<std::string> actions; + for (const auto &i : m_actions) + { + if (!i.HasCondition() || infoMgr.EvaluateBool(i.GetCondition(), 0, item)) + { + if (!StringUtils::IsInteger(i.GetAction())) + actions.emplace_back(i.GetAction()); + } + } + // execute them + bool retval = false; + for (const auto &i : actions) + { + CGUIMessage msg(GUI_MSG_EXECUTE, controlID, parentID, 0, 0, item); + msg.SetStringParam(i); + if (m_sendThreadMessages) + CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); + else + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + retval = true; + } + return retval; +} + +int CGUIAction::GetNavigation() const +{ + CGUIInfoManager& infoMgr = CServiceBroker::GetGUI()->GetInfoManager(); + for (const auto &i : m_actions) + { + if (StringUtils::IsInteger(i.GetAction())) + { + if (!i.HasCondition() || infoMgr.EvaluateBool(i.GetCondition(), INFO::DEFAULT_CONTEXT)) + return std::stoi(i.GetAction()); + } + } + return 0; +} + +void CGUIAction::SetNavigation(int id) +{ + if (id == 0) + return; + + std::string strId = std::to_string(id); + for (auto &i : m_actions) + { + if (StringUtils::IsInteger(i.GetAction()) && !i.HasCondition()) + { + i.SetAction(strId); + return; + } + } + m_actions.emplace_back(std::move(strId)); +} + +bool CGUIAction::HasActionsMeetingCondition() const +{ + CGUIInfoManager& infoMgr = CServiceBroker::GetGUI()->GetInfoManager(); + for (const auto &i : m_actions) + { + if (!i.HasCondition() || infoMgr.EvaluateBool(i.GetCondition(), INFO::DEFAULT_CONTEXT)) + return true; + } + return false; +} + +bool CGUIAction::HasAnyActions() const +{ + return m_actions.size() > 0; +} + +void CGUIAction::Append(const CExecutableAction& action) +{ + m_actions.emplace_back(action); +} + +void CGUIAction::EnableSendThreadMessageMode() +{ + m_sendThreadMessages = true; +} + +void CGUIAction::Reset() +{ + m_actions.clear(); +} |