changed: dos2unixed some files with mixed line endings and set svn:eol-style native
[xbmc:xbmc-antiquated.git] / guilib / GUIListItemLayout.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 "GUIListItemLayout.h"
24 #include "FileItem.h"
25 #include "GuiControlFactory.h"
26 #include "SkinInfo.h"
27 #include "utils/GUIInfoManager.h"
28 #include "GUIListLabel.h"
29
30 using namespace std;
31
32 CGUIListItemLayout::CGUIListItemLayout()
33 : m_group(0, 0, 0, 0, 0, 0)
34 {
35   m_width = 0;
36   m_height = 0;
37   m_condition = 0;
38   m_focused = false;
39   m_invalidated = true;
40   m_isPlaying = false;
41 }
42
43 CGUIListItemLayout::CGUIListItemLayout(const CGUIListItemLayout &from)
44 : m_group(from.m_group)
45 {
46   m_width = from.m_width;
47   m_height = from.m_height;
48   m_focused = from.m_focused;
49   m_condition = from.m_condition;
50   m_invalidated = true;
51   m_isPlaying = false;
52 }
53
54 CGUIListItemLayout::~CGUIListItemLayout()
55 {
56 }
57
58 bool CGUIListItemLayout::IsAnimating(ANIMATION_TYPE animType)
59 {
60   return m_group.IsAnimating(animType);
61 }
62
63 void CGUIListItemLayout::ResetAnimation(ANIMATION_TYPE animType)
64 {
65   return m_group.ResetAnimation(animType);
66 }
67
68 float CGUIListItemLayout::Size(ORIENTATION orientation) const
69 {
70   return (orientation == HORIZONTAL) ? m_width : m_height;
71 }
72
73 void CGUIListItemLayout::Render(CGUIListItem *item, DWORD parentID, DWORD time)
74 {
75   if (m_invalidated)
76   { // need to update our item
77     // could use a dynamic cast here if RTTI was enabled.  As it's not,
78     // let's use a static cast with a virtual base function
79     CFileItem *fileItem = item->IsFileItem() ? (CFileItem *)item : new CFileItem(*item);
80     m_isPlaying = g_infoManager.GetBool(LISTITEM_ISPLAYING, parentID, item);
81     m_group.UpdateInfo(fileItem);
82     m_invalidated = false;
83     // delete our temporary fileitem
84     if (!item->IsFileItem())
85       delete fileItem;
86   }
87
88   // update visibility, and render
89   m_group.SetState(item->IsSelected() || m_isPlaying, m_focused);
90   m_group.UpdateVisibility(item);
91   m_group.DoRender(time);
92 }
93
94 void CGUIListItemLayout::SetFocusedItem(unsigned int focus)
95 {
96   m_group.SetFocusedItem(focus);
97 }
98
99 unsigned int CGUIListItemLayout::GetFocusedItem() const
100 {
101   return m_group.GetFocusedItem();
102 }
103
104 void CGUIListItemLayout::SelectItemFromPoint(const CPoint &point)
105 {
106   m_group.SelectItemFromPoint(point);
107 }
108
109 bool CGUIListItemLayout::MoveLeft()
110 {
111   return m_group.MoveLeft();
112 }
113
114 bool CGUIListItemLayout::MoveRight()
115 {
116   return m_group.MoveRight();
117 }
118
119 void CGUIListItemLayout::LoadControl(TiXmlElement *child, CGUIControlGroup *group)
120 {
121   if (!group) return;
122
123   FRECT rect = { group->GetXPosition(), group->GetYPosition(), group->GetXPosition() + group->GetWidth(), group->GetYPosition() + group->GetHeight() };
124
125   CGUIControlFactory factory;
126   CGUIControl *control = factory.Create(0, rect, child, true);  // true indicating we're inside a list for the
127                                                                 // different label control + defaults.
128   if (control)
129   {
130     group->AddControl(control);
131     if (control->IsGroup())
132     {
133       TiXmlElement *grandChild = child->FirstChildElement("control");
134       while (grandChild)
135       {
136         LoadControl(grandChild, (CGUIControlGroup *)control);
137         grandChild = grandChild->NextSiblingElement("control");
138       }
139     }
140   }
141 }
142
143 void CGUIListItemLayout::LoadLayout(TiXmlElement *layout, bool focused)
144 {
145   m_focused = focused;
146   g_SkinInfo.ResolveIncludes(layout);
147   g_SkinInfo.ResolveConstant(layout->Attribute("width"), m_width);
148   g_SkinInfo.ResolveConstant(layout->Attribute("height"), m_height);
149   const char *condition = layout->Attribute("condition");
150   if (condition)
151     m_condition = g_infoManager.TranslateString(condition);
152   TiXmlElement *child = layout->FirstChildElement("control");
153   m_group.SetWidth(m_width);
154   m_group.SetHeight(m_height);
155   while (child)
156   {
157     LoadControl(child, &m_group);
158     child = child->NextSiblingElement("control");
159   }
160 }
161
162 //#ifdef PRE_SKIN_VERSION_2_1_COMPATIBILITY
163 void CGUIListItemLayout::CreateListControlLayouts(float width, float height, bool focused, const CLabelInfo &labelInfo, const CLabelInfo &labelInfo2, const CImage &texture, const CImage &textureFocus, float texHeight, float iconWidth, float iconHeight, int nofocusCondition, int focusCondition)
164 {
165   m_width = width;
166   m_height = height;
167   m_focused = focused;
168   CGUIImage *tex = new CGUIImage(0, 0, 0, 0, width, texHeight, texture);
169   tex->SetVisibleCondition(nofocusCondition, false);
170   m_group.AddControl(tex);
171   if (focused)
172   {
173     CGUIImage *tex = new CGUIImage(0, 0, 0, 0, width, texHeight, textureFocus);
174     tex->SetVisibleCondition(focusCondition, false);
175     m_group.AddControl(tex);
176   }
177   CGUIImage *image = new CGUIImage(0, 0, 8, 0, iconWidth, texHeight, CImage("$INFO[ListItem.Icon]"));
178   image->SetAspectRatio(CGUIImage::CAspectRatio::AR_KEEP);
179   m_group.AddControl(image);
180   float x = iconWidth + labelInfo.offsetX + 10;
181   CGUIListLabel *label = new CGUIListLabel(0, 0, x, labelInfo.offsetY, width - x - 18, height, labelInfo, CGUIInfoLabel("$INFO[ListItem.Label]"), false, CScrollInfo::defaultSpeed);
182   m_group.AddControl(label);
183   x = labelInfo2.offsetX ? labelInfo2.offsetX : m_width - 16;
184   label = new CGUIListLabel(0, 0, x, labelInfo2.offsetY, x - iconWidth - 20, height, labelInfo2, CGUIInfoLabel("$INFO[ListItem.Label2]"), false, CScrollInfo::defaultSpeed);
185   m_group.AddControl(label);
186 }
187
188 void CGUIListItemLayout::CreateThumbnailPanelLayouts(float width, float height, bool focused, const CImage &image, float texWidth, float texHeight, float thumbPosX, float thumbPosY, float thumbWidth, float thumbHeight, DWORD thumbAlign, const CGUIImage::CAspectRatio &thumbAspect, const CLabelInfo &labelInfo, bool hideLabels)
189 {
190   m_width = width;
191   m_height = height;
192   m_focused = focused;
193   float centeredPosX = (m_width - texWidth)*0.5f;
194   CGUIImage *tex = new CGUIImage(0, 0, centeredPosX, 0, texWidth, texHeight, image);
195   m_group.AddControl(tex);
196   // thumbnail
197   float xOff = 0;
198   float yOff = 0;
199   if (thumbAlign != 0)
200   {
201     xOff += (texWidth - thumbWidth) * 0.5f;
202     yOff += (texHeight - thumbHeight) * 0.5f;
203     //if thumbPosX or thumbPosX != 0 the thumb will be bumped off-center
204   }
205   CGUIImage *thumb = new CGUIImage(0, 0, thumbPosX + centeredPosX + xOff, thumbPosY + yOff, thumbWidth, thumbHeight, CImage("$INFO[ListItem.Icon]"));
206   thumb->SetAspectRatio(thumbAspect);
207   m_group.AddControl(thumb);
208   // overlay
209   CGUIImage *overlay = new CGUIImage(0, 0, thumbPosX + centeredPosX + xOff + thumbWidth - 32, thumbPosY + yOff + thumbHeight - 32, 32, 32, CImage("$INFO[ListItem.Overlay]"));
210   overlay->SetAspectRatio(thumbAspect);
211   m_group.AddControl(overlay);
212   // label
213   if (hideLabels) return;
214   CGUIListLabel *label = new CGUIListLabel(0, 0, width*0.5f, texHeight, width, height, labelInfo, CGUIInfoLabel("$INFO[ListItem.Label]"), false, CScrollInfo::defaultSpeed);
215   m_group.AddControl(label);
216 }
217 //#endif
218
219 #ifdef _DEBUG
220 void CGUIListItemLayout::DumpTextureUse()
221 {
222   m_group.DumpTextureUse();
223 }
224 #endif