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.
9 #include "GUIDialogPVRItemsViewBase.h"
11 #include "ContextMenuManager.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"
24 #define CONTROL_LIST 11
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
);
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());
70 case ACTION_CONTEXT_MENU
:
71 case ACTION_MOUSE_RIGHT_CLICK
:
72 return ContextMenu(m_viewControl
.GetSelectedItem());
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())
94 const std::shared_ptr
<CFileItem
> item
= m_vecItems
->Get(itemIdx
);
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())
110 const CFileItemPtr item
= m_vecItems
->Get(itemIdx
);
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
));
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
));
133 int idx
= CGUIDialogContextMenu::Show(buttons
);
134 if (idx
< 0 || idx
>= static_cast<int>(buttons
.size()))
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
);
151 void CGUIDialogPVRItemsViewBase::Clear()
153 m_viewControl
.Clear();