From 0afb1d4d51973cf52973617c92236d851a039d31 Mon Sep 17 00:00:00 2001 From: manuel Date: Sat, 2 Sep 2017 15:02:54 +0200 Subject: sync with upstream --- .../kodi-addon-dev-kit/include/kodi/gui/ListItem.h | 4 +- .../kodi-addon-dev-kit/include/kodi/gui/Window.h | 4 + .../include/kodi/gui/definitions.h | 2 + .../include/kodi/gui/dialogs/ContextMenu.h | 94 ++++++++++++ .../include/kodi/gui/dialogs/ExtendedProgress.h | 2 +- .../include/kodi/gui/dialogs/Keyboard.h | 24 +-- .../include/kodi/gui/dialogs/Numeric.h | 15 +- .../include/kodi/gui/dialogs/Select.h | 165 +++++++++++++++++++++ 8 files changed, 281 insertions(+), 29 deletions(-) (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/gui') diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h index 944b1b9..13cf2d1 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/ListItem.h @@ -37,7 +37,7 @@ namespace gui GUIHANDLE GetControlHandle() const { return m_controlHandle; } protected: - CAddonGUIControlBase(CAddonGUIControlBase* window) + explicit CAddonGUIControlBase(CAddonGUIControlBase* window) : m_controlHandle(nullptr), m_interface(::kodi::addon::CAddonBase::m_interface->toKodi), m_Window(window) {} @@ -111,7 +111,7 @@ namespace gui * Related to call of "ListItemPtr kodi::gui::CWindow::GetListItem(int listPos)" * Not needed for addon development itself */ - CListItem(GUIHANDLE listItemHandle) + explicit CListItem(GUIHANDLE listItemHandle) : CAddonGUIControlBase(nullptr) { m_controlHandle = listItemHandle; diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h index b78585f..c369c62 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/Window.h @@ -128,6 +128,10 @@ namespace gui /// @note If your Add-On ends this window will be closed to. To show it forever, /// make a loop at the end of your Add-On or use doModal() instead. /// + /// @warning If used must be the class be global present until Kodi becomes + /// closed. The creation can be done after before "Show" becomes called, but + /// not delete class after them. + /// /// @return Return true if call and show is successed, /// if false was something failed to get needed /// skin parts. diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h index 61af9fe..1dd03cc 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/definitions.h @@ -262,6 +262,8 @@ typedef struct AddonToKodiFuncTable_kodi_gui_dialogProgress typedef struct AddonToKodiFuncTable_kodi_gui_dialogSelect { int (*open)(void* kodiBase, const char *heading, const char *entries[], unsigned int size, int selected, unsigned int autoclose); + bool (*open_multi_select)(void* kodiBase, const char* heading, const char* entryIDs[], const char* entryNames[], + bool entriesSelected[], unsigned int size, unsigned int autoclose); } AddonToKodiFuncTable_kodi_gui_dialogSelect; typedef struct AddonToKodiFuncTable_kodi_gui_dialogTextViewer diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h index 47afc23..39b21b4 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ContextMenu.h @@ -91,6 +91,100 @@ namespace dialogs return ret; } //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_dialogs_ContextMenu + /// @brief Show a context menu dialog about given parts. + /// + /// @param[in] heading Dialog heading name + /// @param[in] entries String list about entries + /// @return The selected entry, if return -1 was nothing selected or canceled + /// + /// + ///------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// #include + /// + /// const std::vector> entries + /// { + /// { "ID 1", "Test 1" }, + /// { "ID 2", "Test 2" }, + /// { "ID 3", "Test 3" }, + /// { "ID 4", "Test 4" }, + /// { "ID 5", "Test 5" } + /// }; + /// + /// int selected = kodi::gui::dialogs::ContextMenu::Show("Test selection", entries); + /// if (selected < 0) + /// fprintf(stderr, "Item selection canceled\n"); + /// else + /// fprintf(stderr, "Selected item is: %i\n", selected); + /// ~~~~~~~~~~~~~ + /// + inline int Show(const std::string& heading, const std::vector>& entries) + { + using namespace ::kodi::addon; + unsigned int size = entries.size(); + const char** cEntries = static_cast(malloc(size*sizeof(const char**))); + for (unsigned int i = 0; i < size; ++i) + { + cEntries[i] = entries[i].second.c_str(); + } + int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size); + free(cEntries); + return ret; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_dialogs_ContextMenu + /// @brief Show a context menu dialog about given parts. + /// + /// @param[in] heading Dialog heading name + /// @param[in] entries String list about entries + /// @return The selected entry, if return -1 was nothing selected or canceled + /// + /// + ///------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// #include + /// + /// const std::vector> entries + /// { + /// { 1, "Test 1" }, + /// { 2, "Test 2" }, + /// { 3, "Test 3" }, + /// { 4, "Test 4" }, + /// { 5, "Test 5" } + /// }; + /// + /// int selected = kodi::gui::dialogs::ContextMenu::Show("Test selection", entries); + /// if (selected < 0) + /// fprintf(stderr, "Item selection canceled\n"); + /// else + /// fprintf(stderr, "Selected item is: %i\n", selected); + /// ~~~~~~~~~~~~~ + /// + inline int Show(const std::string& heading, const std::vector>& entries) + { + using namespace ::kodi::addon; + unsigned int size = entries.size(); + const char** cEntries = static_cast(malloc(size*sizeof(const char**))); + for (unsigned int i = 0; i < size; ++i) + { + cEntries[i] = entries[i].second.c_str(); + } + int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogContextMenu->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size); + free(cEntries); + return ret; + } + //-------------------------------------------------------------------------- }; } /* namespace dialogs */ diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h index e9c5a9d..5878958 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h @@ -75,7 +75,7 @@ namespace dialogs /// /// @param[in] title Title string /// - CExtendedProgress(const std::string& title = "") + explicit CExtendedProgress(const std::string& title = "") { using namespace ::kodi::addon; m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->new_dialog(CAddonBase::m_interface->toKodi->kodiBase, title.c_str()); diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h index cff30d8..6d2b32b 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Keyboard.h @@ -96,8 +96,7 @@ namespace dialogs hiddenInput, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - text = retString; + text = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -129,8 +128,7 @@ namespace dialogs allowEmptyResult, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - text = retString; + text = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -162,8 +160,7 @@ namespace dialogs allowEmptyResult, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - newPassword = retString; + newPassword = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -192,8 +189,7 @@ namespace dialogs newPassword.c_str(), &retString, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - newPassword = retString; + newPassword = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -275,8 +271,7 @@ namespace dialogs autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - newPassword = retString; + newPassword = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -305,8 +300,7 @@ namespace dialogs &retString, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - newPassword = retString; + newPassword = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -339,8 +333,7 @@ namespace dialogs retries, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - password = retString; + password = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -373,8 +366,7 @@ namespace dialogs text.c_str(), &retString, searching, autoCloseMs); if (retString != nullptr) { - if (std::strlen(retString)) - text = retString; + text = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h index dddbf7e..70e9e7b 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Numeric.h @@ -68,8 +68,7 @@ namespace dialogs bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password(CAddonBase::m_interface->toKodi->kodiBase, &pw); if (pw != nullptr) { - if (std::strlen(pw)) - newPassword = pw; + newPassword = pw; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, pw); } return ret; @@ -172,8 +171,7 @@ namespace dialogs toVerify.c_str(), &retString, heading.c_str(), verifyInput); if (retString != nullptr) { - if (std::strlen(retString)) - toVerify = retString; + toVerify = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -279,8 +277,7 @@ namespace dialogs ipAddress.c_str(), &retString, heading.c_str()); if (retString != nullptr) { - if (std::strlen(retString)) - ipAddress = retString; + ipAddress = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -326,8 +323,7 @@ namespace dialogs input.c_str(), &retString, heading.c_str(), autoCloseTimeoutMs); if (retString != nullptr) { - if (std::strlen(retString)) - input = retString; + input = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; @@ -354,8 +350,7 @@ namespace dialogs time.c_str(), &retString, heading.c_str()); if (retString != nullptr) { - if (std::strlen(retString)) - time = retString; + time = retString; CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, retString); } return ret; diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h index 963c84c..8276832 100644 --- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h +++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h @@ -22,6 +22,38 @@ #include "../definitions.h" #include "../../AddonBase.h" +//============================================================================== +/// \defgroup cpp_kodi_vfs_Defs Definitions, structures and enumerators +/// \ingroup cpp_kodi_gui_dialogs_Select +/// @brief **Dialog Select definition values** +//------------------------------------------------------------------------------ + +//============================================================================== +/// \ingroup cpp_kodi_vfs_Defs +/// @brief **Selection entry structure** +/// +typedef struct SSelectionEntry +{ + //============================================================================ + /// Structure constructor + /// + /// There becomes selected always set to false. + /// + SSelectionEntry() : selected(false) { } + //---------------------------------------------------------------------------- + + /// Entry identfication string + std::string id; + + /// Entry name to show on GUI dialog + std::string name; + + /// Place where entry can be preselected and after return the from user + /// selected is set. + bool selected; +} SSelectionEntry; +//------------------------------------------------------------------------------ + namespace kodi { namespace gui @@ -97,6 +129,139 @@ namespace dialogs return ret; } //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_dialogs_Select + /// @brief Show a selection dialog about given parts. + /// + /// This function is mostly equal to the other, only becomes the string list + /// here done by a SSelectionEntry, where a ID string can be defined. + /// + /// @param[in] heading Dialog heading name + /// @param[in] entries SSelectionEntry list about entries + /// @param[in] selected [opt] Predefined selection (default is + /// -1 for the first) + /// @param[in] autoclose [opt] To close dialog automatic after the given + /// time in ms. As '0' it stays open. + /// @return The selected entry, if return -1 was + /// nothing selected or canceled + /// + /// + ///------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// #include + /// + /// std::vector entries + /// { + /// { "ID 1", "Test 1", false }, + /// { "ID 2", "Test 2", false }, + /// { "ID 3", "Test 3", false }, + /// { "ID 4", "Test 4", false }, + /// { "ID 5", "Test 5", false } + /// }; + /// + /// int selected = kodi::gui::dialogs::Select::Show("Test selection", entries, -1); + /// if (selected < 0) + /// fprintf(stderr, "Item selection canceled\n"); + /// else + /// fprintf(stderr, "Selected item is: %i\n", selected); + /// ~~~~~~~~~~~~~ + /// + inline int Show(const std::string& heading, std::vector& entries, int selected = -1, unsigned int autoclose = 0) + { + using namespace ::kodi::addon; + unsigned int size = entries.size(); + const char** cEntries = static_cast(malloc(size*sizeof(const char*))); + for (unsigned int i = 0; i < size; ++i) + { + cEntries[i] = entries[i].name.c_str(); + if (selected == -1 && entries[i].selected) + selected = i; + } + int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open(CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), + cEntries, size, selected, autoclose); + if (ret >= 0) + { + entries[ret].selected = true; + } + free(cEntries); + return ret; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_dialogs_Select + /// @brief Show a multiple selection dialog about given parts. + /// + /// @param[in] heading Dialog heading name + /// @param[in] entries SSelectionEntry list about entries + /// @param[in] autoclose [opt] To close dialog automatic after the given + /// time in ms. As '0' it stays open. + /// @return The selected entries, if return empty was + /// nothing selected or canceled + /// + /// With selected on SSelectionEntry can be a pre selection defined. + /// + ///------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// #include + /// + /// std::vector entries + /// { + /// { "ID 1", "Test 1", false }, + /// { "ID 2", "Test 2", false }, + /// { "ID 3", "Test 3", false }, + /// { "ID 4", "Test 4", false }, + /// { "ID 5", "Test 5", false } + /// }; + /// + /// bool ret = kodi::gui::dialogs::Select::ShowMultiSelect("Test selection", entries); + /// if (!ret) + /// fprintf(stderr, "Selection canceled\n"); + /// else + /// { + /// fprintf(stderr, "Selected items:\n"); + /// for (const auto& entry : entries) + /// { + /// if (entry.selected) + /// fprintf(stderr, " - %s\n", entry.selected.id.c_str()); + /// } + /// } + /// ~~~~~~~~~~~~~ + /// + inline bool ShowMultiSelect(const std::string& heading, std::vector& entries, int autoclose = 0) + { + using namespace ::kodi::addon; + unsigned int size = entries.size(); + const char** cEntryIDs = static_cast(malloc(size*sizeof(const char*))); + const char** cEntryNames = static_cast(malloc(size*sizeof(const char*))); + bool* cEntriesSelected = static_cast(malloc(size*sizeof(bool))); + for (unsigned int i = 0; i < size; ++i) + { + cEntryIDs[i] = entries[i].id.c_str(); + cEntryNames[i] = entries[i].name.c_str(); + cEntriesSelected[i] = entries[i].selected; + } + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open_multi_select(CAddonBase::m_interface->toKodi->kodiBase, + heading.c_str(), cEntryIDs, cEntryNames, + cEntriesSelected, size, autoclose); + if (ret) + { + for (unsigned int i = 0; i < size; ++i) + entries[i].selected = cEntriesSelected[i]; + } + free(cEntryNames); + free(cEntryIDs); + free(cEntriesSelected); + return ret; + } + //-------------------------------------------------------------------------- }; /// @} -- cgit v1.2.3