]> git.vomp.tv Git - vompclient.git/blob - vrecording.cc
Some nasty hacks to support MVP
[vompclient.git] / vrecording.cc
1 /*
2     Copyright 2004-2008 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 "vrecording.h"
22
23 #include "remote.h"
24 #include "recinfo.h"
25 #include "vquestion.h"
26 #include "vinfo.h"
27 #include "vdr.h"
28 #include "colour.h"
29 #include "video.h"
30 #include "i18n.h"
31 #include "command.h"
32 #include "vrecmove.h"
33 #include "boxstack.h"
34 #include "recman.h"
35 #include "vrecordinglist.h"
36 #include "recording.h"
37 #include "message.h"
38 #include "log.h"
39 #include "wmovieview.h"
40 #include "wseriesview.h"
41 #include "wpictureview.h"
42
43 VRecording::VRecording(RecMan* trecman, Recording* trec)
44 {
45   rec = trec;
46   recman = trecman;
47   buttons = true;
48   selected = RESUME;
49   
50   Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
51   rec->loadRecInfo();
52   Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
53
54
55   if (Video::getInstance()->getFormat() == Video::PAL)
56   {
57     setSize(640, 500);
58         createBuffer();
59   }
60   else
61   {
62         setSize(560, 400);
63         createBuffer();
64   }
65   setPosition(40, 40);
66
67   setTitleBarOn(1);
68   setBorderOn(1);
69   if (rec->recInfo && strlen(rec->recInfo->title))
70           setTitleText(rec->recInfo->title);
71   else
72           setTitleText(rec->getProgName());
73   setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
74
75   tabbar.setPosition(10+130+10, 30 + 5);
76   tabbar.setSize(area.w - 20-10-130, area.h - 30 - 10);
77   add(&tabbar);
78
79
80
81
82   WTextbox * summary=new WTextbox();
83   summary->setParaMode(true);
84
85   if (rec->recInfo && strlen(rec->recInfo->summary))
86     summary->setText(rec->recInfo->summary);
87   else
88     summary->setText(tr("Summary unavailable"));
89
90 #ifndef VOMP_PLATTFORM_MVP
91 // OSDV
92   OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
93 #endif
94
95   tabbar.addTab(tr("EPG"), summary);
96   if (rec->movieInfo) {
97           WMovieView *movieview = new WMovieView(rec->movieInfo);
98           movieview->setParaMode(true);
99           tabbar.addTab(tr("TheTVDB Info"), movieview);
100 #ifndef VOMP_PLATTFORM_MVP
101 // OSDV
102           if (osdv) {
103                   if (rec->movieInfo->actors.size() > 0 && osdv)
104                   {
105                           WActorGallery *gallery= new WActorGallery(rec->movieInfo->actors);
106                           tabbar.addTab(tr("Cast"),gallery);
107                   }
108                   WArtworkGallery *artgallery= new WArtworkGallery(*rec->movieInfo);
109                   tabbar.addTab(tr("Gallery"),artgallery);
110           }
111 #endif
112   } else if (rec->seriesInfo) {
113           WSeriesView *seriesview = new WSeriesView(rec->seriesInfo);
114           seriesview->setParaMode(true);
115           tabbar.addTab(tr("TheTVDB Info"), seriesview);
116 #ifndef VOMP_PLATTFORM_MVP
117 // OSDV
118           if (osdv) {
119                   if (rec->seriesInfo->actors.size() > 0 && osdv)
120                   {
121                           WActorGallery *gallery= new WActorGallery(rec->seriesInfo->actors);
122                           tabbar.addTab(tr("Cast"),gallery);
123                   }
124                   WArtworkGallery *artgallery= new WArtworkGallery(*rec->seriesInfo);
125                   tabbar.addTab(tr("Gallery"),artgallery);
126           }
127 #endif
128   }
129
130
131   
132   int sfh = getFontHeight();
133   buttonRegion.x = 10;
134   buttonRegion.y = 10+30;
135   buttonRegion.w = 130;
136   buttonRegion.h = sfh*2*last;
137
138   button[PLAY].setText(tr("Play"));
139   button[RESUME].setText(tr("Resume"));
140   button[MOVE].setText(tr("Move"));
141   button[A_DELETE].setText(tr("Delete"));
142   
143   for (int i=PLAY, ver=10+30; i<last; i++, ver+= sfh*2)
144   {
145     button[i].setPosition(10, ver);
146     button[i].setSize(130, sfh);
147     add(&button[i]);
148   }
149   
150
151   button[selected].setActive(1);
152   tabbar.activateFocus(false);
153 }
154
155 VRecording::~VRecording()
156 {
157 }
158
159 void VRecording::setParent(VRecordingList* tvRecList)
160 {
161   vRecList = tvRecList;
162 }
163
164 void VRecording::draw()
165 {
166   TBBoxx::draw();
167 #ifndef VOMP_PLATTFORM_MVP
168 // OSDV
169   OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
170   if (osdv) {
171           TVMedia poster;
172           if (rec->movieInfo) {
173                   poster=rec->movieInfo->poster;
174           }
175           if (rec->seriesInfo) {
176                   if (rec->seriesInfo->seasonposter.height) {
177                           poster=rec->seriesInfo->seasonposter;
178                   }
179                   else
180                   if (rec->seriesInfo->posters.size()) {
181                           poster=rec->seriesInfo->posters[0];
182                   }
183           }
184           if (poster.height) {
185                  // float aspect=((float)poster.height)/((float)poster.width)/Osd::getInstance()->getPixelAspect();
186                   drawTVMedia(poster.info,buttonRegion.x,
187                                          tabbar.getY2()-3,
188                                                 buttonRegion.w,/*buttonRegion.w*aspect*/0.f,BottomLeft);
189           }
190   }
191 #endif
192 }
193
194 int VRecording::handleCommand(int command)
195 {
196         if (command==Remote::BACK) {
197                 return 4;
198         }
199         if (buttons) {
200                 switch(command)
201                 {
202                 case Remote::DF_UP:
203                 case Remote::UP:
204                 {
205                         tabbar.activateFocus(false);
206                         moveCursor(LEFT);
207                         return 2;
208                 }
209
210                 case Remote::DF_DOWN:
211                 case Remote::DOWN:
212                 {
213                         tabbar.activateFocus(false);
214                         moveCursor(RIGHT);
215                         return 2;
216                 }
217                 case Remote::LEFT:
218                 case Remote::DF_LEFT:
219                 case Remote::RIGHT:
220                 case Remote::DF_RIGHT:
221                 {
222                         buttons = false;
223                         button[selected].setActive(0);
224                         tabbar.activateFocus(true);
225                         button[selected].draw();
226                         tabbar.draw();
227                         BoxStack::getInstance()->update(this);
228                         return 2;
229                 }
230                 case Remote::OK:
231                 {
232
233                         if (selected == PLAY)
234                         {
235                                 Message* m = new Message(); // Must be done after this view deleted
236                                 m->from = this;
237                                 m->to = vRecList;
238                                 m->message = Message::PLAY_SELECTED_RECORDING;
239                                 Command::getInstance()->postMessageNoLock(m);
240                                 return 4;
241                         }
242
243                         if (selected == RESUME)
244                         {
245                                 Message* m = new Message(); // Must be done after this view deleted
246                                 m->from = this;
247                                 m->to = vRecList;
248                                 m->message = Message::RESUME_SELECTED_RECORDING;
249                                 Command::getInstance()->postMessageNoLock(m);
250                                 return 4;
251                         }
252
253                         if (selected == MOVE)
254                         {
255                                 VRecMove* vrm = new VRecMove(recman);
256                                 vrm->setParent(this);
257                                 vrm->draw();
258                                 BoxStack::getInstance()->add(vrm);
259                                 BoxStack::getInstance()->update(vrm);
260                                 return 2;
261                         }
262
263                         if (selected == A_DELETE)
264                         {
265                                 VQuestion* v = new VQuestion(this);
266                                 v->setSize(260, 180);
267                                 v->createBuffer();
268                                 v->setTitleBarColour(DrawStyle::DANGER);
269                                 v->setTitleBarOn(1);
270                                 v->setBorderOn(1);
271                                 v->setTitleText(tr("Delete recording"));
272                                 v->setMainText(tr("Are you sure you want to delete this recording?"));
273                                 v->setDefault(VQuestion::NO);
274                                 if (Video::getInstance()->getFormat() == Video::PAL)
275                                 {
276                                         v->setPosition(230, 160);
277                                 }
278                                 else
279                                 {
280                                         v->setPosition(220, 140);
281                                 }
282
283                                 v->draw();
284                                 BoxStack::getInstance()->add(v);
285                                 BoxStack::getInstance()->update(v);
286                                 return 2;
287                         }
288                 }
289                 }
290         } else {
291                 // Pass to tabbar
292                 int retval = tabbar.handleCommand(command);
293                 if (retval == 1)
294                 {
295                         BoxStack::getInstance()->update(this);
296                         return 2;
297                 }
298                 else if (retval == 2)
299                 {
300                         // command was taken and actively ignored
301                         if (command==Remote::LEFT || command==Remote::DF_LEFT
302                                         || command==Remote::RIGHT || command==Remote::DF_RIGHT)
303                         {
304                                 buttons=true;
305                                 button[selected].setActive(1);
306                                 tabbar.activateFocus(false);
307                                 button[selected].draw();
308                                 tabbar.draw();
309                                 BoxStack::getInstance()->update(this);
310                         }
311                         return 2;
312                 }
313         }
314
315
316         // stop command getting to any more views
317         return 1;
318 }
319
320 void VRecording::moveCursor(Direction direction)
321 {
322   button[selected].setActive(0);
323   button[selected].draw();
324   if (direction == RIGHT)
325   { 
326     if (++selected == last) selected = PLAY;
327   }
328   else
329   {
330     if (--selected < 0) selected = last - 1;
331   }
332   button[selected].setActive(1);
333   button[selected].draw();
334   BoxStack::getInstance()->update(this, &buttonRegion);
335 }
336
337 void VRecording::processMessage(Message* m)
338 {
339   if (m->message == Message::MOUSE_MOVE)
340   {
341     for (int i = PLAY; i < last; i++)
342     {
343           if (button[i].mouseMove((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
344       {
345         for (int j = PLAY; j < last; j++)
346           button[j].setActive(0);
347         button[i].setActive(1);
348                 tabbar.activateFocus(false);
349                 buttons = true;
350         selected=i;
351         draw();
352         BoxStack::getInstance()->update(this);
353         break;
354       }
355     }
356         if (tabbar.mouseMove((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
357         {
358                 BoxStack::getInstance()->update(this);
359                 return;
360         }
361   }
362   else if (m->message == Message::MOUSE_SCROLL)
363   {
364           if (tabbar.mouseAndroidScroll((m->tag >> 16) - getScreenX(), (m->tag & 0xFFFF) - getScreenY(),
365                   (short)(m->parameter.num >> 16), (short) (m->parameter.num & 0xFFFF)))
366           {
367                   BoxStack::getInstance()->update(this);
368                   return;
369           }
370   }
371   else if (m->message == Message::MOUSE_LBDOWN)
372   {
373     int cancel = true;
374     for (int i = PLAY; i < last; i++)
375     {
376       if (button[i].mouseLBDOWN((m->parameter.num>>16)-getScreenX(),(m->parameter.num&0xFFFF)-getScreenY()))
377       {
378         BoxStack::getInstance()->handleCommand(Remote::OK); //simulate OK press
379                 buttons = true;
380         cancel = false;
381         break;
382       }
383     }
384         if (cancel && tabbar.mouseLBDOWN((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
385         {
386                 buttons = false;
387                 button[selected].setActive(0);
388
389                 BoxStack::getInstance()->update(this);
390                 cancel = false;
391         }
392     if (cancel)
393     {
394       //check if press is outside this view! then simulate cancel
395       int x=(m->parameter.num>>16)-getScreenX();
396       int y=(m->parameter.num&0xFFFF)-getScreenY();
397       if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
398       {
399         BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
400       }
401     }
402   }
403   else if (m->message == Message::QUESTION_YES)
404   {
405     if (selected == A_DELETE)
406     {
407       Message* m2 = new Message(); // Delete self
408       m2->from = this;
409       m2->to = BoxStack::getInstance();
410       m2->message = Message::CLOSE_ME;
411       Command::getInstance()->postMessageNoLock(m2);
412
413       m2 = new Message(); // OK. Want this to delete before this message does its job
414       m2->from = this;
415       m2->to = vRecList;
416       m2->message = Message::DELETE_SELECTED_RECORDING;
417       Command::getInstance()->postMessageNoLock(m2);
418     }
419   }
420   else if (m->message == Message::MOVE_RECORDING)
421   {
422     Message* m2 = new Message(); // Delete self
423     m2->from = this;
424     m2->to = BoxStack::getInstance();
425     m2->message = Message::CLOSE_ME;
426     Command::getInstance()->postMessageNoLock(m2);
427
428     m2 = new Message();
429     m2->from = this;
430     m2->to = vRecList;
431     m2->message = Message::MOVE_RECORDING;
432     m2->parameter.num = m->parameter.num;
433     Command::getInstance()->postMessageNoLock(m2);
434   }
435 }
436