Merge pull request #26350 from jjd-uk/estuary_media_align
[xbmc.git] / xbmc / favourites / ContextMenus.cpp
bloba735b6950de8141df156346c5c9d0e1dcfa44e7f
1 /*
2 * Copyright (C) 2016-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 "ContextMenus.h"
11 #include "ContextMenuManager.h"
12 #include "FileItem.h"
13 #include "ServiceBroker.h"
14 #include "favourites/FavouritesService.h"
15 #include "favourites/FavouritesURL.h"
16 #include "favourites/FavouritesUtils.h"
17 #include "guilib/LocalizeStrings.h"
18 #include "utils/URIUtils.h"
19 #include "utils/Variant.h"
20 #include "utils/guilib/GUIBuiltinsUtils.h"
21 #include "utils/guilib/GUIContentUtils.h"
22 #include "video/VideoUtils.h"
23 #include "video/guilib/VideoGUIUtils.h"
25 using namespace CONTEXTMENU;
26 using namespace KODI;
27 using namespace KODI::UTILS::GUILIB;
29 bool CFavouriteContextMenuAction::IsVisible(const CFileItem& item) const
31 return URIUtils::IsProtocol(item.GetPath(), "favourites");
34 bool CFavouriteContextMenuAction::Execute(const std::shared_ptr<CFileItem>& item) const
36 CFileItemList items;
37 CServiceBroker::GetFavouritesService().GetAll(items);
39 const auto it = std::find_if(items.cbegin(), items.cend(), [&item](const auto& favourite) {
40 return favourite->GetPath() == item->GetPath();
41 });
43 if ((it != items.cend()) && DoExecute(items, *it))
44 return CServiceBroker::GetFavouritesService().Save(items);
46 return false;
49 bool CMoveUpFavourite::DoExecute(CFileItemList& items, const std::shared_ptr<CFileItem>& item) const
51 return FAVOURITES_UTILS::MoveItem(items, item, -1);
54 bool CMoveUpFavourite::IsVisible(const CFileItem& item) const
56 return CFavouriteContextMenuAction::IsVisible(item) && FAVOURITES_UTILS::ShouldEnableMoveItems();
59 bool CMoveDownFavourite::DoExecute(CFileItemList& items,
60 const std::shared_ptr<CFileItem>& item) const
62 return FAVOURITES_UTILS::MoveItem(items, item, +1);
65 bool CMoveDownFavourite::IsVisible(const CFileItem& item) const
67 return CFavouriteContextMenuAction::IsVisible(item) && FAVOURITES_UTILS::ShouldEnableMoveItems();
70 bool CRemoveFavourite::DoExecute(CFileItemList& items, const std::shared_ptr<CFileItem>& item) const
72 return FAVOURITES_UTILS::RemoveItem(items, item);
75 bool CRenameFavourite::DoExecute(CFileItemList&, const std::shared_ptr<CFileItem>& item) const
77 return FAVOURITES_UTILS::ChooseAndSetNewName(*item);
80 bool CChooseThumbnailForFavourite::DoExecute(CFileItemList&,
81 const std::shared_ptr<CFileItem>& item) const
83 return FAVOURITES_UTILS::ChooseAndSetNewThumbnail(*item);
86 namespace
88 std::shared_ptr<CFileItem> ResolveFavouriteItem(const CFileItem& item)
90 std::shared_ptr<CFileItem> targetItem{
91 CServiceBroker::GetFavouritesService().ResolveFavourite(item)};
92 if (targetItem)
93 targetItem->SetProperty("hide_add_remove_favourite", CVariant{true});
95 return targetItem;
98 bool IsPlayMediaFavourite(const CFileItem& item)
100 if (item.IsFavourite())
102 const CFavouritesURL favURL{item, -1};
103 if (favURL.IsValid())
104 return favURL.GetAction() == CFavouritesURL::Action::PLAY_MEDIA;
106 return false;
109 bool IsActivateWindowFavourite(const CFileItem& item)
111 if (item.IsFavourite())
113 const CFavouritesURL favURL{item, -1};
114 if (favURL.IsValid())
115 return favURL.GetAction() == CFavouritesURL::Action::ACTIVATE_WINDOW;
117 return false;
119 } // unnamed namespace
121 bool CFavouritesTargetBrowse::IsVisible(const CFileItem& item) const
123 return IsActivateWindowFavourite(item);
126 bool CFavouritesTargetBrowse::Execute(const std::shared_ptr<CFileItem>& item) const
128 return FAVOURITES_UTILS::ExecuteAction({*item, -1}, item);
131 std::string CFavouritesTargetResume::GetLabel(const CFileItem& item) const
133 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(item)};
134 if (targetItem)
135 return VIDEO::UTILS::GetResumeString(*targetItem);
137 return {};
140 bool CFavouritesTargetResume::IsVisible(const CFileItem& item) const
142 if (IsPlayMediaFavourite(item))
144 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(item)};
145 if (targetItem)
146 return VIDEO::UTILS::GetItemResumeInformation(*targetItem).isResumable;
148 return false;
151 bool CFavouritesTargetResume::Execute(const std::shared_ptr<CFileItem>& item) const
153 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(*item)};
154 if (targetItem)
155 return CGUIBuiltinsUtils::ExecutePlayMediaTryResume(targetItem);
157 return false;
160 std::string CFavouritesTargetPlay::GetLabel(const CFileItem& item) const
162 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(item)};
163 if (targetItem && VIDEO::UTILS::GetItemResumeInformation(*targetItem).isResumable)
164 return g_localizeStrings.Get(12021); // Play from beginning
166 return g_localizeStrings.Get(208); // Play
169 bool CFavouritesTargetPlay::IsVisible(const CFileItem& item) const
171 return IsPlayMediaFavourite(item);
174 bool CFavouritesTargetPlay::Execute(const std::shared_ptr<CFileItem>& item) const
176 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(*item)};
177 if (targetItem)
178 return CGUIBuiltinsUtils::ExecutePlayMediaNoResume(targetItem);
180 return false;
183 bool CFavouritesTargetInfo::IsVisible(const CFileItem& item) const
185 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(item)};
186 if (targetItem)
187 return UTILS::GUILIB::CGUIContentUtils::HasInfoForItem(*targetItem);
189 return false;
192 bool CFavouritesTargetInfo::Execute(const std::shared_ptr<CFileItem>& item) const
194 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(*item)};
195 if (targetItem)
196 return UTILS::GUILIB::CGUIContentUtils::ShowInfoForItem(*targetItem);
198 return false;
201 bool CFavouritesTargetContextMenu::IsVisible(const CFileItem& item) const
203 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(item)};
204 if (targetItem)
205 return CONTEXTMENU::HasAnyMenuItemsFor(targetItem, CContextMenuManager::MAIN);
207 return false;
210 bool CFavouritesTargetContextMenu::Execute(const std::shared_ptr<CFileItem>& item) const
212 const std::shared_ptr<CFileItem> targetItem{ResolveFavouriteItem(*item)};
213 if (targetItem)
215 CONTEXTMENU::ShowFor(targetItem, CContextMenuManager::MAIN);
216 return true;
218 return false;