diff options
Diffstat (limited to 'xbmc/interfaces/legacy/Window.h')
-rw-r--r-- | xbmc/interfaces/legacy/Window.h | 878 |
1 files changed, 878 insertions, 0 deletions
diff --git a/xbmc/interfaces/legacy/Window.h b/xbmc/interfaces/legacy/Window.h new file mode 100644 index 0000000..b30be7b --- /dev/null +++ b/xbmc/interfaces/legacy/Window.h @@ -0,0 +1,878 @@ +/* + * 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 "AddonCallback.h" +#include "AddonString.h" +#include "Control.h" +#include "swighelper.h" + +#include <limits.h> +#include <mutex> +#include <vector> + +namespace XBMCAddon +{ + namespace xbmcgui + { + // Forward declare the interceptor as the AddonWindowInterceptor.h + // file needs to include the Window class because of the template + class InterceptorBase; + + // + /// \defgroup python_xbmcgui_action Action + /// \ingroup python_xbmcgui + ///@{ + /// @brief **Action class.** + /// + /// \python_class{ xbmcgui.Action(): } + /// + /// This class serves in addition to identify carried out + /// \ref kodi_key_action_ids of Kodi and to be able to carry out thereby own + /// necessary steps. + /// + /// The data of this class are always transmitted by callback + /// Window::onAction at a window. + /// + class Action : public AddonClass + { + public: + Action() = default; + +#ifndef SWIG + explicit Action(const CAction& caction) { setFromCAction(caction); } + + void setFromCAction(const CAction& caction); + + long id = -1; + float fAmount1 = 0.0f; + float fAmount2 = 0.0f; + float fRepeat = 0.0f; + unsigned long buttonCode = 0; + std::string strAction; + + // Not sure if this is correct but it's here for now. + AddonClass::Ref<Control> control; // previously pObject +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_action + /// @brief \python_func{ getId() } + /// To get \ref kodi_key_action_ids + /// + /// This function returns the identification code used by the explained + /// order, it is necessary to determine the type of command from + /// \ref kodi_key_action_ids. + /// + /// @return The action's current id as a long or 0 if + /// no action is mapped in the xml's. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// def onAction(self, action): + /// if action.getId() == ACTION_PREVIOUS_MENU: + /// print('action received: previous') + /// .. + /// ~~~~~~~~~~~~~ + /// + getId(); +#else + long getId() { XBMC_TRACE; return id; } +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_action + /// @brief \python_func{ getButtonCode() } + /// Returns the button code for this action. + /// + /// @return [integer] button code + /// + getButtonCode(); +#else + long getButtonCode() { XBMC_TRACE; return buttonCode; } +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_action + /// @brief \python_func{ getAmount1() } + /// Returns the first amount of force applied to the thumbstick. + /// + /// @return [float] first amount + /// + getAmount1(); +#else + float getAmount1() { XBMC_TRACE; return fAmount1; } +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_action + /// @brief \python_func{ getAmount2() } + /// Returns the second amount of force applied to the thumbstick. + /// + /// @return [float] second amount + /// + getAmount2(); +#else + float getAmount2() { XBMC_TRACE; return fAmount2; } +#endif + }; + ///@} + + //========================================================================== + // This is the main class for the xbmcgui.Window functionality. It is tied + // into the main Kodi windowing system via the Interceptor + //========================================================================== + // + /// \defgroup python_xbmcgui_window Window + /// \ingroup python_xbmcgui + /// @{ + /// @brief __GUI window class for Add-Ons.__ + /// + /// This class allows over their functions to create and edit windows that + /// can be accessed from an Add-On. + /// + /// Likewise, all functions from here as well in the other window classes + /// \ref python_xbmcgui_window_dialog "WindowDialog", + /// \ref python_xbmcgui_window_xml "WindowXML" and + /// \ref python_xbmcgui_window_dialog_xml "WindowXMLDialog" + /// with inserted and available. + /// + /// + ///-------------------------------------------------------------------------- + /// Constructor for window + /// ---------------------------- + /// + /// \python_class{ xbmcgui.Window([existingWindowId]): } + /// + /// Creates a new from Add-On usable window class. This is to create + /// window for related controls by system calls. + /// + /// @param existingWindowId [opt] Specify an id to use an existing + /// window. + /// @throws ValueError if supplied window Id does not exist. + /// @throws Exception if more then 200 windows are created. + /// + /// Deleting this window will activate the old window that was active + /// and resets (not delete) all controls that are associated with this + /// window. + /// + /// + ///-------------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// win = xbmcgui.Window() + /// width = win.getWidth() + /// .. + /// ~~~~~~~~~~~~~ + /// + /// + // + class Window : public AddonCallback + { + friend class WindowDialogMixin; + bool isDisposed = false; + + void doAddControl(Control* pControl, CCriticalSection* gcontext, bool wait); + void doRemoveControl(Control* pControl, CCriticalSection* gcontext, bool wait); + + protected: +#ifndef SWIG + InterceptorBase* window; + int iWindowId = -1; + + std::vector<AddonClass::Ref<Control> > vecControls; + int iOldWindowId = 0; + int iCurrentControlId = 3000; + bool bModal = false; + CEvent m_actionEvent; + + bool canPulse = false; + + // I REALLY hate this ... but it's the simplest fix right now. + bool existingWindow = true; + bool destroyAfterDeInit = false; + + /** + * This only takes a boolean to allow subclasses to explicitly use it. A + * default constructor can be used as a concrete class and we need to tell + * the difference. + * subclasses should use this constructor and not the other. + */ + explicit Window(bool discrim); + + void deallocating() override; + + /** + * This helper retrieves the next available id. It is assumed that the + * global lock is already being held. + */ + static int getNextAvailableWindowId(); + + /** + * Child classes MUST call this in their constructors. It should be an + * instance of Interceptor<P extends CGUIWindow>. Control of memory + * management for this class is then given to the Window. + */ + void setWindow(InterceptorBase* _window); + + /** + * This is a helper method since popping the previous window id is a common + * function. + */ + void popActiveWindowId(); + + /** + * This is a helper method since getting a control by it's id is a common + * function. + */ + Control* GetControlById(int iControlId, CCriticalSection* gc); + + SWIGHIDDENVIRTUAL void PulseActionEvent(); + SWIGHIDDENVIRTUAL bool WaitForActionEvent(unsigned int milliseconds); +#endif + + public: + explicit Window(int existingWindowId = -1); + + ~Window() override; + +#ifndef SWIG + SWIGHIDDENVIRTUAL bool OnMessage(CGUIMessage& message); + SWIGHIDDENVIRTUAL bool OnAction(const CAction &action); + SWIGHIDDENVIRTUAL bool OnBack(int actionId); + SWIGHIDDENVIRTUAL void OnDeinitWindow(int nextWindowID); + + SWIGHIDDENVIRTUAL bool IsDialogRunning() const + { + XBMC_TRACE; + return false; + } + SWIGHIDDENVIRTUAL bool IsDialog() const + { + XBMC_TRACE; + return false; + } + SWIGHIDDENVIRTUAL bool IsModalDialog() const + { + XBMC_TRACE; + return false; + } + SWIGHIDDENVIRTUAL bool IsMediaWindow() const + { + XBMC_TRACE; + return false; + } + SWIGHIDDENVIRTUAL void dispose(); + + /** + * This is called from the InterceptorBase destructor to prevent further + * use of the interceptor from the window. + */ + inline void interceptorClear() + { + std::unique_lock<CCriticalSection> lock(*this); + window = NULL; + } +#endif + + // + /// @defgroup python_xbmcgui_window_cb Callback functions from Kodi to add-on + /// \ingroup python_xbmcgui_window + /// @{ + /// @brief __GUI window callback functions.__ + /// + /// Functions to handle control callbacks from Kodi. + /// + /// Likewise, all functions from here as well in the all window classes + /// (\ref python_xbmcgui_window "Window", + /// \ref python_xbmcgui_window_dialog "WindowDialog", + /// \ref python_xbmcgui_window_xml "WindowXML" and + /// \ref python_xbmcgui_window_dialog_xml "WindowXMLDialog") with inserted + /// and available. + /// + /// ------------------------------------------------------------------------ + /// + /// @link python_xbmcgui_window Go back to normal functions from window@endlink + // + + // callback takes a parameter +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onAction(self, Action action) } + /// **onAction method.** + /// + /// This method will receive all actions that the main program will send + /// to this window. + /// + /// @param self Own base class pointer + /// @param action The action id to perform, see + /// \ref python_xbmcgui_action to get use + /// of them + /// + /// @note + /// - By default, only the `PREVIOUS_MENU` and `NAV_BACK actions` are + /// handled. + /// - Overwrite this method to let your script handle all actions. + /// - Don't forget to capture `ACTION_PREVIOUS_MENU` or `ACTION_NAV_BACK`, + /// else the user can't close this window. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onAction(self, action): + /// if action.getId() == ACTION_PREVIOUS_MENU: + /// print('action received: previous') + /// self.close() + /// if action.getId() == ACTION_SHOW_INFO: + /// print('action received: show info') + /// if action.getId() == ACTION_STOP: + /// print('action received: stop') + /// if action.getId() == ACTION_PAUSE: + /// print('action received: pause') + /// .. + /// ~~~~~~~~~~~~~ + /// + onAction(...); +#else + virtual void onAction(Action* action); +#endif + + // on control is not actually on Window in the api but is called into Python anyway. +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onControl(self, Control) } + /// **onControl method.** + /// + /// This method will receive all click events on owned and selected + /// controls when the control itself doesn't handle the message. + /// + /// @param self Own base class pointer + /// @param control The \ref python_xbmcgui_control "Control" class + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onControl(self, control): + /// print("Window.onControl(control=[%s])"%control) + /// .. + /// ~~~~~~~~~~~~~ + /// + void onControl(...); +#else + virtual void onControl(Control* control); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onClick(self, int controlId) } + /// **onClick method.** + /// + /// This method will receive all click events that the main program will + /// send to this window. + /// + /// @param self Own base class pointer + /// @param controlId The one time clicked GUI control + /// identifier + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onClick(self,controlId): + /// if controlId == 10: + /// print("The control with Id 10 is clicked") + /// .. + /// ~~~~~~~~~~~~~ + /// + onClick(...); +#else + virtual void onClick(int controlId); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onDoubleClick(self, int controlId) } + /// __onDoubleClick method.__ + /// + /// This method will receive all double click events that the main program + /// will send to this window. + /// + /// @param self Own base class pointer + /// @param controlId The double clicked GUI control + /// identifier + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onDoubleClick(self,controlId): + /// if controlId == 10: + /// print("The control with Id 10 is double clicked") + /// .. + /// ~~~~~~~~~~~~~ + /// + onDoubleClick(...); +#else + virtual void onDoubleClick(int controlId); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onFocus(self, int controlId) } + /// __onFocus method.__ + /// + /// This method will receive all focus events that the main program will + /// send to this window. + /// + /// @param self Own base class pointer + /// @param controlId The focused GUI control identifier + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onDoubleClick(self,controlId): + /// if controlId == 10: + /// print("The control with Id 10 is focused") + /// .. + /// ~~~~~~~~~~~~~ + /// + onFocus(...); +#else + virtual void onFocus(int controlId); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window_cb + /// @brief \python_func{ onInit(self) } + /// __onInit method.__ + /// + /// This method will be called to initialize the window + /// + /// @param self Own base class pointer + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// # Define own function where becomes called from Kodi + /// def onInit(self): + /// print("Window.onInit method called from Kodi") + /// .. + /// ~~~~~~~~~~~~~ + /// + onInit(...); +#else + virtual void onInit(); +#endif + //@} + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ show() } + /// Show this window. + /// + /// Shows this window by activating it, calling close() after it wil + /// activate the current window again. + /// + /// @note If your script ends this window will be closed to. To show it + /// forever, make a loop at the end of your script or use doModal() + /// instead. + /// + show(); +#else + SWIGHIDDENVIRTUAL void show(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ setFocus(Control) } + /// Give the supplied control focus. + /// + /// @param Control \ref python_xbmcgui_control "Control" class to focus + /// @throws TypeError If supplied argument is not a \ref python_xbmcgui_control "Control" + /// type + /// @throws SystemError On Internal error + /// @throws RuntimeError If control is not added to a window + /// + setFocus(...); +#else + SWIGHIDDENVIRTUAL void setFocus(Control* pControl); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ setFocusId(ControlId) } + /// Gives the control with the supplied focus. + /// + /// @param ControlId [integer] On skin defined id of control + /// @throws SystemError On Internal error + /// @throws RuntimeError If control is not added to a window + /// + setFocusId(...); +#else + SWIGHIDDENVIRTUAL void setFocusId(int iControlId); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getFocus(Control) } + /// Returns the control which is focused. + /// + /// @return Focused control class + /// @throws SystemError On Internal error + /// @throws RuntimeError If no control has focus + /// + getFocus(); +#else + SWIGHIDDENVIRTUAL Control* getFocus(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getFocusId(int) } + /// Returns the id of the control which is focused. + /// + /// @return Focused control id + /// @throws SystemError On Internal error + /// @throws RuntimeError If no control has focus + /// + getFocusId(); +#else + SWIGHIDDENVIRTUAL long getFocusId(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ removeControl(Control) } + /// Removes the control from this window. + /// + /// @param Control \ref python_xbmcgui_control "Control" class to remove + /// @throws TypeError If supplied argument is not a \ref python_xbmcgui_control + /// type + /// @throws RuntimeError If control is not added to this window + /// + /// This will not delete the control. It is only removed from the window. + /// + removeControl(...); +#else + SWIGHIDDENVIRTUAL void removeControl(Control* pControl); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ removeControls(List) } + /// Removes a list of controls from this window. + /// + /// @param List List with controls to remove + /// @throws TypeError If supplied argument is not a \ref python_xbmcgui_control + /// type + /// @throws RuntimeError If control is not added to this window + /// + /// This will not delete the controls. They are only removed from the + /// window. + /// + removeControls(...); +#else + SWIGHIDDENVIRTUAL void removeControls(std::vector<Control*> pControls); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getHeight() } + /// Returns the height of this Window instance. + /// + /// @return Window height in pixels + /// + ///----------------------------------------------------------------------- + /// @python_v18 Function changed + /// + getHeight(); +#else + SWIGHIDDENVIRTUAL long getHeight(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getWidth() } + /// Returns the width of this Window instance. + /// + /// @return Window width in pixels + /// + ///----------------------------------------------------------------------- + /// @python_v18 Function changed + /// + getWidth(); +#else + SWIGHIDDENVIRTUAL long getWidth(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ setProperty(key, value) } + /// Sets a window property, similar to an infolabel. + /// + /// @param key string - property name. + /// @param 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. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + /// win.setProperty('Category', 'Newest') + /// .. + /// ~~~~~~~~~~~~~ + /// + setProperty(...); +#else + SWIGHIDDENVIRTUAL void setProperty(const char* key, const String& value); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getProperty(key) } + /// Returns a window property as a string, similar to an infolabel. + /// + /// @param key string - property name. + /// + /// @note Key is NOT case sensitive.\n + /// 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:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + /// category = win.getProperty('Category') + /// .. + /// ~~~~~~~~~~~~~ + /// + getProperty(...); +#else + SWIGHIDDENVIRTUAL String getProperty(const char* key); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ clearProperty(key) } + /// Clears the specific window property. + /// + /// @param 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:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + /// win.clearProperty('Category') + /// .. + /// ~~~~~~~~~~~~~ + /// + clearProperty(...); +#else + SWIGHIDDENVIRTUAL void clearProperty(const char* key); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ clearProperties() } + /// Clears all window properties. + /// + /// + ///----------------------------------------------------------------------- + /// + /// **Example:** + /// ~~~~~~~~~~~~~{.py} + /// .. + /// win = xbmcgui.Window(xbmcgui.getCurrentWindowId()) + /// win.clearProperties() + /// .. + /// ~~~~~~~~~~~~~ + /// + clearProperties(); +#else + SWIGHIDDENVIRTUAL void clearProperties(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ close() } + /// Closes this window. + /// + /// Closes this window by activating the old window. + /// + /// @note The window is not deleted with this method. + /// + close(); +#else + SWIGHIDDENVIRTUAL void close(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ doModal() } + /// Display this window until close() is called. + /// + doModal(); +#else + + SWIGHIDDENVIRTUAL void doModal(); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ addControl(Control) } + /// Add a \ref python_xbmcgui_control "Control" to this window. + /// + /// @param Control \ref python_xbmcgui_control "Control" to add + /// @throws TypeError If supplied argument is not a \ref python_xbmcgui_control + /// type + /// @throws ReferenceError If control is already used in another + /// window + /// @throws RuntimeError Should not happen :-) + /// + /// The next controls can be added to a window atm + /// | Control-class | Description | + /// |---------------------|------------------------------------------------------------| + /// | \ref python_xbmcgui_control_label "ControlLabel" | Label control to show text + /// | \ref python_xbmcgui_control_fadelabel "ControlFadeLabel" | The fadelabel has multiple labels which it cycles through + /// | \ref python_xbmcgui_control_textbox "ControlTextBox" | To show bigger text field + /// | \ref python_xbmcgui_control_button "ControlButton" | Brings a button to do some actions + /// | \ref python_xbmcgui_control_edit "ControlEdit" | The edit control allows a user to input text in Kodi + /// | \ref python_xbmcgui_control_fadelabel "ControlFadeLabel" | The fade label control is used for displaying multiple pieces of text in the same space in Kodi + /// | \ref python_xbmcgui_control_list "ControlList" | Add a list for something like files + /// | \ref python_xbmcgui_control_group "ControlGroup" | Is for a group which brings the others together + /// | \ref python_xbmcgui_control_image "ControlImage" | Controls a image on skin + /// | \ref python_xbmcgui_control_radiobutton "ControlRadioButton" | For a radio button which handle boolean values + /// | \ref python_xbmcgui_control_progress "ControlProgress" | Progress bar for a performed work or something else + /// | \ref python_xbmcgui_control_slider "ControlSlider" | The slider control is used for things where a sliding bar best represents the operation at hand + /// | \ref python_xbmcgui_control_spin "ControlSpin" | The spin control is used for when a list of options can be chosen + /// | \ref python_xbmcgui_control_textbox "ControlTextBox" | The text box is used for showing a large multipage piece of text in Kodi + /// + addControl(...); +#else + SWIGHIDDENVIRTUAL void addControl(Control* pControl); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ addControls(List) } + /// Add a list of Controls to this window. + /// + /// @param List List with controls to add + /// @throws TypeError If supplied argument is not of List + /// type, or a control is not of \ref python_xbmcgui_control + /// type + /// @throws ReferenceError If control is already used in another + /// window + /// @throws RuntimeError Should not happen :-) + /// + addControls(...); +#else + SWIGHIDDENVIRTUAL void addControls(std::vector<Control*> pControls); +#endif + +#ifdef DOXYGEN_SHOULD_USE_THIS + /// + /// \ingroup python_xbmcgui_window + /// @brief \python_func{ getControl(controlId) } + /// Gets the control from this window. + /// + /// @param controlId \ref python_xbmcgui_control id to get + /// @throws Exception If \ref python_xbmcgui_control doesn't exist + /// + /// @remark controlId doesn't have to be a python control, it can be a + /// control id from a Kodi window too (you can find id's in the xml files. + /// + /// @note Not python controls are not completely usable yet + /// You can only use the \ref python_xbmcgui_control functions + /// + getControl(...); +#else + SWIGHIDDENVIRTUAL Control* getControl(int iControlId); +#endif + }; + ///@} + } +} |