Merge pull request #25808 from CastagnaIT/fix_url_parse
[xbmc.git] / xbmc / music / ContextMenus.cpp
blob56e53eb9c9244e38fd02627ba66e7855db468d1a
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 "FileItem.h"
12 #include "GUIUserMessages.h"
13 #include "ServiceBroker.h"
14 #include "cores/playercorefactory/PlayerCoreFactory.h"
15 #include "guilib/GUIComponent.h"
16 #include "guilib/GUIWindowManager.h"
17 #include "music/MusicUtils.h"
18 #include "music/dialogs/GUIDialogMusicInfo.h"
19 #include "playlists/PlayListTypes.h"
20 #include "tags/MusicInfoTag.h"
21 #include "utils/Variant.h"
22 #include "video/VideoFileItemClassify.h"
24 #include <utility>
26 using namespace CONTEXTMENU;
27 using namespace KODI;
29 CMusicInfo::CMusicInfo(MediaType mediaType)
30 : CStaticContextMenuAction(19033), m_mediaType(std::move(mediaType))
34 bool CMusicInfo::IsVisible(const CFileItem& item) const
36 return (item.HasMusicInfoTag() && item.GetMusicInfoTag()->GetType() == m_mediaType) ||
37 (m_mediaType == MediaTypeArtist && VIDEO::IsVideoDb(item) &&
38 item.HasProperty("artist_musicid")) ||
39 (m_mediaType == MediaTypeAlbum && VIDEO::IsVideoDb(item) &&
40 item.HasProperty("album_musicid"));
43 bool CMusicInfo::Execute(const std::shared_ptr<CFileItem>& item) const
45 CGUIDialogMusicInfo::ShowFor(item.get());
46 return true;
49 bool CMusicBrowse::IsVisible(const CFileItem& item) const
51 return ((item.m_bIsFolder || item.IsFileFolder(EFILEFOLDER_MASK_ONBROWSE)) &&
52 MUSIC_UTILS::IsItemPlayable(item));
55 bool CMusicBrowse::Execute(const std::shared_ptr<CFileItem>& item) const
57 // For file directory browsing, we need item's dyn path, for everything else the path.
58 const std::string path{item->IsFileFolder(EFILEFOLDER_MASK_ONBROWSE) ? item->GetDynPath()
59 : item->GetPath()};
61 auto& windowMgr = CServiceBroker::GetGUI()->GetWindowManager();
62 if (windowMgr.GetActiveWindow() == WINDOW_MUSIC_NAV)
64 CGUIMessage msg(GUI_MSG_NOTIFY_ALL, WINDOW_MUSIC_NAV, 0, GUI_MSG_UPDATE);
65 msg.SetStringParam(path);
66 windowMgr.SendMessage(msg);
68 else
70 windowMgr.ActivateWindow(WINDOW_MUSIC_NAV, {path, "return"});
72 return true;
75 bool CMusicPlay::IsVisible(const CFileItem& item) const
77 return MUSIC_UTILS::IsItemPlayable(item);
80 namespace
82 void Play(const std::shared_ptr<CFileItem>& item, const std::string& player)
84 item->SetProperty("playlist_type_hint", static_cast<int>(PLAYLIST::Id::TYPE_MUSIC));
86 const ContentUtils::PlayMode mode = item->GetProperty("CheckAutoPlayNextItem").asBoolean()
87 ? ContentUtils::PlayMode::CHECK_AUTO_PLAY_NEXT_ITEM
88 : ContentUtils::PlayMode::PLAY_ONLY_THIS;
89 MUSIC_UTILS::PlayItem(item, player, mode);
92 std::vector<std::string> GetPlayers(const CPlayerCoreFactory& playerCoreFactory,
93 const CFileItem& item)
95 std::vector<std::string> players;
96 playerCoreFactory.GetPlayers(item, players);
97 return players;
100 bool CanQueue(const CFileItem& item)
102 if (!item.CanQueue())
103 return false;
105 const int windowId = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow();
106 if (windowId == WINDOW_MUSIC_PLAYLIST)
107 return false; // Already queued
109 return true;
111 } // unnamed namespace
113 bool CMusicPlay::Execute(const std::shared_ptr<CFileItem>& item) const
115 Play(item, "");
116 return true;
119 bool CMusicPlayUsing::IsVisible(const CFileItem& item) const
121 const CPlayerCoreFactory& playerCoreFactory{CServiceBroker::GetPlayerCoreFactory()};
122 return (GetPlayers(playerCoreFactory, item).size() > 1) && MUSIC_UTILS::IsItemPlayable(item);
125 bool CMusicPlayUsing::Execute(const std::shared_ptr<CFileItem>& item) const
127 const CPlayerCoreFactory& playerCoreFactory{CServiceBroker::GetPlayerCoreFactory()};
128 const std::vector<std::string> players{GetPlayers(playerCoreFactory, *item)};
129 const std::string player{playerCoreFactory.SelectPlayerDialog(players)};
130 if (!player.empty())
132 Play(item, player);
133 return true;
135 return false;
138 bool CMusicPlayNext::IsVisible(const CFileItem& item) const
140 if (!CanQueue(item))
141 return false;
143 return MUSIC_UTILS::IsItemPlayable(item);
146 bool CMusicPlayNext::Execute(const std::shared_ptr<CFileItem>& item) const
148 MUSIC_UTILS::QueueItem(item, MUSIC_UTILS::QueuePosition::POSITION_BEGIN);
149 return true;
152 bool CMusicQueue::IsVisible(const CFileItem& item) const
154 if (!CanQueue(item))
155 return false;
157 return MUSIC_UTILS::IsItemPlayable(item);
160 namespace
162 void SelectNextItem(int windowID)
164 auto& windowMgr = CServiceBroker::GetGUI()->GetWindowManager();
165 CGUIWindow* window = windowMgr.GetWindow(windowID);
166 if (window)
168 const int viewContainerID = window->GetViewContainerID();
169 if (viewContainerID > 0)
171 CGUIMessage msg1(GUI_MSG_ITEM_SELECTED, windowID, viewContainerID);
172 windowMgr.SendMessage(msg1, windowID);
174 CGUIMessage msg2(GUI_MSG_ITEM_SELECT, windowID, viewContainerID, msg1.GetParam1() + 1);
175 windowMgr.SendMessage(msg2, windowID);
179 } // unnamed namespace
181 bool CMusicQueue::Execute(const std::shared_ptr<CFileItem>& item) const
183 MUSIC_UTILS::QueueItem(item, MUSIC_UTILS::QueuePosition::POSITION_END);
185 // Set selection to next item in active window's view.
186 const int windowID = CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow();
187 SelectNextItem(windowID);
189 return true;