]> git.vomp.tv Git - vompclient.git/blob - vwelcome.cc
Bugfix for reboot option supplied by davep
[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(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       return 2;\r
193     }\r
194     case Remote::OK:\r
195     {\r
196       ULONG option = sl.getCurrentOptionData();\r
197       if (option == 1)\r
198       {\r
199         doChannelsList();\r
200         return 2;\r
201       }\r
202       else if (option == 2)\r
203       {\r
204         doRadioList();\r
205         return 2;\r
206       }\r
207       else if (option == 3)\r
208       {\r
209         doRecordingsList();\r
210         return 2;\r
211       }\r
212       else if (option == 4)\r
213       {\r
214         doTimersList();\r
215         return 2;\r
216       }\r
217       else if (option == 5)\r
218       {\r
219         doMediaList();\r
220         return 2;\r
221       }\r
222       else if (option == 6)\r
223       {\r
224         doOptions();\r
225         return 2;\r
226       }\r
227       else if (option == 7)\r
228       {\r
229         Command::getInstance()->doReboot();\r
230         return 2;\r
231       }\r
232       return 2; // never gets here\r
233     }\r
234 //#ifdef DEV\r
235     case Remote::NINE:\r
236     {\r
237       VScreensaver* vscreensaver = new VScreensaver();\r
238       boxstack->add(vscreensaver);\r
239       vscreensaver->draw();\r
240 //      boxstack->update(vscreensaver);\r
241 \r
242       return 2;\r
243     }\r
244 //#endif\r
245 \r
246     // Test\r
247 //    case Remote::BACK:\r
248 //    {\r
249 //      return 4;\r
250 //    }\r
251 \r
252   }\r
253   return 1;\r
254 }\r
255 \r
256 void VWelcome::doChannelsList()\r
257 {\r
258   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::VIDEO);\r
259 \r
260   if (chanList)\r
261   {\r
262     VChannelList* vchan = new VChannelList(VDR::VIDEO);\r
263     vchan->setList(chanList);\r
264 \r
265     vchan->draw();\r
266     boxstack->add(vchan);\r
267     boxstack->update(vchan);\r
268   }\r
269   else\r
270   {\r
271     Command::getInstance()->connectionLost();\r
272   }\r
273 }\r
274 \r
275 void VWelcome::doRadioList()\r
276 {\r
277   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::RADIO);\r
278 \r
279   if (chanList)\r
280   {\r
281     VChannelList* vchan = new VChannelList(VDR::RADIO);\r
282     vchan->setList(chanList);\r
283 \r
284     vchan->draw();\r
285     boxstack->add(vchan);\r
286     boxstack->update(vchan);\r
287   }\r
288   else\r
289   {\r
290     Command::getInstance()->connectionLost();\r
291   }\r
292 }\r
293 \r
294 void VWelcome::doRecordingsList()\r
295 {\r
296   VRecordingList* vrec = new VRecordingList();\r
297   vrec->draw();\r
298   boxstack->add(vrec);\r
299   boxstack->update(vrec);\r
300 \r
301   if (!vrec->load())\r
302   {\r
303     Command::getInstance()->connectionLost();\r
304   }\r
305 }\r
306 \r
307 void VWelcome::doMediaList()\r
308 {\r
309 #ifdef VOMP_MEDIAPLAYER\r
310   VMediaList::createList();\r
311 #endif\r
312 }\r
313 \r
314 void VWelcome::doTimersList()\r
315 {\r
316   VTimerList* vtl = new VTimerList();\r
317   if (!vtl->load())\r
318   {\r
319     delete vtl;\r
320     Command::getInstance()->connectionLost();\r
321     return;\r
322   }\r
323   \r
324   vtl->draw();\r
325   boxstack->add(vtl);\r
326   boxstack->update(vtl);\r
327 }\r
328 \r
329 void VWelcome::doOptions()\r
330 {\r
331 //  VOptionsMenu* voptionsmenu = new VOptionsMenu();\r
332 //  voptionsmenu->draw();\r
333 //  boxstack->add(voptionsmenu);\r
334 //  boxstack->updateView(voptionsmenu);\r
335 \r
336   VOpts* vopts = new VOpts();\r
337   vopts->draw();\r
338   boxstack->add(vopts);\r
339   boxstack->update(vopts);\r
340 }\r
341 \r
342 void VWelcome::processMessage(Message* m)\r
343 {\r
344   if (m->message == Message::MOUSE_MOVE)\r
345   {\r
346     if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
347     {\r
348       sl.draw();\r
349       boxstack->update(this);\r
350     }\r
351   }\r
352   else if (m->message == Message::MOUSE_LBDOWN)\r
353   {\r
354     if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))\r
355     {\r
356       boxstack->handleCommand(Remote::OK); //simulate OK press\r
357     }\r
358   }\r
359 }\r