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.
9 #include "GUIWindowFavourites.h"
11 #include "ContextMenuManager.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"
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
);
53 class CVideoSelectActionProcessor
: public VIDEO::GUILIB::CVideoSelectActionProcessorBase
56 explicit CVideoSelectActionProcessor(const std::shared_ptr
<CFileItem
>& item
)
57 : CVideoSelectActionProcessorBase(item
)
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)});
70 bool OnResumeSelected() override
72 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item
, "resume"});
76 bool OnPlaySelected() override
78 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item
, "noresume"});
82 bool OnQueueSelected() override
84 FAVOURITES_UTILS::ExecuteAction({"QueueMedia", *m_item
, ""});
88 bool OnInfoSelected() override
90 return UTILS::GUILIB::CGUIContentUtils::ShowInfoForItem(*m_item
);
93 bool OnChooseSelected() override
95 CONTEXTMENU::ShowFor(m_item
, CContextMenuManager::MAIN
);
100 class CVideoPlayActionProcessor
: public VIDEO::GUILIB::CVideoPlayActionProcessorBase
103 explicit CVideoPlayActionProcessor(const ::std::shared_ptr
<CFileItem
>& item
)
104 : CVideoPlayActionProcessorBase(item
)
109 bool OnResumeSelected() override
111 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item
, "resume"});
115 bool OnPlaySelected() override
117 FAVOURITES_UTILS::ExecuteAction({"PlayMedia", *m_item
, "noresume"});
123 bool CGUIWindowFavourites::OnSelect(int itemIdx
)
125 if (itemIdx
< 0 || itemIdx
>= m_vecItems
->Size())
128 const auto item
{(*m_vecItems
)[itemIdx
]};
129 const CFavouritesURL favURL
{*item
, GetID()};
130 if (!favURL
.IsValid())
133 const bool isPlayMedia
{favURL
.GetAction() == CFavouritesURL::Action::PLAY_MEDIA
};
135 const auto target
{CServiceBroker::GetFavouritesService().ResolveFavourite(*item
)};
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())
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())
162 if (action
.GetID() == ACTION_PLAYER_PLAY
)
164 const auto targetItem
{
165 CServiceBroker::GetFavouritesService().ResolveFavourite(*(*m_vecItems
)[selectedItem
])};
169 const auto item
{std::make_shared
<CFileItem
>(*targetItem
)};
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())
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
);
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
)
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
232 if (m_vecItems
->Size() < size
)
234 // item removed. select item after the removed item
235 m_viewControl
.SetSelectedItem(selected
);
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)
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())
267 else if (selected
< 0)
268 selected
= m_vecItems
->Size() - 1;
270 m_viewControl
.SetSelectedItem(selected
);
277 bool CGUIWindowFavourites::RemoveItem(int item
)
279 if (item
< 0 || item
>= m_vecItems
->Size())
282 if (FAVOURITES_UTILS::RemoveItem(*m_vecItems
, (*m_vecItems
)[item
]) &&
283 CServiceBroker::GetFavouritesService().Save(*m_vecItems
))