[videodb] remove unused seasons table from episode_view
[xbmc.git] / xbmc / favourites / GUIWindowFavourites.cpp
blobde3d25de371b1aaee1f6db453bff4f857bb7986c
1 /*
2 * Copyright (C) 2022 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 "GUIWindowFavourites.h"
11 #include "ContextMenuManager.h"
12 #include "FileItem.h"
13 #include "ServiceBroker.h"
14 #include "favourites/FavouritesURL.h"
15 #include "favourites/FavouritesUtils.h"
16 #include "guilib/GUIComponent.h"
17 #include "guilib/GUIMessage.h"
18 #include "guilib/GUIWindowManager.h"
19 #include "input/actions/Action.h"
20 #include "input/actions/ActionIDs.h"
21 #include "messaging/ApplicationMessenger.h"
22 #include "utils/PlayerUtils.h"
23 #include "utils/StringUtils.h"
24 #include "utils/guilib/GUIContentUtils.h"
25 #include "video/VideoUtils.h"
26 #include "video/guilib/VideoGUIUtils.h"
27 #include "video/guilib/VideoPlayActionProcessor.h"
28 #include "video/guilib/VideoSelectActionProcessor.h"
30 using namespace KODI;
32 CGUIWindowFavourites::CGUIWindowFavourites()
33 : CGUIMediaWindow(WINDOW_FAVOURITES, "MyFavourites.xml")
35 m_loadType = KEEP_IN_MEMORY;
36 CServiceBroker::GetFavouritesService().Events().Subscribe(
37 this, &CGUIWindowFavourites::OnFavouritesEvent);
40 CGUIWindowFavourites::~CGUIWindowFavourites()
42 CServiceBroker::GetFavouritesService().Events().Unsubscribe(this);
45 void CGUIWindowFavourites::OnFavouritesEvent(const CFavouritesService::FavouritesUpdated& event)
47 CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, 0);
48 CServiceBroker::GetAppMessenger()->SendGUIMessage(m);
51 namespace
53 class CVideoSelectActionProcessor : public VIDEO::GUILIB::CVideoSelectActionProcessorBase
55 public:
56 explicit CVideoSelectActionProcessor(const std::shared_ptr<CFileItem>& item)
57 : CVideoSelectActionProcessorBase(item)
61 protected:
62 bool OnPlayPartSelected(unsigned int part) override
64 // part numbers are 1-based
65 FAVOURITES_UTILS::ExecuteAction(
66 {"PlayMedia", *m_item, StringUtils::Format("playoffset={}", part - 1)});
67 return true;
70 bool OnResumeSelected() override
72 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item, "resume"});
73 return true;
76 bool OnPlaySelected() override
78 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item, "noresume"});
79 return true;
82 bool OnQueueSelected() override
84 FAVOURITES_UTILS::ExecuteAction({"QueueMedia", *m_item, ""});
85 return true;
88 bool OnInfoSelected() override
90 return UTILS::GUILIB::CGUIContentUtils::ShowInfoForItem(*m_item);
93 bool OnMoreSelected() override
95 CONTEXTMENU::ShowFor(m_item, CContextMenuManager::MAIN);
96 return true;
100 class CVideoPlayActionProcessor : public VIDEO::GUILIB::CVideoPlayActionProcessorBase
102 public:
103 explicit CVideoPlayActionProcessor(const ::std::shared_ptr<CFileItem>& item)
104 : CVideoPlayActionProcessorBase(item)
108 protected:
109 bool OnResumeSelected() override
111 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item, "resume"});
112 return true;
115 bool OnPlaySelected() override
117 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item, "noresume"});
118 return true;
121 } // namespace
123 bool CGUIWindowFavourites::OnSelect(int itemIdx)
125 if (itemIdx < 0 || itemIdx >= m_vecItems->Size())
126 return false;
128 const auto item{(*m_vecItems)[itemIdx]};
129 const CFavouritesURL favURL{*item, GetID()};
130 if (!favURL.IsValid())
131 return false;
133 const bool isPlayMedia{favURL.GetAction() == CFavouritesURL::Action::PLAY_MEDIA};
135 const auto target{CServiceBroker::GetFavouritesService().ResolveFavourite(*item)};
136 if (!target)
137 return false;
139 CFileItem targetItem{*target};
141 // video select action setting is for files only, except exec func is playmedia...
142 if (targetItem.HasVideoInfoTag() && (!targetItem.m_bIsFolder || isPlayMedia))
144 // play the given/default video version, even if multiple versions are available
145 targetItem.SetProperty("has_resolved_video_asset", true);
147 CVideoSelectActionProcessor proc{std::make_shared<CFileItem>(targetItem)};
148 if (proc.ProcessDefaultAction())
149 return true;
152 // exec the execute string for the original (!) item
153 return FAVOURITES_UTILS::ExecuteAction(favURL);
156 bool CGUIWindowFavourites::OnAction(const CAction& action)
158 const int selectedItem = m_viewControl.GetSelectedItem();
159 if (selectedItem < 0 || selectedItem >= m_vecItems->Size())
160 return false;
162 if (action.GetID() == ACTION_PLAYER_PLAY)
164 const auto target{
165 CServiceBroker::GetFavouritesService().ResolveFavourite(*(*m_vecItems)[selectedItem])};
166 if (!target)
167 return false;
169 const auto item{std::make_shared<CFileItem>(*target)};
171 // video play action setting is for files and folders...
172 if (item->HasVideoInfoTag() || (item->m_bIsFolder && VIDEO::UTILS::IsItemPlayable(*item)))
174 CVideoPlayActionProcessor proc{item};
175 if (proc.ProcessDefaultAction())
176 return true;
179 if (CPlayerUtils::IsItemPlayable(*item))
181 CFavouritesURL target{*item, {}};
182 if (target.GetAction() != CFavouritesURL::Action::PLAY_MEDIA)
184 // build a playmedia execute string for given target
185 target = CFavouritesURL{CFavouritesURL::Action::PLAY_MEDIA,
186 {StringUtils::Paramify(item->GetPath())}};
188 return FAVOURITES_UTILS::ExecuteAction(target);
190 return false;
192 else if (action.GetID() == ACTION_SHOW_INFO)
194 const auto targetItem{
195 CServiceBroker::GetFavouritesService().ResolveFavourite(*(*m_vecItems)[selectedItem])};
197 return UTILS::GUILIB::CGUIContentUtils::ShowInfoForItem(*targetItem);
199 else if (action.GetID() == ACTION_MOVE_ITEM_UP)
201 if (FAVOURITES_UTILS::ShouldEnableMoveItems())
202 return MoveItem(selectedItem, -1);
204 else if (action.GetID() == ACTION_MOVE_ITEM_DOWN)
206 if (FAVOURITES_UTILS::ShouldEnableMoveItems())
207 return MoveItem(selectedItem, +1);
209 else if (action.GetID() == ACTION_DELETE_ITEM)
211 return RemoveItem(selectedItem);
214 return CGUIMediaWindow::OnAction(action);
217 bool CGUIWindowFavourites::OnMessage(CGUIMessage& message)
219 bool ret = false;
221 switch (message.GetMessage())
223 case GUI_MSG_REFRESH_LIST:
225 const int size = m_vecItems->Size();
226 int selected = m_viewControl.GetSelectedItem();
227 if (m_vecItems->Size() > 0 && selected == size - 1)
228 --selected; // remove of last item, select the new last item after refresh
230 Refresh(true);
232 if (m_vecItems->Size() < size)
234 // item removed. select item after the removed item
235 m_viewControl.SetSelectedItem(selected);
238 ret = true;
239 break;
243 return ret || CGUIMediaWindow::OnMessage(message);
246 bool CGUIWindowFavourites::Update(const std::string& strDirectory,
247 bool updateFilterPath /* = true */)
249 std::string directory = strDirectory;
250 if (directory.empty())
251 directory = "favourites://";
253 return CGUIMediaWindow::Update(directory, updateFilterPath);
256 bool CGUIWindowFavourites::MoveItem(int item, int amount)
258 if (item < 0 || item >= m_vecItems->Size() || m_vecItems->Size() < 2 || amount == 0)
259 return false;
261 if (FAVOURITES_UTILS::MoveItem(*m_vecItems, (*m_vecItems)[item], amount) &&
262 CServiceBroker::GetFavouritesService().Save(*m_vecItems))
264 int selected = item + amount;
265 if (selected >= m_vecItems->Size())
266 selected = 0;
267 else if (selected < 0)
268 selected = m_vecItems->Size() - 1;
270 m_viewControl.SetSelectedItem(selected);
271 return true;
274 return false;
277 bool CGUIWindowFavourites::RemoveItem(int item)
279 if (item < 0 || item >= m_vecItems->Size())
280 return false;
282 if (FAVOURITES_UTILS::RemoveItem(*m_vecItems, (*m_vecItems)[item]) &&
283 CServiceBroker::GetFavouritesService().Save(*m_vecItems))
284 return true;
286 return false;