]> git.vomp.tv Git - vompclient.git/blob - vlivebanner.cc
Switch over to updateView rather than show, EPG tweaks
[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::instance = NULL;
24
25 VLiveBanner::VLiveBanner(View* tparent, Channel* channel, bool bannerTakesCommands)
26 {
27   instance = this;
28   eventList = NULL;
29   parent = tparent;
30   takeCommands = bannerTakesCommands;
31
32   clockRegion.x = 440;
33   clockRegion.y = 0;
34   clockRegion.w = 60;
35   clockRegion.h = 30;
36
37   create(500, 120);
38   if (Video::getInstance()->getFormat() == Video::PAL)
39   {
40     setScreenPos(124, 410);
41   }
42   else
43   {
44     setScreenPos(114, 320);
45   }
46
47
48   setBackgroundColour(Colour::VIEWBACKGROUND);
49   setTitleBarOn(1);
50   setTitleBarColour(Colour::TITLEBARBACKGROUND);
51
52   sl.setSurface(surface);
53   sl.setSurfaceOffset(0, 30);
54   sl.setDimensions(area.w, area.h - 60);
55   sl.setNoLoop();
56
57   setChannel(channel);
58 }
59
60 VLiveBanner::~VLiveBanner()
61 {
62   instance = NULL;
63   Timers::getInstance()->cancelTimer(this, 1);
64   Timers::getInstance()->cancelTimer(this, 2);
65   delData();
66 }
67
68 VLiveBanner* VLiveBanner::getInstance()
69 {
70   return instance;
71 }
72
73 void VLiveBanner::delData()
74 {
75   if (eventList)
76   {
77     int eventListSize = eventList->size();
78     for(int i = 0; i < eventListSize; i++)
79     {
80       delete (*eventList)[i];
81     }
82     eventList->clear();
83     delete eventList;
84
85   }
86   sl.clear();
87 }
88
89 void VLiveBanner::setChannel(Channel* tChannel)
90 {
91   delData();
92   currentChannel = tChannel;
93   // get the data
94
95   char ttitleText[100];
96   snprintf(ttitleText, 99, "%03lu - %s", currentChannel->number, currentChannel->name);
97
98   setTitleText(ttitleText);
99   eventList = VDR::getInstance()->getChannelSchedule(currentChannel->number);
100
101   if (!eventList)
102   {
103     sl.addOption(tr("No channel data available"), 1);
104   }
105   else
106   {
107     // sort the list
108     Log::getInstance()->log("Banner", Log::DEBUG, "Start sort");
109     sort(eventList->begin(), eventList->end(), EventSorter());
110     Log::getInstance()->log("Banner", Log::DEBUG, "End sort");
111
112     char tempString[300];
113     char tempString2[300];
114     struct tm* btime;
115     Event* event;
116     int first = 1;
117     int eventListSize = eventList->size();
118     for(int i = 0; i < eventListSize; i++)
119     {
120       event = (*eventList)[i];
121
122       btime = localtime((time_t*)&event->time);
123       strftime(tempString2, 299, "%0H:%0M ", btime);
124       snprintf(tempString, 299, "%s %s", tempString2, event->title);
125       event->index = sl.addOption(tempString, first);
126       first = 0;
127     }
128
129     // Reset the timer as it probably took 1-2 seconds to change the channel
130     Timers::getInstance()->setTimer(this, 1, (struct timespec){4, 0});
131   }
132 }
133
134 void VLiveBanner::draw()
135 {
136   View::draw();
137   sl.draw();
138   rectangle(0, area.h - 30, area.w, 30, titleBarColour);
139
140   rectangle(7, area.h - 24, 18, 16, Colour::RED);
141   drawText(tr("info"), 32, area.h - 25, Colour::LIGHTTEXT);
142
143   rectangle(110, area.h - 24, 18, 16, Colour::GREEN);
144   drawText(tr("EPG"), 135, area.h - 25, Colour::LIGHTTEXT);
145
146   drawClock();
147 }
148
149 int VLiveBanner::handleCommand(int command)
150 {
151   switch (command)
152   {
153     case Remote::OK:
154     case Remote::BACK:
155     {
156       Timers::getInstance()->cancelTimer(this, 1); // if it exists
157       return 4;
158     }
159     case Remote::DF_UP:
160     {
161       if (!takeCommands) return 0; // banner was auto, old remote
162     } // else drop through
163     case Remote::UP:
164     {
165       sl.up();
166       sl.draw();
167
168       ViewMan::getInstance()->updateView(this);
169
170       // Arrows pressed, go to an 8s timer
171       Timers::getInstance()->setTimer(this, 1, (struct timespec){8, 0});
172
173       return 2;
174     }
175     case Remote::DF_DOWN:
176     {
177       if (!takeCommands) return 0; // banner was auto, old remote
178     } // else drop through
179     case Remote::DOWN:
180     {
181       sl.down();
182       sl.draw();
183
184       ViewMan::getInstance()->updateView(this);
185
186       // Arrows pressed, go to an 8s timer
187       Timers::getInstance()->setTimer(this, 1, (struct timespec){8, 0});
188
189       return 2;
190     }
191     case Remote::CHANNELUP:
192     {
193       // cancel timer so this view is still here later
194       Timers::getInstance()->cancelTimer(this, 1); // if it exists
195
196       Message* m = new Message();
197       m->from = this;
198       m->to = parent;
199       m->message = Message::CHANNEL_UP;
200       ViewMan::getInstance()->postMessage(m);
201       return 2;
202     }
203     case Remote::CHANNELDOWN:
204     {
205       // cancel timer so this view is still here later
206       Timers::getInstance()->cancelTimer(this, 1); // if it exists
207
208       Message* m = new Message();
209       m->from = this;
210       m->to = parent;
211       m->message = Message::CHANNEL_DOWN;
212       ViewMan::getInstance()->postMessage(m);
213       return 2;
214     }
215     case Remote::RED:
216     case Remote::MENU:
217     {
218       if (!eventList) return 2;
219       Event* event;
220       int eventListSize = eventList->size();
221       for(int i = 0; i < eventListSize; i++)
222       {
223         event = (*eventList)[i];
224         if (event->index == sl.getCurrentOption())
225         {
226           Log::getInstance()->log("VLiveBanner", Log::DEBUG, "Found the option you pointed at. %s", event->title);
227           // First, cancel my delete timer
228           Timers::getInstance()->cancelTimer(this, 1); // if it exists
229
230           VInfo* vi = new VInfo();
231           vi->setTitleText(event->title);
232           vi->setBorderOn(1);
233           vi->setExitable();
234           if (event->description) vi->setMainText(event->description);
235           else vi->setMainText(tr("Summary unavailable"));
236           if (Video::getInstance()->getFormat() == Video::PAL)
237           {
238             vi->setScreenPos(120, 130);
239           }
240           else
241           {
242             vi->setScreenPos(110, 90);
243           }
244           vi->create(510, 270);
245           vi->draw();
246
247           ViewMan::getInstance()->add(vi);
248           ViewMan::getInstance()->updateView(vi);
249
250           return 2;
251
252         }
253       }
254       return 2; // should not get here
255     }
256     case Remote::GREEN:
257     {
258       // full epg
259       Timers::getInstance()->cancelTimer(this, 1); // if it exists
260       Message* m = new Message();
261       m->message = Message::EPG;
262       m->to = parent;
263       m->from = this;
264       ViewMan::getInstance()->postMessage(m);
265       return 4;
266     }
267   }
268
269   return 1;
270 }
271
272 void VLiveBanner::timercall(int clientReference)
273 {
274   if (clientReference == 1)
275   {
276     // delete me!
277     Message* m = new Message();
278     m->message = Message::CLOSE_ME;
279     m->to = ViewMan::getInstance();
280     m->from = this;
281     ViewMan::getInstance()->postMessage(m);
282   }
283   else if (clientReference == 2)
284   {
285     // redraw clock
286     drawClock();
287     ViewMan::getInstance()->updateView(this, &clockRegion);
288   }
289 }
290
291 void VLiveBanner::drawClock()
292 {
293   // Blank the area first
294   rectangle(area.w - 60, 0, 60, 30, titleBarColour);
295
296   char timeString[20];
297   time_t t;
298   time(&t);
299   struct tm* tms = localtime(&t);
300   strftime(timeString, 19, "%H:%M", tms);
301   drawTextRJ(timeString, 490, 5, Colour::LIGHTTEXT);
302
303   time_t dt = 60 - (t % 60);  // seconds to the next minute
304   if (dt == 0) dt = 60; // advance a whole minute if necessary
305   dt += t;  // get a time_t value for it rather than using duration
306   // (so it will occur at the actual second and not second and a half)
307
308   Timers::getInstance()->setTimer(this, 2, dt);
309 }