summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIWindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/GUIWindow.h')
-rw-r--r--xbmc/guilib/GUIWindow.h293
1 files changed, 293 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIWindow.h b/xbmc/guilib/GUIWindow.h
new file mode 100644
index 0000000..20d92f1
--- /dev/null
+++ b/xbmc/guilib/GUIWindow.h
@@ -0,0 +1,293 @@
+/*
+ * 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
+
+/*!
+\file GUIWindow.h
+\brief
+*/
+
+#include "GUIAction.h"
+#include "GUIControlGroup.h"
+#include <memory>
+#include "threads/CriticalSection.h"
+
+class CFileItem; typedef std::shared_ptr<CFileItem> CFileItemPtr;
+
+#include <limits.h>
+#include <map>
+#include <vector>
+
+enum RenderOrder {
+ RENDER_ORDER_WINDOW = 0,
+ RENDER_ORDER_DIALOG = 1,
+ RENDER_ORDER_WINDOW_SCREENSAVER = INT_MAX,
+ RENDER_ORDER_WINDOW_POINTER = INT_MAX - 1,
+ RENDER_ORDER_WINDOW_DEBUG = INT_MAX - 2,
+ RENDER_ORDER_DIALOG_TELETEXT = INT_MAX - 3
+};
+
+// forward
+class TiXmlNode;
+class TiXmlElement;
+class CXBMCTinyXML;
+class CVariant;
+
+class COrigin
+{
+public:
+ COrigin()
+ {
+ x = y = 0;
+ };
+ float x;
+ float y;
+ INFO::InfoPtr condition;
+};
+
+/*!
+ \ingroup winmsg
+ \brief
+ */
+class CGUIWindow : public CGUIControlGroup, protected CCriticalSection
+{
+public:
+ enum LOAD_TYPE { LOAD_EVERY_TIME, LOAD_ON_GUI_INIT, KEEP_IN_MEMORY };
+
+ CGUIWindow(int id, const std::string &xmlFile);
+ ~CGUIWindow(void) override;
+
+ bool Initialize(); // loads the window
+ bool Load(const std::string& strFileName, bool bContainsPath = false);
+
+ void CenterWindow();
+
+ void DoProcess(unsigned int currentTime, CDirtyRegionList &dirtyregions) override;
+
+ /*! \brief Main render function, called every frame.
+ Window classes should override this only if they need to alter how something is rendered.
+ General updating on a per-frame basis should be handled in FrameMove instead, as DoRender
+ is not necessarily re-entrant.
+ \sa FrameMove
+ */
+ void DoRender() override;
+
+ /*! \brief Do any post render activities.
+ Check if window closing animation is finished and finalize window closing.
+ */
+ void AfterRender();
+
+ /*! \brief Main update function, called every frame prior to rendering
+ Any window that requires updating on a frame by frame basis (such as to maintain
+ timers and the like) should override this function.
+ */
+ virtual void FrameMove() {}
+
+ void Close(bool forceClose = false, int nextWindowID = 0, bool enableSound = true, bool bWait = true);
+
+ // OnAction() is called by our window manager. We should process any messages
+ // that should be handled at the window level in the derived classes, and any
+ // unhandled messages should be dropped through to here where we send the message
+ // on to the currently focused control. Returns true if the action has been handled
+ // and does not need to be passed further down the line (to our global action handlers)
+ bool OnAction(const CAction &action) override;
+
+ using CGUIControlGroup::OnBack;
+ virtual bool OnBack(int actionID);
+ using CGUIControlGroup::OnInfo;
+ virtual bool OnInfo(int actionID) { return false; }
+
+ /*! \brief Clear the background (if necessary) prior to rendering the window
+ */
+ virtual void ClearBackground();
+
+ bool OnMove(int fromControl, int moveAction);
+ bool OnMessage(CGUIMessage& message) override;
+
+ bool ControlGroupHasFocus(int groupID, int controlID);
+ void SetID(int id) override;
+ virtual bool HasID(int controlID) const;
+ const std::vector<int>& GetIDRange() const { return m_idRange; }
+ int GetPreviousWindow() { return m_previousWindow; }
+ CRect GetScaledBounds() const;
+ void ClearAll() override;
+ using CGUIControlGroup::AllocResources;
+ virtual void AllocResources(bool forceLoad = false);
+ void FreeResources(bool forceUnLoad = false) override;
+ void DynamicResourceAlloc(bool bOnOff) override;
+ virtual bool IsDialog() const { return false; }
+ virtual bool IsDialogRunning() const { return false; }
+ virtual bool IsModalDialog() const { return false; }
+ virtual bool IsMediaWindow() const { return false; }
+ virtual bool HasListItems() const { return false; }
+ virtual bool IsSoundEnabled() const { return true; }
+ virtual CFileItemPtr GetCurrentListItem(int offset = 0) { return CFileItemPtr(); }
+ virtual int GetViewContainerID() const { return 0; }
+ virtual int GetViewCount() const { return 0; }
+ virtual bool CanBeActivated() const { return true; }
+ virtual bool IsActive() const;
+ void SetCoordsRes(const RESOLUTION_INFO& res) { m_coordsRes = res; }
+ const RESOLUTION_INFO& GetCoordsRes() const { return m_coordsRes; }
+ void SetLoadType(LOAD_TYPE loadType) { m_loadType = loadType; }
+ LOAD_TYPE GetLoadType() { return m_loadType; }
+ int GetRenderOrder() { return m_renderOrder; }
+ void SetInitialVisibility() override;
+ bool IsVisible() const override { return true; }; // windows are always considered visible as they implement their own
+ // versions of UpdateVisibility, and are deemed visible if they're in
+ // the window manager's active list.
+ virtual bool HasVisibleControls() { return true; }; //Assume that window always has visible controls
+
+ bool IsAnimating(ANIMATION_TYPE animType) override;
+
+ /*!
+ \brief Return if the window is a custom window
+ \return true if the window is an custom window otherwise false
+ */
+ bool IsCustom() const { return m_custom; }
+
+ /*!
+ \brief Mark this window as custom window
+ \param custom true if this window is a custom window, false if not
+ */
+ void SetCustom(bool custom) { m_custom = custom; }
+
+ void DisableAnimations();
+
+ virtual void ResetControlStates();
+ void UpdateControlStats() override {}; // Do not count window itself
+
+ void SetRunActionsManually();
+ void RunLoadActions() const;
+ void RunUnloadActions() const;
+
+ /*! \brief Set a property
+ Sets the value of a property referenced by a key.
+ \param key name of the property to set
+ \param value value to set, may be a string, integer, boolean or double.
+ \sa GetProperty
+ */
+ void SetProperty(const std::string &key, const CVariant &value);
+
+ /*! \brief Retrieve a property
+ \param key name of the property to retrieve
+ \return value of the property, empty if it doesn't exist
+ */
+ CVariant GetProperty(const std::string &key) const;
+
+ /*! \brief Clear a all the window's properties
+ \sa SetProperty, HasProperty, GetProperty
+ */
+ void ClearProperties();
+
+#ifdef _DEBUG
+ void DumpTextureUse() override;
+#endif
+ bool HasSaveLastControl() const { return !m_defaultAlways; }
+
+ virtual void OnDeinitWindow(int nextWindowID);
+protected:
+ EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event) override;
+
+ /*!
+ \brief Load the window XML from the given path
+ \param strPath the path to the window XML
+ \param strLowerPath a lowered path to the window XML
+ */
+ virtual bool LoadXML(const std::string& strPath, const std::string &strLowerPath);
+
+ /*!
+ \brief Loads the window from the given XML element
+ \param pRootElement the XML element
+ \return true if the window is loaded from the given XML otherwise false.
+ */
+ virtual bool Load(TiXmlElement *pRootElement);
+
+ /*!
+ \brief Prepare the XML for load
+ \param rootElement the original XML element
+ \return the prepared XML (resolved includes, constants and expression)
+ */
+ virtual std::unique_ptr<TiXmlElement> Prepare(const std::unique_ptr<TiXmlElement>& rootElement);
+
+ /*!
+ \brief Check if window needs a (re)load. The window need to be (re)loaded when window is not loaded or include conditions values were changed
+ */
+ bool NeedLoad() const;
+
+ virtual void SetDefaults();
+ virtual void OnWindowUnload() {}
+ virtual void OnWindowLoaded();
+ virtual void OnInitWindow();
+ void Close_Internal(bool forceClose = false, int nextWindowID = 0, bool enableSound = true);
+ EVENT_RESULT OnMouseAction(const CAction &action);
+ bool Animate(unsigned int currentTime) override;
+ bool CheckAnimation(ANIMATION_TYPE animType) override;
+
+ // control state saving on window close
+ virtual void SaveControlStates();
+ virtual void RestoreControlStates();
+
+ // methods for updating controls and sending messages
+ void OnEditChanged(int id, std::string &text);
+ bool SendMessage(int message, int id, int param1 = 0, int param2 = 0);
+
+ void LoadControl(TiXmlElement* pControl, CGUIControlGroup *pGroup, const CRect &rect);
+
+ std::vector<int> m_idRange;
+ RESOLUTION_INFO m_coordsRes; // resolution that the window coordinates are in.
+ bool m_needsScaling;
+ bool m_windowLoaded; // true if the window's xml file has been loaded
+ LOAD_TYPE m_loadType;
+ bool m_dynamicResourceAlloc;
+ bool m_closing;
+ bool m_active; // true if window is active or dialog is running
+ KODI::GUILIB::GUIINFO::CGUIInfoColor m_clearBackground; // colour to clear the window
+
+ int m_renderOrder; // for render order of dialogs
+
+ /*! \brief Grabs the window's top,left position in skin coordinates
+ The window origin may change based on `<origin>` tag conditions in the skin.
+
+ \return the window's origin in skin coordinates
+ */
+ CPoint GetPosition() const override;
+ std::vector<COrigin> m_origins; // positions of dialogs depending on base window
+
+ // control states
+ int m_lastControlID;
+ std::vector<CControlState> m_controlStates;
+ int m_previousWindow;
+
+ bool m_animationsEnabled;
+ struct icompare
+ {
+ bool operator()(const std::string &s1, const std::string &s2) const;
+ };
+
+ CGUIAction m_loadActions;
+ CGUIAction m_unloadActions;
+
+ /*! \brief window root xml definition after resolving any skin includes.
+ Stored to avoid parsing the XML every time the window is loaded.
+ */
+ std::unique_ptr<TiXmlElement> m_windowXMLRootElement;
+
+ bool m_manualRunActions;
+
+ int m_exclusiveMouseControl; ///< \brief id of child control that wishes to receive all mouse events \sa GUI_MSG_EXCLUSIVE_MOUSE
+
+ int m_menuControlID;
+ int m_menuLastFocusedControlID;
+ bool m_custom;
+
+private:
+ std::map<std::string, CVariant, icompare> m_mapProperties;
+ std::map<INFO::InfoPtr, bool> m_xmlIncludeConditions; ///< \brief used to store conditions used to resolve includes for this window
+};
+