[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / pvr / dialogs / GUIDialogPVRItemsViewBase.cpp
blob72b469452852db5e629128ce39205aa1b8277b2b
1 /*
2 * Copyright (C) 2012-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.
7 */
9 #include "GUIDialogPVRItemsViewBase.h"
11 #include "ContextMenuManager.h"
12 #include "FileItem.h"
13 #include "FileItemList.h"
14 #include "ServiceBroker.h"
15 #include "dialogs/GUIDialogContextMenu.h"
16 #include "input/actions/Action.h"
17 #include "input/actions/ActionIDs.h"
18 #include "pvr/PVRManager.h"
19 #include "pvr/guilib/PVRGUIActionsEPG.h"
20 #include "view/ViewState.h"
22 #include <utility>
24 #define CONTROL_LIST 11
26 using namespace PVR;
28 CGUIDialogPVRItemsViewBase::CGUIDialogPVRItemsViewBase(int id, const std::string& xmlFile)
29 : CGUIDialog(id, xmlFile), m_vecItems(new CFileItemList)
33 void CGUIDialogPVRItemsViewBase::OnWindowLoaded()
35 CGUIDialog::OnWindowLoaded();
36 m_viewControl.Reset();
37 m_viewControl.SetParentWindow(GetID());
38 m_viewControl.AddView(GetControl(CONTROL_LIST));
41 void CGUIDialogPVRItemsViewBase::OnWindowUnload()
43 CGUIDialog::OnWindowUnload();
44 m_viewControl.Reset();
47 void CGUIDialogPVRItemsViewBase::OnInitWindow()
49 CGUIDialog::OnInitWindow();
52 void CGUIDialogPVRItemsViewBase::OnDeinitWindow(int nextWindowID)
54 CGUIDialog::OnDeinitWindow(nextWindowID);
55 Clear();
58 bool CGUIDialogPVRItemsViewBase::OnAction(const CAction& action)
60 if (m_viewControl.HasControl(GetFocusedControlID()))
62 switch (action.GetID())
64 case ACTION_SHOW_INFO:
65 case ACTION_SELECT_ITEM:
66 case ACTION_MOUSE_LEFT_CLICK:
67 ShowInfo(m_viewControl.GetSelectedItem());
68 return true;
70 case ACTION_CONTEXT_MENU:
71 case ACTION_MOUSE_RIGHT_CLICK:
72 return ContextMenu(m_viewControl.GetSelectedItem());
74 default:
75 break;
78 return CGUIDialog::OnAction(action);
81 CGUIControl* CGUIDialogPVRItemsViewBase::GetFirstFocusableControl(int id)
83 if (m_viewControl.HasControl(id))
84 id = m_viewControl.GetCurrentControl();
86 return CGUIDialog::GetFirstFocusableControl(id);
89 void CGUIDialogPVRItemsViewBase::ShowInfo(int itemIdx)
91 if (itemIdx < 0 || itemIdx >= m_vecItems->Size())
92 return;
94 const std::shared_ptr<CFileItem> item = m_vecItems->Get(itemIdx);
95 if (!item)
96 return;
98 CServiceBroker::GetPVRManager().Get<PVR::GUI::EPG>().ShowEPGInfo(*item);
101 bool CGUIDialogPVRItemsViewBase::ContextMenu(int itemIdx)
103 auto InRange = [](size_t i, std::pair<size_t, size_t> range) {
104 return i >= range.first && i < range.second;
107 if (itemIdx < 0 || itemIdx >= m_vecItems->Size())
108 return false;
110 const CFileItemPtr item = m_vecItems->Get(itemIdx);
111 if (!item)
112 return false;
114 CContextButtons buttons;
116 // Add the global menu
117 const ContextMenuView globalMenu =
118 CServiceBroker::GetContextMenuManager().GetItems(*item, CContextMenuManager::MAIN);
119 auto globalMenuRange = std::make_pair(buttons.size(), buttons.size() + globalMenu.size());
120 for (const auto& menu : globalMenu)
121 buttons.emplace_back(~buttons.size(), menu->GetLabel(*item));
123 // Add addon menus
124 const ContextMenuView addonMenu =
125 CServiceBroker::GetContextMenuManager().GetAddonItems(*item, CContextMenuManager::MAIN);
126 auto addonMenuRange = std::make_pair(buttons.size(), buttons.size() + addonMenu.size());
127 for (const auto& menu : addonMenu)
128 buttons.emplace_back(~buttons.size(), menu->GetLabel(*item));
130 if (buttons.empty())
131 return true;
133 int idx = CGUIDialogContextMenu::Show(buttons);
134 if (idx < 0 || idx >= static_cast<int>(buttons.size()))
135 return false;
137 Close();
139 if (InRange(idx, globalMenuRange))
140 return CONTEXTMENU::LoopFrom(*globalMenu[idx - globalMenuRange.first], item);
142 return CONTEXTMENU::LoopFrom(*addonMenu[idx - addonMenuRange.first], item);
145 void CGUIDialogPVRItemsViewBase::Init()
147 m_viewControl.SetCurrentView(DEFAULT_VIEW_LIST);
148 Clear();
151 void CGUIDialogPVRItemsViewBase::Clear()
153 m_viewControl.Clear();
154 m_vecItems->Clear();