From 0afb1d4d51973cf52973617c92236d851a039d31 Mon Sep 17 00:00:00 2001 From: manuel Date: Sat, 2 Sep 2017 15:02:54 +0200 Subject: sync with upstream --- .../include/kodi/gui/dialogs/Select.h | 165 +++++++++++++++++++++ 1 file changed, 165 insertions(+) (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/gui/dialogs/Select.h') 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