summaryrefslogtreecommitdiffstats
path: root/xbmc/favourites/GUIDialogFavourites.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/favourites/GUIDialogFavourites.cpp')
-rw-r--r--xbmc/favourites/GUIDialogFavourites.cpp213
1 files changed, 213 insertions, 0 deletions
diff --git a/xbmc/favourites/GUIDialogFavourites.cpp b/xbmc/favourites/GUIDialogFavourites.cpp
new file mode 100644
index 0000000..7af6d29
--- /dev/null
+++ b/xbmc/favourites/GUIDialogFavourites.cpp
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "GUIDialogFavourites.h"
+
+#include "ContextMenuManager.h"
+#include "ServiceBroker.h"
+#include "dialogs/GUIDialogContextMenu.h"
+#include "favourites/FavouritesURL.h"
+#include "favourites/FavouritesUtils.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIMessage.h"
+#include "guilib/GUIWindowManager.h"
+#include "input/actions/ActionIDs.h"
+
+#define FAVOURITES_LIST 450
+
+CGUIDialogFavourites::CGUIDialogFavourites() :
+ CGUIDialog(WINDOW_DIALOG_FAVOURITES, "DialogFavourites.xml"),
+ m_favouritesService(CServiceBroker::GetFavouritesService())
+{
+ m_favourites = new CFileItemList;
+ m_loadType = KEEP_IN_MEMORY;
+}
+
+CGUIDialogFavourites::~CGUIDialogFavourites(void)
+{
+ delete m_favourites;
+}
+
+bool CGUIDialogFavourites::OnMessage(CGUIMessage &message)
+{
+ if (message.GetMessage() == GUI_MSG_CLICKED)
+ {
+ if (message.GetSenderId() == FAVOURITES_LIST)
+ {
+ int item = GetSelectedItem();
+ int action = message.GetParam1();
+ if (action == ACTION_SELECT_ITEM || action == ACTION_MOUSE_LEFT_CLICK)
+ OnClick(item);
+ else if (action == ACTION_MOVE_ITEM_UP)
+ OnMoveItem(item, -1);
+ else if (action == ACTION_MOVE_ITEM_DOWN)
+ OnMoveItem(item, 1);
+ else if (action == ACTION_CONTEXT_MENU || action == ACTION_MOUSE_RIGHT_CLICK)
+ OnPopupMenu(item);
+ else if (action == ACTION_DELETE_ITEM)
+ OnDelete(item);
+ else
+ return false;
+ return true;
+ }
+ }
+ else if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT)
+ {
+ CGUIDialog::OnMessage(message);
+ // clear our favourites
+ CGUIMessage message(GUI_MSG_LABEL_RESET, GetID(), FAVOURITES_LIST);
+ OnMessage(message);
+ m_favourites->Clear();
+ return true;
+ }
+ return CGUIDialog::OnMessage(message);
+}
+
+void CGUIDialogFavourites::OnInitWindow()
+{
+ m_favouritesService.GetAll(*m_favourites);
+ UpdateList();
+ CGUIWindow::OnInitWindow();
+}
+
+int CGUIDialogFavourites::GetSelectedItem()
+{
+ CGUIMessage message(GUI_MSG_ITEM_SELECTED, GetID(), FAVOURITES_LIST);
+ OnMessage(message);
+ return message.GetParam1();
+}
+
+void CGUIDialogFavourites::OnClick(int item)
+{
+ if (item < 0 || item >= m_favourites->Size())
+ return;
+
+ CGUIMessage message(GUI_MSG_EXECUTE, 0, GetID());
+ message.SetStringParam(CFavouritesURL(*(*m_favourites)[item], GetID()).GetExecString());
+
+ Close();
+
+ CServiceBroker::GetGUI()->GetWindowManager().SendMessage(message);
+}
+
+void CGUIDialogFavourites::OnPopupMenu(int item)
+{
+ if (item < 0 || item >= m_favourites->Size())
+ return;
+
+ // highlight the item
+ (*m_favourites)[item]->Select(true);
+
+ CContextButtons choices;
+ if (m_favourites->Size() > 1)
+ {
+ choices.Add(1, 13332); // Move up
+ choices.Add(2, 13333); // Move down
+ }
+ choices.Add(3, 20019); // Choose thumbnail
+ choices.Add(4, 118); // Rename
+ choices.Add(5, 15015); // Remove
+
+ CFileItemPtr itemPtr = m_favourites->Get(item);
+
+ //temporary workaround until the context menu ids are removed
+ const int addonItemOffset = 10000;
+
+ auto addonItems = CServiceBroker::GetContextMenuManager().GetAddonItems(*itemPtr);
+
+ for (size_t i = 0; i < addonItems.size(); ++i)
+ choices.Add(addonItemOffset + i, addonItems[i]->GetLabel(*itemPtr));
+
+ int button = CGUIDialogContextMenu::ShowAndGetChoice(choices);
+
+ // unhighlight the item
+ (*m_favourites)[item]->Select(false);
+
+ if (button == 1)
+ OnMoveItem(item, -1);
+ else if (button == 2)
+ OnMoveItem(item, +1);
+ else if (button == 3)
+ OnSetThumb(item);
+ else if (button == 4)
+ OnRename(item);
+ else if (button == 5)
+ OnDelete(item);
+ else if (button >= addonItemOffset)
+ CONTEXTMENU::LoopFrom(*addonItems.at(button - addonItemOffset), itemPtr);
+}
+
+void CGUIDialogFavourites::OnMoveItem(int item, int amount)
+{
+ if (item < 0 || item >= m_favourites->Size() || m_favourites->Size() <= 1 || 0 == amount) return;
+
+ int nextItem = (item + amount) % m_favourites->Size();
+ if (nextItem < 0) nextItem += m_favourites->Size();
+
+ m_favourites->Swap(item, nextItem);
+ m_favouritesService.Save(*m_favourites);
+
+ CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, nextItem);
+ OnMessage(message);
+
+ UpdateList();
+}
+
+void CGUIDialogFavourites::OnDelete(int item)
+{
+ if (item < 0 || item >= m_favourites->Size())
+ return;
+ m_favourites->Remove(item);
+ m_favouritesService.Save(*m_favourites);
+
+ CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, item < m_favourites->Size() ? item : item - 1);
+ OnMessage(message);
+
+ UpdateList();
+}
+
+void CGUIDialogFavourites::OnRename(int item)
+{
+ if (item < 0 || item >= m_favourites->Size())
+ return;
+
+ if (FAVOURITES_UTILS::ChooseAndSetNewName(*(*m_favourites)[item]))
+ {
+ m_favouritesService.Save(*m_favourites);
+ UpdateList();
+ }
+}
+
+void CGUIDialogFavourites::OnSetThumb(int item)
+{
+ if (item < 0 || item >= m_favourites->Size())
+ return;
+
+ if (FAVOURITES_UTILS::ChooseAndSetNewThumbnail(*(*m_favourites)[item]))
+ {
+ m_favouritesService.Save(*m_favourites);
+ UpdateList();
+ }
+}
+
+void CGUIDialogFavourites::UpdateList()
+{
+ int currentItem = GetSelectedItem();
+ CGUIMessage message(GUI_MSG_LABEL_BIND, GetID(), FAVOURITES_LIST, currentItem >= 0 ? currentItem : 0, 0, m_favourites);
+ OnMessage(message);
+}
+
+CFileItemPtr CGUIDialogFavourites::GetCurrentListItem(int offset)
+{
+ int currentItem = GetSelectedItem();
+ if (currentItem < 0 || !m_favourites->Size()) return CFileItemPtr();
+
+ int item = (currentItem + offset) % m_favourites->Size();
+ if (item < 0) item += m_favourites->Size();
+ return (*m_favourites)[item];
+}