fixed: Video OSD animations weren't reset on close/reopen.
[xbmc:xbmc-antiquated.git] / guilib / GUIWindow.h
1 /*!
2 \file GUIWindow.h
3 \brief 
4 */
5
6 #ifndef GUILIB_GUIWINDOW_H
7 #define GUILIB_GUIWINDOW_H
8
9 #pragma once
10
11 /*
12  *      Copyright (C) 2005-2008 Team XBMC
13  *      http://www.xbmc.org
14  *
15  *  This Program is free software; you can redistribute it and/or modify
16  *  it under the terms of the GNU General Public License as published by
17  *  the Free Software Foundation; either version 2, or (at your option)
18  *  any later version.
19  *
20  *  This Program is distributed in the hope that it will be useful,
21  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  *  GNU General Public License for more details.
24  *
25  *  You should have received a copy of the GNU General Public License
26  *  along with XBMC; see the file COPYING.  If not, write to
27  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
28  *  http://www.gnu.org/copyleft/gpl.html
29  *
30  */
31
32 #include "GUIControl.h"
33
34 class CGUIControlGroup;
35 class CFileItem;
36
37 #include "GUICallback.h"  // for GUIEvent
38
39 #include <map>
40 #include <vector>
41
42 #define ON_CLICK_MESSAGE(i,c,m) \
43 { \
44  GUIEventHandler<c, CGUIMessage&> clickHandler(this, &m); \
45  m_mapClickEvents[i] = clickHandler; \
46 } \
47
48 #define ON_SELECTED_MESSAGE(i,c,m) \
49 { \
50  GUIEventHandler<c, CGUIMessage&> selectedHandler(this, &m); \
51  m_mapSelectedEvents[i] = selectedHandler; \
52 } \
53
54 // forward
55 class TiXmlNode;
56 class TiXmlElement;
57
58 class COrigin
59 {
60 public:
61   COrigin()
62   {
63     x = y = 0;
64     condition = 0;
65   };
66   float x;
67   float y;
68   int condition;
69 };
70
71 /*!
72  \ingroup winmsg
73  \brief 
74  */
75 class CGUIWindow
76 {
77 public:
78   enum WINDOW_TYPE { WINDOW = 0, MODAL_DIALOG, MODELESS_DIALOG, BUTTON_MENU, SUB_MENU };
79
80   CGUIWindow(DWORD dwID, const CStdString &xmlFile);
81   virtual ~CGUIWindow(void);
82
83   bool Initialize();  // loads the window
84   virtual bool Load(const CStdString& strFileName, bool bContainsPath = false);
85   virtual bool Load(TiXmlElement* pRootElement);
86   virtual void SetPosition(float posX, float posY);
87   void CenterWindow();
88   virtual void Render();
89
90   // OnAction() is called by our window manager.  We should process any messages
91   // that should be handled at the window level in the derived classes, and any
92   // unhandled messages should be dropped through to here where we send the message
93   // on to the currently focused control.  Returns true if the action has been handled
94   // and does not need to be passed further down the line (to our global action handlers)
95   virtual bool OnAction(const CAction &action);
96
97   virtual bool OnMouse(const CPoint &point);
98   bool HandleMouse(CGUIControl *pControl, const CPoint &point);
99   bool OnMove(int fromControl, int moveAction);
100   virtual bool OnMessage(CGUIMessage& message);
101   void Add(CGUIControl* pControl);
102   void Insert(CGUIControl *control, const CGUIControl *insertPoint);
103   bool Remove(DWORD dwId);
104   bool ControlGroupHasFocus(int groupID, int controlID);
105   void SetID(DWORD dwID);
106   virtual DWORD GetID(void) const;
107   virtual bool HasID(DWORD dwID) { return (dwID >= m_dwWindowId && dwID < m_dwWindowId + m_dwIDRange); };
108   void SetIDRange(DWORD dwRange) { m_dwIDRange = dwRange; };
109   DWORD GetIDRange() const { return m_dwIDRange; };
110   virtual float GetWidth() { return m_width; };
111   virtual float GetHeight() { return m_height; };
112   DWORD GetPreviousWindow() { return m_previousWindow; };
113   float GetPosX() { return m_posX; };
114   float GetPosY() { return m_posY; };
115   FRECT GetScaledBounds() const;
116   const CGUIControl* GetControl(int iControl) const;
117   void ClearAll();
118   int GetFocusedControlID() const;
119   CGUIControl *GetFocusedControl() const;
120   virtual void AllocResources(bool forceLoad = false);
121   virtual void FreeResources(bool forceUnLoad = false);
122   void DynamicResourceAlloc(bool bOnOff);
123 //#ifdef PRE_SKIN_VERSION_2_1_COMPATIBILITY
124   static void FlushReferenceCache();
125 //#endif
126   virtual bool IsDialog() const { return false; };
127   virtual bool IsDialogRunning() const { return false; };
128   virtual bool IsModalDialog() const { return false; };
129   virtual bool IsMediaWindow() const { return false; };
130   virtual bool HasListItems() const { return false; };
131   virtual CFileItem *GetCurrentListItem(int offset = 0) { return NULL; };
132   virtual int GetViewContainerID() const { return 0; };
133   void GetContainers(std::vector<CGUIControl *> &containers) const;
134   virtual bool IsActive() const;
135   bool IsAllocated() const { return m_WindowAllocated; };
136   void SetCoordsRes(RESOLUTION res) { m_coordsRes = res; };
137   RESOLUTION GetCoordsRes() const { return m_coordsRes; };
138   int GetVisibleCondition() const { return m_visibleCondition; };
139   void SetXMLFile(const CStdString &xmlFile) { m_xmlFile = xmlFile; };
140   const CStdString &GetXMLFile() const { return m_xmlFile; };
141   void LoadOnDemand(bool loadOnDemand) { m_loadOnDemand = loadOnDemand; };
142   bool GetLoadOnDemand() { return m_loadOnDemand; }
143   int GetRenderOrder() { return m_renderOrder; };
144   void SetControlVisibility();
145
146   enum OVERLAY_STATE { OVERLAY_STATE_PARENT_WINDOW=0, OVERLAY_STATE_SHOWN, OVERLAY_STATE_HIDDEN };
147
148   OVERLAY_STATE GetOverlayState() const { return m_overlayState; };
149
150   virtual void QueueAnimation(ANIMATION_TYPE animType);
151   virtual bool IsAnimating(ANIMATION_TYPE animType);
152   virtual void ResetAnimations();
153
154   virtual void ResetControlStates();
155
156 #ifdef _DEBUG
157   void DumpTextureUse();
158 #endif
159
160 protected:
161   virtual void SetDefaults();
162   virtual void OnWindowUnload() {}
163   virtual void OnWindowLoaded();
164   virtual void OnInitWindow();
165   virtual void OnDeinitWindow(int nextWindowID);
166   virtual void OnMouseAction();
167   virtual bool RenderAnimation(DWORD time);
168   virtual void UpdateStates(ANIMATION_TYPE type, ANIMATION_PROCESS currentProcess, ANIMATION_STATE currentState);
169   bool HasAnimation(ANIMATION_TYPE animType);
170   CAnimation *GetAnimation(ANIMATION_TYPE animType, bool checkConditions = true);
171
172   // control state saving on window close
173   virtual void SaveControlStates();
174   virtual void RestoreControlStates();
175   void AddControlGroup(int id);
176   virtual CGUIControl *GetFirstFocusableControl(int id);
177
178   typedef GUIEvent<CGUIMessage&> CLICK_EVENT;
179   typedef std::map<int, CLICK_EVENT> MAPCONTROLCLICKEVENTS;
180   MAPCONTROLCLICKEVENTS m_mapClickEvents;
181
182   typedef GUIEvent<CGUIMessage&> SELECTED_EVENT;
183   typedef std::map<int, SELECTED_EVENT> MAPCONTROLSELECTEDEVENTS;
184   MAPCONTROLSELECTEDEVENTS m_mapSelectedEvents;
185
186   void LoadControl(TiXmlElement* pControl, CGUIControlGroup *pGroup);
187
188 //#ifdef PRE_SKIN_VERSION_2_1_COMPATIBILITY
189   bool LoadReferences();
190   static CStdString CacheFilename;
191 //#endif
192
193   std::vector<CGUIControl*> m_vecControls;
194   typedef std::vector<CGUIControl*>::iterator ivecControls;
195   typedef std::vector<CGUIControl*>::const_iterator ciControls;
196   DWORD m_dwWindowId;
197   DWORD m_dwIDRange;
198   DWORD m_dwDefaultFocusControlID;
199   bool m_bRelativeCoords;
200   float m_posX;
201   float m_posY;
202   float m_width;
203   float m_height;
204   OVERLAY_STATE m_overlayState;
205   bool m_WindowAllocated;
206   RESOLUTION m_coordsRes; // resolution that the window coordinates are in.
207   bool m_needsScaling;
208   CStdString m_xmlFile;  // xml file to load
209   bool m_windowLoaded;  // true if the window's xml file has been loaded
210   bool m_loadOnDemand;  // true if the window should be loaded only as needed
211   bool m_isDialog;      // true if we have a dialog, false otherwise.
212   bool m_dynamicResourceAlloc;
213   int m_visibleCondition;
214
215   bool   m_hasCamera;
216   CPoint m_camera;      // 3D camera position (x,y coords - z is fixed currently)
217   std::vector<CAnimation> m_animations;
218   TransformMatrix m_transform;
219
220   int m_renderOrder;      // for render order of dialogs
221   bool m_hasRendered;
222
223   std::vector<COrigin> m_origins;  // positions of dialogs depending on base window
224
225   // control states
226   bool m_saveLastControl;
227   int m_lastControlID;
228   int m_focusedControl;
229   std::vector<CControlState> m_controlStates;
230   DWORD m_previousWindow;
231 };
232
233 #endif