]> git.vomp.tv Git - vompclient.git/blob - vlivebanner.cc
EPG & vvideolive clean up (inc new bugs!)
[vompclient.git] / vlivebanner.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "vlivebanner.h"
22
23 VLiveBanner::VLiveBanner(View* tparent, Channel* channel, bool bannerTakesCommands)
24 {
25   eventList = NULL;
26   parent = tparent;
27   takeCommands = bannerTakesCommands;
28
29   create(500, 120);
30   if (Video::getInstance()->getFormat() == Video::PAL)
31   {
32     setScreenPos(125, 410);
33   }
34   else
35   {
36     setScreenPos(115, 320);
37   }
38
39
40   setBackgroundColour(Colour::VIEWBACKGROUND);
41   setTitleBarOn(1);
42   setTitleBarColour(Colour::TITLEBARBACKGROUND);
43
44   sl.setSurface(surface);
45   sl.setSurfaceOffset(0, 30);
46   sl.setDimensions(area.w, area.h - 60);
47   sl.setNoLoop();
48
49   setChannel(channel);
50 }
51
52 VLiveBanner::~VLiveBanner()
53 {
54   delData();
55 }
56
57 void VLiveBanner::delData()
58 {
59   if (eventList)
60   {
61     int eventListSize = eventList->size();
62     for(int i = 0; i < eventListSize; i++)
63     {
64       delete (*eventList)[i];
65     }
66     eventList->clear();
67     delete eventList;
68
69   }
70   sl.clear();
71 }
72
73 void VLiveBanner::setChannel(Channel* tChannel)
74 {
75   delData();
76   currentChannel = tChannel;
77   // get the data
78
79   setTitleText(currentChannel->name);
80   eventList = VDR::getInstance()->getChannelSchedule(currentChannel->number);
81
82   if (!eventList)
83   {
84     sl.addOption(tr("No channel data available"), 1);
85   }
86   else
87   {
88     // sort the list
89     Log::getInstance()->log("Banner", Log::DEBUG, "Start sort");
90     sort(eventList->begin(), eventList->end(), EventSorter());
91     Log::getInstance()->log("Banner", Log::DEBUG, "End sort");
92
93     char tempString[300];
94     char tempString2[300];
95     struct tm* btime;
96     Event* event;
97     int first = 1;
98     int eventListSize = eventList->size();
99     for(int i = 0; i < eventListSize; i++)
100     {
101       event = (*eventList)[i];
102
103       btime = localtime((time_t*)&event->time);
104       strftime(tempString2, 299, "%0H:%0M ", btime);
105       snprintf(tempString, 299, "%s %s", tempString2, event->title);
106       event->index = sl.addOption(tempString, first);
107       first = 0;
108     }
109
110     // Reset the timer as it probably took 1-2 seconds to change the channel
111     ViewMan::getInstance()->timedDelete(this, 4, 0);
112   }
113 }
114
115 void VLiveBanner::draw()
116 {
117   View::draw();
118   sl.draw();
119   rectangle(0, area.h - 30, area.w, 30, titleBarColour);
120
121   rectangle(7, area.h - 24, 18, 16, Colour::RED);
122   drawText(tr("info"), 32, area.h - 25, Colour::LIGHTTEXT);
123 }
124
125 int VLiveBanner::handleCommand(int command)
126 {
127   switch (command)
128   {
129     case Remote::OK:
130     case Remote::BACK:
131     {
132       return 4;
133     }
134     case Remote::DF_UP:
135     {
136       if (!takeCommands) return 0; // banner was auto, old remote
137     } // else drop through
138     case Remote::UP:
139     {
140       sl.up();
141       sl.draw();
142
143       show();
144       return 2;
145     }
146     case Remote::DF_DOWN:
147     {
148       if (!takeCommands) return 0; // banner was auto, old remote
149     } // else drop through
150     case Remote::DOWN:
151     {
152       sl.down();
153       sl.draw();
154
155       show();
156       return 2;
157     }
158     case Remote::CHANNELUP:
159     {
160       ViewMan::getInstance()->timedDelete(this, 0, 0); // cancel timer so this view is still here later
161
162       Message* m = new Message();
163       m->from = this;
164       m->to = parent;
165       m->message = Message::CHANNEL_UP;
166       ViewMan::getInstance()->postMessage(m);
167       return 2;
168     }
169     case Remote::CHANNELDOWN:
170     {
171       ViewMan::getInstance()->timedDelete(this, 0, 0);
172
173       Message* m = new Message();
174       m->from = this;
175       m->to = parent;
176       m->message = Message::CHANNEL_DOWN;
177       ViewMan::getInstance()->postMessage(m);
178       return 2;
179     }
180     case Remote::RED:
181     case Remote::MENU:
182     {
183       if (!eventList) return 2;
184       Event* event;
185       int eventListSize = eventList->size();
186       for(int i = 0; i < eventListSize; i++)
187       {
188         event = (*eventList)[i];
189         if (event->index == sl.getCurrentOption())
190         {
191           Log::getInstance()->log("VLiveBanner", Log::DEBUG, "Found the option you pointed at. %s", event->title);
192           // First, cancel my delete timer
193           ViewMan::getInstance()->timedDelete(this, 0, 0);
194
195           VInfo* vi = new VInfo();
196           vi->setTitleText(event->title);
197           vi->setBorderOn(1);
198           vi->setExitable();
199           if (event->description) vi->setMainText(event->description);
200           else vi->setMainText(tr("Summary unavailable"));
201           if (Video::getInstance()->getFormat() == Video::PAL)
202           {
203             vi->setScreenPos(120, 130);
204           }
205           else
206           {
207             vi->setScreenPos(110, 90);
208           }
209           vi->create(510, 270);
210
211           ViewMan::getInstance()->addNoLock(vi);
212           vi->draw();
213           vi->show();
214
215           return 2;
216
217         }
218       }
219       return 2; // should not get here
220     }
221   }
222
223   return 1;
224 }