]> git.vomp.tv Git - vompclient.git/blob - vlivebanner.cc
Channel schedules in live banner
[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)
24 {
25   eventList = NULL;
26   parent = tparent;
27
28   if (Video::getInstance()->getFormat() == Video::PAL)
29   {
30     setScreenPos(125, 410);
31   }
32   else
33   {
34     setScreenPos(115, 320);
35   }
36
37   setDimensions(500, 120);
38
39   setBackgroundColour(Colour::VIEWBACKGROUND);
40   setTitleBarOn(1);
41   setTitleBarColour(Colour::TITLEBARBACKGROUND);
42
43   sl.setScreenPos(screenX, screenY + 30);
44   sl.setDimensions(width, height - 60);
45   sl.setNoLoop();
46
47   setChannel(channel);
48 }
49
50 VLiveBanner::~VLiveBanner()
51 {
52   delData();
53 }
54
55 void VLiveBanner::delData()
56 {
57   if (eventList)
58   {
59     int eventListSize = eventList->size();
60     for(int i = 0; i < eventListSize; i++)
61     {
62       delete (*eventList)[i];
63     }
64     eventList->clear();
65     delete eventList;
66
67   }
68   sl.clear();
69 }
70
71 void VLiveBanner::setChannel(Channel* tChannel)
72 {
73   delData();
74   currentChannel = tChannel;
75   // get the data
76
77   setTitleText(currentChannel->name);
78   eventList = VDR::getInstance()->getChannelSchedule(currentChannel->number);
79
80   if (!eventList)
81   {
82     sl.addOption("No channel data available", 1);
83   }
84   else
85   {
86     // sort the list
87     Log::getInstance()->log("Banner", Log::DEBUG, "Start sort");
88     sort(eventList->begin(), eventList->end(), EventSorter());
89     Log::getInstance()->log("Banner", Log::DEBUG, "End sort");
90
91     char tempString[300];
92     char tempString2[300];
93     struct tm* btime;
94     Event* event;
95     int first = 1;
96     int eventListSize = eventList->size();
97     for(int i = 0; i < eventListSize; i++)
98     {
99       event = (*eventList)[i];
100
101       btime = localtime((time_t*)&event->time);
102       strftime(tempString2, 299, "%0H:%0M ", btime);
103       snprintf(tempString, 299, "%s %s", tempString2, event->title);
104       event->index = sl.addOption(tempString, first);
105       first = 0;
106     }
107
108     // Reset the timer as it probably took 1-2 seconds to change the channel
109     ViewMan::getInstance()->timedDelete(this, 4, 0);
110   }
111 }
112
113 void VLiveBanner::draw()
114 {
115   View::draw();
116   sl.draw();
117   rectangle(0, height - 30, width, 30, titleBarColour);
118
119   rectangle(7, height - 24, 18, 16, Colour::RED);
120   drawText("info", 32, height - 25, Colour::LIGHTTEXT);
121 }
122
123 int VLiveBanner::handleCommand(int command)
124 {
125   switch (command)
126   {
127     case Remote::OK:
128     case Remote::BACK:
129     {
130       return 4;
131     }
132     case Remote::DF_UP:
133     case Remote::UP:
134     {
135       sl.up();
136       sl.draw();
137
138       show();
139       return 2;
140     }
141     case Remote::DF_DOWN:
142     case Remote::DOWN:
143     {
144       sl.down();
145       sl.draw();
146
147       show();
148       return 2;
149     }
150     case Remote::CHANNELUP:
151     {
152       Message* m = new Message();
153       m->from = this;
154       m->to = parent;
155       m->message = Message::CHANNEL_UP;
156       ViewMan::getInstance()->postMessage(m);
157       return 2;
158     }
159     case Remote::CHANNELDOWN:
160     {
161       Message* m = new Message();
162       m->from = this;
163       m->to = parent;
164       m->message = Message::CHANNEL_DOWN;
165       ViewMan::getInstance()->postMessage(m);
166       return 2;
167     }
168     case Remote::RED:
169     case Remote::MENU:
170     {
171       if (!eventList) return 2;
172       Event* event;
173       int eventListSize = eventList->size();
174       for(int i = 0; i < eventListSize; i++)
175       {
176         event = (*eventList)[i];
177         if (event->index == sl.getCurrentOption())
178         {
179           Log::getInstance()->log("VLiveBanner", Log::DEBUG, "Found the option you pointed at. %s", event->title);
180           // First, cancel my delete timer
181           ViewMan::getInstance()->timedDelete(this, 0, 0);
182
183           VInfo* vi = new VInfo();
184           vi->setTitleText(event->title);
185           vi->setBorderOn(1);
186           vi->setExitable();
187           if (event->description) vi->setMainText(event->description);
188           else vi->setMainText("Summary unavailable");
189           if (Video::getInstance()->getFormat() == Video::PAL)
190           {
191             vi->setScreenPos(120, 130);
192           }
193           else
194           {
195             vi->setScreenPos(110, 90);
196           }
197           vi->setDimensions(510, 270);
198
199           ViewMan::getInstance()->addNoLock(vi);
200           vi->draw();
201           vi->show();
202
203           return 2;
204
205         }
206       }
207       return 2; // should not get here
208     }
209   }
210
211   return 1;
212 }