diff options
Diffstat (limited to '')
-rw-r--r-- | xbmc/ContextMenuItem.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/xbmc/ContextMenuItem.cpp b/xbmc/ContextMenuItem.cpp new file mode 100644 index 0000000..9191cb1 --- /dev/null +++ b/xbmc/ContextMenuItem.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2015-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 "ContextMenuItem.h" + +#include "FileItem.h" +#include "GUIInfoManager.h" +#include "addons/AddonManager.h" +#include "addons/IAddon.h" +#include "guilib/GUIComponent.h" +#include "guilib/LocalizeStrings.h" +#ifdef HAS_PYTHON +#include "interfaces/generic/ScriptInvocationManager.h" +#include "interfaces/python/ContextItemAddonInvoker.h" +#include "interfaces/python/XBPython.h" +#endif +#include "ServiceBroker.h" +#include "utils/StringUtils.h" + +std::string CStaticContextMenuAction::GetLabel(const CFileItem& item) const +{ + return g_localizeStrings.Get(m_label); +} + +bool CContextMenuItem::IsVisible(const CFileItem& item) const +{ + if (!m_infoBoolRegistered) + { + m_infoBool = CServiceBroker::GetGUI()->GetInfoManager().Register(m_visibilityCondition, 0); + m_infoBoolRegistered = true; + } + return IsGroup() || (m_infoBool && m_infoBool->Get(INFO::DEFAULT_CONTEXT, &item)); +} + +bool CContextMenuItem::IsParentOf(const CContextMenuItem& other) const +{ + return !m_groupId.empty() && (m_groupId == other.m_parent); +} + +bool CContextMenuItem::IsGroup() const +{ + return !m_groupId.empty(); +} + +bool CContextMenuItem::Execute(const std::shared_ptr<CFileItem>& item) const +{ + if (!item || m_library.empty() || IsGroup()) + return false; + + ADDON::AddonPtr addon; + if (!CServiceBroker::GetAddonMgr().GetAddon(m_addonId, addon, ADDON::OnlyEnabled::CHOICE_YES)) + return false; + + bool reuseLanguageInvoker = false; + if (addon->ExtraInfo().find("reuselanguageinvoker") != addon->ExtraInfo().end()) + reuseLanguageInvoker = addon->ExtraInfo().at("reuselanguageinvoker") == "true"; + +#ifdef HAS_PYTHON + LanguageInvokerPtr invoker(new CContextItemAddonInvoker(&CServiceBroker::GetXBPython(), item)); + return (CScriptInvocationManager::GetInstance().ExecuteAsync(m_library, invoker, addon, m_args, reuseLanguageInvoker) != -1); +#else + return false; +#endif +} + +bool CContextMenuItem::operator==(const CContextMenuItem& other) const +{ + if (IsGroup() && other.IsGroup()) + return (m_groupId == other.m_groupId && m_parent == other.m_parent); + + return (IsGroup() == other.IsGroup()) + && (m_parent == other.m_parent) + && (m_library == other.m_library) + && (m_addonId == other.m_addonId) + && (m_args == other.m_args); +} + +std::string CContextMenuItem::ToString() const +{ + if (IsGroup()) + return StringUtils::Format("CContextMenuItem[group, id={}, parent={}, addon={}]", m_groupId, + m_parent, m_addonId); + else + return StringUtils::Format("CContextMenuItem[item, parent={}, library={}, addon={}]", m_parent, + m_library, m_addonId); +} + +CContextMenuItem CContextMenuItem::CreateGroup(const std::string& label, const std::string& parent, + const std::string& groupId, const std::string& addonId) +{ + CContextMenuItem menuItem; + menuItem.m_label = label; + menuItem.m_parent = parent; + menuItem.m_groupId = groupId; + menuItem.m_addonId = addonId; + return menuItem; +} + +CContextMenuItem CContextMenuItem::CreateItem(const std::string& label, const std::string& parent, + const std::string& library, const std::string& condition, const std::string& addonId, const std::vector<std::string>& args) +{ + CContextMenuItem menuItem; + menuItem.m_label = label; + menuItem.m_parent = parent; + menuItem.m_library = library; + menuItem.m_visibilityCondition = condition; + menuItem.m_addonId = addonId; + menuItem.m_args = args; + return menuItem; +} |