]> git.vomp.tv Git - vompclient.git/blob - vwelcome.cc
20 CWFs, fix some snprintf calls
[vompclient.git] / vwelcome.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, see <https://www.gnu.org/licenses/>.
18 */
19
20 #include "vwelcome.h"
21
22 #include "input.h"
23 #include "vdr.h"
24 #include "vchannellist.h"
25 #include "vrecordinglistclassic.h"
26 #include "vrecordinglistadvanced.h"
27 #include "vtimerlist.h"
28 #include "command.h"
29 #include "message.h"
30 #include "colour.h"
31 #include "video.h"
32 #include "i18n.h"
33 #include "timers.h"
34 #include "vscreensaver.h"
35 #include "vmedialist.h"
36 #include "boxstack.h"
37 #include "vopts.h"
38 #include "staticartwork.h"
39
40 #include "log.h"
41
42 VWelcome::VWelcome()
43 {
44   boxstack = BoxStack::getInstance();
45
46   clockRegion.x = 400;
47   clockRegion.y = 0;
48   clockRegion.w = 60;
49   clockRegion.h = 30;
50
51 #ifndef GRADIENT_DRAWING
52   setSize(460, 220);
53   createBuffer();
54   if (Video::getInstance()->getFormat() == Video::PAL)
55   {
56     setPosition(140, 170);
57   }
58   else
59   {
60     setPosition(130, 140);
61   }
62 #else
63   setSize(460, 280);
64   createBuffer();
65   setPosition(140, 150);
66 #endif
67
68   setTitleBarOn(1);
69   setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
70
71
72 #ifndef GRADIENT_DRAWING
73   jpeg.setPosition(240, 60);
74 #ifndef _MIPS_ARCH
75   jpeg.init("/vdr.jpg");
76 #else
77   jpeg.init("vdr.jpg");
78 #endif
79   add(&jpeg);
80 #else
81   vdr.setPosition(250, 65);
82   vdr.setSize(180, 160);
83   TVMediaInfo sinfo;
84   sinfo.setStaticArtwork(sa_vdrlogo);
85   vdr.setTVMedia(sinfo, WTVMedia::ZoomHorizontal);
86   add(&vdr);
87
88 #endif
89
90   sl.setPosition(20, 40);
91 #ifdef GRADIENT_DRAWING
92   sl.addColumn(0);
93   sl.addColumn(25);
94   sl.setLinesPerOption(1.5f);
95   sl.setSize(200, 230);
96 #else
97   sl.setSize(200, 160);
98 #endif
99   add(&sl);
100
101   setTitleText(tr("Welcome"));
102
103
104   TVMediaInfo *info= new TVMediaInfo();
105   info->setStaticArtwork(sa_tv);
106   sl.addOption(tr("1. Live TV"), reinterpret_cast<void*>(1), 1, info);
107
108   info= new TVMediaInfo();
109   info->setStaticArtwork(sa_radio);
110   sl.addOption(tr("2. Radio"), reinterpret_cast<void*>(2), 0, info);
111
112   info= new TVMediaInfo();
113   info->setStaticArtwork(sa_recordings);
114   sl.addOption(tr("3. Recordings"), reinterpret_cast<void*>(3), 0, info);
115
116   info= new TVMediaInfo();
117   info->setStaticArtwork(sa_timers);
118   sl.addOption(tr("4. Timers"), reinterpret_cast<void*>(4), 0, info);
119 #ifdef VOMP_PLATTFORM_MVP
120   sl.addOption(tr("5. MediaPlayer"), reinterpret_cast<void*>(5), 0);
121 #endif
122
123   info= new TVMediaInfo();
124   info->setStaticArtwork(sa_properties);
125   sl.addOption(tr("6. Options"), reinterpret_cast<void*>(6), 0,info);
126
127   info= new TVMediaInfo();
128   info->setStaticArtwork(sa_restart);
129 #ifndef VOMP_HAS_EXIT
130   sl.addOption(tr("7. Reboot"), reinterpret_cast<void*>(7), 0,info);
131 #else
132   sl.addOption(tr("7. Exit"), reinterpret_cast<void*>(7), 0,info);
133 #endif
134
135
136 }
137
138 void VWelcome::preDelete()
139 {
140   Timers::getInstance()->cancelTimer(this, 1);
141 }
142
143 VWelcome::~VWelcome()
144 {
145 }
146
147 void VWelcome::draw()
148 {
149   TBBoxx::draw();
150   drawClock();
151 }
152
153 void VWelcome::drawClock()
154 {
155   // Blank the area first
156 #ifndef GRADIENT_DRAWING
157   rectangle(area.w - 60, 0, 60, 30, titleBarColour);
158 #endif
159   char timeString[20];
160   time_t t;
161   time(&t);
162   struct tm tms;
163   LOCALTIME_R(&t, &tms);
164
165   strftime(timeString, 19, "%H:%M", &tms);
166   drawTextRJ(timeString, 450, 5, DrawStyle::LIGHTTEXT);
167
168   time_t dt = 60 - (t % 60);  // seconds to the next minute
169   if (dt == 0) dt = 60; // advance a whole minute if necessary
170   dt += t;  // get a time_t value for it rather than using duration
171   // (so it will occur at the actual second and not second and a half)
172
173   Timers::getInstance()->setTimerT(this, 1, dt);
174 }
175
176 void VWelcome::timercall(int /* clientReference */)
177 {
178 #ifndef GRADIENT_DRAWING
179   drawClock();
180 #else
181   draw();
182 #endif
183   boxstack->update(this, &clockRegion);
184 }
185
186 int VWelcome::handleCommand(int command)
187 {
188   switch(command)
189   {
190     case Input::UP:
191     {
192       sl.up();
193       sl.draw();
194       boxstack->update(this);
195       return 2;
196     }
197     case Input::DOWN:
198     {
199       sl.down();
200       sl.draw();
201       boxstack->update(this);
202       return 2;
203     }
204     case Input::ONE:
205     {
206       doChannelsList();
207       return 2;
208     }
209     case Input::TWO:
210     {
211       doRadioList();
212       return 2;
213     }
214     case Input::THREE:
215     {
216       doRecordingsList();
217       return 2;
218     }
219     case Input::FOUR:
220     {
221       doTimersList();
222       return 2;
223     }
224     case Input::FIVE:
225     {
226 #ifdef VOMP_PLATTFORM_MVP
227       doMediaList();
228 #endif
229       return 2;
230     }
231     case Input::SIX:
232     {
233       doOptions();
234       return 2;
235     }
236     case Input::SEVEN:
237     {
238       Command::getInstance()->doReboot();
239       return 2;
240     }
241     case Input::OK:
242     {
243       ULONG option = reinterpret_cast<ULONG>(sl.getCurrentOptionData());
244       if (option == 1)
245       {
246         doChannelsList();
247         return 2;
248       }
249       else if (option == 2)
250       {
251         doRadioList();
252         return 2;
253       }
254       else if (option == 3)
255       {
256         doRecordingsList();
257         return 2;
258       }
259       else if (option == 4)
260       {
261         doTimersList();
262         return 2;
263       }
264       else if (option == 5)
265       {
266         doMediaList();
267         return 2;
268       }
269       else if (option == 6)
270       {
271         doOptions();
272         return 2;
273       }
274       else if (option == 7)
275       {
276         Command::getInstance()->doReboot();
277         return 2;
278       }
279       return 2; // never gets here
280     }
281 //#ifdef DEV
282     case Input::NINE:
283     {
284       VScreensaver* vscreensaver = new VScreensaver();
285       boxstack->add(vscreensaver);
286       vscreensaver->draw();
287 //      boxstack->update(vscreensaver);
288
289       return 2;
290     }
291 //#endif
292
293     // Test
294 //    case Input::BACK:
295 //    {
296 //      return 4;
297 //    }
298
299   }
300   return 1;
301 }
302
303 void VWelcome::doChannelsList()
304 {
305   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::VIDEO);
306
307   if (chanList)
308   {
309     VChannelList* vchan = new VChannelList(VDR::VIDEO);
310     vchan->setList(chanList);
311
312     vchan->draw();
313     boxstack->add(vchan);
314     boxstack->update(vchan);
315   }
316   else
317   {
318     Command::getInstance()->connectionLost();
319   }
320 }
321
322 void VWelcome::doRadioList()
323 {
324   ChannelList* chanList = VDR::getInstance()->getChannelsList(VDR::RADIO);
325
326   if (chanList)
327   {
328     VChannelList* vchan = new VChannelList(VDR::RADIO);
329     vchan->setList(chanList);
330
331     vchan->draw();
332     boxstack->add(vchan);
333     boxstack->update(vchan);
334   }
335   else
336   {
337     Command::getInstance()->connectionLost();
338   }
339 }
340
341 void VWelcome::doRecordingsList()
342 {
343         VRecordingList* vrec;
344         if (Command::getInstance()->isAdvMenus())
345            vrec = new VRecordingListAdvanced();
346         else
347            vrec = new VRecordingListClassic();
348
349         vrec->draw();
350         boxstack->add(vrec);
351         boxstack->update(vrec);
352
353         if (!vrec->load())
354         {
355                 Command::getInstance()->connectionLost();
356         }
357 }
358
359 void VWelcome::doMediaList()
360 {
361 #ifdef VOMP_MEDIAPLAYER
362   VMediaList::createList();
363 #endif
364 }
365
366 void VWelcome::doTimersList()
367 {
368   VTimerList* vtl = new VTimerList();
369   if (!vtl->load())
370   {
371     delete vtl;
372     Command::getInstance()->connectionLost();
373     return;
374   }
375   
376   vtl->draw();
377   boxstack->add(vtl);
378   boxstack->update(vtl);
379 }
380
381 void VWelcome::doOptions()
382 {
383 //  VOptionsMenu* voptionsmenu = new VOptionsMenu();
384 //  voptionsmenu->draw();
385 //  boxstack->add(voptionsmenu);
386 //  boxstack->updateView(voptionsmenu);
387
388   VOpts* vopts = new VOpts();
389   vopts->draw();
390   boxstack->add(vopts);
391   boxstack->update(vopts);
392 }
393
394 void VWelcome::processMessage(Message* m)
395 {
396   if (m->message == Message::MOUSE_MOVE)
397   {
398     if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
399     {
400       sl.draw();
401       boxstack->update(this);
402     }
403   }
404   else if (m->message == Message::MOUSE_LBDOWN)
405   {
406     if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
407     {
408       boxstack->handleCommand(Input::OK); //simulate OK press
409     }
410   }
411 }