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.
9 #include "ContextMenus.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"
26 using namespace CONTEXTMENU
;
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());
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()
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
);
70 windowMgr
.ActivateWindow(WINDOW_MUSIC_NAV
, {path
, "return"});
75 bool CMusicPlay::IsVisible(const CFileItem
& item
) const
77 return MUSIC_UTILS::IsItemPlayable(item
);
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
);
100 bool CanQueue(const CFileItem
& item
)
102 if (!item
.CanQueue())
105 const int windowId
= CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow();
106 if (windowId
== WINDOW_MUSIC_PLAYLIST
)
107 return false; // Already queued
111 } // unnamed namespace
113 bool CMusicPlay::Execute(const std::shared_ptr
<CFileItem
>& item
) const
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
)};
138 bool CMusicPlayNext::IsVisible(const CFileItem
& item
) const
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
);
152 bool CMusicQueue::IsVisible(const CFileItem
& item
) const
157 return MUSIC_UTILS::IsItemPlayable(item
);
162 void SelectNextItem(int windowID
)
164 auto& windowMgr
= CServiceBroker::GetGUI()->GetWindowManager();
165 CGUIWindow
* window
= windowMgr
.GetWindow(windowID
);
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
);