fixed: Control.GetLabel(id) didn't work on progress controls.
[xbmc:xbmc-antiquated.git] / XBMC / guilib / GUIProgressControl.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "include.h"
23 #include "GUIProgressControl.h"
24 #include "utils/GUIInfoManager.h"
25
26 CGUIProgressControl::CGUIProgressControl(DWORD dwParentID, DWORD dwControlId,
27                                          float posX, float posY, float width,
28                                          float height, const CTextureInfo& backGroundTexture,
29                                          const CTextureInfo& leftTexture,
30                                          const CTextureInfo& midTexture,
31                                          const CTextureInfo& rightTexture,
32                                          const CTextureInfo& overlayTexture, float min, float max,
33                                          bool reveal)
34     : CGUIControl(dwParentID, dwControlId, posX, posY, width, height)
35     , m_guiBackground(posX, posY, width, height, backGroundTexture)
36     , m_guiLeft(posX, posY, width, height, leftTexture)
37     , m_guiMid(posX, posY, width, height, midTexture)
38     , m_guiRight(posX, posY, width, height, rightTexture)
39     , m_guiOverlay(posX, posY, width, height, overlayTexture)
40 {
41   m_RangeMin = min;
42   m_RangeMax = max;
43   m_fPercent = 0;
44   m_iInfoCode = 0;
45   ControlType = GUICONTROL_PROGRESS;
46   m_bReveal = reveal;
47 }
48
49 CGUIProgressControl::~CGUIProgressControl(void)
50 {
51 }
52
53 void CGUIProgressControl::SetPosition(float posX, float posY)
54 {
55   // everything is positioned based on the background image position
56   CGUIControl::SetPosition(posX, posY);
57   m_guiBackground.SetPosition(posX, posY);
58 }
59
60 void CGUIProgressControl::Render()
61 {
62   if (!IsDisabled())
63   {
64     if (m_iInfoCode )
65     {
66       m_fPercent = (float)g_infoManager.GetInt(m_iInfoCode);
67       if ((m_RangeMax - m_RangeMin)> 0 && (m_RangeMax != 100 && m_RangeMin != 0) )
68       {
69         if (m_fPercent > m_RangeMax)
70           m_fPercent = m_RangeMax;
71         if (m_fPercent < m_RangeMin)
72           m_fPercent = m_RangeMin;
73         m_fPercent = ((100*(m_fPercent - m_RangeMin)) / (m_RangeMax - m_RangeMin));
74       }
75     }
76     if (m_fPercent < 0.0f) m_fPercent = 0.0f;
77     if (m_fPercent > 100.0f) m_fPercent = 100.0f;
78
79     float fScaleX, fScaleY;
80     if (m_width == 0)
81       m_width = m_guiBackground.GetTextureWidth();
82     if (m_height == 0)
83       m_height = m_guiBackground.GetTextureHeight();
84     fScaleY = m_height / m_guiBackground.GetTextureHeight();
85     fScaleX = m_width / m_guiBackground.GetTextureWidth();
86
87     m_guiBackground.SetHeight(m_height);
88     m_guiBackground.SetWidth(m_width);
89     m_guiBackground.Render();
90
91     float fWidth = m_fPercent;
92
93     float posX = m_guiBackground.GetXPosition();
94     float posY = m_guiBackground.GetYPosition();
95
96     if (m_guiLeft.GetFileName().IsEmpty() && m_guiRight.GetFileName().IsEmpty())
97     { // rendering without left and right image - fill the mid image completely
98       float width = m_fPercent * m_width * 0.01f;
99       if (m_fPercent && width > 1)
100       {
101         float offset = fabs(fScaleY * 0.5f * (m_guiMid.GetTextureHeight() - m_guiBackground.GetTextureHeight()));
102         if (offset > 0)  //  Center texture to the background if necessary
103           m_guiMid.SetPosition(posX, posY + offset);
104         else
105           m_guiMid.SetPosition(posX, posY);
106         m_guiMid.SetHeight(fScaleY * m_guiMid.GetTextureHeight());
107         if (m_bReveal)
108         {
109           m_guiMid.SetWidth(m_width);
110           g_graphicsContext.SetClipRegion(posX, posY+offset, width, fScaleY * m_guiMid.GetTextureHeight());
111           m_guiMid.Render();
112           g_graphicsContext.RestoreClipRegion();
113         }
114         else
115         {
116           m_guiMid.SetWidth(width);
117           m_guiMid.Render();
118         }
119         posX += fWidth * fScaleX;
120       }
121     }
122     else
123     {
124
125       float fWidth = m_fPercent;
126       float fFullWidth = m_guiBackground.GetTextureWidth() - m_guiLeft.GetTextureWidth() - m_guiRight.GetTextureWidth();
127       fWidth /= 100.0f;
128       fWidth *= fFullWidth;
129
130       float offset = fabs(fScaleY * 0.5f * (m_guiLeft.GetTextureHeight() - m_guiBackground.GetTextureHeight()));
131       if (offset > 0)  //  Center texture to the background if necessary
132         m_guiLeft.SetPosition(posX, posY + offset);
133       else
134         m_guiLeft.SetPosition(posX, posY);
135       m_guiLeft.SetHeight(fScaleY * m_guiLeft.GetTextureHeight());
136       m_guiLeft.SetWidth(fScaleX * m_guiLeft.GetTextureWidth());
137       m_guiLeft.Render();
138
139       posX += fScaleX * m_guiLeft.GetTextureWidth();
140       if (m_fPercent && (int)(fScaleX * fWidth) > 1)
141       {
142         float offset = fabs(fScaleY * 0.5f * (m_guiMid.GetTextureHeight() - m_guiBackground.GetTextureHeight()));
143         if (offset > 0)  //  Center texture to the background if necessary
144           m_guiMid.SetPosition(posX, posY + offset);
145         else
146           m_guiMid.SetPosition(posX, posY);
147         m_guiMid.SetHeight(fScaleY * m_guiMid.GetTextureHeight());
148         if (m_bReveal)
149         {
150           m_guiMid.SetWidth(fScaleX * fFullWidth);
151           g_graphicsContext.SetClipRegion(posX, posY+offset, fScaleX * fWidth, fScaleY * m_guiMid.GetTextureHeight());
152           m_guiMid.Render();
153           g_graphicsContext.RestoreClipRegion();
154         }
155         else
156         {
157           m_guiMid.SetWidth(fScaleX * fWidth);
158           m_guiMid.Render();
159         }
160         posX += fWidth * fScaleX;
161       }
162
163       offset = fabs(fScaleY * 0.5f * (m_guiRight.GetTextureHeight() - m_guiBackground.GetTextureHeight()));
164       if (offset > 0)  //  Center texture to the background if necessary
165         m_guiRight.SetPosition(posX, posY + offset);
166       else
167         m_guiRight.SetPosition(posX, posY);
168       m_guiRight.SetHeight(fScaleY * m_guiRight.GetTextureHeight());
169       m_guiRight.SetWidth(fScaleX * m_guiRight.GetTextureWidth());
170       m_guiRight.Render();
171     }
172     float offset = fabs(fScaleY * 0.5f * (m_guiOverlay.GetTextureHeight() - m_guiBackground.GetTextureHeight()));
173     if (offset > 0)  //  Center texture to the background if necessary
174       m_guiOverlay.SetPosition(m_guiBackground.GetXPosition(), m_guiBackground.GetYPosition() + offset);
175     else
176       m_guiOverlay.SetPosition(m_guiBackground.GetXPosition(), m_guiBackground.GetYPosition());
177     m_guiOverlay.SetHeight(fScaleY * m_guiOverlay.GetTextureHeight());
178     m_guiOverlay.SetWidth(fScaleX * m_guiOverlay.GetTextureWidth());
179     m_guiOverlay.Render();
180   }
181   CGUIControl::Render();
182 }
183
184
185 bool CGUIProgressControl::CanFocus() const
186 {
187   return false;
188 }
189
190
191 bool CGUIProgressControl::OnMessage(CGUIMessage& message)
192 {
193   return CGUIControl::OnMessage(message);
194 }
195
196 void CGUIProgressControl::SetPercentage(float fPercent)
197 {
198   m_fPercent = fPercent;
199 }
200
201 float CGUIProgressControl::GetPercentage() const
202 {
203   return m_fPercent;
204 }
205 void CGUIProgressControl::FreeResources()
206 {
207   CGUIControl::FreeResources();
208   m_guiBackground.FreeResources();
209   m_guiMid.FreeResources();
210   m_guiRight.FreeResources();
211   m_guiLeft.FreeResources();
212   m_guiOverlay.FreeResources();
213 }
214
215 void CGUIProgressControl::DynamicResourceAlloc(bool bOnOff)
216 {
217   CGUIControl::DynamicResourceAlloc(bOnOff);
218   m_guiBackground.DynamicResourceAlloc(bOnOff);
219   m_guiMid.DynamicResourceAlloc(bOnOff);
220   m_guiRight.DynamicResourceAlloc(bOnOff);
221   m_guiLeft.DynamicResourceAlloc(bOnOff);
222   m_guiOverlay.DynamicResourceAlloc(bOnOff);
223 }
224
225 void CGUIProgressControl::PreAllocResources()
226 {
227   CGUIControl::PreAllocResources();
228   m_guiBackground.PreAllocResources();
229   m_guiMid.PreAllocResources();
230   m_guiRight.PreAllocResources();
231   m_guiLeft.PreAllocResources();
232   m_guiOverlay.PreAllocResources();
233 }
234
235 void CGUIProgressControl::AllocResources()
236 {
237   CGUIControl::AllocResources();
238   m_guiBackground.AllocResources();
239   m_guiMid.AllocResources();
240   m_guiRight.AllocResources();
241   m_guiLeft.AllocResources();
242   m_guiOverlay.AllocResources();
243
244   m_guiBackground.SetHeight(25);
245   m_guiRight.SetHeight(20);
246   m_guiLeft.SetHeight(20);
247   m_guiMid.SetHeight(20);
248   m_guiOverlay.SetHeight(20);
249 }
250
251 void CGUIProgressControl::SetInfo(int iInfo)
252 {
253   m_iInfoCode = iInfo;
254 }
255
256 void CGUIProgressControl::UpdateColors()
257 {
258   CGUIControl::UpdateColors();
259   m_guiBackground.SetDiffuseColor(m_diffuseColor);
260   m_guiRight.SetDiffuseColor(m_diffuseColor);
261   m_guiLeft.SetDiffuseColor(m_diffuseColor);
262   m_guiMid.SetDiffuseColor(m_diffuseColor);
263   m_guiOverlay.SetDiffuseColor(m_diffuseColor);
264 }
265
266 CStdString CGUIProgressControl::GetDescription() const
267 {
268   CStdString percent;
269   percent.Format("%2.f", m_fPercent);
270   return percent;
271 }