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/CMakeLists.txt | 8 + .../addons/kodi-dev-kit/include/kodi/gui/General.h | 176 ++++ .../kodi-dev-kit/include/kodi/gui/ListItem.h | 345 ++++++++ xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h | 915 +++++++++++++++++++++ .../include/kodi/gui/controls/Button.h | 166 ++++ .../include/kodi/gui/controls/CMakeLists.txt | 16 + .../kodi-dev-kit/include/kodi/gui/controls/Edit.h | 217 +++++ .../include/kodi/gui/controls/FadeLabel.h | 148 ++++ .../kodi-dev-kit/include/kodi/gui/controls/Image.h | 112 +++ .../kodi-dev-kit/include/kodi/gui/controls/Label.h | 118 +++ .../include/kodi/gui/controls/Progress.h | 112 +++ .../include/kodi/gui/controls/RadioButton.h | 214 +++++ .../include/kodi/gui/controls/Rendering.h | 217 +++++ .../include/kodi/gui/controls/SettingsSlider.h | 314 +++++++ .../include/kodi/gui/controls/Slider.h | 326 ++++++++ .../kodi-dev-kit/include/kodi/gui/controls/Spin.h | 416 ++++++++++ .../include/kodi/gui/controls/TextBox.h | 164 ++++ .../include/kodi/gui/dialogs/CMakeLists.txt | 14 + .../include/kodi/gui/dialogs/ContextMenu.h | 186 +++++ .../include/kodi/gui/dialogs/ExtendedProgress.h | 242 ++++++ .../include/kodi/gui/dialogs/FileBrowser.h | 302 +++++++ .../include/kodi/gui/dialogs/Keyboard.h | 404 +++++++++ .../include/kodi/gui/dialogs/Numeric.h | 346 ++++++++ .../kodi-dev-kit/include/kodi/gui/dialogs/OK.h | 101 +++ .../include/kodi/gui/dialogs/Progress.h | 244 ++++++ .../kodi-dev-kit/include/kodi/gui/dialogs/Select.h | 269 ++++++ .../include/kodi/gui/dialogs/TextViewer.h | 109 +++ .../kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h | 188 +++++ .../include/kodi/gui/gl/CMakeLists.txt | 7 + xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GL.h | 112 +++ .../kodi-dev-kit/include/kodi/gui/gl/GLonDX.h | 389 +++++++++ .../kodi-dev-kit/include/kodi/gui/gl/Shader.h | 571 +++++++++++++ .../include/kodi/gui/input/ActionIDs.h | 11 + .../include/kodi/gui/input/CMakeLists.txt | 5 + .../kodi-dev-kit/include/kodi/gui/renderHelper.h | 82 ++ 35 files changed, 7566 insertions(+) create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Select.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GL.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/gui') diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt new file mode 100644 index 0000000..8f12955 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/CMakeLists.txt @@ -0,0 +1,8 @@ +set(HEADERS General.h + ListItem.h + Window.h + renderHelper.h) + +if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_kodi_gui) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h new file mode 100644 index 0000000..85ba3f2 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/General.h @@ -0,0 +1,176 @@ +/* + * 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/general.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ + +//============================================================================== +/// @addtogroup cpp_kodi_gui_general +/// Permits the use of the required functions of the add-on to Kodi. +/// +/// These are pure functions them no other initialization need. +/// +/// It has the header @ref kodi/gui/General.h "#include " be included +/// to enjoy it. +/// + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Performs a graphical lock of rendering engine. +/// +inline void ATTRIBUTE_HIDDEN Lock() +{ + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->general->lock(); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Performs a graphical unlock of previous locked rendering engine. +/// +inline void ATTRIBUTE_HIDDEN Unlock() +{ + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->general->unlock(); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Return the the current screen height with pixel. +/// +/// @return Screen height with pixel +/// +inline int ATTRIBUTE_HIDDEN GetScreenHeight() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_height( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Return the the current screen width with pixel. +/// +/// @return Screen width with pixel +/// +inline int ATTRIBUTE_HIDDEN GetScreenWidth() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_screen_width( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Return the the current screen rendering resolution. +/// +/// @return Current screen rendering resolution +/// +inline int ATTRIBUTE_HIDDEN GetVideoResolution() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_video_resolution( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Returns the id for the current 'active' dialog as an integer. +/// +/// @return The currently active dialog Id +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// .. +/// int wid = kodi::gui::GetCurrentWindowDialogId(); +/// .. +/// ~~~~~~~~~~~~~ +/// +inline int ATTRIBUTE_HIDDEN GetCurrentWindowDialogId() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_dialog_id( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief Returns the id for the current 'active' window as an integer. +/// +/// @return The currently active window Id +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// .. +/// int wid = kodi::gui::GetCurrentWindowId(); +/// .. +/// ~~~~~~~~~~~~~ +/// +inline int ATTRIBUTE_HIDDEN GetCurrentWindowId() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_current_window_id( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_general +/// @brief To get hardware specific device context interface. +/// +/// @return A pointer to the used device with @ref cpp_kodi_Defs_HardwareContext "kodi::HardwareContext" +/// +/// @warning This function is only be supported under Windows, on all other +/// OS it return `nullptr`! +/// +/// @note Returned Windows class pointer is `ID3D11DeviceContext1`. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// .. +/// ID3D11DeviceContext1* context = static_cast(kodi::gui::GetHWContext()); +/// .. +/// ~~~~~~~~~~~~~ +/// +inline kodi::HardwareContext GetHWContext() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->general->get_hw_context( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ + +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h new file mode 100644 index 0000000..3a4d50b --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/ListItem.h @@ -0,0 +1,345 @@ +/* + * 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/list_item.h" + +#ifdef __cplusplus + +#include + +namespace kodi +{ +namespace gui +{ + +class CWindow; + +class ATTRIBUTE_HIDDEN CAddonGUIControlBase +{ +public: + KODI_GUI_LISTITEM_HANDLE GetControlHandle() const { return m_controlHandle; } + +protected: + explicit CAddonGUIControlBase(CAddonGUIControlBase* window) + : m_controlHandle(nullptr), + m_interface(::kodi::addon::CAddonBase::m_interface->toKodi), + m_Window(window) + { + } + + virtual ~CAddonGUIControlBase() = default; + + friend class CWindow; + + KODI_GUI_LISTITEM_HANDLE m_controlHandle; + AddonToKodiFuncTable_Addon* m_interface; + CAddonGUIControlBase* m_Window; + +private: + CAddonGUIControlBase() = delete; + CAddonGUIControlBase(const CAddonGUIControlBase&) = delete; + CAddonGUIControlBase& operator=(const CAddonGUIControlBase&) = delete; +}; + +class CListItem; + +//============================================================================== +/// @addtogroup cpp_kodi_gui_windows_listitem +/// @brief @cpp_class{ kodi::gui::CListItem } +/// **Selectable window list item**\n +/// The list item control is used for creating item lists in Kodi. +/// +/// The with @ref ListItem.h "#include " given +/// class is used to create a item entry for a list on window and to support it's +/// control. +/// +class ATTRIBUTE_HIDDEN CListItem : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Class constructor with parameters. + /// + /// @param[in] label [opt] Item label + /// @param[in] label2 [opt] Second Item label (if needed) + /// @param[in] path [opt] Path to where item is defined + /// + CListItem(const std::string& label = "", + const std::string& label2 = "", + const std::string& path = "") + : CAddonGUIControlBase(nullptr) + { + m_controlHandle = m_interface->kodi_gui->listItem->create(m_interface->kodiBase, label.c_str(), + label2.c_str(), path.c_str()); + } + + /* + * Constructor used for parts given by list items from addon window + * + * Related to call of "std::shared_ptr kodi::gui::CWindow::GetListItem(int listPos)" + * Not needed for addon development itself + */ + explicit CListItem(KODI_GUI_LISTITEM_HANDLE listItemHandle) : CAddonGUIControlBase(nullptr) + { + m_controlHandle = listItemHandle; + } + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Class destructor + /// + ~CListItem() override + { + m_interface->kodi_gui->listItem->destroy(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Returns the listitem label. + /// + /// @return Label of item + /// + std::string GetLabel() + { + std::string label; + char* ret = m_interface->kodi_gui->listItem->get_label(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets the listitem label. + /// + /// @param[in] label string or unicode - text string. + /// + void SetLabel(const std::string& label) + { + m_interface->kodi_gui->listItem->set_label(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Returns the second listitem label. + /// + /// @return Second label of item + /// + std::string GetLabel2() + { + std::string label; + char* ret = m_interface->kodi_gui->listItem->get_label2(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets the listitem's label2. + /// + /// @param[in] label string or unicode - text string. + /// + void SetLabel2(const std::string& label) + { + m_interface->kodi_gui->listItem->set_label2(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets the listitem's art + /// + /// @param[in] type Type of Art to set + /// - Some default art values (any string possible): + /// | value (type) | Type | + /// |:-------------:|:--------------------------------------------------| + /// | thumb | string - image filename + /// | poster | string - image filename + /// | banner | string - image filename + /// | fanart | string - image filename + /// | clearart | string - image filename + /// | clearlogo | string - image filename + /// | landscape | string - image filename + /// | icon | string - image filename + /// @return The url to use for Art + /// + std::string GetArt(const std::string& type) + { + std::string strReturn; + char* ret = m_interface->kodi_gui->listItem->get_art(m_interface->kodiBase, m_controlHandle, + type.c_str()); + if (ret != nullptr) + { + if (std::strlen(ret)) + strReturn = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return strReturn; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets the listitem's art + /// + /// @param[in] type Type of Art to set + /// @param[in] url The url to use for Art + /// - Some default art values (any string possible): + /// | value (type) | Type | + /// |:-------------:|:--------------------------------------------------| + /// | thumb | string - image filename + /// | poster | string - image filename + /// | banner | string - image filename + /// | fanart | string - image filename + /// | clearart | string - image filename + /// | clearlogo | string - image filename + /// | landscape | string - image filename + /// | icon | string - image filename + /// + void SetArt(const std::string& type, const std::string& url) + { + m_interface->kodi_gui->listItem->set_art(m_interface->kodiBase, m_controlHandle, type.c_str(), + url.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Returns the path / filename of this listitem. + /// + /// @return Path string + /// + std::string GetPath() + { + std::string strReturn; + char* ret = m_interface->kodi_gui->listItem->get_path(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + strReturn = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return strReturn; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets the listitem's path. + /// + /// @param[in] path string or unicode - path, activated when item is clicked. + /// + /// @note You can use the above as keywords for arguments. + /// + void SetPath(const std::string& path) + { + m_interface->kodi_gui->listItem->set_path(m_interface->kodiBase, m_controlHandle, path.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Sets a listitem property, similar to an infolabel. + /// + /// @param[in] key string - property name. + /// @param[in] value string or unicode - value of property. + /// + /// @note Key is NOT case sensitive. + /// You can use the above as keywords for arguments and skip certain@n + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the + /// keyword. + /// + /// Some of these are treated internally by Kodi, such as the + /// 'StartOffset' property, which is the offset in seconds at which to + /// start playback of an item. Others may be used in the skin to add + /// extra information, such as 'WatchedCount' for tvshow items + /// + void SetProperty(const std::string& key, const std::string& value) + { + m_interface->kodi_gui->listItem->set_property(m_interface->kodiBase, m_controlHandle, + key.c_str(), value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Returns a listitem property as a string, similar to an infolabel. + /// + /// @param[in] key string - property name. + /// @return string - List item property + /// + /// @note Key is NOT case sensitive.\n + /// You can use the above as keywords for arguments and skip certain + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the + /// keyword. + /// + std::string GetProperty(const std::string& key) + { + std::string label; + char* ret = m_interface->kodi_gui->listItem->get_property(m_interface->kodiBase, + m_controlHandle, key.c_str()); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief To control selection of item in list (also multiple selection, + /// in list on serveral items possible). + /// + /// @param[in] selected if true becomes set as selected + /// + void Select(bool selected) + { + m_interface->kodi_gui->listItem->select(m_interface->kodiBase, m_controlHandle, selected); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_listitem + /// @brief Returns the listitem's selected status. + /// + /// @return true if selected, otherwise false + /// + bool IsSelected() + { + return m_interface->kodi_gui->listItem->is_selected(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h new file mode 100644 index 0000000..3066b3c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/Window.h @@ -0,0 +1,915 @@ +/* + * 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/window.h" +#include "ListItem.h" +#include "input/ActionIDs.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_window_Defs Definitions, structures and enumerators +/// @ingroup cpp_kodi_gui_windows_window +/// @brief **Library definition values**\n +/// Additional values, structures and things that are used in the Window class. +/// +/// ------------------------------------------------------------------------ +/// +/// @link cpp_kodi_gui_windows_window Go back to normal functions from CWindow@endlink +/// + +//============================================================================== +/// @ingroup cpp_kodi_gui_windows_window_Defs +/// @brief **Handler for addon-sided processing class**\n +/// If the callback functions used by the window are not used directly in the +/// @ref cpp_kodi_gui_windows_window "CWindow" class and are outside of it. +/// +/// This value here corresponds to a `void*` and returns the address +/// requested by the add-on for callbacks. +/// +using ClientHandle = KODI_GUI_CLIENT_HANDLE; +//------------------------------------------------------------------------------ + +class CListItem; + +//============================================================================== +/// @addtogroup cpp_kodi_gui_windows_window +/// @brief @cpp_class{ kodi::gui::CWindow } +/// **Main window control class**\n +/// The addon uses its own skin xml file and displays it in Kodi using this class. +/// +/// The with @ref Window.h "#include " +/// included file brings support to create a window or dialog on Kodi. +/// +/// The add-on has to integrate its own @ref cpp_kodi_gui_windows_window_callbacks "callback functions" +/// in order to process the necessary user access to its window. +/// +/// +/// -------------------------------------------------------------------------- +/// +/// **Window header example:** +/// ~~~~~~~~~~~~~{.xml} +/// +/// +/// RunScript(script.foobar) +/// SetProperty(foo,bar) +/// 2 +/// 9000 +/// 0xff00ff00 +/// 50,51,509,510 +/// Window.IsActive(Home) +/// WindowOpen +/// WindowClose +/// 1 +/// +/// 40 +/// 50 +/// Window.IsActive(Home) +/// +/// MyVideos +/// +/// +/// +/// .... +/// +/// +/// ~~~~~~~~~~~~~ +/// +/// -------------------------------------------------------------------------- +/// +/// On functions defined input variable controlId (GUI control identifier) +/// is the on window.xml defined value behind type added with id="..." and +/// used to identify for changes there and on callbacks. +/// +/// ~~~~~~~~~~~~~{.xml} +/// +/// Title Label +/// ... +/// +/// +/// progress control +/// ... +/// +/// ~~~~~~~~~~~~~ +/// +/// +class ATTRIBUTE_HIDDEN CWindow : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Class constructor with needed values for window / dialog. + /// + /// Creates a new Window class. + /// + /// @param[in] xmlFilename XML file for the skin + /// @param[in] defaultSkin Default skin to use if needed not available + /// @param[in] asDialog Use window as dialog if set + /// @param[in] isMedia [opt] bool - if False, create a regular window. + /// if True, create a mediawindow. (default=false) + /// + /// @note `isMedia` value as true only usable for windows not for dialogs. + /// + CWindow(const std::string& xmlFilename, + const std::string& defaultSkin, + bool asDialog, + bool isMedia = false) + : CAddonGUIControlBase(nullptr) + { + m_controlHandle = m_interface->kodi_gui->window->create( + m_interface->kodiBase, xmlFilename.c_str(), defaultSkin.c_str(), asDialog, isMedia); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow can't create window class from Kodi !!!"); + m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, this, + CBOnInit, CBOnFocus, CBOnClick, CBOnAction, + CBGetContextButtons, CBOnContextButton); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup CWindow + /// @brief Class destructor. + /// + ~CWindow() override + { + if (m_controlHandle) + m_interface->kodi_gui->window->destroy(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Show this window. + /// + /// Shows this window by activating it, calling close() after it wil activate + /// the current window again. + /// + /// @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 @ref DoModal() instead. + /// + /// @warning If used must be the class be global present until Kodi becomes + /// closed. The creation can be done 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. + /// + bool Show() + { + return m_interface->kodi_gui->window->show(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Closes this window. + /// + /// Closes this window by activating the old window. + /// @note The window is not deleted with this method. + /// + void Close() { m_interface->kodi_gui->window->close(m_interface->kodiBase, m_controlHandle); } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Display this window until close() is called. + /// + void DoModal() + { + m_interface->kodi_gui->window->do_modal(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Gives the control with the supplied focus. + /// + /// @param[in] controlId On skin defined id of control + /// @return Return true if call and focus is successed, if false was something + /// failed to get needed skin parts + /// + bool SetFocusId(int controlId) + { + return m_interface->kodi_gui->window->set_focus_id(m_interface->kodiBase, m_controlHandle, + controlId); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Returns the id of the control which is focused. + /// + /// @return Focused control id + /// + int GetFocusId() + { + return m_interface->kodi_gui->window->get_focus_id(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To set the used label on given control id. + /// + /// @param[in] controlId Control id where label need to set + /// @param[in] label Label to use + /// + void SetControlLabel(int controlId, const std::string& label) + { + m_interface->kodi_gui->window->set_control_label(m_interface->kodiBase, m_controlHandle, + controlId, label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To set the visibility on given control id. + /// + /// @param[in] controlId Control id where visibility is changed + /// @param[in] visible Boolean value with `true` for visible, `false` for hidden + /// + void SetControlVisible(int controlId, bool visible) + { + m_interface->kodi_gui->window->set_control_visible(m_interface->kodiBase, m_controlHandle, + controlId, visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To set the selection on given control id. + /// + /// @param[in] controlId Control id where selection is changed + /// @param[in] selected Boolean value with `true` for selected, `false` for not + /// + void SetControlSelected(int controlId, bool selected) + { + m_interface->kodi_gui->window->set_control_selected(m_interface->kodiBase, m_controlHandle, + controlId, selected); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets a window property, similar to an infolabel. + /// + /// @param[in] key string - property name. + /// @param[in] value string or unicode - value of property. + /// + /// @note Key is NOT case sensitive. Setting value to an empty string is + /// equivalent to clearProperty(key).\n + /// You can use the above as keywords for arguments and skip certain + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the keyword. + /// + void SetProperty(const std::string& key, const std::string& value) + { + m_interface->kodi_gui->window->set_property(m_interface->kodiBase, m_controlHandle, key.c_str(), + value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Returns a window property as a string, similar to an infolabel. + /// + /// @param[in] key string - property name. + /// @return The property as string (if present) + /// + /// @note Key is NOT case sensitive. Setting value to an empty string is + /// equivalent to clearProperty(key).\n + /// You can use the above as keywords for arguments and skip certain + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the keyword. + /// + std::string GetProperty(const std::string& key) const + { + std::string label; + char* ret = m_interface->kodi_gui->window->get_property(m_interface->kodiBase, m_controlHandle, + key.c_str()); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets a window property with integer value + /// + /// @param[in] key string - property name. + /// @param[in] value integer value to set + /// + void SetPropertyInt(const std::string& key, int value) + { + m_interface->kodi_gui->window->set_property_int(m_interface->kodiBase, m_controlHandle, + key.c_str(), value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Returns a window property with integer value + /// + /// @param[in] key string - property name. + /// @return integer value of property + /// + int GetPropertyInt(const std::string& key) const + { + return m_interface->kodi_gui->window->get_property_int(m_interface->kodiBase, m_controlHandle, + key.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets a window property with boolean value + /// + /// @param[in] key string - property name. + /// @param[in] value boolean value to set + /// + void SetPropertyBool(const std::string& key, bool value) + { + m_interface->kodi_gui->window->set_property_bool(m_interface->kodiBase, m_controlHandle, + key.c_str(), value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Returns a window property with boolean value + /// + /// @param[in] key string - property name. + /// @return boolean value of property + /// + bool GetPropertyBool(const std::string& key) const + { + return m_interface->kodi_gui->window->get_property_bool(m_interface->kodiBase, m_controlHandle, + key.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets a window property with double value + /// + /// @param[in] key string - property name. + /// @param[in] value double value to set + /// + void SetPropertyDouble(const std::string& key, double value) + { + m_interface->kodi_gui->window->set_property_double(m_interface->kodiBase, m_controlHandle, + key.c_str(), value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Returns a window property with double value + /// + /// @param[in] key string - property name. + /// @return double value of property + /// + double GetPropertyDouble(const std::string& key) const + { + return m_interface->kodi_gui->window->get_property_double(m_interface->kodiBase, + m_controlHandle, key.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Remove all present properties from window + /// + void ClearProperties() + { + m_interface->kodi_gui->window->clear_properties(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Clears the specific window property. + /// + /// @param[in] key string - property name. + /// + /// @note Key is NOT case sensitive. Equivalent to SetProperty(key, "") + /// You can use the above as keywords for arguments and skip certain + /// optional arguments. + /// Once you use a keyword, all following arguments require the + /// keyword. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// .. + /// ClearProperty('Category') + /// .. + /// ~~~~~~~~~~~~~ + /// + void ClearProperty(const std::string& key) + { + m_interface->kodi_gui->window->clear_property(m_interface->kodiBase, m_controlHandle, + key.c_str()); + } + //---------------------------------------------------------------------------- + + /// @{ + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Function delete all entries in integrated list. + /// + void ClearList() + { + m_interface->kodi_gui->window->clear_item_list(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To add a list item in the on window integrated list. + /// + /// @param[in] item List item to add + /// @param[in] itemPosition [opt] The position for item, default is on end + /// + void AddListItem(std::shared_ptr item, int itemPosition = -1) + { + m_interface->kodi_gui->window->add_list_item(m_interface->kodiBase, m_controlHandle, + item->m_controlHandle, itemPosition); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To add a list item based upon string in the on window integrated list. + /// + /// @param[in] item List item to add + /// @param[in] itemPosition [opt] The position for item, default is on end + /// + void AddListItem(const std::string item, int itemPosition = -1) + { + m_interface->kodi_gui->window->add_list_item( + m_interface->kodiBase, m_controlHandle, + std::make_shared(item)->m_controlHandle, itemPosition); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Remove list item on position. + /// + /// @param[in] itemPosition List position to remove + /// + void RemoveListItem(int itemPosition) + { + m_interface->kodi_gui->window->remove_list_item_from_position(m_interface->kodiBase, + m_controlHandle, itemPosition); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Remove item with given control class from list. + /// + /// @param[in] item List item control class to remove + /// + void RemoveListItem(std::shared_ptr item) + { + m_interface->kodi_gui->window->remove_list_item(m_interface->kodiBase, m_controlHandle, + item->m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To get list item control class on wanted position. + /// + /// @param[in] listPos Position from where control is needed + /// @return The list item control class or null if not found + /// + /// @warning Function returns a new generated **CListItem** class! + /// + std::shared_ptr GetListItem(int listPos) + { + KODI_GUI_LISTITEM_HANDLE handle = m_interface->kodi_gui->window->get_list_item( + m_interface->kodiBase, m_controlHandle, listPos); + if (!handle) + return std::shared_ptr(); + + return std::make_shared(handle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To set position of selected part in list. + /// + /// @param[in] listPos Position to use + /// + void SetCurrentListPosition(int listPos) + { + m_interface->kodi_gui->window->set_current_list_position(m_interface->kodiBase, m_controlHandle, + listPos); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To get current selected position in list + /// + /// @return Current list position + /// + int GetCurrentListPosition() + { + return m_interface->kodi_gui->window->get_current_list_position(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To get the amount of entries in the list. + /// + /// @return Size of in window integrated control class + /// + int GetListSize() + { + return m_interface->kodi_gui->window->get_list_size(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets a container property, similar to an infolabel. + /// + /// @param[in] key string - property name. + /// @param[in] value string or unicode - value of property. + /// + /// @note Key is NOT case sensitive.\n + /// You can use the above as keywords for arguments and skip certain + /// optional arguments.\n + /// Once you use a keyword, all following arguments require the keyword. + /// + void SetContainerProperty(const std::string& key, const std::string& value) + { + m_interface->kodi_gui->window->set_container_property(m_interface->kodiBase, m_controlHandle, + key.c_str(), value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Sets the content type of the container. + /// + /// @param[in] value string or unicode - content value. + /// + /// __Available content types__ + /// | Name | Media | + /// |:-----------:|:-----------------------------------------| + /// | actors | Videos + /// | addons | Addons, Music, Pictures, Programs, Videos + /// | albums | Music, Videos + /// | artists | Music, Videos + /// | countries | Music, Videos + /// | directors | Videos + /// | files | Music, Videos + /// | games | Games + /// | genres | Music, Videos + /// | images | Pictures + /// | mixed | Music, Videos + /// | movies | Videos + /// | Musicvideos | Music, Videos + /// | playlists | Music, Videos + /// | seasons | Videos + /// | sets | Videos + /// | songs | Music + /// | studios | Music, Videos + /// | tags | Music, Videos + /// | tvshows | Videos + /// | videos | Videos + /// | years | Music, Videos + /// + void SetContainerContent(const std::string& value) + { + m_interface->kodi_gui->window->set_container_content(m_interface->kodiBase, m_controlHandle, + value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief Get the id of the currently visible container. + /// + /// @return currently visible container id + /// + int GetCurrentContainerId() + { + return m_interface->kodi_gui->window->get_current_container_id(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + /// @} + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window + /// @brief To inform Kodi that it need to render region new. + /// + void MarkDirtyRegion() + { + return m_interface->kodi_gui->window->mark_dirty_region(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @defgroup cpp_kodi_gui_windows_window_callbacks Callback functions from Kodi to add-on + /// @ingroup cpp_kodi_gui_windows_window + /// @{ + /// @brief GUI window callback functions.\n + /// Functions to handle control callbacks from Kodi + /// + /// ------------------------------------------------------------------------ + /// + /// @link cpp_kodi_gui_windows_window Go back to normal functions from CWindow@endlink + // + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief OnInit method. + /// + /// @return Return true if initialize was done successful + /// + /// + virtual bool OnInit() { return false; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief OnFocus method. + /// + /// @param[in] controlId GUI control identifier + /// @return Return true if focus condition was handled there or false to handle + /// them by Kodi itself + /// + /// + virtual bool OnFocus(int controlId) { return false; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief OnClick method. + /// + /// @param[in] controlId GUI control identifier + /// @return Return true if click was handled there or false to handle them by + /// Kodi itself + /// + /// + virtual bool OnClick(int controlId) { return false; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief OnAction method. + /// + /// @param[in] actionId The action id to perform, see + /// @ref kodi_key_action_ids to get list of + /// them + /// @return Return true if action was handled there + /// or false to handle them by Kodi itself + /// + /// + /// This method will receive all actions that the main program will send + /// to this window. + /// + /// @note + /// - By default, only the @c ADDON_ACTION_PREVIOUS_MENU and @c ADDON_ACTION_NAV_BACK actions are handled. + /// - Overwrite this method to let your code handle all actions. + /// - Don't forget to capture @ref ADDON_ACTION_PREVIOUS_MENU or @ref ADDON_ACTION_NAV_BACK, else the user can't close this window. + /// + /// + ///---------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// .. + /// // Window used with parent / child way + /// bool cYOUR_CLASS::OnAction(ADDON_ACTION actionId) + /// { + /// switch (action) + /// { + /// case ADDON_ACTION_PREVIOUS_MENU: + /// case ADDON_ACTION_NAV_BACK: + /// printf("action recieved: previous"); + /// Close(); + /// return true; + /// case ADDON_ACTION_SHOW_INFO: + /// printf("action recieved: show info"); + /// break; + /// case ADDON_ACTION_STOP: + /// printf("action recieved: stop"); + /// break; + /// case ADDON_ACTION_PAUSE: + /// printf("action recieved: pause"); + /// break; + /// default: + /// break; + /// } + /// return false; + /// } + /// .. + /// ~~~~~~~~~~~~~ + /// + virtual bool OnAction(ADDON_ACTION actionId) + { + switch (actionId) + { + case ADDON_ACTION_PREVIOUS_MENU: + case ADDON_ACTION_NAV_BACK: + Close(); + return true; + default: + break; + } + return false; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief Get context menu buttons for list entry. + /// + /// @param[in] itemNumber Selected list item entry + /// @param[in] buttons List where context menus becomes added with his + /// identifier and name + /// + virtual void GetContextButtons(int itemNumber, + std::vector>& buttons) + { + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief Called after selection in context menu. + /// + /// @param[in] itemNumber Selected list item entry + /// @param[in] button The pressed button id + /// @return true if handled, otherwise false + /// + virtual bool OnContextButton(int itemNumber, unsigned int button) { return false; } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_window_callbacks + /// @brief **Set independent callbacks** + /// + /// If the class is used independent (with "new CWindow") and + /// not as parent (with \"cCLASS_own : public @ref cpp_kodi_gui_windows_window "kodi::gui::CWindow"\") from own must be the + /// callback from Kodi to add-on overdriven with own functions! + /// + /// @param[in] cbhdl The pointer to own handle data structure / class + /// @param[in] CBOnInit Own defined window init function + /// @param[in] CBOnFocus Own defined focus function + /// @param[in] CBOnClick Own defined click function + /// @param[in] CBOnAction Own defined action function + /// @param[in] CBGetContextButtons [opt] To get context menu entries for + /// lists function + /// @param[in] CBOnContextButton [opt] Used context menu entry function + /// + /// + ///---------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.cpp} + /// ... + /// + /// bool OnInit(kodi::gui::ClientHandle cbhdl) + /// { + /// ... + /// return true; + /// } + /// + /// bool OnFocus(kodi::gui::ClientHandle cbhdl, int controlId) + /// { + /// ... + /// return true; + /// } + /// + /// bool OnClick(kodi::gui::ClientHandle cbhdl, int controlId) + /// { + /// ... + /// return true; + /// } + /// + /// bool OnAction(kodi::gui::ClientHandle cbhdl, ADDON_ACTION actionId) + /// { + /// ... + /// return true; + /// } + /// + /// ... + /// // Somewhere where you create the window + /// CWindow myWindow = new CWindow; + /// myWindow->SetIndependentCallbacks(myWindow, OnInit, OnFocus, OnClick, OnAction); + /// ... + /// ~~~~~~~~~~~~~ + /// + void SetIndependentCallbacks(kodi::gui::ClientHandle cbhdl, + bool (*CBOnInit)(kodi::gui::ClientHandle cbhdl), + bool (*CBOnFocus)(kodi::gui::ClientHandle cbhdl, int controlId), + bool (*CBOnClick)(kodi::gui::ClientHandle cbhdl, int controlId), + bool (*CBOnAction)(kodi::gui::ClientHandle cbhdl, + ADDON_ACTION actionId), + void (*CBGetContextButtons)(kodi::gui::ClientHandle cbhdl, + int itemNumber, + gui_context_menu_pair* buttons, + unsigned int* size) = nullptr, + bool (*CBOnContextButton)(kodi::gui::ClientHandle cbhdl, + int itemNumber, + unsigned int button) = nullptr) + { + if (!cbhdl || !CBOnInit || !CBOnFocus || !CBOnClick || !CBOnAction) + { + kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CWindow::%s called with nullptr !!!", __FUNCTION__); + return; + } + + m_interface->kodi_gui->window->set_callbacks(m_interface->kodiBase, m_controlHandle, cbhdl, + CBOnInit, CBOnFocus, CBOnClick, CBOnAction, + CBGetContextButtons, CBOnContextButton); + } + //---------------------------------------------------------------------------- + /// @} + +private: + static bool CBOnInit(KODI_GUI_CLIENT_HANDLE cbhdl) + { + return static_cast(cbhdl)->OnInit(); + } + + static bool CBOnFocus(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId) + { + return static_cast(cbhdl)->OnFocus(controlId); + } + + static bool CBOnClick(KODI_GUI_CLIENT_HANDLE cbhdl, int controlId) + { + return static_cast(cbhdl)->OnClick(controlId); + } + + static bool CBOnAction(KODI_GUI_CLIENT_HANDLE cbhdl, ADDON_ACTION actionId) + { + return static_cast(cbhdl)->OnAction(actionId); + } + + static void CBGetContextButtons(KODI_GUI_CLIENT_HANDLE cbhdl, + int itemNumber, + gui_context_menu_pair* buttons, + unsigned int* size) + { + std::vector> buttonList; + static_cast(cbhdl)->GetContextButtons(itemNumber, buttonList); + if (!buttonList.empty()) + { + unsigned int presentSize = static_cast(buttonList.size()); + if (presentSize > *size) + kodi::Log(ADDON_LOG_WARNING, "GetContextButtons: More as allowed '%i' entries present!", + *size); + else + *size = presentSize; + for (unsigned int i = 0; i < *size; ++i) + { + buttons[i].id = buttonList[i].first; + strncpy(buttons[i].name, buttonList[i].second.c_str(), ADDON_MAX_CONTEXT_ENTRY_NAME_LENGTH); + } + } + } + + static bool CBOnContextButton(KODI_GUI_CLIENT_HANDLE cbhdl, int itemNumber, unsigned int button) + { + return static_cast(cbhdl)->OnContextButton(itemNumber, button); + } +}; + +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h new file mode 100644 index 0000000..873a549 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Button.h @@ -0,0 +1,166 @@ +/* + * 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 "../../c-api/gui/controls/button.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CButton Control Button +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CButton } +/// **Standard push button control for window**\n +/// The button control is used for creating push buttons in Kodi. +/// +/// You can choose the position, size, and look of the button, as well as +/// choosing what action(s) should be performed when pushed. +/// +/// It has the header @ref Button.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref skin_Button_control "button control" +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CButton : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CButton(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_button( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, "kodi::gui::CButton can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Destructor. + /// + ~CButton() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_button->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_button->set_enabled(m_interface->kodiBase, m_controlHandle, + enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief To set the text string on button. + /// + /// @param[in] label Text to show + /// + void SetLabel(const std::string& label) + { + m_interface->kodi_gui->control_button->set_label(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Get the used text from button. + /// + /// @return Text shown + /// + std::string GetLabel() const + { + std::string label; + char* ret = + m_interface->kodi_gui->control_button->get_label(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief If two labels are used for button becomes it set with them. + /// + /// @param[in] label Text for second label + /// + void SetLabel2(const std::string& label) + { + m_interface->kodi_gui->control_button->set_label2(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CButton + /// @brief Get the second label if present. + /// + /// @return Second label + /// + std::string GetLabel2() const + { + std::string label; + char* ret = + m_interface->kodi_gui->control_button->get_label2(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt new file mode 100644 index 0000000..3fdab01 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/CMakeLists.txt @@ -0,0 +1,16 @@ +set(HEADERS Button.h + Edit.h + FadeLabel.h + Image.h + Label.h + Progress.h + RadioButton.h + Rendering.h + SettingsSlider.h + Slider.h + Spin.h + TextBox.h) + +if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_kodi_gui_controls) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h new file mode 100644 index 0000000..00c6231 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Edit.h @@ -0,0 +1,217 @@ +/* + * 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 "../../c-api/gui/controls/edit.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CEdit Control Edit +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CEdit } +/// **Editable window text control used as an input control for the osd keyboard +/// and other input fields**\n +/// The edit control allows a user to input text in Kodi. +/// +/// You can choose the font, size, colour, location and header of the text to be +/// displayed. +/// +/// It has the header @ref Edit.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin partfor a @ref skin_Edit_control "edit control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// + +//============================================================================== +// see gui/definition.h for use of group "cpp_kodi_gui_windows_controls_CEdit_Defs" +/// +/// @defgroup cpp_kodi_gui_windows_controls_CEdit_Defs Definitions, structures and enumerators +/// @ingroup cpp_kodi_gui_windows_controls_CEdit +/// @brief **Library definition values** +/// + +class ATTRIBUTE_HIDDEN CEdit : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CEdit(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_edit( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::control::CEdit can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Destructor. + /// + ~CEdit() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_edit->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_edit->set_enabled(m_interface->kodiBase, m_controlHandle, + enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief To set the text string on edit control. + /// + /// @param[in] label Text to show + /// + void SetLabel(const std::string& label) + { + m_interface->kodi_gui->control_edit->set_label(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Returns the text heading for this edit control. + /// + /// @return Heading text + /// + std::string GetLabel() const + { + std::string label; + char* ret = + m_interface->kodi_gui->control_edit->get_label(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Set's text heading for this edit control. + /// + /// @param[in] text string or unicode - text string. + /// + void SetText(const std::string& text) + { + m_interface->kodi_gui->control_edit->set_text(m_interface->kodiBase, m_controlHandle, + text.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Returns the text value for this edit control. + /// + /// @return Text value of control + /// + std::string GetText() const + { + std::string text; + char* ret = + m_interface->kodi_gui->control_edit->get_text(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + text = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return text; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief Set the cursor position on text. + /// + /// @param[in] position The position to set + /// + void SetCursorPosition(unsigned int position) + { + m_interface->kodi_gui->control_edit->set_cursor_position(m_interface->kodiBase, m_controlHandle, + position); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief To get current cursor position on text field. + /// + /// @return The current cursor position + /// + unsigned int GetCursorPosition() + { + return m_interface->kodi_gui->control_edit->get_cursor_position(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CEdit + /// @brief To set field input type which are defined on @ref AddonGUIInputType. + /// + /// @param[in] type The @ref AddonGUIInputType "Add-on input type" to use + /// @param[in] heading The heading text for related keyboard dialog + /// + void SetInputType(AddonGUIInputType type, const std::string& heading) + { + m_interface->kodi_gui->control_edit->set_input_type(m_interface->kodiBase, m_controlHandle, + static_cast(type), heading.c_str()); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h new file mode 100644 index 0000000..01847fb --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/FadeLabel.h @@ -0,0 +1,148 @@ +/* + * 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 "../../c-api/gui/controls/fade_label.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CFadeLabel Control Fade Label +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CFadeLabel } +/// **Window control used to show multiple pieces of text in the same position, +/// by fading from one to the other**\n +/// The fade label control is used for displaying multiple pieces of text in +/// the same space in Kodi. +/// +/// You can choose the font, size, colour, location and contents of the text to +/// be displayed. The first piece of information to display fades in over 50 +/// frames, then scrolls off to the left. Once it is finished scrolling off +/// screen, the second piece of information fades in and the process repeats. +/// A fade label control is not supported in a list container. +/// +/// It has the header @ref FadeLabel.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Fade_Label_Control "fade label control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CFadeLabel : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CFadeLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_fade_label( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CFadeLabel can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief Destructor. + /// + ~CFadeLabel() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_fade_label->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief To add additional text string on fade label. + /// + /// @param[in] label Text to show + /// + void AddLabel(const std::string& label) + { + m_interface->kodi_gui->control_fade_label->add_label(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief Get the used text from button. + /// + /// @return Text shown + /// + std::string GetLabel() const + { + std::string label; + char* ret = m_interface->kodi_gui->control_fade_label->get_label(m_interface->kodiBase, + m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief To enable or disable scrolling on fade label. + /// + /// @param[in] scroll To enable scrolling set to true, otherwise is disabled + /// + void SetScrolling(bool scroll) + { + m_interface->kodi_gui->control_fade_label->set_scrolling(m_interface->kodiBase, m_controlHandle, + scroll); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CFadeLabel + /// @brief To reset al inserted labels. + /// + void Reset() + { + m_interface->kodi_gui->control_fade_label->reset(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h new file mode 100644 index 0000000..9dc493e --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Image.h @@ -0,0 +1,112 @@ +/* + * 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 "../../c-api/gui/controls/image.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================ +/// @defgroup cpp_kodi_gui_windows_controls_CImage Control Image +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CImage } +/// **Window control used to show an image.**\n +/// The image control is used for displaying images in Kodi. You can choose +/// the position, size, transparency and contents of the image to be displayed. +/// +/// It has the header @ref Image.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Image_Control "image control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CImage : public CAddonGUIControlBase +{ +public: + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CImage + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CImage(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_image( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CImage can't create control class from Kodi !!!"); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CImage + /// @brief Destructor. + /// + ~CImage() override = default; + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CImage + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_image->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CImage + /// @brief To set the filename used on image control. + /// + /// @param[in] filename Image file to use + /// @param[in] useCache To define storage of image, default is in cache, if + /// false becomes it loaded always on changes again + /// + void SetFileName(const std::string& filename, bool useCache = true) + { + m_interface->kodi_gui->control_image->set_filename(m_interface->kodiBase, m_controlHandle, + filename.c_str(), useCache); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CImage + /// @brief To set set the diffuse color on image. + /// + /// @param[in] colorDiffuse Color to use for diffuse + /// + void SetColorDiffuse(uint32_t colorDiffuse) + { + m_interface->kodi_gui->control_image->set_color_diffuse(m_interface->kodiBase, m_controlHandle, + colorDiffuse); + } + //-------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h new file mode 100644 index 0000000..d10b85f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Label.h @@ -0,0 +1,118 @@ +/* + * 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 "../../c-api/gui/controls/label.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CLabel Control Label +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CLabel } +/// **Window control used to show some lines of text**\n +/// The label control is used for displaying text in Kodi. You can choose +/// the font, size, colour, location and contents of the text to be displayed. +/// +/// It has the header @ref Label.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Label_Control "label control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CLabel : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CLabel + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CLabel(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_label( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CLabel can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CLabel + /// @brief Destructor. + /// + ~CLabel() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CLabel + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_label->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CLabel + /// @brief To set the text string on label. + /// + /// @param[in] text Text to show + /// + void SetLabel(const std::string& text) + { + m_interface->kodi_gui->control_label->set_label(m_interface->kodiBase, m_controlHandle, + text.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CLabel + /// @brief Get the used text from control. + /// + /// @return Used text on label control + /// + std::string GetLabel() const + { + std::string label; + char* ret = + m_interface->kodi_gui->control_label->get_label(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h new file mode 100644 index 0000000..83b16aa --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Progress.h @@ -0,0 +1,112 @@ +/* + * 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 "../../c-api/gui/controls/progress.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CProgress Control Progress +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CProgress } +/// **Window control to show the progress of a particular operation**\n +/// The progress control is used to show the progress of an item that may take +/// a long time, or to show how far through a movie you are. +/// +/// You can choose the position, size, and look of the progress control. +/// +/// It has the header @ref Progress.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Progress_Control "progress control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CProgress : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CProgress + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CProgress(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_progress( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CProgress can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CProgress + /// @brief Destructor. + /// + ~CProgress() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CProgress + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_progress->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CProgress + /// @brief To set Percent position of control. + /// + /// @param[in] percent The percent position to use + /// + void SetPercentage(float percent) + { + m_interface->kodi_gui->control_progress->set_percentage(m_interface->kodiBase, m_controlHandle, + percent); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CProgress + /// @brief Get the active percent position of progress bar. + /// + /// @return Progress position as percent + /// + float GetPercentage() const + { + return m_interface->kodi_gui->control_progress->get_percentage(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h new file mode 100644 index 0000000..3b6a23c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/RadioButton.h @@ -0,0 +1,214 @@ +/* + * 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 "../../c-api/gui/controls/radio_button.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CRadioButton Control Radio Button +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CRadioButton } +/// **Window control for a radio button (as used for on/off settings)**\n +/// The radio button control is used for creating push button on/off settings +/// in Kodi. +/// +/// You can choose the position, size, and look of the button. When the user +/// clicks on the radio button, the state will change, toggling the extra +/// textures (textureradioon and textureradiooff). Used for settings +/// controls. +/// +/// It has the header @ref RadioButton.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Radio_button_control "radio button control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +/// +/// -------------------------------------------------------------------------- +/// **Example:** +/// ~~~~~~~~~~~~cpp +/// #include +/// +/// #define MY_RADIO_BUTTON_CONTROL 1 +/// +/// class CMyWindow : public kodi::gui::CWindow +/// { +/// public: +/// CMyWindow() +/// +/// void ShowWindow(); +/// +/// bool OnInit() override; +/// bool OnClick(int controlId) override; +/// +/// private: +/// kodi::gui::controls::CSpin m_myRadioButtonControl; +/// }; +/// +/// CMyWindow::CMyWindow() +/// : kodi::gui::CWindow("my_skin.xml", "skin.estuary", true, false), +/// m_myRadioButtonControl(this, MY_RADIO_BUTTON_CONTROL) +/// { +/// } +/// +/// void CMyWindow::ShowWindow() +/// { +/// kodi::gui::CWindow::DoModal(); +/// } +/// +/// bool CMyWindow::OnInit() +/// { +/// m_myRadioButtonControl.SetSelected(false); // can also on skin set to default +/// return true; +/// } +/// +/// bool CMyWindow::OnClick(int controlId) +/// { +/// if (controlId == MY_RADIO_BUTTON_CONTROL) +/// { +/// bool selected = m_myRadioButtonControl.IsSelected(); +/// ... +/// } +/// return true; +/// } +/// return false; +/// } +/// ~~~~~~~~~~~~ +/// +class ATTRIBUTE_HIDDEN CRadioButton : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CRadioButton(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_radio_button( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CRadioButton can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief Destructor. + /// + ~CRadioButton() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton. + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_radio_button->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_radio_button->set_enabled(m_interface->kodiBase, m_controlHandle, + enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief To set the text string on radio button. + /// + /// @param[in] label Text to show + /// + void SetLabel(const std::string& label) + { + m_interface->kodi_gui->control_radio_button->set_label(m_interface->kodiBase, m_controlHandle, + label.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief Get the used text from control. + /// + /// @return Text shown + /// + std::string GetLabel() const + { + std::string label; + char* ret = m_interface->kodi_gui->control_radio_button->get_label(m_interface->kodiBase, + m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + label = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return label; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief To set radio button condition to on or off. + /// + /// @param[in] selected true set radio button to selection on, otherwise off + /// + void SetSelected(bool selected) + { + m_interface->kodi_gui->control_radio_button->set_selected(m_interface->kodiBase, + m_controlHandle, selected); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CRadioButton + /// @brief Get the current selected condition of radio button. + /// + /// @return Selected condition + /// + bool IsSelected() const + { + return m_interface->kodi_gui->control_radio_button->is_selected(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h new file mode 100644 index 0000000..7f5feef --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h @@ -0,0 +1,217 @@ +/* + * 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 "../../c-api/gui/controls/rendering.h" +#include "../Window.h" +#include "../renderHelper.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================ +/// @defgroup cpp_kodi_gui_windows_controls_CRendering Control Rendering +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CRendering } +/// **Window control for rendering own parts**\n +/// This rendering control is used when own parts are needed. +/// +/// You have the control over them to render direct OpenGL or DirectX content +/// to the screen set by the size of them. +/// +/// Alternative can be the virtual functions from t his been ignored if the +/// callbacks are defined by the @ref CRendering_SetIndependentCallbacks +/// function and class is used as single and not as a parent class. +/// +/// It has the header @ref Rendering.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Addon_Rendering_control "rendering control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CRendering : public CAddonGUIControlBase +{ +public: + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CRendering(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_render_addon( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (m_controlHandle) + m_interface->kodi_gui->control_rendering->set_callbacks(m_interface->kodiBase, + m_controlHandle, this, OnCreateCB, + OnRenderCB, OnStopCB, OnDirtyCB); + else + kodi::Log(ADDON_LOG_FATAL, "kodi::gui::controls::%s can't create control class from Kodi !!!", + __FUNCTION__); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Destructor. + /// + ~CRendering() override + { + m_interface->kodi_gui->control_rendering->destroy(m_interface->kodiBase, m_controlHandle); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief To create rendering control on Add-on. + /// + /// Function creates the needed rendering control for Kodi which becomes + /// handled and processed from Add-on + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + /// @param[in] x Horizontal position + /// @param[in] y Vertical position + /// @param[in] w Width of control + /// @param[in] h Height of control + /// @param[in] device The device to use. For OpenGL is empty on Direct X is + /// the needed device send. + /// @return Add-on needs to return true if successed, otherwise false. + /// + /// @note The @ref kodi::HardwareContext is basically a simple pointer which + /// has to be changed to the desired format at the corresponding places using + /// `static_cast<...>(...)`. + /// + virtual bool Create(int x, int y, int w, int h, kodi::HardwareContext device) { return false; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Render process call from Kodi. + /// + /// @note This is callback function from Kodi to Add-on and not to use for + /// calls from add-on to this function. + /// + virtual void Render() {} + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Call from Kodi to stop rendering process. + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + virtual void Stop() {} + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Call from Kodi where add-on becomes asked about dirty rendering + /// region. + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + /// @return True if a render region is dirty and need rendering. + /// + virtual bool Dirty() { return false; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @anchor CRendering_SetIndependentCallbacks + /// @brief If the class is used independent (with "new CRendering") + /// and not as parent (with "cCLASS_own : CRendering") from own must + /// be the callback from Kodi to add-on overdriven with own functions! + /// + /// @param[in] cbhdl Addon related class point where becomes given as value on + /// related functions. + /// @param[in] CBCreate External creation function pointer, see also @ref Create + /// about related values + /// @param[in] CBRender External render function pointer, see also @ref Render + /// about related values + /// @param[in] CBStop External stop function pointer, see also @ref Stop + /// about related values + /// @param[in] CBDirty External dirty function pointer, see also @ref Dirty + /// about related values + /// + void SetIndependentCallbacks(kodi::gui::ClientHandle cbhdl, + bool (*CBCreate)(kodi::gui::ClientHandle cbhdl, + int x, + int y, + int w, + int h, + kodi::HardwareContext device), + void (*CBRender)(kodi::gui::ClientHandle cbhdl), + void (*CBStop)(kodi::gui::ClientHandle cbhdl), + bool (*CBDirty)(kodi::gui::ClientHandle cbhdl)) + { + if (!cbhdl || !CBCreate || !CBRender || !CBStop || !CBDirty) + { + kodi::Log(ADDON_LOG_ERROR, "kodi::gui::controls::%s called with nullptr !!!", __FUNCTION__); + return; + } + + m_interface->kodi_gui->control_rendering->set_callbacks( + m_interface->kodiBase, m_controlHandle, cbhdl, CBCreate, CBRender, CBStop, CBDirty); + } + //-------------------------------------------------------------------------- + +private: + /* + * Defined callback functions from Kodi to add-on, for use in parent / child system + * (is private)! + */ + static bool OnCreateCB( + KODI_GUI_CLIENT_HANDLE cbhdl, int x, int y, int w, int h, ADDON_HARDWARE_CONTEXT device) + { + static_cast(cbhdl)->m_renderHelper = kodi::gui::GetRenderHelper(); + return static_cast(cbhdl)->Create(x, y, w, h, device); + } + + static void OnRenderCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + if (!static_cast(cbhdl)->m_renderHelper) + return; + static_cast(cbhdl)->m_renderHelper->Begin(); + static_cast(cbhdl)->Render(); + static_cast(cbhdl)->m_renderHelper->End(); + } + + static void OnStopCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + static_cast(cbhdl)->Stop(); + static_cast(cbhdl)->m_renderHelper = nullptr; + } + + static bool OnDirtyCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + return static_cast(cbhdl)->Dirty(); + } + + std::shared_ptr m_renderHelper; +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h new file mode 100644 index 0000000..5557fc4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/SettingsSlider.h @@ -0,0 +1,314 @@ +/* + * 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 "../../c-api/gui/controls/settings_slider.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CSettingsSlider Control Settings Slider +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CSettingsSlider } +/// **Window control for moveable slider with text name**\n +/// The settings slider control is used in the settings screens for when an +/// option is best specified on a sliding scale. +/// +/// You can choose the position, size, and look of the slider control. It is +/// basically a cross between the button control and a slider control. It has a +/// label and focus and non focus textures, as well as a slider control on the +/// right. +/// +/// It has the header @ref SettingsSlider.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Settings_Slider_Control "settings slider control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CSettingsSlider : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CSettingsSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_settings_slider( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CSettingsSlider can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Destructor. + /// + ~CSettingsSlider() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_settings_slider->set_visible(m_interface->kodiBase, + m_controlHandle, visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_settings_slider->set_enabled(m_interface->kodiBase, + m_controlHandle, enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To set the text string on settings slider. + /// + /// @param[in] text Text to show + /// + void SetText(const std::string& text) + { + m_interface->kodi_gui->control_settings_slider->set_text(m_interface->kodiBase, m_controlHandle, + text.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To reset slider on defaults. + /// + void Reset() + { + m_interface->kodi_gui->control_settings_slider->reset(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To set the the range as integer of slider, e.g. -10 is the slider + /// start and e.g. +10 is the from here defined position where it reach the + /// end. + /// + /// Ad default is the range from 0 to 100. + /// + /// The integer interval is as default 1 and can be changed with + /// @ref SetIntInterval. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetIntRange(int start, int end) + { + m_interface->kodi_gui->control_settings_slider->set_int_range(m_interface->kodiBase, + m_controlHandle, start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Set the slider position with the given integer value. The Range + /// must be defined with a call from @ref SetIntRange before. + /// + /// @param[in] value Position in range to set with integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetIntValue(int value) + { + m_interface->kodi_gui->control_settings_slider->set_int_value(m_interface->kodiBase, + m_controlHandle, value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To get the current position as integer value. + /// + /// @return The position as integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + int GetIntValue() const + { + return m_interface->kodi_gui->control_settings_slider->get_int_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To set the interval steps of slider, as default is it 1. If it + /// becomes changed with this function will a step of the user with the + /// value fixed here be executed. + /// + /// @param[in] interval Intervall step to set. + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetIntInterval(int interval) + { + m_interface->kodi_gui->control_settings_slider->set_int_interval(m_interface->kodiBase, + m_controlHandle, interval); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Sets the percent of the slider. + /// + /// @param[in] percent float - Percent value of slide + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetPercentage(float percent) + { + m_interface->kodi_gui->control_settings_slider->set_percentage(m_interface->kodiBase, + m_controlHandle, percent); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Returns a float of the percent of the slider. + /// + /// @return float - Percent of slider + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + float GetPercentage() const + { + return m_interface->kodi_gui->control_settings_slider->get_percentage(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To set the the range as float of slider, e.g. -25.0 is the slider + /// start and e.g. +25.0 is the from here defined position where it reach + /// the end. + /// + /// As default is the range 0.0 to 1.0. + /// + /// The float interval is as default 0.1 and can be changed with + /// @ref SetFloatInterval. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetFloatRange(float start, float end) + { + m_interface->kodi_gui->control_settings_slider->set_float_range(m_interface->kodiBase, + m_controlHandle, start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief Set the slider position with the given float value. The Range can + /// be defined with a call from @ref SetIntRange before, as default it + /// is 0.0 to 1.0. + /// + /// @param[in] value Position in range to set with float + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetFloatValue(float value) + { + m_interface->kodi_gui->control_settings_slider->set_float_value(m_interface->kodiBase, + m_controlHandle, value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To get the current position as float value. + /// + /// @return The position as float + /// + float GetFloatValue() const + { + return m_interface->kodi_gui->control_settings_slider->get_float_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSettingsSlider + /// @brief To set the interval steps of slider, as default is it 0.1 If it + /// becomes changed with this function will a step of the user with the + /// value fixed here be executed. + /// + /// @param[in] interval Intervall step to set. + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetFloatInterval(float interval) + { + m_interface->kodi_gui->control_settings_slider->set_float_interval(m_interface->kodiBase, + m_controlHandle, interval); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h new file mode 100644 index 0000000..077def8 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Slider.h @@ -0,0 +1,326 @@ +/* + * 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 "../../c-api/gui/controls/slider.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CSlider Control Slider +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CSlider } +/// **Window control for moveable slider**\n +/// The slider control is used for things where a sliding bar best represents +/// the operation at hand (such as a volume control or seek control). +/// +/// You can choose the position, size, and look of the slider control. +/// +/// It has the header @ref Slider.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Slider_Control "slider control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CSlider : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CSlider(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_slider( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CSlider can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Destructor. + /// + ~CSlider() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_slider->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_slider->set_enabled(m_interface->kodiBase, m_controlHandle, + enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To reset slider on defaults. + /// + void Reset() + { + m_interface->kodi_gui->control_slider->reset(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief With GetDescription becomes a string value of position returned. + /// + /// @return Text string about current slider position + /// + /// The following are the text definition returned from this: + /// | Value | Without range selection | With range selection | + /// |:---------:|:------------------------|:-------------------------------| + /// | float | %2.2f | [%2.2f, %2.2f] | + /// | integer | %i | [%i, %i] | + /// | percent | %i%% | [%i%%, %i%%] | + /// + std::string GetDescription() const + { + std::string text; + char* ret = m_interface->kodi_gui->control_slider->get_description(m_interface->kodiBase, + m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + text = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return text; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To set the the range as integer of slider, e.g. -10 is the slider + /// start and e.g. +10 is the from here defined position where it reach the + /// end. + /// + /// Ad default is the range from 0 to 100. + /// + /// The integer interval is as default 1 and can be changed with + /// @ref SetIntInterval. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + void SetIntRange(int start, int end) + { + m_interface->kodi_gui->control_slider->set_int_range(m_interface->kodiBase, m_controlHandle, + start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Set the slider position with the given integer value. The Range + /// must be defined with a call from @ref SetIntRange before. + /// + /// @param[in] value Position in range to set with integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + void SetIntValue(int value) + { + m_interface->kodi_gui->control_slider->set_int_value(m_interface->kodiBase, m_controlHandle, + value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To get the current position as integer value. + /// + /// @return The position as integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + int GetIntValue() const + { + return m_interface->kodi_gui->control_slider->get_int_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To set the interval steps of slider, as default is it 1. If it + /// becomes changed with this function will a step of the user with the + /// value fixed here be executed. + /// + /// @param[in] interval Intervall step to set. + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + void SetIntInterval(int interval) + { + m_interface->kodi_gui->control_slider->set_int_interval(m_interface->kodiBase, m_controlHandle, + interval); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Sets the percent of the slider. + /// + /// @param[in] percent float - Percent value of slide + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + void SetPercentage(float percent) + { + m_interface->kodi_gui->control_slider->set_percentage(m_interface->kodiBase, m_controlHandle, + percent); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Returns a float of the percent of the slider. + /// + /// @return float - Percent of slider + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + float GetPercentage() const + { + return m_interface->kodi_gui->control_slider->get_percentage(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To set the the range as float of slider, e.g. -25.0 is the slider + /// start and e.g. +25.0 is the from here defined position where it reach + /// the end. + /// + /// As default is the range 0.0 to 1.0. + /// + /// The float interval is as default 0.1 and can be changed with + /// @ref SetFloatInterval. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetFloatRange(float start, float end) + { + m_interface->kodi_gui->control_slider->set_float_range(m_interface->kodiBase, m_controlHandle, + start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief Set the slider position with the given float value. The Range + /// can be defined with a call from @ref SetIntRange before, as default it + /// is 0.0 to 1.0. + /// + /// @param[in] value Position in range to set with float + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only one + /// each can be used. + /// + void SetFloatValue(float value) + { + m_interface->kodi_gui->control_slider->set_float_value(m_interface->kodiBase, m_controlHandle, + value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To get the current position as float value. + /// + /// @return The position as float + /// + float GetFloatValue() const + { + return m_interface->kodi_gui->control_slider->get_float_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSlider + /// @brief To set the interval steps of slider, as default is it 0.1 If it + /// becomes changed with this function will a step of the user with the + /// value fixed here be executed. + /// + /// @param[in] interval Intervall step to set. + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used. + /// + void SetFloatInterval(float interval) + { + m_interface->kodi_gui->control_slider->set_float_interval(m_interface->kodiBase, + m_controlHandle, interval); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h new file mode 100644 index 0000000..6c55243 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Spin.h @@ -0,0 +1,416 @@ +/* + * 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 "../../c-api/gui/controls/spin.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_windows_controls_CSpin Control Spin +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CSpin } +/// **Window control used for cycling up/down controls**\n +/// The settings spin control is used in the settings screens for when a list +/// of options can be chosen from using up/down arrows. +/// +/// You can choose the position, size, and look of the spin control. It is +/// basically a cross between the button control and a spin control. It has a +/// label and focus and non focus textures, as well as a spin control on the +/// right. +/// +/// It has the header @ref Spin.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Spin_Control "spin control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +/// -------------------------------------------------------------------------- +/// **Example:** +/// ~~~~~~~~~~~~cpp +/// #include +/// +/// #define MY_SPIN_CONTROL 1 +/// +/// class CMyWindow : public kodi::gui::CWindow +/// { +/// public: +/// CMyWindow() +/// +/// void ShowWindow(); +/// +/// bool OnInit() override; +/// bool OnClick(int controlId) override; +/// +/// private: +/// kodi::gui::controls::CSpin m_mySpinControl; +/// }; +/// +/// CMyWindow::CMyWindow() +/// : kodi::gui::CWindow("my_skin.xml", "skin.estuary", true, false), +/// m_mySpinControl(this, MY_SPIN_CONTROL) +/// { +/// } +/// +/// void CMyWindow::ShowWindow() +/// { +/// kodi::gui::CWindow::DoModal(); +/// } +/// +/// bool CMyWindow::OnInit() +/// { +/// m_mySpinControl.SetType(kodi::gui::controls::ADDON_SPIN_CONTROL_TYPE_INT); +/// m_mySpinControl.SetIntRange(1, 80); +/// return true; +/// } +/// +/// bool CMyWindow::OnClick(int controlId) +/// { +/// if (controlId == MY_SPIN_CONTROL) +/// { +/// int value = m_mySpinControl.GetIntValue(); +/// ... +/// } +/// return true; +/// } +/// return false; +/// } +/// ~~~~~~~~~~~~ +/// + + +//============================================================================== +/// @ingroup cpp_kodi_gui_windows_controls_CSpin +/// @anchor AddonGUISpinControlType +/// @brief The values here defines the used value format for steps on +/// spin control. +/// +typedef enum AddonGUISpinControlType +{ + /// One spin step interpreted as integer + ADDON_SPIN_CONTROL_TYPE_INT = 1, + /// One spin step interpreted as floating point value + ADDON_SPIN_CONTROL_TYPE_FLOAT = 2, + /// One spin step interpreted as text string + ADDON_SPIN_CONTROL_TYPE_TEXT = 3, + /// One spin step interpreted as a page change value + ADDON_SPIN_CONTROL_TYPE_PAGE = 4 +} AddonGUISpinControlType; +//------------------------------------------------------------------------------ + +class ATTRIBUTE_HIDDEN CSpin : public CAddonGUIControlBase +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CSpin(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_spin( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CSpin can't create control class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Destructor. + /// + ~CSpin() override = default; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_spin->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Set's the control's enabled/disabled state. + /// + /// @param[in] enabled If true enabled, otherwise disabled + /// + void SetEnabled(bool enabled) + { + m_interface->kodi_gui->control_spin->set_enabled(m_interface->kodiBase, m_controlHandle, + enabled); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To set the text string on spin control. + /// + /// @param[in] text Text to show as name for spin + /// + void SetText(const std::string& text) + { + m_interface->kodi_gui->control_spin->set_text(m_interface->kodiBase, m_controlHandle, + text.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To reset spin control to defaults. + /// + void Reset() + { + m_interface->kodi_gui->control_spin->reset(m_interface->kodiBase, m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To set the with SpinControlType defined types of spin. + /// + /// @param[in] type The type to use + /// + /// @note See description of @ref AddonGUISpinControlType for available types. + /// + void SetType(AddonGUISpinControlType type) + { + m_interface->kodi_gui->control_spin->set_type(m_interface->kodiBase, m_controlHandle, + (int)type); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To add a label entry in spin defined with a value as string. + /// + /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. + /// + /// @param[in] label Label string to view on skin + /// @param[in] value String value to use for selection of them + /// + void AddLabel(const std::string& label, const std::string& value) + { + m_interface->kodi_gui->control_spin->add_string_label(m_interface->kodiBase, m_controlHandle, + label.c_str(), value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To add a label entry in spin defined with a value as integer. + /// + /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_INT to use this function. + /// + /// @param[in] label Label string to view on skin + /// @param[in] value Integer value to use for selection of them. + /// + void AddLabel(const std::string& label, int value) + { + m_interface->kodi_gui->control_spin->add_int_label(m_interface->kodiBase, m_controlHandle, + label.c_str(), value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To change the spin to position with them string as value. + /// + /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. + /// + /// @param[in] value String value to change to + /// + void SetStringValue(const std::string& value) + { + m_interface->kodi_gui->control_spin->set_string_value(m_interface->kodiBase, m_controlHandle, + value.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To get the current spin control position with text string value. + /// + /// Format must be set to @ref ADDON_SPIN_CONTROL_TYPE_TEXT to use this function. + /// + /// @return Currently selected string value + /// + std::string GetStringValue() const + { + std::string value; + char* ret = m_interface->kodi_gui->control_spin->get_string_value(m_interface->kodiBase, + m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + value = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return value; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To set the the range as integer of slider, e.g. -10 is the slider + /// start and e.g. +10 is the from here defined position where it reach the + /// end. + /// + /// Ad default is the range from 0 to 100. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + void SetIntRange(int start, int end) + { + m_interface->kodi_gui->control_spin->set_int_range(m_interface->kodiBase, m_controlHandle, + start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Set the slider position with the given integer value. The Range + /// must be defined with a call from @ref SetIntRange before. + /// + /// @param[in] value Position in range to set with integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + void SetIntValue(int value) + { + m_interface->kodi_gui->control_spin->set_int_value(m_interface->kodiBase, m_controlHandle, + value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To get the current position as integer value. + /// + /// @return The position as integer + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + int GetIntValue() const + { + return m_interface->kodi_gui->control_spin->get_int_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To set the the range as float of spin, e.g. -25.0 is the spin + /// start and e.g. +25.0 is the from here defined position where it reach + /// the end. + /// + /// As default is the range 0.0 to 1.0. + /// + /// The float interval is as default 0.1 and can be changed with + /// @ref SetFloatInterval. + /// + /// @param[in] start Integer start value + /// @param[in] end Integer end value + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + void SetFloatRange(float start, float end) + { + m_interface->kodi_gui->control_spin->set_float_range(m_interface->kodiBase, m_controlHandle, + start, end); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief Set the spin position with the given float value. The Range + /// can be defined with a call from @ref SetIntRange before, as default it + /// is 0.0 to 1.0. + /// + /// @param[in] value Position in range to set with float + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + void SetFloatValue(float value) + { + m_interface->kodi_gui->control_spin->set_float_value(m_interface->kodiBase, m_controlHandle, + value); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To get the current position as float value. + /// + /// @return The position as float + /// + float GetFloatValue() const + { + return m_interface->kodi_gui->control_spin->get_float_value(m_interface->kodiBase, + m_controlHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_windows_controls_CSpin + /// @brief To set the interval steps of spin, as default is it 0.1 If it + /// becomes changed with this function will a step of the user with the + /// value fixed here be executed. + /// + /// @param[in] interval Intervall step to set. + /// + /// @note Percent, floating point or integer are alone possible. Combining + /// these different values can be not together and can, therefore, only + /// one each can be used and must be defined with @ref SetType before. + /// + void SetFloatInterval(float interval) + { + m_interface->kodi_gui->control_spin->set_float_interval(m_interface->kodiBase, m_controlHandle, + interval); + } + //---------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h new file mode 100644 index 0000000..2634568 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/TextBox.h @@ -0,0 +1,164 @@ +/* + * 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 "../../c-api/gui/controls/text_box.h" +#include "../Window.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================ +/// @defgroup cpp_kodi_gui_windows_controls_CTextBox Control Text Box +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CTextBox } +/// **Used to show a multi-page piece of text**\n +/// The text box control can be used to display descriptions, help texts or +/// other larger texts. +/// +/// It corresponds to the representation which is also to be seen on the +/// @ref CDialogTextViewer. +/// +/// It has the header @ref TextBox.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Text_Box "textbox control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CTextBox : public CAddonGUIControlBase +{ +public: + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief Construct a new control. + /// + /// @param[in] window related window control class + /// @param[in] controlId Used skin xml control id + /// + CTextBox(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_text_box( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (!m_controlHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::controls::CTextBox can't create control class from Kodi !!!"); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief Destructor. + /// + ~CTextBox() override = default; + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief Set the control on window to visible. + /// + /// @param[in] visible If true visible, otherwise hidden + /// + void SetVisible(bool visible) + { + m_interface->kodi_gui->control_text_box->set_visible(m_interface->kodiBase, m_controlHandle, + visible); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief To reset box an remove all the text. + /// + void Reset() { m_interface->kodi_gui->control_text_box->reset(m_controlHandle, m_controlHandle); } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief To set the text on box. + /// + /// @param[in] text Text to show + /// + void SetText(const std::string& text) + { + m_interface->kodi_gui->control_text_box->set_text(m_interface->kodiBase, m_controlHandle, + text.c_str()); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief Get the used text from control. + /// + /// @return Text shown + /// + std::string GetText() const + { + std::string text; + char* ret = + m_interface->kodi_gui->control_text_box->get_text(m_interface->kodiBase, m_controlHandle); + if (ret != nullptr) + { + if (std::strlen(ret)) + text = ret; + m_interface->free_string(m_interface->kodiBase, ret); + } + return text; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief To scroll text on other position. + /// + /// @param[in] position The line position to scroll to + /// + void Scroll(unsigned int position) + { + m_interface->kodi_gui->control_text_box->scroll(m_interface->kodiBase, m_controlHandle, + position); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CTextBox + /// @brief To set automatic scrolling of textbox + /// + /// Specifies the timing and conditions of any autoscrolling this textbox + /// should have. Times are in milliseconds. The content is delayed for the + /// given delay, then scrolls at a rate of one line per time interval until + /// the end. If the repeat tag is present, it then delays for the repeat + /// time, fades out over 1 second, and repeats. It does not wrap or reset + /// to the top at the end of the scroll. + /// + /// @param[in] delay Content delay + /// @param[in] time One line per time interval + /// @param[in] repeat Delays with given time, fades out over 1 second, and + /// repeats + /// + void SetAutoScrolling(int delay, int time, int repeat) + { + m_interface->kodi_gui->control_text_box->set_auto_scrolling( + m_interface->kodiBase, m_controlHandle, delay, time, repeat); + } + //-------------------------------------------------------------------------- +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt new file mode 100644 index 0000000..9aaee4f --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/CMakeLists.txt @@ -0,0 +1,14 @@ +set(HEADERS ContextMenu.h + ExtendedProgress.h + FileBrowser.h + Keyboard.h + Numeric.h + OK.h + Progress.h + Select.h + TextViewer.h + YesNo.h) + +if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_kodi_gui_dialogs) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h new file mode 100644 index 0000000..b576b9a --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ContextMenu.h @@ -0,0 +1,186 @@ +/* + * 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/context_menu.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_ContextMenu Dialog Context Menu +/// @ingroup cpp_kodi_gui_dialogs +/// @brief @cpp_namespace{ kodi::gui::dialogs::ContextMenu } +/// **Context menu dialog**@n +/// The function listed below permits the call of a dialogue as context menu to +/// select of an entry as a key +/// +/// It has the header @ref ContextMenu.h "#include " +/// be included to enjoy it. +/// +/// +namespace ContextMenu +{ +//============================================================================== +/// @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 +/// { +/// "Test 1", +/// "Test 2", +/// "Test 3", +/// "Test 4", +/// "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 ATTRIBUTE_HIDDEN Show(const std::string& heading, + const std::vector& entries) +{ + 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].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 +/// { +/// { "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 ATTRIBUTE_HIDDEN Show(const std::string& heading, + const std::vector>& entries) +{ + 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].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 ATTRIBUTE_HIDDEN Show(const std::string& heading, + const std::vector>& entries) +{ + 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].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 ContextMenu + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h new file mode 100644 index 0000000..c650483 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/ExtendedProgress.h @@ -0,0 +1,242 @@ +/* + * 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/extended_progress.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_CExtendedProgress Dialog Extended Progress +/// @ingroup cpp_kodi_gui_dialogs +/// @brief @cpp_class{ kodi::gui::dialogs::ExtendedProgress } +/// **Progress dialog shown for background work** +/// +/// The with @ref ExtendedProgress.h "#include " +/// given class are basically used to create Kodi's extended progress. +/// +/// +/// -------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// kodi::gui::dialogs::CExtendedProgress *ext_progress = new kodi::gui::dialogs::CExtendedProgress("Test Extended progress"); +/// ext_progress->SetText("Test progress"); +/// for (unsigned int i = 0; i < 50; i += 10) +/// { +/// ext_progress->SetProgress(i, 100); +/// sleep(1); +/// } +/// +/// ext_progress->SetTitle("Test Extended progress - Second round"); +/// ext_progress->SetText("Test progress - Step 2"); +/// +/// for (unsigned int i = 50; i < 100; i += 10) +/// { +/// ext_progress->SetProgress(i, 100); +/// sleep(1); +/// } +/// delete ext_progress; +/// ~~~~~~~~~~~~~ +/// +class ATTRIBUTE_HIDDEN CExtendedProgress +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// Construct a new dialog. + /// + /// @param[in] title [opt] Title string + /// + 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()); + if (!m_DialogHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::CDialogExtendedProgress can't create window class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// Destructor. + /// + ~CExtendedProgress() + { + using namespace ::kodi::addon; + if (m_DialogHandle) + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->delete_dialog( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief Get the used title. + /// + /// @return Title string + /// + std::string Title() const + { + using namespace ::kodi::addon; + std::string text; + char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_title( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + if (strMsg != nullptr) + { + if (std::strlen(strMsg)) + text = strMsg; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + strMsg); + } + return text; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief To set the title of dialog. + /// + /// @param[in] title Title string + /// + void SetTitle(const std::string& title) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_title( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, title.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief Get the used text information string. + /// + /// @return Text string + /// + std::string Text() const + { + using namespace ::kodi::addon; + std::string text; + char* strMsg = CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_text( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + if (strMsg != nullptr) + { + if (std::strlen(strMsg)) + text = strMsg; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + strMsg); + } + return text; + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief To set the used text information string. + /// + /// @param[in] text Information text to set + /// + void SetText(const std::string& text) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_text( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, text.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief To ask dialog is finished. + /// + /// @return True if on end + /// + bool IsFinished() const + { + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->is_finished( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief Mark progress finished. + /// + void MarkFinished() + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->mark_finished( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief Get the current progress position as percent. + /// + /// @return Position + /// + float Percentage() const + { + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->get_percentage( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief To set the current progress position as percent. + /// + /// @param[in] percentage Position to use from 0.0 to 100.0 + /// + void SetPercentage(float percentage) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_percentage( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CExtendedProgress + /// @brief To set progress position with predefined places. + /// + /// @param[in] currentItem Place position to use + /// @param[in] itemCount Amount of used places + /// + void SetProgress(int currentItem, int itemCount) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogExtendedProgress->set_progress( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, currentItem, itemCount); + } + //---------------------------------------------------------------------------- + +private: + KODI_GUI_HANDLE m_DialogHandle; +}; + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h new file mode 100644 index 0000000..244c76c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/FileBrowser.h @@ -0,0 +1,302 @@ +/* + * 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/filebrowser.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_FileBrowser Dialog File Browser +/// @ingroup cpp_kodi_gui_dialogs +/// @brief @cpp_namespace{ kodi::gui::dialogs::FileBrowser } +/// **File browser dialog**\n +/// The functions listed below of the class "FileBrowser" offer the possibility +/// to select to a file by the user of the add-on. +/// +/// It allows all the options that are possible in Kodi itself and offers all +/// support file types. +/// +/// It has the header @ref FileBrowser.h "#include " +/// be included to enjoy it. +/// +namespace FileBrowser +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief Directory selection dialog. +/// +/// @param[in] shares With Shares becomes the available start folders be set +/// @param[in] heading Dialog header name +/// @param[in,out] path As in the path to start and return value about +/// selected directory +/// @param[in] writeOnly [opt] If set only writeable folders are shown +/// @return False if selection becomes canceled +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// // Example show directory selection dialog with on 'share' (first value) +/// // defined directory types. +/// // +/// // If this becomes leaved empty and 'directory' is empty goes it to the +/// // base path of the hard disk. +/// // +/// // Also can be with path written to 'directory' before the dialog forced +/// // to a start place. +/// std::string directory; +/// bool ret = kodi::gui::dialogs::FileBrowser::ShowAndGetDirectory("local|network|removable", +/// "Test directory selection", +/// directory, +/// false); +/// fprintf(stderr, "Selected directory is : %s and was %s\n", directory.c_str(), ret ? "OK" : "Canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetDirectory(const std::string& shares, + const std::string& heading, + std::string& path, + bool writeOnly = false) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_directory( + CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), path.c_str(), + &retString, writeOnly); + if (retString != nullptr) + { + if (std::strlen(retString)) + path = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief File selection dialog. +/// +/// @param[in] shares With Shares becomes the available start folders be set. +/// @param[in] mask The mask to filter visible files, e.g. ".m3u|.pls|.b4s|.wpl" +/// @param[in] heading Dialog header name +/// @param[in,out] path As in the path to start and Return value about selected +/// file +/// @param[in] useThumbs [opt] If set show thumbs if possible on dialog +/// @param[in] useFileDirectories [opt] If set also packages (e.g. *.zip) are +/// handled as directories. +/// @return False if selection becomes canceled +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetFile(const std::string& shares, + const std::string& mask, + const std::string& heading, + std::string& path, + bool useThumbs = false, + bool useFileDirectories = false) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file( + CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), mask.c_str(), heading.c_str(), + path.c_str(), &retString, useThumbs, useFileDirectories); + if (retString != nullptr) + { + if (std::strlen(retString)) + path = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief File selection from a directory. +/// +/// @param[in] directory The directory name where the dialog start, possible are +/// normal names and kodi's special names +/// @param[in] mask The mask to filter visible files, e.g. ".m3u|.pls|.b4s|.wpl" +/// @param[in] heading Dialog header name +/// @param[in,out] path As in the path to start and Return value about selected +/// file +/// @param[in] useThumbs [opt] If set show thumbs if possible on dialog +/// @param[in] useFileDirectories [opt] If set also packages (e.g. *.zip) are +/// handled as directories +/// @param[in] singleList [opt] +/// @return False if selection becomes canceled +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetFileFromDir(const std::string& directory, + const std::string& mask, + const std::string& heading, + std::string& path, + bool useThumbs = false, + bool useFileDirectories = false, + bool singleList = false) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = + CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_from_dir( + CAddonBase::m_interface->toKodi->kodiBase, directory.c_str(), mask.c_str(), + heading.c_str(), path.c_str(), &retString, useThumbs, useFileDirectories, singleList); + if (retString != nullptr) + { + if (std::strlen(retString)) + path = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief File selection dialog to get several in to a list. +/// +/// @param[in] shares With Shares becomes the available start folders be set. +/// @param[in] mask The mask to filter visible files, e.g. ".m3u|.pls|.b4s|.wpl" +/// @param[in] heading Dialog header name +/// @param[out] fileList Return value about selected files +/// @param[in] useThumbs [opt] If set show thumbs if possible on dialog. +/// @param[in] useFileDirectories [opt] If set also packages (e.g. *.zip) are +/// handled as directories. +/// @return False if selection becomes canceled. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetFileList(const std::string& shares, + const std::string& mask, + const std::string& heading, + std::vector& fileList, + bool useThumbs = false, + bool useFileDirectories = false) +{ + using namespace ::kodi::addon; + char** list = nullptr; + unsigned int listSize = 0; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_file_list( + CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), mask.c_str(), heading.c_str(), + &list, &listSize, useThumbs, useFileDirectories); + if (ret) + { + for (unsigned int i = 0; i < listSize; ++i) + fileList.emplace_back(list[i]); + CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( + CAddonBase::m_interface->toKodi->kodiBase, &list, listSize); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief Source selection dialog. +/// +/// @param[in,out] path As in the path to start and Return value about selected +/// source +/// @param[in] allowNetworkShares Allow also access to network +/// @param[in] additionalShare [opt] With additionalShare becomes the available +/// start folders be set. +/// @param[in] type [opt] +/// @return False if selection becomes canceled +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetSource(std::string& path, + bool allowNetworkShares, + const std::string& additionalShare = "", + const std::string& type = "") +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_source( + CAddonBase::m_interface->toKodi->kodiBase, path.c_str(), &retString, allowNetworkShares, + additionalShare.c_str(), type.c_str()); + if (retString != nullptr) + { + if (std::strlen(retString)) + path = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief Image selection dialog. +/// +/// @param[in] shares With Shares becomes the available start folders be set +/// @param[in] heading Dialog header name +/// @param[out] path Return value about selected image +/// @return False if selection becomes canceled +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetImage(const std::string& shares, + const std::string& heading, + std::string& path) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image( + CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), path.c_str(), + &retString); + if (retString != nullptr) + { + if (std::strlen(retString)) + path = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_FileBrowser +/// @brief Image selection dialog to get several in to a list. +/// +/// @param[in] shares With Shares becomes the available start folders be set +/// @param[in] heading Dialog header name +/// @param[out] file_list Return value about selected images +/// @return False if selection becomes canceled +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetImageList(const std::string& shares, + const std::string& heading, + std::vector& file_list) +{ + using namespace ::kodi::addon; + char** list = nullptr; + unsigned int listSize = 0; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->show_and_get_image_list( + CAddonBase::m_interface->toKodi->kodiBase, shares.c_str(), heading.c_str(), &list, &listSize); + if (ret) + { + for (unsigned int i = 0; i < listSize; ++i) + file_list.emplace_back(list[i]); + CAddonBase::m_interface->toKodi->kodi_gui->dialogFileBrowser->clear_file_list( + CAddonBase::m_interface->toKodi->kodiBase, &list, listSize); + } + return ret; +} +//------------------------------------------------------------------------------ +}; // namespace FileBrowser + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h new file mode 100644 index 0000000..710b7dd --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Keyboard.h @@ -0,0 +1,404 @@ +/* + * 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/keyboard.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//================================================================================ +/// @defgroup cpp_kodi_gui_dialogs_Keyboard Dialog Keyboard +/// @ingroup cpp_kodi_gui_dialogs +/// @brief @cpp_namespace{ kodi::gui::dialogs::Keyboard } +/// **Keyboard dialogs**\n +/// The functions listed below have to be permitted by the user for the +/// representation of a keyboard around an input. +/// +/// The class supports several kinds, from an easy text choice up to the +/// passport Word production and their confirmation for add-on. +/// +/// It has the header @ref Keyboard.h "#include " +/// be included to enjoy it. +/// +namespace Keyboard +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Show keyboard with initial value `text` and replace with result +/// string. +/// +/// @param[in,out] text Overwritten with user input if return=true. +/// @param[in] heading String shown on dialog title. +/// @param[in] allowEmptyResult Whether a blank password is valid or not. +/// @param[in] hiddenInput [opt] The inserted input is not shown as text. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// // The example shows the display of keyboard call dialog at Kodi from the add-on. +/// // Below all values are set, however, can last two (hidden input = false and autoCloseMs = 0) +/// // to be released if not needed. +/// std::string text = "Please change me to them want you want"; // It can be leaved empty or a entry text added +/// bool bRet = ::kodi::gui::dialogs::Keyboard::ShowAndGetInput(text, +/// "Demonstration text entry", +/// true, +/// false, +/// 0); +/// fprintf(stderr, "Written keyboard input is : '%s' and was %s\n", +/// text.c_str(), bRet ? "OK" : "Canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, + const std::string& heading, + bool allowEmptyResult, + bool hiddenInput = false, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = + CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input_with_head( + CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, heading.c_str(), + allowEmptyResult, hiddenInput, autoCloseMs); + if (retString != nullptr) + { + text = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief The example shows the display of keyboard call dialog at Kodi +/// from the add-on. +/// +/// @param[out] text Overwritten with user input if return=true. +/// @param[in] allowEmptyResult If set to true keyboard can also exited without +/// entered text. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(std::string& text, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_input( + CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, allowEmptyResult, + autoCloseMs); + if (retString != nullptr) + { + text = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Shows keyboard and prompts for a password. Differs from +/// `ShowAndVerifyNewPassword()` in that no second verification. +/// +/// @param[in,out] newPassword Overwritten with user input if return=true. +/// @param[in] heading String shown on dialog title. +/// @param[in] allowEmptyResult Whether a blank password is valid or not. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, + const std::string& heading, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard + ->show_and_get_new_password_with_head( + CAddonBase::m_interface->toKodi->kodiBase, newPassword.c_str(), &retString, + heading.c_str(), allowEmptyResult, autoCloseMs); + if (retString != nullptr) + { + newPassword = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Shows keyboard and prompts for a password. Differs from +/// `ShowAndVerifyNewPassword()` in that no second verification. +/// +/// @param[in,out] newPassword Overwritten with user input if return=true. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetNewPassword(std::string& newPassword, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_new_password( + CAddonBase::m_interface->toKodi->kodiBase, newPassword.c_str(), &retString, autoCloseMs); + if (retString != nullptr) + { + newPassword = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Show keyboard twice to get and confirm a user-entered password +/// string. +/// +/// @param[out] newPassword Overwritten with user input if return=true. +/// @param[in] heading String shown on dialog title. +/// @param[in] allowEmptyResult +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// #include +/// +/// // The example below shows the complete use of keyboard dialog for password +/// // check. If only one check from add-on needed can be function with retries +/// // set to '0' called alone. +/// // +/// // The use of MD5 translated password is always required for the check on Kodi! +/// +/// int maxretries = 3; +/// // Password names need to be send as md5 sum to kodi. +/// std::string password; +/// kodi::GetMD5("kodi", password); +/// +/// // To the loop about password checks. +/// int ret; +/// for (unsigned int i = 0; i < maxretries; i++) +/// { +/// // Ask the user about the password. +/// ret = ::kodi::gui::dialogs::Keyboard::ShowAndVerifyPassword(password, "Demo password call for PW 'kodi'", i, 0); +/// if (ret == 0) +/// { +/// fprintf(stderr, "Password successfull confirmed after '%i' tries\n", i+1); +/// break; +/// } +/// else if (ret < 0) +/// { +/// fprintf(stderr, "Canceled editing on try '%i'\n", i+1); +/// break; +/// } +/// else // if (ret > 0) +/// { +/// fprintf(stderr, "Wrong password entered on try '%i'\n", i+1); +/// } +/// } +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, + const std::string& heading, + bool allowEmptyResult, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard + ->show_and_verify_new_password_with_head(CAddonBase::m_interface->toKodi->kodiBase, + &retString, heading.c_str(), + allowEmptyResult, autoCloseMs); + if (retString != nullptr) + { + newPassword = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Show keyboard twice to get and confirm a user-entered password +/// string. +/// +/// @param[out] newPassword Overwritten with user input if return=true. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = + CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_new_password( + CAddonBase::m_interface->toKodi->kodiBase, &retString, autoCloseMs); + if (retString != nullptr) + { + newPassword = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Show keyboard and verify user input against `password`. +/// +/// @param[in,out] password Value to compare against user input. +/// @param[in] heading String shown on dialog title. +/// @param[in] retries If greater than 0, shows "Incorrect password, %d retries +/// left" on dialog line 2, else line 2 is blank. +/// @param[in] autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog +/// open indefinitely. +/// @return 0 if successful display and user input. 1 if unsuccessful input. +/// -1 if no user input or canceled editing. +/// +inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(std::string& password, + const std::string& heading, + int retries, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + int ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_verify_password( + CAddonBase::m_interface->toKodi->kodiBase, password.c_str(), &retString, heading.c_str(), + retries, autoCloseMs); + if (retString != nullptr) + { + password = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Shows a filter related keyboard. +/// +/// @param[in,out] text Overwritten with user input if return=true. +/// @param[in] searching Use dialog for search and send our search message in +/// safe way (only the active window needs it) +/// - header name if true is "Enter search string" +/// - header name if false is "Enter value" +/// @param autoCloseMs [opt] To close the dialog after a specified time, in +/// milliseconds, default is 0 which keeps the dialog open +/// indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetFilter(std::string& text, + bool searching, + unsigned int autoCloseMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->show_and_get_filter( + CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), &retString, searching, autoCloseMs); + if (retString != nullptr) + { + text = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Send a text to a visible keyboard. +/// +/// @param[in] text Overwritten with user input if return=true. +/// @param[in] closeKeyboard [opt] The open dialog is if also closed on 'true'. +/// @return true if successful done, false if unsuccessful or keyboard not +/// present. +/// +inline bool ATTRIBUTE_HIDDEN SendTextToActiveKeyboard(const std::string& text, + bool closeKeyboard = false) +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->send_text_to_active_keyboard( + CAddonBase::m_interface->toKodi->kodiBase, text.c_str(), closeKeyboard); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Keyboard +/// @brief Check for visible keyboard on GUI. +/// +/// @return true if keyboard present, false if not present +/// +inline bool ATTRIBUTE_HIDDEN IsKeyboardActivated() +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogKeyboard->is_keyboard_activated( + CAddonBase::m_interface->toKodi->kodiBase); +} +//------------------------------------------------------------------------------ +}; // namespace Keyboard + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h new file mode 100644 index 0000000..835a8d4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Numeric.h @@ -0,0 +1,346 @@ +/* + * 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/numeric.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_Numeric Dialog Numeric +/// @ingroup cpp_kodi_gui_dialogs +/// @{ +/// @brief @cpp_namespace{ kodi::gui::dialogs::Numeric } +/// **Numeric dialogs**\n +/// The functions listed below have to be permitted by the user for the +/// representation of a numeric keyboard around an input. +/// +/// The class supports several kinds, from an easy number choice up to the +/// passport Word production and their confirmation for add-on. +/// +/// It has the header @ref Numeric.h "#include " +/// be included to enjoy it. +/// +namespace Numeric +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to get numeric new password +/// +/// @param[out] newPassword String to preload into the keyboard accumulator. +/// Overwritten with user input if return=true. +/// Returned in MD5 format. +/// @return true if successful display and user input entry/re-entry. false if +/// unsuccessful display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndVerifyNewPassword(std::string& newPassword) +{ + using namespace ::kodi::addon; + char* pw = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_new_password( + CAddonBase::m_interface->toKodi->kodiBase, &pw); + if (pw != nullptr) + { + newPassword = pw; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, pw); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to verify numeric password. +/// +/// @param[in] password Password to compare with user input, need +/// in MD5 format. +/// @param[in] heading Heading to display +/// @param[in] retries If greater than 0, shows "Incorrect +/// password, %d retries left" on dialog +/// line 2, else line 2 is blank. +/// @return Possible values: +/// - 0 if successful display and user input. +/// - 1 if unsuccessful input. +/// - -1 if no user input or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include // fprintf +/// #include +/// #include +/// +/// // The example below shows the complete use of keyboard dialog for password +/// // check. If only one check from add-on needed can be function with retries +/// // set to '0' called alone. +/// // +/// // The use of MD5 translated password is always required for the check on Kodi! +/// +/// int maxretries = 3; +/// +/// // Password names need to be send as md5 sum to kodi. +/// std::string password = kodi::GetMD5("1234"); +/// +/// // To the loop about password checks. +/// int ret; +/// for (unsigned int i = 0; i < maxretries; i++) +/// { +/// // Ask the user about the password. +/// ret = kodi::gui::dialogs::Numeric::ShowAndVerifyPassword(password, "Demo numeric password call for PW '1234'", i); +/// if (ret == 0) +/// { +/// fprintf(stderr, "Numeric password successfull confirmed after '%i' tries\n", i+1); +/// break; +/// } +/// else if (ret < 0) +/// { +/// fprintf(stderr, "Canceled editing on try '%i'\n", i+1); +/// break; +/// } +/// else // if (ret > 0) +/// { +/// fprintf(stderr, "Wrong numeric password entered on try '%i'\n", i+1); +/// } +/// } +/// ~~~~~~~~~~~~~ +/// +inline int ATTRIBUTE_HIDDEN ShowAndVerifyPassword(const std::string& password, + const std::string& heading, + int retries) +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_password( + CAddonBase::m_interface->toKodi->kodiBase, password.c_str(), heading.c_str(), retries); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to verify numeric password +/// +/// @param[in,out] toVerify Value to compare against user input. +/// @param[in] heading Heading to display +/// @param[in] verifyInput If set as true we verify the users input versus +/// toVerify. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndVerifyInput(std::string& toVerify, + const std::string& heading, + bool verifyInput) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_verify_input( + CAddonBase::m_interface->toKodi->kodiBase, toVerify.c_str(), &retString, heading.c_str(), + verifyInput); + if (retString != nullptr) + { + toVerify = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to get time value. +/// +/// @param[out] time Overwritten with user input if return=true and time +/// inserted. +/// @param[in] heading Heading to display. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include // printf +/// #include // time_t, struct tm, time, localtime, strftime +/// #include +/// +/// time_t rawtime; +/// struct tm * timeinfo; +/// char buffer [10]; +/// +/// time (&rawtime); +/// timeinfo = localtime(&rawtime); +/// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetTime(*timeinfo, "Selected time test call"); +/// strftime(buffer, sizeof(buffer), "%H:%M.", timeinfo); +/// printf("Selected time it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetTime(tm& time, const std::string& heading) +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_time( + CAddonBase::m_interface->toKodi->kodiBase, &time, heading.c_str()); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to get date value. +/// +/// @param[in,out] date Overwritten with user input if return=true and date +/// inserted. +/// @param[in] heading Heading to display +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include // printf +/// #include // time_t, struct tm, time, localtime, strftime +/// #include +/// +/// time_t rawtime; +/// struct tm * timeinfo; +/// char buffer [20]; +/// +/// time (&rawtime); +/// timeinfo = localtime(&rawtime); +/// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetDate(*timeinfo, "Selected date test call"); +/// strftime(buffer, sizeof(buffer), "%Y-%m-%d", timeinfo); +/// printf("Selected date it's %s and was on Dialog %s\n", buffer, bRet ? "OK" : "Canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetDate(tm& date, const std::string& heading) +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_date( + CAddonBase::m_interface->toKodi->kodiBase, &date, heading.c_str()); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to get a IP +/// +/// @param[in,out] ipAddress Overwritten with user input if return=true and +/// IP address inserted. +/// @param[in] heading Heading to display. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetIPAddress(std::string& ipAddress, const std::string& heading) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_ip_address( + CAddonBase::m_interface->toKodi->kodiBase, ipAddress.c_str(), &retString, heading.c_str()); + if (retString != nullptr) + { + ipAddress = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Use dialog to get normal number. +/// +/// @param[in,out] input Overwritten with user input if return=true and time +/// in seconds inserted +/// @param[in] heading Heading to display +/// @param[in] autoCloseTimeoutMs [opt] To close the dialog after a specified +/// time, in milliseconds, default is 0 +/// which keeps the dialog open +/// indefinitely. +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include // printf +/// #include // strtoull (C++11) +/// #include +/// +/// std::string number; +/// bool bRet = kodi::gui::dialogs::Numeric::ShowAndGetNumber(number, "Number test call"); +/// printf("Written number input is : %llu and was %s\n", +/// strtoull(number.c_str(), nullptr, 0), bRet ? "OK" : "Canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetNumber(std::string& input, + const std::string& heading, + unsigned int autoCloseTimeoutMs = 0) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_number( + CAddonBase::m_interface->toKodi->kodiBase, input.c_str(), &retString, heading.c_str(), + autoCloseTimeoutMs); + if (retString != nullptr) + { + input = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_Numeric +/// @brief Show numeric keypad to get seconds. +/// +/// @param[in,out] time Overwritten with user input if return=true and time +/// in seconds inserted. +/// @param[in] heading Heading to display +/// @return true if successful display and user input. false if unsuccessful +/// display, no user input, or canceled editing. +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetSeconds(std::string& time, const std::string& heading) +{ + using namespace ::kodi::addon; + char* retString = nullptr; + bool ret = CAddonBase::m_interface->toKodi->kodi_gui->dialogNumeric->show_and_get_seconds( + CAddonBase::m_interface->toKodi->kodiBase, time.c_str(), &retString, heading.c_str()); + if (retString != nullptr) + { + time = retString; + CAddonBase::m_interface->toKodi->free_string(CAddonBase::m_interface->toKodi->kodiBase, + retString); + } + return ret; +} +//------------------------------------------------------------------------------ +}; // namespace Numeric +/// @} + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h new file mode 100644 index 0000000..747ab9d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/OK.h @@ -0,0 +1,101 @@ +/* + * 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/ok.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_OK Dialog OK +/// @ingroup cpp_kodi_gui_dialogs +/// @{ +/// @brief @cpp_namespace{ kodi::gui::dialogs::OK } +/// **OK dialog**\n +/// The functions listed below permit the call of a dialogue of information, a +/// confirmation of the user by press from OK required. +/// +/// It has the header @ref OK.h "#include " +/// be included to enjoy it. +/// +namespace OK +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_OK +/// @brief Use dialog to inform user with text and confirmation with OK with +/// continued string. +/// +/// @param[in] heading Dialog heading. +/// @param[in] text Multi-line text. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// ... +/// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!\nI'm a call from add-on\n :) :D"); +/// ~~~~~~~~~~~~~ +/// +inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, const std::string& text) +{ + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_single_text( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str()); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_OK +/// @brief Use dialog to inform user with text and confirmation with OK with +/// strings separated to the lines. +/// +/// @param[in] heading Dialog heading. +/// @param[in] line0 Line #1 text. +/// @param[in] line1 Line #2 text. +/// @param[in] line2 Line #3 text. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// ... +/// kodi::gui::dialogs::OK::ShowAndGetInput("Test dialog", "Hello World!", "I'm a call from add-on", " :) :D"); +/// ~~~~~~~~~~~~~ +/// +inline void ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, + const std::string& line0, + const std::string& line1, + const std::string& line2) +{ + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogOK->show_and_get_input_line_text( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), + line2.c_str()); +} +//------------------------------------------------------------------------------ +} // namespace OK +/// @} + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h new file mode 100644 index 0000000..d242a56 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/Progress.h @@ -0,0 +1,244 @@ +/* + * 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/progress.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_CProgress Dialog Progress +/// @ingroup cpp_kodi_gui_dialogs +/// @brief @cpp_class{ kodi::gui::dialogs::CProgress } +/// **Progress dialog shown in center**\n +/// The with @ref Progress.h "#include " +/// given class are basically used to create Kodi's progress dialog with named +/// text fields. +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// kodi::gui::dialogs::CProgress *progress = new kodi::gui::dialogs::CProgress; +/// progress->SetHeading("Test progress"); +/// progress->SetLine(1, "line 1"); +/// progress->SetLine(2, "line 2"); +/// progress->SetLine(3, "line 3"); +/// progress->SetCanCancel(true); +/// progress->ShowProgressBar(true); +/// progress->Open(); +/// for (unsigned int i = 0; i < 100; i += 10) +/// { +/// progress->SetPercentage(i); +/// sleep(1); +/// } +/// delete progress; +/// ~~~~~~~~~~~~~ +/// +class ATTRIBUTE_HIDDEN CProgress +{ +public: + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief Construct a new dialog + /// + CProgress() + { + using namespace ::kodi::addon; + m_DialogHandle = CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->new_dialog( + CAddonBase::m_interface->toKodi->kodiBase); + if (!m_DialogHandle) + kodi::Log(ADDON_LOG_FATAL, + "kodi::gui::dialogs::CProgress can't create window class from Kodi !!!"); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief Destructor + /// + ~CProgress() + { + using namespace ::kodi::addon; + if (m_DialogHandle) + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->delete_dialog( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To open the dialog + /// + void Open() + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->open( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief Set the heading title of dialog + /// + /// @param[in] heading Title string to use + /// + void SetHeading(const std::string& heading) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_heading( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, heading.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To set the line text field on dialog from 0 - 2 + /// + /// @param[in] iLine Line number + /// @param[in] line Text string + /// + void SetLine(unsigned int iLine, const std::string& line) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_line( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, iLine, line.c_str()); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To enable and show cancel button on dialog + /// + /// @param[in] canCancel if true becomes it shown + /// + void SetCanCancel(bool canCancel) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_can_cancel( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, canCancel); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To check dialog for clicked cancel button + /// + /// @return True if canceled + /// + bool IsCanceled() const + { + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->is_canceled( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief Get the current progress position as percent + /// + /// @param[in] percentage Position to use from 0 to 100 + /// + void SetPercentage(int percentage) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_percentage( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, percentage); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To set the current progress position as percent + /// + /// @return Current Position used from 0 to 100 + /// + int GetPercentage() const + { + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->get_percentage( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To show or hide progress bar dialog + /// + /// @param[in] onOff If true becomes it shown + /// + void ShowProgressBar(bool onOff) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->show_progress_bar( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, onOff); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief Set the maximum position of progress, needed if `SetProgressAdvance(...)` is used + /// + /// @param[in] max Biggest usable position to use + /// + void SetProgressMax(int max) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_max( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, max); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To increase progress bar by defined step size until reach of maximum position + /// + /// @param[in] steps Step size to increase, default is 1 + /// + void SetProgressAdvance(int steps = 1) + { + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->set_progress_advance( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle, steps); + } + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_gui_dialogs_CProgress + /// @brief To check progress was canceled on work + /// + /// @return True if aborted + /// + bool Abort() + { + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogProgress->abort( + CAddonBase::m_interface->toKodi->kodiBase, m_DialogHandle); + } + //---------------------------------------------------------------------------- + +private: + KODI_GUI_HANDLE m_DialogHandle; +}; + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ 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 */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h new file mode 100644 index 0000000..42a86f3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/TextViewer.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2015-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/text_viewer.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_TextViewer Dialog Text Viewer +/// @ingroup cpp_kodi_gui_dialogs +/// @{ +/// @brief @cpp_namespace{ kodi::gui::dialogs::TextViewer } +/// **Text viewer dialog**\n +/// The text viewer dialog can be used to display descriptions, help texts or +/// other larger texts. +/// +/// In order to achieve a line break is a \\n directly in the text or +/// in the "./resources/language/resource.language.??_??/strings.po" +/// to call with std::string kodi::general::GetLocalizedString(...);. +/// +/// It has the header \ref TextViewer.h "#include " +/// be included to enjoy it. +/// +namespace TextViewer +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_TextViewer +/// @brief Show info text dialog +/// +/// @param[in] heading mall heading text +/// @param[in] text Showed text on dialog +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// kodi::gui::dialogs::TextViewer::Show("The Wizard of Oz (1939 film)", +/// "The Wizard of Oz is a 1939 American musical comedy-drama fantasy film " +/// "produced by Metro-Goldwyn-Mayer, and the most well-known and commercially " +/// "successful adaptation based on the 1900 novel The Wonderful Wizard of Oz " +/// "by L. Frank Baum. The film stars Judy Garland as Dorothy Gale. The film" +/// "co-stars Terry the dog, billed as Toto; Ray Bolger, Jack Haley, Bert Lahr, " +/// "Frank Morgan, Billie Burke, Margaret Hamilton, with Charley Grapewin and " +/// "Clara Blandick, and the Singer Midgets as the Munchkins.\n" +/// "\n" +/// "Notable for its use of Technicolor, fantasy storytelling, musical score and " +/// "unusual characters, over the years it has become an icon of American popular " +/// "culture. It was nominated for six Academy Awards, including Best Picture but " +/// "lost to Gone with the Wind. It did win in two other categories including Best " +/// "Original Song for \"Over the Rainbow\". However, the film was a box office " +/// "disappointment on its initial release, earning only $3,017,000 on a $2,777,000 " +/// "budget, despite receiving largely positive reviews. It was MGM's most " +/// "expensive production at that time, and did not completely recoup the studio's " +/// "investment and turn a profit until theatrical re-releases starting in 1949.\n" +/// "\n" +/// "The 1956 broadcast television premiere of the film on CBS re-introduced the " +/// "film to the wider public and eventually made the presentation an annual " +/// "tradition, making it one of the most known films in cinema history. The " +/// "film was named the most-viewed motion picture on television syndication by " +/// "the Library of Congress who also included the film in its National Film " +/// "Registry in its inaugural year in 1989. Designation on the registry calls " +/// "for efforts to preserve it for being \"culturally, historically, and " +/// "aesthetically significant\". It is also one of the few films on UNESCO's " +/// "Memory of the World Register.\n" +/// "\n" +/// "The Wizard of Oz is often ranked on best-movie lists in critics' and public " +/// "polls. It is the source of many quotes referenced in modern popular culture. " +/// "It was directed primarily by Victor Fleming (who left production to take " +/// "over direction on the troubled Gone with the Wind production). Noel Langley, " +/// "Florence Ryerson and Edgar Allan Woolf received credit for the screenplay, " +/// "but there were uncredited contributions by others. The songs were written " +/// "by Edgar \"Yip\" Harburg (lyrics) and Harold Arlen (music). The incidental " +/// "music, based largely on the songs, was composed by Herbert Stothart, with " +/// "interspersed renderings from classical composers.\n"); +/// ~~~~~~~~~~~~~ +/// +inline void ATTRIBUTE_HIDDEN Show(const std::string& heading, const std::string& text) +{ + using namespace ::kodi::addon; + CAddonBase::m_interface->toKodi->kodi_gui->dialogTextViewer->open( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str()); +} +//------------------------------------------------------------------------------ +}; // namespace TextViewer +/// @} + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h new file mode 100644 index 0000000..6e6e069 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/dialogs/YesNo.h @@ -0,0 +1,188 @@ +/* + * 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/yes_no.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace dialogs +{ + +//============================================================================== +/// @defgroup cpp_kodi_gui_dialogs_YesNo Dialog Yes/No +/// @ingroup cpp_kodi_gui_dialogs +/// @{ +/// @brief @cpp_namespace{ kodi::gui::dialogs::YesNo } +/// **Yes / No dialog**\n +/// The Yes / No dialog can be used to inform the user about questions and get +/// the answer. +/// +/// In order to achieve a line break is a \\n directly in the text or +/// in the "./resources/language/resource.language.??_??/strings.po" +/// to call with std::string kodi::general::GetLocalizedString(...);. +/// +/// It has the header @ref YesNo.h "#include " +/// be included to enjoy it. +/// +namespace YesNo +{ +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_YesNo +/// @brief Use dialog to get numeric new password with one text string shown +/// everywhere and cancel return field. +/// +/// @param[in] heading Dialog heading +/// @param[in] text Multi-line text +/// @param[out] canceled Return value about cancel button +/// @param[in] noLabel [opt] label to put on the no button +/// @param[in] yesLabel [opt] label to put on the yes button +/// @return Returns True if 'Yes' was pressed, else False +/// +/// @note It is preferred to only use this as it is actually a multi-line text. +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// bool canceled = false; +/// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput( +/// "Yes / No test call", // The Header +/// "You has opened Yes / No dialog for test\n\nIs this OK for you?", +/// canceled, // return value about cancel button +/// "Not really", // No label, is optional and if empty "No" +/// "Ohhh yes"); // Yes label, also optional and if empty "Yes" +/// fprintf(stderr, "You has called Yes/No, returned '%s' and was %s\n", +/// ret ? "yes" : "no", +/// canceled ? "canceled" : "not canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, + const std::string& text, + bool& canceled, + const std::string& noLabel = "", + const std::string& yesLabel = "") +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_single_text( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), text.c_str(), &canceled, + noLabel.c_str(), yesLabel.c_str()); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_YesNo +/// @brief Use dialog to get numeric new password with separated line strings. +/// +/// @param[in] heading Dialog heading +/// @param[in] line0 Line #0 text +/// @param[in] line1 Line #1 text +/// @param[in] line2 Line #2 text +/// @param[in] noLabel [opt] label to put on the no button +/// @param[in] yesLabel [opt] label to put on the yes button +/// @return Returns True if 'Yes' was pressed, else False +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput( +/// "Yes / No test call", // The Header +/// "You has opened Yes / No dialog for test", +/// "", +/// "Is this OK for you?", +/// "Not really", // No label, is optional and if empty "No" +/// "Ohhh yes"); // Yes label, also optional and if empty "Yes" +/// fprintf(stderr, "You has called Yes/No, returned '%s'\n", +/// ret ? "yes" : "no"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, + const std::string& line0, + const std::string& line1, + const std::string& line2, + const std::string& noLabel = "", + const std::string& yesLabel = "") +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo->show_and_get_input_line_text( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), + line2.c_str(), noLabel.c_str(), yesLabel.c_str()); +} +//------------------------------------------------------------------------------ + +//============================================================================== +/// @ingroup cpp_kodi_gui_dialogs_YesNo +/// @brief Use dialog to get numeric new password with separated line strings +/// and cancel return field. +/// +/// @param[in] heading Dialog heading +/// @param[in] line0 Line #0 text +/// @param[in] line1 Line #1 text +/// @param[in] line2 Line #2 text +/// @param[out] canceled Return value about cancel button +/// @param[in] noLabel [opt] label to put on the no button +/// @param[in] yesLabel [opt] label to put on the yes button +/// @return Returns True if 'Yes' was pressed, else False +/// +/// +///------------------------------------------------------------------------- +/// +/// **Example:** +/// ~~~~~~~~~~~~~{.cpp} +/// #include +/// +/// bool canceled = false; +/// bool ret = kodi::gui::dialogs::YesNo::ShowAndGetInput( +/// "Yes / No test call", // The Header +/// "You has opened Yes / No dialog for test", +/// "", +/// "Is this OK for you?", +/// canceled, // return value about cancel button +/// "Not really", // No label, is optional and if empty "No" +/// "Ohhh yes"); // Yes label, also optional and if empty "Yes" +/// fprintf(stderr, "You has called Yes/No, returned '%s' and was %s\n", +/// ret ? "yes" : "no", +/// canceled ? "canceled" : "not canceled"); +/// ~~~~~~~~~~~~~ +/// +inline bool ATTRIBUTE_HIDDEN ShowAndGetInput(const std::string& heading, + const std::string& line0, + const std::string& line1, + const std::string& line2, + bool& canceled, + const std::string& noLabel = "", + const std::string& yesLabel = "") +{ + using namespace ::kodi::addon; + return CAddonBase::m_interface->toKodi->kodi_gui->dialogYesNo + ->show_and_get_input_line_button_text( + CAddonBase::m_interface->toKodi->kodiBase, heading.c_str(), line0.c_str(), line1.c_str(), + line2.c_str(), &canceled, noLabel.c_str(), yesLabel.c_str()); +} +//------------------------------------------------------------------------------ +}; // namespace YesNo +/// @} + +} /* namespace dialogs */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt new file mode 100644 index 0000000..844902d --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/CMakeLists.txt @@ -0,0 +1,7 @@ +set(HEADERS GL.h + GLonDX.h + Shader.h) + +if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_kodi_gui_gl) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GL.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GL.h new file mode 100644 index 0000000..16d43e3 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GL.h @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2005-2019 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 + +#ifdef __cplusplus + +//============================================================================== +/// @defgroup cpp_kodi_gui_helpers_gl OpenGL helpers +/// @ingroup cpp_kodi_gui_helpers +/// @brief **Auxiliary functions for Open GL**\n +/// This group includes help for definitions, functions, and classes for +/// OpenGL. +/// +/// To use OpenGL for your system, add the @ref GL.h "#include ". +/// +/// The @ref HAS_GL is declared if Open GL is required and @ref HAS_GLES if Open GL +/// Embedded Systems (ES) is required, with ES the version is additionally given +/// in the definition, this can be "2" or "3". +/// +/// +///----------------------------------------------------------------------------- +/// +/// Following @ref GL_TYPE_STRING define can be used, for example, to manage +/// different folders for GL and GLES and make the selection easier. +/// This are on OpenGL "GL" and on Open GL|ES "GLES". +/// +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl"); +/// ~~~~~~~~~~~~~~~~~ +/// +/// +///---------------------------------------------------------------------------- +/// +/// In addition, @ref BUFFER_OFFSET is declared in it which can be used to give an +/// offset on the array to GL. +/// +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// const struct PackedVertex { +/// float position[3]; // Position x, y, z +/// float color[4]; // Color r, g, b, a +/// } vertices[3] = { +/// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, +/// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, +/// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } +/// }; +/// +/// glVertexAttribPointer(m_aPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, position))); +/// glEnableVertexAttribArray(m_aPosition); +/// +/// glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, color))); +/// glEnableVertexAttribArray(m_aColor); +/// ~~~~~~~~~~~~~~~~~ + +#if HAS_GL +#define GL_TYPE_STRING "GL" +// always define GL_GLEXT_PROTOTYPES before include gl headers +#if !defined(GL_GLEXT_PROTOTYPES) +#define GL_GLEXT_PROTOTYPES +#endif +#if defined(TARGET_LINUX) +#include +#include +#elif defined(TARGET_FREEBSD) +#include +#elif defined(TARGET_DARWIN) +#include +#include +#elif defined(WIN32) +#error Use of GL under Windows is not possible +#endif +#elif HAS_GLES >= 2 +#define GL_TYPE_STRING "GLES" +#if defined(WIN32) +#if defined(HAS_ANGLE) +#include +#else +#error Use of GLES only be available under Windows by the use of angle +#endif +#elif defined(TARGET_DARWIN) +#if HAS_GLES == 3 +#include +#include +#else +#include +#include +#endif +#else +#if HAS_GLES == 3 +#include +#include +#else +#include +#include +#endif +#endif +#endif + +#ifndef BUFFER_OFFSET +/// @ingroup cpp_kodi_gui_helpers_gl +/// @brief To give a offset number as pointer value. +#define BUFFER_OFFSET(i) ((char*)nullptr + (i)) +#endif + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h new file mode 100644 index 0000000..4dd97af --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/GLonDX.h @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2005-2019 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 + +#ifdef __cplusplus + +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "d3dcompiler.lib") +#ifndef GL_CLIENT_VERSION +#define GL_CLIENT_VERSION 3 +#endif + +namespace kodi +{ +namespace gui +{ +namespace gl +{ + +class ATTRIBUTE_HIDDEN CGLonDX : public kodi::gui::IRenderHelper +{ +public: + explicit CGLonDX() : m_pContext(reinterpret_cast(kodi::gui::GetHWContext())) + { + } + ~CGLonDX() override { destruct(); } + + bool Init() override + { + EGLint egl_display_attrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, + EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, + EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, + EGL_DONT_CARE, + EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, + EGL_DONT_CARE, + EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, + EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE, + EGL_NONE}; + EGLint egl_config_attrs[] = {EGL_RED_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_BLUE_SIZE, + 8, + EGL_ALPHA_SIZE, + 8, + EGL_BIND_TO_TEXTURE_RGBA, + EGL_TRUE, + EGL_RENDERABLE_TYPE, + GL_CLIENT_VERSION == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, + EGL_PBUFFER_BIT, + EGL_NONE}; + EGLint egl_context_attrs[] = {EGL_CONTEXT_CLIENT_VERSION, GL_CLIENT_VERSION, EGL_NONE}; + + m_eglDisplay = + eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, egl_display_attrs); + if (m_eglDisplay == EGL_NO_DISPLAY) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to get EGL display (%s)", eglGetErrorString()); + return false; + } + + if (eglInitialize(m_eglDisplay, nullptr, nullptr) != EGL_TRUE) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to init EGL display (%s)", eglGetErrorString()); + return false; + } + + EGLint numConfigs = 0; + if (eglChooseConfig(m_eglDisplay, egl_config_attrs, &m_eglConfig, 1, &numConfigs) != EGL_TRUE || + numConfigs == 0) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to get EGL config (%s)", eglGetErrorString()); + return false; + } + + m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, nullptr, egl_context_attrs); + if (m_eglContext == EGL_NO_CONTEXT) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create EGL context (%s)", eglGetErrorString()); + return false; + } + + if (!createD3DResources()) + return false; + + if (eglMakeCurrent(m_eglDisplay, m_eglBuffer, m_eglBuffer, m_eglContext) != EGL_TRUE) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to make current EGL (%s)", eglGetErrorString()); + return false; + } + return true; + } + + void CheckGL(ID3D11DeviceContext* device) + { + if (m_pContext != device) + { + m_pSRView = nullptr; + m_pVShader = nullptr; + m_pPShader = nullptr; + m_pContext = device; + + if (m_eglBuffer != EGL_NO_SURFACE) + { + eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroySurface(m_eglDisplay, m_eglBuffer); + m_eglBuffer = EGL_NO_SURFACE; + } + + // create new resources + if (!createD3DResources()) + return; + + eglMakeCurrent(m_eglDisplay, m_eglBuffer, m_eglBuffer, m_eglContext); + } + } + + void Begin() override + { + // confirm on begin D3D context is correct + CheckGL(reinterpret_cast(kodi::gui::GetHWContext())); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + + void End() override + { + glFlush(); + + // set our primitive shaders + m_pContext->VSSetShader(m_pVShader.Get(), nullptr, 0); + m_pContext->PSSetShader(m_pPShader.Get(), nullptr, 0); + m_pContext->PSSetShaderResources(0, 1, m_pSRView.GetAddressOf()); + // draw texture + m_pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + m_pContext->IASetVertexBuffers(0, 0, nullptr, nullptr, nullptr); + m_pContext->IASetInputLayout(nullptr); + m_pContext->Draw(4, 0); + // unset shaders + m_pContext->PSSetShader(nullptr, nullptr, 0); + m_pContext->VSSetShader(nullptr, nullptr, 0); + // unbind our view + ID3D11ShaderResourceView* views[1] = {}; + m_pContext->PSSetShaderResources(0, 1, views); + } + +private: + enum ShaderType + { + VERTEX_SHADER, + PIXEL_SHADER + }; + + bool createD3DResources() + { + HANDLE sharedHandle; + Microsoft::WRL::ComPtr pDevice; + Microsoft::WRL::ComPtr pRTView; + Microsoft::WRL::ComPtr pRTResource; + Microsoft::WRL::ComPtr pRTTexture; + Microsoft::WRL::ComPtr pOffScreenTexture; + Microsoft::WRL::ComPtr dxgiResource; + + m_pContext->GetDevice(&pDevice); + m_pContext->OMGetRenderTargets(1, &pRTView, nullptr); + if (!pRTView) + return false; + + pRTView->GetResource(&pRTResource); + if (FAILED(pRTResource.As(&pRTTexture))) + return false; + + D3D11_TEXTURE2D_DESC texDesc; + pRTTexture->GetDesc(&texDesc); + texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; + texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + if (FAILED(pDevice->CreateTexture2D(&texDesc, nullptr, &pOffScreenTexture))) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create intermediate texture"); + return false; + } + + CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(pOffScreenTexture.Get(), + D3D11_SRV_DIMENSION_TEXTURE2D); + if (FAILED(pDevice->CreateShaderResourceView(pOffScreenTexture.Get(), &srvDesc, &m_pSRView))) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create shader view"); + return false; + } + + if (FAILED(pOffScreenTexture.As(&dxgiResource)) || + FAILED(dxgiResource->GetSharedHandle(&sharedHandle))) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable get shared handle for texture"); + return false; + } + + // initiate simple shaders + if (FAILED(d3dCreateShader(VERTEX_SHADER, vs_out_shader_text, &m_pVShader))) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create vertex shader view"); + return false; + } + + if (FAILED(d3dCreateShader(PIXEL_SHADER, ps_out_shader_text, &m_pPShader))) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create pixel shader view"); + return false; + } + + // create EGL buffer from D3D shared texture + EGLint egl_buffer_attrs[] = {EGL_WIDTH, + static_cast(texDesc.Width), + EGL_HEIGHT, + static_cast(texDesc.Height), + EGL_TEXTURE_TARGET, + EGL_TEXTURE_2D, + EGL_TEXTURE_FORMAT, + EGL_TEXTURE_RGBA, + EGL_NONE}; + + m_eglBuffer = + eglCreatePbufferFromClientBuffer(m_eglDisplay, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, + sharedHandle, m_eglConfig, egl_buffer_attrs); + + if (m_eglBuffer == EGL_NO_SURFACE) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create EGL buffer (%s)", eglGetErrorString()); + return false; + } + return true; + } + + HRESULT d3dCreateShader(ShaderType shaderType, + const std::string& source, + IUnknown** ppShader) const + { + Microsoft::WRL::ComPtr pBlob; + Microsoft::WRL::ComPtr pErrors; + + auto hr = D3DCompile(source.c_str(), source.length(), nullptr, nullptr, nullptr, "main", + shaderType == PIXEL_SHADER ? "ps_4_0" : "vs_4_0", 0, 0, &pBlob, &pErrors); + + if (SUCCEEDED(hr)) + { + Microsoft::WRL::ComPtr pDevice; + m_pContext->GetDevice(&pDevice); + + if (shaderType == PIXEL_SHADER) + { + hr = pDevice->CreatePixelShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), nullptr, + reinterpret_cast(ppShader)); + } + else + { + hr = pDevice->CreateVertexShader(pBlob->GetBufferPointer(), pBlob->GetBufferSize(), nullptr, + reinterpret_cast(ppShader)); + } + + if (FAILED(hr)) + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to create %s shader", + shaderType == PIXEL_SHADER ? "pixel" : "vertex"); + } + } + else + { + Log(ADDON_LOG_ERROR, "GLonDX: unable to compile shader (%s)", pErrors->GetBufferPointer()); + } + return hr; + } + + static const char* eglGetErrorString() + { +#define CASE_STR(value) \ + case value: \ + return #value + switch (eglGetError()) + { + CASE_STR(EGL_SUCCESS); + CASE_STR(EGL_NOT_INITIALIZED); + CASE_STR(EGL_BAD_ACCESS); + CASE_STR(EGL_BAD_ALLOC); + CASE_STR(EGL_BAD_ATTRIBUTE); + CASE_STR(EGL_BAD_CONTEXT); + CASE_STR(EGL_BAD_CONFIG); + CASE_STR(EGL_BAD_CURRENT_SURFACE); + CASE_STR(EGL_BAD_DISPLAY); + CASE_STR(EGL_BAD_SURFACE); + CASE_STR(EGL_BAD_MATCH); + CASE_STR(EGL_BAD_PARAMETER); + CASE_STR(EGL_BAD_NATIVE_PIXMAP); + CASE_STR(EGL_BAD_NATIVE_WINDOW); + CASE_STR(EGL_CONTEXT_LOST); + default: + return "Unknown"; + } +#undef CASE_STR + } + + void destruct() + { + if (m_eglDisplay != EGL_NO_DISPLAY) + { + eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (m_eglBuffer != EGL_NO_SURFACE) + { + eglDestroySurface(m_eglDisplay, m_eglBuffer); + m_eglBuffer = EGL_NO_SURFACE; + } + + if (m_eglContext != EGL_NO_CONTEXT) + { + eglDestroyContext(m_eglDisplay, m_eglContext); + m_eglContext = EGL_NO_CONTEXT; + } + + eglTerminate(m_eglDisplay); + m_eglDisplay = EGL_NO_DISPLAY; + } + + m_pSRView = nullptr; + m_pVShader = nullptr; + m_pPShader = nullptr; + m_pContext = nullptr; + } + + EGLConfig m_eglConfig = EGL_NO_CONFIG_KHR; + EGLDisplay m_eglDisplay = EGL_NO_DISPLAY; + EGLContext m_eglContext = EGL_NO_CONTEXT; + EGLSurface m_eglBuffer = EGL_NO_SURFACE; + + ID3D11DeviceContext* m_pContext = nullptr; // don't hold context + Microsoft::WRL::ComPtr m_pSRView = nullptr; + Microsoft::WRL::ComPtr m_pVShader = nullptr; + Microsoft::WRL::ComPtr m_pPShader = nullptr; + +#define TO_STRING(...) #__VA_ARGS__ + std::string vs_out_shader_text = TO_STRING(void main(uint id + : SV_VertexId, out float2 tex + : TEXCOORD0, out float4 pos + : SV_POSITION) { + tex = float2(id % 2, (id % 4) >> 1); + pos = float4((tex.x - 0.5f) * 2, -(tex.y - 0.5f) * 2, 0, 1); + }); + + std::string ps_out_shader_text = TO_STRING( + Texture2D texMain : register(t0); + SamplerState Sampler + { + Filter = MIN_MAG_MIP_LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; + Comparison = NEVER; + }; + + float4 main(in float2 tex : TEXCOORD0) : SV_TARGET + { + return texMain.Sample(Sampler, tex); + }); +#undef TO_STRING +}; /* class CGLonDX */ + +} /* namespace gl */ + +using CRenderHelper = gl::CGLonDX; +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h new file mode 100644 index 0000000..bf6d48c --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/gl/Shader.h @@ -0,0 +1,571 @@ +/* + * Copyright (C) 2005-2019 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 "GL.h" + +#ifdef __cplusplus + +#include +#include +#include + +#include +#include + +#define LOG_SIZE 1024 +#define GLchar char + +namespace kodi +{ +namespace gui +{ +namespace gl +{ + +//======================================================================== +/// CShader - base class +class ATTRIBUTE_HIDDEN CShader +{ +public: + CShader() = default; + virtual ~CShader() = default; + virtual bool Compile(const std::string& extraBegin = "", const std::string& extraEnd = "") = 0; + virtual void Free() = 0; + virtual GLuint Handle() = 0; + + bool LoadSource(const std::string& file) + { + char buffer[16384]; + + kodi::vfs::CFile source; + if (!source.OpenFile(file)) + { + kodi::Log(ADDON_LOG_ERROR, "CShader::%s: Failed to open file '%s'", __FUNCTION__, + file.c_str()); + return false; + } + size_t len = source.Read(buffer, sizeof(buffer)); + m_source.assign(buffer); + m_source[len] = 0; + source.Close(); + return true; + } + + bool OK() const { return m_compiled; } + +protected: + std::string m_source; + std::string m_lastLog; + bool m_compiled = false; +}; +//------------------------------------------------------------------------ + +//======================================================================== +/// CVertexShader +class ATTRIBUTE_HIDDEN CVertexShader : public CShader +{ +public: + CVertexShader() = default; + ~CVertexShader() override { Free(); } + + void Free() override + { + if (m_vertexShader) + glDeleteShader(m_vertexShader); + m_vertexShader = 0; + } + + bool Compile(const std::string& extraBegin = "", const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + m_vertexShader = glCreateShader(GL_VERTEX_SHADER); + + GLsizei count = 0; + const char* sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_vertexShader, count, sources, nullptr); + glCompileShader(m_vertexShader); + glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CVertexShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CVertexShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_vertexShader; } + +protected: + GLuint m_vertexShader = 0; +}; +//------------------------------------------------------------------------ + +//======================================================================== +/// CPixelShader +class ATTRIBUTE_HIDDEN CPixelShader : public CShader +{ +public: + CPixelShader() = default; + ~CPixelShader() { Free(); } + void Free() override + { + if (m_pixelShader) + glDeleteShader(m_pixelShader); + m_pixelShader = 0; + } + + bool Compile(const std::string& extraBegin = "", const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + + GLsizei count = 0; + const char* sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_pixelShader, count, sources, 0); + glCompileShader(m_pixelShader); + glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CPixelShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CPixelShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_pixelShader; } + +protected: + GLuint m_pixelShader = 0; +}; +//------------------------------------------------------------------------ + +//============================================================================ +/// @defgroup cpp_kodi_gui_helpers_gl_CShaderProgram GL Shader Program +/// @ingroup cpp_kodi_gui_helpers_gl +/// @brief @cpp_class{ kodi::gui::gl::CShaderProgram } +/// **Class to manage an OpenGL shader program**\n +/// With this class the used GL shader code can be defined on the GPU and +/// its variables can be managed between CPU and GPU. +/// +/// It has the header @ref Shader.h "#include " +/// be included to enjoy it. +/// +/// ---------------------------------------------------------------------------- +/// +/// Example: +/// +/// ~~~~~~~~~~~~~{.cpp} +/// +/// #include +/// ... +/// +/// class ATTRIBUTE_HIDDEN CExample +/// : ..., +/// public kodi::gui::gl::CShaderProgram +/// { +/// public: +/// CExample() = default; +/// +/// bool Start(); +/// void Render(); +/// +/// // override functions for kodi::gui::gl::CShaderProgram +/// void OnCompiledAndLinked() override; +/// bool OnEnabled() override; +/// +/// private: +/// ... +/// GLint m_aPosition = -1; +/// GLint m_aColor = -1; +/// }; +/// +/// bool CExample::Start() +/// { +/// // Define shaders and load +/// std::string fraqShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.frag"); +/// std::string vertShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.vert"); +/// if (!LoadShaderFiles(vertShader, fraqShader) || !CompileAndLink()) +/// return false; +/// +/// ... +/// return true; +/// } +/// +/// ... +/// +/// void CExample::Render() +/// { +/// ... +/// +/// EnableShader(); +/// ... +/// DO WORK +/// ... +/// DisableShader(); +/// } +/// +/// void CExample::OnCompiledAndLinked() +/// { +/// ... +/// DO YOUR WORK HERE FOR WHAT IS ONE TIME REQUIRED DURING COMPILE OF SHADER, E.G.: +/// +/// m_aPosition = glGetAttribLocation(ProgramHandle(), "a_position"); +/// m_aColor = glGetAttribLocation(ProgramHandle(), "a_color"); +/// } +/// +/// bool OnEnabled() override +/// { +/// ... +/// DO YOUR WORK HERE FOR WHAT REQUIRED DURING ENABLE OF SHADER +/// ... +/// return true; +/// } +/// +/// ADDONCREATOR(CExample); +/// ~~~~~~~~~~~~~ +/// +class ATTRIBUTE_HIDDEN CShaderProgram +{ +public: + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief Construct a new shader. + /// + /// Load must be done later with @ref LoadShaderFiles. + /// + CShaderProgram() = default; + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief Construct a new shader and load defined shader files. + /// + /// @param[in] vert Path to used GL vertext shader + /// @param[in] frag Path to used GL fragment shader + /// + CShaderProgram(const std::string& vert, const std::string& frag) { LoadShaderFiles(vert, frag); } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief Destructor. + /// + virtual ~CShaderProgram() { ShaderFree(); } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To load manually the needed shader files. + /// + /// @param[in] vert Path to used GL vertext shader + /// @param[in] frag Path to used GL fragment shader + /// + /// + /// @note The use of the files is optional, but it must either be passed over + /// here or via @ref CompileAndLink, or both of the source code. + /// + bool LoadShaderFiles(const std::string& vert, const std::string& frag) + { + if (!kodi::vfs::FileExists(vert) || !m_pVP.LoadSource(vert)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, vert.c_str()); + return false; + } + + if (!kodi::vfs::FileExists(frag) || !m_pFP.LoadSource(frag)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, frag.c_str()); + return false; + } + + return true; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To compile and link the shader to the GL interface. + /// + /// Optionally, additional source code can be transferred here, or it can be + /// used independently without any files + /// + /// @param[in] vertexExtraBegin [opt] To additionally add vextex source + /// code to the beginning of the loaded file + /// source code + /// @param[in] vertexExtraEnd [opt] To additionally add vextex source + /// code to the end of the loaded file + /// source code + /// @param[in] fragmentExtraBegin [opt] To additionally add fragment source + /// code to the beginning of the loaded file + /// source code + /// @param[in] fragmentExtraEnd [opt] To additionally add fragment source + /// code to the end of the loaded file + /// source code + /// @return true if compile was successed + /// + /// + /// @note In the case of a compile error, it will be written once into the Kodi + /// log and in addition to the console output to quickly detect the errors when + /// writing the damage. + /// + /// + bool CompileAndLink(const std::string& vertexExtraBegin = "", + const std::string& vertexExtraEnd = "", + const std::string& fragmentExtraBegin = "", + const std::string& fragmentExtraEnd = "") + { + GLint params[4]; + + // free resources + ShaderFree(); + m_ok = false; + + // compiled vertex shader + if (!m_pVP.Compile(vertexExtraBegin, vertexExtraEnd)) + { + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling vertex shader"); + return false; + } + + // compile pixel shader + if (!m_pFP.Compile(fragmentExtraBegin, fragmentExtraEnd)) + { + m_pVP.Free(); + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling fragment shader"); + return false; + } + + // create program object + m_shaderProgram = glCreateProgram(); + if (!m_shaderProgram) + { + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: Failed to create GL program", __FUNCTION__); + ShaderFree(); + return false; + } + + // attach the vertex shader + glAttachShader(m_shaderProgram, m_pVP.Handle()); + glAttachShader(m_shaderProgram, m_pFP.Handle()); + + // link the program + glLinkProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s@n", __FUNCTION__, log); + ShaderFree(); + return false; + } + + m_validated = false; + m_ok = true; + OnCompiledAndLinked(); + return true; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To activate the shader and use it on the GPU. + /// + /// @return true if enable was successfull done + /// + /// + /// @note During this call, the @ref OnEnabled stored in the child is also + /// called + /// + bool EnableShader() + { + if (ShaderOK()) + { + glUseProgram(m_shaderProgram); + if (OnEnabled()) + { + if (!m_validated) + { + // validate the program + GLint params[4]; + glValidateProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log); + } + m_validated = true; + } + return true; + } + else + { + glUseProgram(0); + return false; + } + return true; + } + return false; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To deactivate the shader use on the GPU. + /// + void DisableShader() + { + if (ShaderOK()) + { + glUseProgram(0); + OnDisabled(); + } + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief Used to check if shader has been loaded before. + /// + /// @return true if enable was successfull done + /// + /// @note The CompileAndLink call sets these values + /// + ATTRIBUTE_FORCEINLINE bool ShaderOK() const { return m_ok; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To get the vertex shader class used by Kodi at the addon. + /// + /// @return pointer to vertex shader class + /// + ATTRIBUTE_FORCEINLINE CVertexShader& VertexShader() { return m_pVP; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief To get the fragment shader class used by Kodi at the addon. + /// + /// @return pointer to fragment shader class + /// + ATTRIBUTE_FORCEINLINE CPixelShader& PixelShader() { return m_pFP; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief Used to get the definition created in the OpenGL itself. + /// + /// @return GLuint of GL shader program handler + /// + ATTRIBUTE_FORCEINLINE GLuint ProgramHandle() { return m_shaderProgram; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @defgroup cpp_kodi_gui_helpers_gl_CShaderProgram_child Child Functions + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram + /// @brief @cpp_class{ kodi::gui::gl::CShaderProgram child functions } + /// + /// Functions that are added by parent in the child + /// @{ + //========================================================================== + /// + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram_child + /// @brief Mandatory child function to set the necessary CPU to GPU data + /// + virtual void OnCompiledAndLinked(){}; + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram_child + /// @brief Optional function to exchange data between CPU and GPU while + /// activating the shader + /// + /// @return true if enable was successfull done + /// + virtual bool OnEnabled() { return true; }; + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_helpers_gl_CShaderProgram_child + /// @brief Optional child function that may have to be performed when + /// switching off the shader + virtual void OnDisabled(){}; + //-------------------------------------------------------------------------- + /// @} + +private: + void ShaderFree() + { + if (m_shaderProgram) + glDeleteProgram(m_shaderProgram); + m_shaderProgram = 0; + m_ok = false; + } + + CVertexShader m_pVP; + CPixelShader m_pFP; + GLuint m_shaderProgram = 0; + bool m_ok = false; + bool m_validated = false; +}; +//------------------------------------------------------------------------ + +} /* namespace gl */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h new file mode 100644 index 0000000..4c816a4 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/ActionIDs.h @@ -0,0 +1,11 @@ +/* + * Copyright (C) 2005-2020 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 "../../c-api/gui/input/action_ids.h" diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt new file mode 100644 index 0000000..d576974 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/input/CMakeLists.txt @@ -0,0 +1,5 @@ +set(HEADERS ActionIDs.h) + +if(NOT ENABLE_STATIC_LIBS) + core_add_library(addons_kodi-dev-kit_include_kodi_gui_input) +endif() diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h new file mode 100644 index 0000000..dabe101 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/renderHelper.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2005-2019 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" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +struct ATTRIBUTE_HIDDEN IRenderHelper +{ + virtual ~IRenderHelper() = default; + virtual bool Init() = 0; + virtual void Begin() = 0; + virtual void End() = 0; +}; /* class IRenderHelper */ +} /* namespace gui */ +} /* namespace kodi */ + +#if defined(WIN32) && defined(HAS_ANGLE) +#include "gl/GLonDX.h" +#else +/* + * Default background GUI render helper class + */ +namespace kodi +{ +namespace gui +{ +struct ATTRIBUTE_HIDDEN CRenderHelperStub : public IRenderHelper +{ + bool Init() override { return true; } + void Begin() override {} + void End() override {} +}; /* class CRenderHelperStub */ + +using CRenderHelper = CRenderHelperStub; +} /* namespace gui */ +} /* namespace kodi */ +#endif + +namespace kodi +{ +namespace gui +{ + +/* + * Create render background handler, e.g. becomes on "Windows" Angle used + * to emulate GL. + * + * This only be used internal and not from addon's direct. + * + * Function defines here and not in CAddonBase because of a hen and egg problem. + */ +inline std::shared_ptr ATTRIBUTE_HIDDEN GetRenderHelper() +{ + using namespace ::kodi::addon; + if (static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper) + return static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper; + + const std::shared_ptr renderHelper(new CRenderHelper()); + if (!renderHelper->Init()) + return nullptr; + + static_cast(CAddonBase::m_interface->addonBase)->m_renderHelper = + renderHelper; // Hold on base for other types + return renderHelper; +} + +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ -- cgit v1.2.3