1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/*
* Copyright (C) 2012-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 "GUIDialogPVRItemsViewBase.h"
#include "ContextMenuManager.h"
#include "FileItem.h"
#include "ServiceBroker.h"
#include "dialogs/GUIDialogContextMenu.h"
#include "input/actions/Action.h"
#include "input/actions/ActionIDs.h"
#include "pvr/PVRManager.h"
#include "pvr/guilib/PVRGUIActionsEPG.h"
#include "view/ViewState.h"
#include <utility>
#define CONTROL_LIST 11
using namespace PVR;
CGUIDialogPVRItemsViewBase::CGUIDialogPVRItemsViewBase(int id, const std::string& xmlFile)
: CGUIDialog(id, xmlFile), m_vecItems(new CFileItemList)
{
}
void CGUIDialogPVRItemsViewBase::OnWindowLoaded()
{
CGUIDialog::OnWindowLoaded();
m_viewControl.Reset();
m_viewControl.SetParentWindow(GetID());
m_viewControl.AddView(GetControl(CONTROL_LIST));
}
void CGUIDialogPVRItemsViewBase::OnWindowUnload()
{
CGUIDialog::OnWindowUnload();
m_viewControl.Reset();
}
void CGUIDialogPVRItemsViewBase::OnInitWindow()
{
CGUIDialog::OnInitWindow();
}
void CGUIDialogPVRItemsViewBase::OnDeinitWindow(int nextWindowID)
{
CGUIDialog::OnDeinitWindow(nextWindowID);
Clear();
}
bool CGUIDialogPVRItemsViewBase::OnAction(const CAction& action)
{
if (m_viewControl.HasControl(GetFocusedControlID()))
{
switch (action.GetID())
{
case ACTION_SHOW_INFO:
case ACTION_SELECT_ITEM:
case ACTION_MOUSE_LEFT_CLICK:
ShowInfo(m_viewControl.GetSelectedItem());
return true;
case ACTION_CONTEXT_MENU:
case ACTION_MOUSE_RIGHT_CLICK:
return ContextMenu(m_viewControl.GetSelectedItem());
default:
break;
}
}
return CGUIDialog::OnAction(action);
}
CGUIControl* CGUIDialogPVRItemsViewBase::GetFirstFocusableControl(int id)
{
if (m_viewControl.HasControl(id))
id = m_viewControl.GetCurrentControl();
return CGUIDialog::GetFirstFocusableControl(id);
}
void CGUIDialogPVRItemsViewBase::ShowInfo(int itemIdx)
{
if (itemIdx < 0 || itemIdx >= m_vecItems->Size())
return;
const std::shared_ptr<CFileItem> item = m_vecItems->Get(itemIdx);
if (!item)
return;
CServiceBroker::GetPVRManager().Get<PVR::GUI::EPG>().ShowEPGInfo(*item);
}
bool CGUIDialogPVRItemsViewBase::ContextMenu(int itemIdx)
{
auto InRange = [](size_t i, std::pair<size_t, size_t> range) {
return i >= range.first && i < range.second;
};
if (itemIdx < 0 || itemIdx >= m_vecItems->Size())
return false;
const CFileItemPtr item = m_vecItems->Get(itemIdx);
if (!item)
return false;
CContextButtons buttons;
// Add the global menu
const ContextMenuView globalMenu =
CServiceBroker::GetContextMenuManager().GetItems(*item, CContextMenuManager::MAIN);
auto globalMenuRange = std::make_pair(buttons.size(), buttons.size() + globalMenu.size());
for (const auto& menu : globalMenu)
buttons.emplace_back(~buttons.size(), menu->GetLabel(*item));
// Add addon menus
const ContextMenuView addonMenu =
CServiceBroker::GetContextMenuManager().GetAddonItems(*item, CContextMenuManager::MAIN);
auto addonMenuRange = std::make_pair(buttons.size(), buttons.size() + addonMenu.size());
for (const auto& menu : addonMenu)
buttons.emplace_back(~buttons.size(), menu->GetLabel(*item));
if (buttons.empty())
return true;
int idx = CGUIDialogContextMenu::Show(buttons);
if (idx < 0 || idx >= static_cast<int>(buttons.size()))
return false;
Close();
if (InRange(idx, globalMenuRange))
return CONTEXTMENU::LoopFrom(*globalMenu[idx - globalMenuRange.first], item);
return CONTEXTMENU::LoopFrom(*addonMenu[idx - addonMenuRange.first], item);
}
void CGUIDialogPVRItemsViewBase::Init()
{
m_viewControl.SetCurrentView(DEFAULT_VIEW_LIST);
Clear();
}
void CGUIDialogPVRItemsViewBase::Clear()
{
m_viewControl.Clear();
m_vecItems->Clear();
}
|