diff options
Diffstat (limited to 'xbmc/dialogs/GUIDialogContextMenu.h')
-rw-r--r-- | xbmc/dialogs/GUIDialogContextMenu.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/xbmc/dialogs/GUIDialogContextMenu.h b/xbmc/dialogs/GUIDialogContextMenu.h new file mode 100644 index 0000000..420e458 --- /dev/null +++ b/xbmc/dialogs/GUIDialogContextMenu.h @@ -0,0 +1,152 @@ +/* + * 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. + */ + +#pragma once + +#include "guilib/GUIDialog.h" + +#include <string> +#include <utility> +#include <vector> + + +class CMediaSource; + +enum CONTEXT_BUTTON { CONTEXT_BUTTON_CANCELLED = 0, + CONTEXT_BUTTON_RENAME, + CONTEXT_BUTTON_DELETE, + CONTEXT_BUTTON_MOVE, + CONTEXT_BUTTON_SETTINGS, + CONTEXT_BUTTON_RIP_CD, + CONTEXT_BUTTON_CANCEL_RIP_CD, + CONTEXT_BUTTON_RIP_TRACK, + CONTEXT_BUTTON_EJECT_DRIVE, + CONTEXT_BUTTON_EDIT_SOURCE, + CONTEXT_BUTTON_REMOVE_SOURCE, + CONTEXT_BUTTON_SET_DEFAULT, + CONTEXT_BUTTON_CLEAR_DEFAULT, + CONTEXT_BUTTON_SET_THUMB, + CONTEXT_BUTTON_ADD_LOCK, + CONTEXT_BUTTON_REMOVE_LOCK, + CONTEXT_BUTTON_CHANGE_LOCK, + CONTEXT_BUTTON_RESET_LOCK, + CONTEXT_BUTTON_REACTIVATE_LOCK, + CONTEXT_BUTTON_VIEW_SLIDESHOW, + CONTEXT_BUTTON_RECURSIVE_SLIDESHOW, + CONTEXT_BUTTON_REFRESH_THUMBS, + CONTEXT_BUTTON_SWITCH_MEDIA, + CONTEXT_BUTTON_MOVE_ITEM, + CONTEXT_BUTTON_MOVE_HERE, + CONTEXT_BUTTON_CANCEL_MOVE, + CONTEXT_BUTTON_MOVE_ITEM_UP, + CONTEXT_BUTTON_MOVE_ITEM_DOWN, + CONTEXT_BUTTON_CLEAR, + CONTEXT_BUTTON_QUEUE_ITEM, + CONTEXT_BUTTON_PLAY_ITEM, + CONTEXT_BUTTON_PLAY_WITH, + CONTEXT_BUTTON_PLAY_PARTYMODE, + CONTEXT_BUTTON_PLAY_PART, + CONTEXT_BUTTON_RESUME_ITEM, + CONTEXT_BUTTON_EDIT, + CONTEXT_BUTTON_EDIT_SMART_PLAYLIST, + CONTEXT_BUTTON_INFO, + CONTEXT_BUTTON_INFO_ALL, + CONTEXT_BUTTON_CDDB, + CONTEXT_BUTTON_SCAN, + CONTEXT_BUTTON_SCAN_TO_LIBRARY, + CONTEXT_BUTTON_SET_ARTIST_THUMB, + CONTEXT_BUTTON_SET_SEASON_ART, + CONTEXT_BUTTON_CANCEL_PARTYMODE, + CONTEXT_BUTTON_MARK_WATCHED, + CONTEXT_BUTTON_MARK_UNWATCHED, + CONTEXT_BUTTON_SET_CONTENT, + CONTEXT_BUTTON_EDIT_PARTYMODE, + CONTEXT_BUTTON_LINK_MOVIE, + CONTEXT_BUTTON_UNLINK_MOVIE, + CONTEXT_BUTTON_GO_TO_ARTIST, + CONTEXT_BUTTON_GO_TO_ALBUM, + CONTEXT_BUTTON_PLAY_OTHER, + CONTEXT_BUTTON_SET_ACTOR_THUMB, + CONTEXT_BUTTON_UNLINK_BOOKMARK, + CONTEXT_BUTTON_ACTIVATE, + CONTEXT_BUTTON_GROUP_MANAGER, + CONTEXT_BUTTON_CHANNEL_MANAGER, + CONTEXT_BUTTON_SET_MOVIESET_ART, + CONTEXT_BUTTON_PLAY_AND_QUEUE, + CONTEXT_BUTTON_PLAY_ONLY_THIS, + CONTEXT_BUTTON_UPDATE_EPG, + CONTEXT_BUTTON_TAGS_ADD_ITEMS, + CONTEXT_BUTTON_TAGS_REMOVE_ITEMS, + CONTEXT_BUTTON_SET_MOVIESET, + CONTEXT_BUTTON_MOVIESET_ADD_REMOVE_ITEMS, + CONTEXT_BUTTON_BROWSE_INTO, + CONTEXT_BUTTON_EDIT_SORTTITLE, + CONTEXT_BUTTON_DELETE_ALL, + CONTEXT_BUTTON_HELP, + CONTEXT_BUTTON_PLAY_NEXT, + CONTEXT_BUTTON_NAVIGATE, + }; + +class CContextButtons : public std::vector< std::pair<size_t, std::string> > +{ +public: + void Add(unsigned int, const std::string &label); + void Add(unsigned int, int label); +}; + +class CGUIDialogContextMenu : + public CGUIDialog +{ +public: + CGUIDialogContextMenu(void); + ~CGUIDialogContextMenu(void) override; + bool OnMessage(CGUIMessage &message) override; + bool OnAction(const CAction& action) override; + void SetPosition(float posX, float posY) override; + + static bool SourcesMenu(const std::string &strType, const CFileItemPtr& item, float posX, float posY); + static void SwitchMedia(const std::string& strType, const std::string& strPath); + + static void GetContextButtons(const std::string &type, const CFileItemPtr& item, CContextButtons &buttons); + static bool OnContextButton(const std::string &type, const CFileItemPtr& item, CONTEXT_BUTTON button); + + /*! Show the context menu with the given choices and return the index of the selected item, + or -1 if cancelled. + */ + static int Show(const CContextButtons& choices, int focusedButton = 0); + + /*! Legacy method that returns the context menu id, or -1 on cancel */ + static int ShowAndGetChoice(const CContextButtons &choices); + +protected: + void SetupButtons(); + + /*! \brief Position the context menu in the middle of the focused control. + If no control is available it is positioned in the middle of the screen. + */ + void PositionAtCurrentFocus(); + + float GetWidth() const override; + float GetHeight() const override; + void OnInitWindow() override; + void OnWindowLoaded() override; + void OnDeinitWindow(int nextWindowID) override; + static std::string GetDefaultShareNameByType(const std::string &strType); + static void SetDefault(const std::string &strType, const std::string &strDefault); + static void ClearDefault(const std::string &strType); + static CMediaSource *GetShare(const std::string &type, const CFileItem *item); + +private: + float m_coordX, m_coordY; + /// \brief Stored size of background image (height or width depending on grouplist orientation) + float m_backgroundImageSize; + int m_initiallyFocusedButtonIdx = 0; + int m_clickedButton; + CContextButtons m_buttons; + const CGUIControl *m_backgroundImage = nullptr; +}; |