From be933ef2241d79558f91796cc5b3a161f72ebf9c Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 19 Oct 2020 00:52:24 +0200 Subject: sync with upstream --- .../kodi-dev-kit/include/kodi/gui/dialogs/Select.h | 269 +++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h') diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h new file mode 100644 index 0000000..9b1923e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h @@ -0,0 +1,269 @@ +/* + * 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 "../../AddonBase.h" +#include "../../c-api/gui/dialogs/select.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_Select_Defs Definitions, structures and enumerators +/// @ingroup cpp_kodi_gui_dialogs_Select +/// @brief **Dialog Select definition values**\n +/// Data structures associated with this dialog. +/// +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Select_Defs +/// @brief **Selection entry structure**\n +/// Used to provide the necessary data for the selection dialog and to declare +/// the selected position in it. +/// +typedef struct SSelectionEntry +{ + /*! \cond PRIVATE */ + SSelectionEntry() = default; + /*! \endcond */ + + /// 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 = false; +} SSelectionEntry; +//------------------------------------------------------------------------------ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_Select Dialog Select +/// @ingroup cpp_kodi_gui_dialogs +/// @{ +/// @brief @cpp_namespace{ kodi::gui::dialogs::Select } +/// **Selection dialog**\n +/// The function listed below permits the call of a dialogue to select of an +/// entry as a key +/// +/// It has the header @ref Select.h "#include " +/// be included to enjoy it. +/// +/// +namespace Select +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Select +/// @brief Show a selection dialog about given parts. +/// +/// @param[in] heading Dialog heading name +/// @param[in] entries String 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 +/// +/// const std::vector entries +/// { +/// "Test 1", +/// "Test 2", +/// "Test 3", +/// "Test 4", +/// "Test 5" +/// }; +/// +/// 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 ATTRIBUTE_HIDDEN Show(const std::string& heading, + const std::vector& entries, + int selected = -1, + unsigned int autoclose = 0) +{ + using namespace ::kodi::addon; + unsigned int size = static_cast(entries.size()); + const char** cEntries = (const char**)malloc(size * sizeof(const char**)); + for (unsigned int i = 0; i < size; ++i) + { + cEntries[i] = entries[i].c_str(); + } + int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogSelect->open( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), cEntries, size, selected, + autoclose); + free(cEntries); + 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 @ref SSelectionEntry, where a ID string can be defined. +/// +/// @param[in] heading Dialog heading name +/// @param[in] entries @ref 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 ATTRIBUTE_HIDDEN Show(const std::string& heading, + std::vector& entries, + int selected = -1, + unsigned int autoclose = 0) +{ + using namespace ::kodi::addon; + unsigned int size = static_cast(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 @ref 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 @ref 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 ATTRIBUTE_HIDDEN ShowMultiSelect(const std::string& heading, + std::vector& entries, + int autoclose = 0) +{ + using namespace ::kodi::addon; + unsigned int size = static_cast(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; +} +//------------------------------------------------------------------------------ +}; // namespace Select +/// @} + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ -- cgit v1.2.3