]> git.vomp.tv Git - vompclient-marten.git/blob - vwelcome.cc
FFMPEG decoding in color at 7 fps
[vompclient-marten.git] / vwelcome.cc
1 /*\r
2     Copyright 2004-2005 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 #include "vwelcome.h"\r
22 \r
23 #include "remote.h"\r
24 #include "vdr.h"\r
25 #include "vchannellist.h"\r
26 #include "vrecordinglist.h"\r
27 #include "vtimerlist.h"\r
28 #include "command.h"\r
29 #include "message.h"\r
30 #include "colour.h"\r
31 #include "video.h"\r
32 #include "i18n.h"\r
33 #include "timers.h"\r
34 #include "vscreensaver.h"\r
35 #include "vmedialist.h"\r
36 #include "boxstack.h"\r
37 #include "vopts.h"\r
38 \r
39 #include "log.h"\r
40 \r
41 VWelcome::VWelcome()\r
42 {\r
43   boxstack = BoxStack::getInstance();\r
44 \r
45   clockRegion.x = 400;\r
46   clockRegion.y = 0;\r
47   clockRegion.w = 60;\r
48   clockRegion.h = 30;\r
49 \r
50   setSize(460, 220);\r
51   createBuffer();\r
52   if (Video::getInstance()->getFormat() == Video::PAL)\r
53   {\r
54     setPosition(140, 170);\r
55   }\r
56   else\r
57   {\r
58     setPosition(130, 140);\r
59   }\r
60 \r
61   setTitleBarOn(1);\r
62   setTitleBarColour(Colour::TITLEBARBACKGROUND);\r
63 \r
64   sl.setPosition(20, 40);\r
65   sl.setSize(200, 160);\r
66   add(&sl);\r
67 \r
68   setTitleText(tr("Welcome"));\r
69   sl.addOption(tr("1. Live TV"), 1, 1);\r
70   sl.addOption(tr("2. Radio"), 2, 0);\r
71   sl.addOption(tr("3. Recordings"), 3, 0);\r
72   sl.addOption(tr("4. Timers"), 4, 0);\r
73 #ifdef VOMP_PLATTFORM_MVP\r
74   sl.addOption(tr("5. MediaPlayer"), 5, 0);\r
75 #endif\r
76 \r
77   sl.addOption(tr("6. Options"), 6, 0);\r
78 #ifdef VOMP_PLATTFORM_MVP\r
79   sl.addOption(tr("7. Reboot"), 7, 0);\r
80 #else\r
81     sl.addOption(tr("7. Exit"), 7, 0);\r
82 #endif\r
83 \r
84   jpeg.setPosition(240, 60);\r
85 #ifndef _MIPS_ARCH  \r
86   jpeg.init("/vdr.jpg");\r
87 #else\r
88   jpeg.init("vdr.jpg");\r
89 #endif\r
90   add(&jpeg);\r
91 }\r
92 \r
93 void VWelcome::preDelete()\r
94 {\r
95   Timers::getInstance()->cancelTimer(this, 1);\r
96 }\r
97 \r
98 VWelcome::~VWelcome()\r
99 {\r
100 }\r
101 \r
102 void VWelcome::draw()\r
103 {\r
104   Log::getInstance()->log("VWelcome", Log::DEBUG, "Mark1");\r
105   TBBoxx::draw();\r
106   Log::getInstance()->log("VWelcome", Log::DEBUG, "Mark2");\r
107   drawClock();\r
108   Log::getInstance()->log("VWelcome", Log::DEBUG, "Mark3");\r
109 }\r
110 \r
111 void VWelcome::drawClock()\r
112 {\r
113   // Blank the area first\r
114   rectangle(area.w - 60, 0, 60, 30, titleBarColour);\r
115 \r
116   char timeString[20];\r
117   time_t t;\r
118   time(&t);\r
119   struct tm* tms = localtime(&t);\r
120   strftime(timeString, 19, "%H:%M", tms);\r
121   drawTextRJ(timeString, 450, 5, Colour::LIGHTTEXT);\r
122 \r
123   time_t dt = 60 - (t % 60);  // seconds to the next minute\r
124   if (dt == 0) dt = 60; // advance a whole minute if necessary\r
125   dt += t;  // get a time_t value for it rather than using duration\r
126   // (so it will occur at the actual second and not second and a half)\r
127 \r
128   Timers::getInstance()->setTimerT(this, 1, dt);\r
129 }\r
130 \r
131 void VWelcome::timercall(int clientReference)\r
132 {\r
133   drawClock();\r
134   boxstack->update(this, &clockRegion);\r
135 }\r
136 \r
137 int VWelcome::handleCommand(int command)\r
138 {\r
139   switch(command)\r
140   {\r
141     case Remote::DF_UP:\r
142     case Remote::UP:\r
143     {\r
144       sl.up();\r
145       sl.draw();\r
146       boxstack->update(this);\r
147       return 2;\r
148     }\r
149     case Remote::DF_DOWN:\r
150     case Remote::DOWN:\r
151     {\r
152       sl.down();\r
153       sl.draw();\r
154       boxstack->update(this);\r
155       return 2;\r
156     }\r
157     case Remote::ONE:\r
158     {\r
159       doChannelsList();\r
160       return 2;\r
161     }\r
162     case Remote::TWO:\r
163     {\r
164       doRadioList();\r
165       return 2;\r
166     }\r
167     case Remote::THREE:\r
168     {\r
169       doRecordingsList();\r
170       return 2;\r
171     }\r
172     case Remote::FOUR:\r
173     {\r
174       doTimersList();\r
175       return 2;\r
176     }\r
177     case Remote::FIVE:\r
178     {\r
179 #ifdef VOMP_PLATTFORM_MVP\r
180       doMediaList();\r
181 #endif\r
182       return 2;\r
183     }\r
184     case Remote::SIX:\r
185     {\r
186       doOptions();\r
187       return 2;\r
188     }\r
189     case Remote::SEVEN:\r
190     {\r
191       Command::getInstance()->doReboot();\r
192     }\r
193     case Remote::OK:\r
194     {\r
195       ULONG option = sl.getCurrentOptionData();\r
196       if (option == 1)\r
197       {\r
198         doChannelsList();\r
199         return 2;\r
200       }\r
201       else if (option == 2)\r
202       {\r
203         doRadioList();\r
204         return 2;\r
205       }\r
206       else if (option == 3)\r
207       {\r
208         doRecordingsList();\r
209         return 2;\r
210       }\r
211       else if (option == 4)\r
212       {\r
213         doTimersList();\r
214         return 2;\r
215       }\r
216       else if (option == 5)\r
217       {\r
218         doMediaList();\r
219         return 2;\r
220       }\r
221       else if (option == 6)\r
222       {\r
223         doOptions();\r
224         return 2;\r
225       }\r
226       else if (option == 7)\r
227       {\r
228         Command::getInstance()->doReboot();\r
229         return 2;\r
230       }\r
231       return 2; // never gets here\r
232     }\r
233 //#ifdef DEV\r
234     case Remote::NINE:\r
235     {\r
236       VScreensaver* vscreensaver = new VScreensaver();\r
237       boxstack->add(vscreensaver);\r
238       vscreensaver->draw();\r
239 //      boxstack->update(vscreensaver);\r
240 \r
241       return 2;\r
242     }\r
243 //#endif\r
244 \r
245     // Test\r
246 //    case Remote::BACK:\r
247 //    {\r
248 //      return 4;\r
249 //    }\r
250 \r
251   }\r
252   return 1;\r
253 }\r
254 \r
255 void VWelcome::doChannelsList()\r
256 {\r
257   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::VIDEO);\r
258 \r
259   if (chanList)\r
260   {\r
261     VChannelList* vchan = new VChannelList(VDR::VIDEO);\r
262     vchan->setList(chanList);\r
263 \r
264     vchan->draw();\r
265     boxstack->add(vchan);\r
266     boxstack->update(vchan);\r
267   }\r
268   else\r
269   {\r
270     Command::getInstance()->connectionLost();\r
271   }\r
272 }\r
273 \r
274 void VWelcome::doRadioList()\r
275 {\r
276   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::RADIO);\r
277 \r
278   if (chanList)\r
279   {\r
280     VChannelList* vchan = new VChannelList(VDR::RADIO);\r
281     vchan->setList(chanList);\r
282 \r
283     vchan->draw();\r
284     boxstack->add(vchan);\r
285     boxstack->update(vchan);\r
286   }\r
287   else\r
288   {\r
289     Command::getInstance()->connectionLost();\r
290   }\r
291 }\r
292 \r
293 void VWelcome::doRecordingsList()\r
294 {\r
295   VRecordingList* vrec = new VRecordingList();\r
296   vrec->draw();\r
297   boxstack->add(vrec);\r
298   boxstack->update(vrec);\r
299 \r
300   if (!vrec->load())\r
301   {\r
302     Command::getInstance()->connectionLost();\r
303   }\r
304 }\r
305 \r
306 void VWelcome::doMediaList()\r
307 {\r
308 #ifdef VOMP_MEDIAPLAYER\r
309   VMediaList::createList();\r
310 #endif\r
311 }\r
312 \r
313 void VWelcome::doTimersList()\r
314 {\r
315   VTimerList* vtl = new VTimerList();\r
316   if (!vtl->load())\r
317   {\r
318     delete vtl;\r
319     Command::getInstance()->connectionLost();\r
320     return;\r
321   }\r
322   \r
323   vtl->draw();\r
324   boxstack->add(vtl);\r
325   boxstack->update(vtl);\r
326 }\r
327 \r
328 void VWelcome::doOptions()\r
329 {\r
330 //  VOptionsMenu* voptionsmenu = new VOptionsMenu();\r
331 //  voptionsmenu->draw();\r
332 //  boxstack->add(voptionsmenu);\r
333 //  boxstack->updateView(voptionsmenu);\r
334 \r
335   VOpts* vopts = new VOpts();\r
336   vopts->draw();\r
337   boxstack->add(vopts);\r
338   boxstack->update(vopts);\r
339 }\r
340 \r
341 void VWelcome::processMessage(Message* m)\r
342 {\r
343   if (m->message == Message::MOUSE_MOVE)\r
344   {\r
345     if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
346     {\r
347       sl.draw();\r
348       boxstack->update(this);\r
349     }\r
350   }\r
351   else if (m->message == Message::MOUSE_LBDOWN)\r
352   {\r
353     if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
354     {\r
355       boxstack->handleCommand(Remote::OK); //simulate OK press\r
356     }\r
357   }\r
358 }\r