]> git.vomp.tv Git - vompclient-marten.git/blob - vchannellist.cc
Motion Compensation, all implemented, all buggy
[vompclient-marten.git] / vchannellist.cc
1 /*
2     Copyright 2004-2007 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "vchannellist.h"
22
23 #include "remote.h"
24 #include "wsymbol.h"
25 #include "vvideolivetv.h"
26 #include "colour.h"
27 #include "video.h"
28 #include "i18n.h"
29 #include "channel.h"
30 #include "message.h"
31 #include "boxstack.h"
32 #include "vchannelselect.h"
33
34 VChannelList::VChannelList(ULONG type)
35 {
36   boxstack = BoxStack::getInstance();
37   setSize(570, 420);
38   createBuffer();
39   if (Video::getInstance()->getFormat() == Video::PAL)
40   {
41     setPosition(80, 70);
42   }
43   else
44   {
45     setPosition(70, 35);
46   }
47
48   setTitleBarOn(1);
49
50   if (type == VDR::VIDEO)
51   {
52     setTitleText(tr("Channels"));
53   }
54   else if (type == VDR::RADIO)
55   {
56     setTitleText(tr("Radio Stations"));
57   }
58   setTitleBarColour(Colour::TITLEBARBACKGROUND);
59
60   sl.setPosition(10, 30 + 5);
61   sl.setSize(area.w - 20, area.h - 30 - 15 - 30);
62   add(&sl);
63 }
64
65 VChannelList::~VChannelList()
66 {
67
68   if (chanList)
69   {
70     for (UINT i = 0; i < chanList->size(); i++)
71     {
72       delete (*chanList)[i];
73     }
74
75     chanList->clear();
76     delete chanList;
77   }
78 }
79
80 void VChannelList::setList(ChannelList* tlist)
81 {
82   char str[500];
83
84   sl.addColumn(0);
85   sl.addColumn(60);
86
87   chanList = tlist;
88
89   Channel* chan;
90   int first = 1;
91   if (chanList)
92   {
93     for (UINT i = 0; i < chanList->size(); i++)
94     {
95       chan = (*chanList)[i];
96       sprintf(str, "%lu\t%s", chan->number, chan->name);
97       chan->index = sl.addOption(str, (ULONG)chan, first);
98       first = 0;
99     }
100   }
101 }
102
103 void VChannelList::highlightChannel(Channel* chan)
104 {
105   sl.hintSetCurrent(chan->index);
106   sl.draw();
107   doShowingBar();
108   boxstack->update(this);
109 }
110
111 void VChannelList::draw()
112 {
113   TBBoxx::draw();
114   sl.draw();
115
116   // Put the status stuff at the bottom
117
118   WSymbol w;
119   TEMPADD(&w);
120
121   w.nextSymbol = WSymbol::UP;
122   w.setPosition(20, 385);
123   w.draw();
124
125   w.nextSymbol = WSymbol::DOWN;
126   w.setPosition(50, 385);
127   w.draw();
128
129   w.nextSymbol = WSymbol::SKIPBACK;
130   w.setPosition(85, 385);
131   w.draw();
132
133   w.nextSymbol = WSymbol::SKIPFORWARD;
134   w.setPosition(115, 385);
135   w.draw();
136
137   w.nextSymbol = WSymbol::PLAY;
138   w.setPosition(150, 385);
139   w.draw();
140
141   doShowingBar();
142 }
143
144 void VChannelList::doShowingBar()
145 {
146   int topOption = sl.getTopOption() + 1;
147   if (sl.getNumOptions() == 0) topOption = 0;
148
149   char showing[200];
150   sprintf(showing, tr("%i to %i of %i"), topOption, sl.getBottomOption(), sl.getNumOptions());
151
152   rectangle(220, 385, 220+160, 385+25, Colour::VIEWBACKGROUND);
153   drawText(showing, 220, 385, Colour::LIGHTTEXT);
154 }
155
156 int VChannelList::handleCommand(int command)
157 {
158   switch(command)
159   {
160     case Remote::DF_UP:
161     case Remote::UP:
162     {
163       sl.up();
164       sl.draw();
165
166       doShowingBar();
167       boxstack->update(this);
168       return 2;
169     }
170     case Remote::DF_DOWN:
171     case Remote::DOWN:
172     {
173       sl.down();
174       sl.draw();
175
176       doShowingBar();
177       boxstack->update(this);
178       return 2;
179     }
180     case Remote::SKIPBACK:
181     {
182       sl.pageUp();
183       sl.draw();
184
185       doShowingBar();
186       boxstack->update(this);
187       return 2;
188     }
189     case Remote::SKIPFORWARD:
190     {
191       sl.pageDown();
192       sl.draw();
193
194       doShowingBar();
195       boxstack->update(this);
196       return 2;
197     }
198     case Remote::ZERO:
199     case Remote::ONE:
200     case Remote::TWO:
201     case Remote::THREE:
202     case Remote::FOUR:
203     case Remote::FIVE:
204     case Remote::SIX:
205     case Remote::SEVEN:
206     case Remote::EIGHT:
207     case Remote::NINE:
208     {
209       VChannelSelect* v = new VChannelSelect(this);
210       v->draw();
211       boxstack->add(v);
212       boxstack->update(v);
213       v->handleCommand(command);
214       return 2;
215     }
216     case Remote::OK:
217     case Remote::PLAY:
218     {
219       Channel* chan = NULL;
220       if (chanList) chan = (Channel*)sl.getCurrentOptionData();
221       if (chan == NULL) return 2;
222  
223       VVideoLiveTV* v = new VVideoLiveTV(chanList, chan->number, this);
224       boxstack->add(v);
225       v->go();
226
227       return 2;
228     }
229     case Remote::BACK:
230     {
231       return 4;
232     }
233   }
234   // stop command getting to any more views
235   return 1;
236 }
237
238 void VChannelList::processMessage(Message* m)
239 {
240  /* if (m->message == Message::MOUSE_MOVE) {
241         if (sl.mouseAndroidScroll((m->tag >> 16),(m->tag & 0xFFFF),
242                         (m->parameter >> 16),(m->parameter & 0xFFFF))) {
243                 sl.draw();
244                 doShowingBar();
245                 boxstack->update(this);
246         }
247   }
248   else */if (m->message == Message::MOUSE_MOVE)
249   {
250     if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
251     {
252       sl.draw();
253       doShowingBar();
254       boxstack->update(this);
255     }
256   }
257   else if (m->message == Message::MOUSE_LBDOWN)
258   {
259     if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
260     {
261       boxstack->handleCommand(Remote::OK); //simulate OK press
262     }
263     else
264     { //check if press is outside this view! then simulate cancel
265       int x=(m->parameter>>16)-getScreenX();
266       int y=(m->parameter&0xFFFF)-getScreenY();
267       if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
268       {
269         boxstack->handleCommand(Remote::BACK); //simulate cancel press
270       }
271     }
272   }
273   else if (m->message == Message::CHANNEL_CHANGE)
274   {
275     Channel* chan = NULL;
276     for (UINT i = 0; i < chanList->size(); i++)
277     {
278       if ((*chanList)[i]->number == m->parameter)
279       {
280         chan = (*chanList)[i];
281         break;
282       }
283     }
284     if (!chan) return;
285
286     if (chan->type == VDR::VIDEO)
287     {
288       VVideoLiveTV* v = new VVideoLiveTV(chanList, chan->number, this);
289       boxstack->add(v);
290       v->go();    
291     }
292     else
293     {
294     /*
295       VVideoLive* v = new VVideoLive(chanList, chan->type, this);
296       v->draw();
297       boxstack->add(v);
298       boxstack->update(v);
299       v->channelChange(VVideoLive::NUMBER, chan->number);
300     */
301     }
302   }
303 }