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