]> git.vomp.tv Git - vompclient.git/blob - vwelcome.cc
Some fixes on cancellation points
[vompclient.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(DrawStyle::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 #ifndef VOMP_HAS_EXIT\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   TBBoxx::draw();\r
105   drawClock();\r
106 }\r
107 \r
108 void VWelcome::drawClock()\r
109 {\r
110   // Blank the area first\r
111   rectangle(area.w - 60, 0, 60, 30, titleBarColour);\r
112 \r
113   char timeString[20];\r
114   time_t t;\r
115   time(&t);\r
116   struct tm* tms = localtime(&t);\r
117   strftime(timeString, 19, "%H:%M", tms);\r
118   drawTextRJ(timeString, 450, 5, DrawStyle::LIGHTTEXT);\r
119 \r
120   time_t dt = 60 - (t % 60);  // seconds to the next minute\r
121   if (dt == 0) dt = 60; // advance a whole minute if necessary\r
122   dt += t;  // get a time_t value for it rather than using duration\r
123   // (so it will occur at the actual second and not second and a half)\r
124 \r
125   Timers::getInstance()->setTimerT(this, 1, dt);\r
126 }\r
127 \r
128 void VWelcome::timercall(int clientReference)\r
129 {\r
130   drawClock();\r
131   boxstack->update(this, &clockRegion);\r
132 }\r
133 \r
134 int VWelcome::handleCommand(int command)\r
135 {\r
136   switch(command)\r
137   {\r
138     case Remote::DF_UP:\r
139     case Remote::UP:\r
140     {\r
141       sl.up();\r
142       sl.draw();\r
143       boxstack->update(this);\r
144       return 2;\r
145     }\r
146     case Remote::DF_DOWN:\r
147     case Remote::DOWN:\r
148     {\r
149       sl.down();\r
150       sl.draw();\r
151       boxstack->update(this);\r
152       return 2;\r
153     }\r
154     case Remote::ONE:\r
155     {\r
156       doChannelsList();\r
157       return 2;\r
158     }\r
159     case Remote::TWO:\r
160     {\r
161       doRadioList();\r
162       return 2;\r
163     }\r
164     case Remote::THREE:\r
165     {\r
166       doRecordingsList();\r
167       return 2;\r
168     }\r
169     case Remote::FOUR:\r
170     {\r
171       doTimersList();\r
172       return 2;\r
173     }\r
174     case Remote::FIVE:\r
175     {\r
176 #ifdef VOMP_PLATTFORM_MVP\r
177       doMediaList();\r
178 #endif\r
179       return 2;\r
180     }\r
181     case Remote::SIX:\r
182     {\r
183       doOptions();\r
184       return 2;\r
185     }\r
186     case Remote::SEVEN:\r
187     {\r
188       Command::getInstance()->doReboot();\r
189       return 2;\r
190     }\r
191     case Remote::OK:\r
192     {\r
193       ULONG option = sl.getCurrentOptionData();\r
194       if (option == 1)\r
195       {\r
196         doChannelsList();\r
197         return 2;\r
198       }\r
199       else if (option == 2)\r
200       {\r
201         doRadioList();\r
202         return 2;\r
203       }\r
204       else if (option == 3)\r
205       {\r
206         doRecordingsList();\r
207         return 2;\r
208       }\r
209       else if (option == 4)\r
210       {\r
211         doTimersList();\r
212         return 2;\r
213       }\r
214       else if (option == 5)\r
215       {\r
216         doMediaList();\r
217         return 2;\r
218       }\r
219       else if (option == 6)\r
220       {\r
221         doOptions();\r
222         return 2;\r
223       }\r
224       else if (option == 7)\r
225       {\r
226         Command::getInstance()->doReboot();\r
227         return 2;\r
228       }\r
229       return 2; // never gets here\r
230     }\r
231 //#ifdef DEV\r
232     case Remote::NINE:\r
233     {\r
234       VScreensaver* vscreensaver = new VScreensaver();\r
235       boxstack->add(vscreensaver);\r
236       vscreensaver->draw();\r
237 //      boxstack->update(vscreensaver);\r
238 \r
239       return 2;\r
240     }\r
241 //#endif\r
242 \r
243     // Test\r
244 //    case Remote::BACK:\r
245 //    {\r
246 //      return 4;\r
247 //    }\r
248 \r
249   }\r
250   return 1;\r
251 }\r
252 \r
253 void VWelcome::doChannelsList()\r
254 {\r
255   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::VIDEO);\r
256 \r
257   if (chanList)\r
258   {\r
259     VChannelList* vchan = new VChannelList(VDR::VIDEO);\r
260     vchan->setList(chanList);\r
261 \r
262     vchan->draw();\r
263     boxstack->add(vchan);\r
264     boxstack->update(vchan);\r
265   }\r
266   else\r
267   {\r
268     Command::getInstance()->connectionLost();\r
269   }\r
270 }\r
271 \r
272 void VWelcome::doRadioList()\r
273 {\r
274   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::RADIO);\r
275 \r
276   if (chanList)\r
277   {\r
278     VChannelList* vchan = new VChannelList(VDR::RADIO);\r
279     vchan->setList(chanList);\r
280 \r
281     vchan->draw();\r
282     boxstack->add(vchan);\r
283     boxstack->update(vchan);\r
284   }\r
285   else\r
286   {\r
287     Command::getInstance()->connectionLost();\r
288   }\r
289 }\r
290 \r
291 void VWelcome::doRecordingsList()\r
292 {\r
293   VRecordingList* vrec = new VRecordingList();\r
294   vrec->draw();\r
295   boxstack->add(vrec);\r
296   boxstack->update(vrec);\r
297 \r
298   if (!vrec->load())\r
299   {\r
300     Command::getInstance()->connectionLost();\r
301   }\r
302 }\r
303 \r
304 void VWelcome::doMediaList()\r
305 {\r
306 #ifdef VOMP_MEDIAPLAYER\r
307   VMediaList::createList();\r
308 #endif\r
309 }\r
310 \r
311 void VWelcome::doTimersList()\r
312 {\r
313   VTimerList* vtl = new VTimerList();\r
314   if (!vtl->load())\r
315   {\r
316     delete vtl;\r
317     Command::getInstance()->connectionLost();\r
318     return;\r
319   }\r
320   \r
321   vtl->draw();\r
322   boxstack->add(vtl);\r
323   boxstack->update(vtl);\r
324 }\r
325 \r
326 void VWelcome::doOptions()\r
327 {\r
328 //  VOptionsMenu* voptionsmenu = new VOptionsMenu();\r
329 //  voptionsmenu->draw();\r
330 //  boxstack->add(voptionsmenu);\r
331 //  boxstack->updateView(voptionsmenu);\r
332 \r
333   VOpts* vopts = new VOpts();\r
334   vopts->draw();\r
335   boxstack->add(vopts);\r
336   boxstack->update(vopts);\r
337 }\r
338 \r
339 void VWelcome::processMessage(Message* m)\r
340 {\r
341   if (m->message == Message::MOUSE_MOVE)\r
342   {\r
343     if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
344     {\r
345       sl.draw();\r
346       boxstack->update(this);\r
347     }\r
348   }\r
349   else if (m->message == Message::MOUSE_LBDOWN)\r
350   {\r
351     if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
352     {\r
353       boxstack->handleCommand(Remote::OK); //simulate OK press\r
354     }\r
355   }\r
356 }\r