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