fixed: align center wasn't working in edit controls
[xbmc:xbmc-antiquated.git] / guilib / GUIButtonControl.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 "GUIButtonControl.h"
23 #include "GUIWindowManager.h"
24 #include "GUIDialog.h"
25 #include "utils/CharsetConverter.h"
26 #include "GUIFontManager.h"
27
28 using namespace std;
29
30 CGUIButtonControl::CGUIButtonControl(int parentID, int controlID, float posX, float posY, float width, float height, const CTextureInfo& textureFocus, const CTextureInfo& textureNoFocus, const CLabelInfo& labelInfo)
31     : CGUIControl(parentID, controlID, posX, posY, width, height)
32     , m_imgFocus(posX, posY, width, height, textureFocus)
33     , m_imgNoFocus(posX, posY, width, height, textureNoFocus)
34     , m_label(posX, posY, width, height, labelInfo)
35     , m_label2(posX, posY, width, height, labelInfo)
36 {
37   m_bSelected = false;
38   m_alpha = 255;
39   m_focusCounter = 0;
40   ControlType = GUICONTROL_BUTTON;
41 }
42
43 CGUIButtonControl::~CGUIButtonControl(void)
44 {
45 }
46
47 void CGUIButtonControl::Render()
48 {
49   if (m_bInvalidated)
50   {
51     m_imgFocus.SetWidth(m_width);
52     m_imgFocus.SetHeight(m_height);
53
54     m_imgNoFocus.SetWidth(m_width);
55     m_imgNoFocus.SetHeight(m_height);
56   }
57
58   if (HasFocus())
59   {
60     if (m_pulseOnSelect)
61     {
62       unsigned int alphaCounter = m_focusCounter + 2;
63       unsigned int alphaChannel;
64       if ((alphaCounter % 128) >= 64)
65         alphaChannel = alphaCounter % 64;
66       else
67         alphaChannel = 63 - (alphaCounter % 64);
68
69       alphaChannel += 192;
70       alphaChannel = (unsigned int)((float)m_alpha * (float)alphaChannel / 255.0f);
71       m_imgFocus.SetAlpha((unsigned char)alphaChannel);
72     }
73     m_imgFocus.SetVisible(true);
74     m_imgNoFocus.SetVisible(false);
75     m_focusCounter++;
76   }
77   else
78   {
79     m_imgFocus.SetVisible(false);
80     m_imgNoFocus.SetVisible(true);
81   }
82   // render both so the visibility settings cause the frame counter to resetcorrectly
83   m_imgFocus.Render();
84   m_imgNoFocus.Render();
85
86   RenderText();
87   CGUIControl::Render();
88 }
89
90 CGUILabel::COLOR CGUIButtonControl::GetTextColor() const
91 {
92   if (IsDisabled())
93     return CGUILabel::COLOR_DISABLED;
94   if (HasFocus())
95     return CGUILabel::COLOR_FOCUSED;
96   return CGUILabel::COLOR_TEXT;
97 }
98
99 void CGUIButtonControl::RenderText()
100 {
101   m_label.SetMaxRect(m_posX, m_posY, m_width, m_height);
102   m_label.SetText(m_info.GetLabel(m_parentID));
103
104   // render the second label if it exists
105   CStdString label2(m_info2.GetLabel(m_parentID));
106   if (!label2.IsEmpty())
107   {
108     m_label2.SetMaxRect(m_posX, m_posY, m_width, m_height);
109     m_label2.SetText(label2);
110     m_label2.SetAlign(XBFONT_RIGHT | (m_label.GetLabelInfo().align & XBFONT_CENTER_Y) | XBFONT_TRUNCATED);
111
112     // TODO: call a function to compute the "best" render rect from these two
113     CRect leftLabel(m_label.GetRenderRect());
114     CRect rightLabel(m_label2.GetRenderRect());
115
116     m_label2.SetColor(GetTextColor());
117     m_label2.Render();
118   }
119   m_label.SetColor(GetTextColor());
120   m_label.Render();
121 }
122
123 bool CGUIButtonControl::OnAction(const CAction &action)
124 {
125   if (action.GetID() == ACTION_SELECT_ITEM)
126   {
127     OnClick();
128     return true;
129   }
130   return CGUIControl::OnAction(action);
131 }
132
133 bool CGUIButtonControl::OnMessage(CGUIMessage& message)
134 {
135   if (message.GetControlId() == GetID())
136   {
137     if (message.GetMessage() == GUI_MSG_LABEL_SET)
138     {
139       SetLabel(message.GetLabel());
140       return true;
141     }
142     if (message.GetMessage() == GUI_MSG_LABEL2_SET)
143     {
144       SetLabel2(message.GetLabel());
145       return true;
146     }
147     if (message.GetMessage() == GUI_MSG_SELECTED)
148     {
149       m_bSelected = true;
150       return true;
151     }
152     if (message.GetMessage() == GUI_MSG_DESELECTED)
153     {
154       m_bSelected = false;
155       return true;
156     }
157   }
158
159   return CGUIControl::OnMessage(message);
160 }
161
162 void CGUIButtonControl::AllocResources()
163 {
164   CGUIControl::AllocResources();
165   m_focusCounter = 0;
166   m_imgFocus.AllocResources();
167   m_imgNoFocus.AllocResources();
168   if (!m_width)
169     m_width = m_imgFocus.GetWidth();
170   if (!m_height)
171     m_height = m_imgFocus.GetHeight();
172 }
173
174 void CGUIButtonControl::FreeResources()
175 {
176   CGUIControl::FreeResources();
177   m_imgFocus.FreeResources();
178   m_imgNoFocus.FreeResources();
179 }
180
181 void CGUIButtonControl::DynamicResourceAlloc(bool bOnOff)
182 {
183   CGUIControl::DynamicResourceAlloc(bOnOff);
184   m_imgFocus.DynamicResourceAlloc(bOnOff);
185   m_imgNoFocus.DynamicResourceAlloc(bOnOff);
186 }
187
188 void CGUIButtonControl::SetInvalid()
189 {
190   CGUIControl::SetInvalid();
191   m_imgFocus.SetInvalid();
192   m_imgNoFocus.SetInvalid();
193 }
194
195 void CGUIButtonControl::SetLabel(const string &label)
196 { // NOTE: No fallback for buttons at this point
197   m_info.SetLabel(label, "");
198 }
199
200 void CGUIButtonControl::SetLabel2(const string &label2)
201 { // NOTE: No fallback for buttons at this point
202   m_info2.SetLabel(label2, "");
203 }
204
205 void CGUIButtonControl::SetPosition(float posX, float posY)
206 {
207   CGUIControl::SetPosition(posX, posY);
208   m_imgFocus.SetPosition(posX, posY);
209   m_imgNoFocus.SetPosition(posX, posY);
210 }
211
212 void CGUIButtonControl::SetAlpha(unsigned char alpha)
213 {
214   m_alpha = alpha;
215   m_imgFocus.SetAlpha(alpha);
216   m_imgNoFocus.SetAlpha(alpha);
217 }
218
219 void CGUIButtonControl::UpdateColors()
220 {
221   m_label.UpdateColors();
222   CGUIControl::UpdateColors();
223   m_imgFocus.SetDiffuseColor(m_diffuseColor);
224   m_imgNoFocus.SetDiffuseColor(m_diffuseColor);
225 }
226
227 bool CGUIButtonControl::OnMouseEvent(const CPoint &point, const CMouseEvent &event)
228 {
229   if (event.m_id == ACTION_MOUSE_LEFT_CLICK)
230   {
231     OnAction(CAction(ACTION_SELECT_ITEM));
232     return true;
233   }
234   return false;
235 }
236
237 CStdString CGUIButtonControl::GetDescription() const
238 {
239   CStdString strLabel(m_info.GetLabel(m_parentID));
240   return strLabel;
241 }
242
243 CStdString CGUIButtonControl::GetLabel2() const
244 {
245   CStdString strLabel(m_info2.GetLabel(m_parentID));
246   return strLabel;
247 }
248
249 void CGUIButtonControl::PythonSetLabel(const CStdString &strFont, const string &strText, color_t textColor, color_t shadowColor, color_t focusedColor)
250 {
251   m_label.GetLabelInfo().font = g_fontManager.GetFont(strFont);
252   m_label.GetLabelInfo().textColor = textColor;
253   m_label.GetLabelInfo().focusedColor = focusedColor;
254   m_label.GetLabelInfo().shadowColor = shadowColor;
255   SetLabel(strText);
256 }
257
258 void CGUIButtonControl::PythonSetDisabledColor(color_t disabledColor)
259 {
260   m_label.GetLabelInfo().disabledColor = disabledColor;
261 }
262
263 void CGUIButtonControl::SettingsCategorySetTextAlign(uint32_t align)
264 {
265   m_label.SetAlign(align);
266 }
267
268 void CGUIButtonControl::OnClick()
269 {
270   // Save values, as the click message may deactivate the window
271   int controlID = GetID();
272   int parentID = GetParentID();
273   vector<CGUIActionDescriptor> clickActions = m_clickActions;
274
275   // button selected, send a message
276   CGUIMessage msg(GUI_MSG_CLICKED, controlID, parentID, 0);
277   SendWindowMessage(msg);
278
279   // and execute our actions
280   for (unsigned int i = 0; i < clickActions.size(); i++)
281   {
282     CGUIMessage message(GUI_MSG_EXECUTE, controlID, parentID);
283     message.SetAction(clickActions[i]);
284     g_windowManager.SendMessage(message);
285   }
286 }
287
288 void CGUIButtonControl::OnFocus()
289 {
290   for (unsigned int i = 0; i < m_focusActions.size(); i++)
291   { // send using a thread message to ensure the UI is updated prior to message firing.
292     CGUIMessage message(GUI_MSG_EXECUTE, m_controlID, m_parentID);
293     message.SetAction(m_focusActions[i]);
294     g_windowManager.SendThreadMessage(message);
295   }
296 }
297
298 void CGUIButtonControl::OnUnFocus()
299 {
300   for (unsigned int i = 0; i < m_unfocusActions.size(); i++)
301   { // send using a thread message to ensure the UI is updated prior to message firing.
302     CGUIMessage message(GUI_MSG_EXECUTE, m_controlID, m_parentID);
303     message.SetAction(m_unfocusActions[i]);
304     g_windowManager.SendThreadMessage(message);
305   }
306 }
307
308 void CGUIButtonControl::SetSelected(bool bSelected)
309 {
310   if (m_bSelected != bSelected)
311   {
312     m_bSelected = bSelected;
313     SetInvalid();
314   }
315 }
316