]> git.vomp.tv Git - vompclient.git/blob - vrecording.cc
Add static icons in menu
[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   
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
81   WTextbox * summary=new WTextbox();
82   summary->setParaMode(true);
83
84   if (rec->recInfo && strlen(rec->recInfo->summary))
85     summary->setText(rec->recInfo->summary);
86   else
87     summary->setText(tr("Summary unavailable"));
88
89   OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
90
91   tabbar.addTab(tr("EPG"), summary);
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[MOVE].setText(tr("Move"));
132   button[A_DELETE].setText(tr("Delete"));
133   
134   for (int i=PLAY, ver=10+30; i<last; i++, ver+= sfh*2)
135   {
136     button[i].setPosition(10, ver);
137     button[i].setSize(130, sfh);
138     add(&button[i]);
139   }
140   
141   selected = RESUME;
142   button[selected].setActive(1);
143   tabbar.activateFocus(false);
144 }
145
146 VRecording::~VRecording()
147 {
148 }
149
150 void VRecording::setParent(VRecordingList* tvRecList)
151 {
152   vRecList = tvRecList;
153 }
154
155 void VRecording::draw()
156 {
157   TBBoxx::draw();
158   OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
159   if (osdv) {
160           TVMedia poster;
161           if (rec->movieInfo) {
162                   poster=rec->movieInfo->poster;
163           }
164           if (rec->seriesInfo) {
165                   if (rec->seriesInfo->seasonposter.height) {
166                           poster=rec->seriesInfo->seasonposter;
167                   }
168                   else
169                   if (rec->seriesInfo->posters.size()) {
170                           poster=rec->seriesInfo->posters[0];
171                   }
172           }
173           if (poster.height) {
174                  // float aspect=((float)poster.height)/((float)poster.width)/Osd::getInstance()->getPixelAspect();
175                   drawTVMedia(poster.info,buttonRegion.x,
176                                          buttonRegion.y+buttonRegion.h,
177                                                 buttonRegion.w,/*buttonRegion.w*aspect*/0.f);
178           }
179   }
180
181 }
182
183 int VRecording::handleCommand(int command)
184 {
185         if (command==Remote::BACK) {
186                 return 4;
187         }
188         if (buttons) {
189                 switch(command)
190                 {
191                 case Remote::DF_UP:
192                 case Remote::UP:
193                 {
194                         moveCursor(LEFT);
195                         return 2;
196                 }
197
198                 case Remote::DF_DOWN:
199                 case Remote::DOWN:
200                 {
201                         moveCursor(RIGHT);
202                         return 2;
203                 }
204                 case Remote::LEFT:
205                 case Remote::DF_LEFT:
206                 case Remote::RIGHT:
207                 case Remote::DF_RIGHT:
208                 {
209                         buttons = false;
210                         button[selected].setActive(0);
211                         tabbar.activateFocus(true);
212                         button[selected].draw();
213                         tabbar.draw();
214                         BoxStack::getInstance()->update(this);
215                         return 2;
216                 }
217                 case Remote::OK:
218                 {
219
220                         if (selected == PLAY)
221                         {
222                                 Message* m = new Message(); // Must be done after this view deleted
223                                 m->from = this;
224                                 m->to = vRecList;
225                                 m->message = Message::PLAY_SELECTED_RECORDING;
226                                 Command::getInstance()->postMessageNoLock(m);
227                                 return 4;
228                         }
229
230                         if (selected == RESUME)
231                         {
232                                 Message* m = new Message(); // Must be done after this view deleted
233                                 m->from = this;
234                                 m->to = vRecList;
235                                 m->message = Message::RESUME_SELECTED_RECORDING;
236                                 Command::getInstance()->postMessageNoLock(m);
237                                 return 4;
238                         }
239
240                         if (selected == MOVE)
241                         {
242                                 VRecMove* vrm = new VRecMove(recman);
243                                 vrm->setParent(this);
244                                 vrm->draw();
245                                 BoxStack::getInstance()->add(vrm);
246                                 BoxStack::getInstance()->update(vrm);
247                                 return 2;
248                         }
249
250                         if (selected == A_DELETE)
251                         {
252                                 VQuestion* v = new VQuestion(this);
253                                 v->setSize(260, 180);
254                                 v->createBuffer();
255                                 v->setTitleBarColour(DrawStyle::DANGER);
256                                 v->setTitleBarOn(1);
257                                 v->setBorderOn(1);
258                                 v->setTitleText(tr("Delete recording"));
259                                 v->setMainText(tr("Are you sure you want to delete this recording?"));
260                                 v->setDefault(VQuestion::NO);
261                                 if (Video::getInstance()->getFormat() == Video::PAL)
262                                 {
263                                         v->setPosition(230, 160);
264                                 }
265                                 else
266                                 {
267                                         v->setPosition(220, 140);
268                                 }
269
270                                 v->draw();
271                                 BoxStack::getInstance()->add(v);
272                                 BoxStack::getInstance()->update(v);
273                                 return 2;
274                         }
275                 }
276                 }
277         } else {
278                 // Pass to tabbar
279                 int retval = tabbar.handleCommand(command);
280                 if (retval == 1)
281                 {
282                         BoxStack::getInstance()->update(this);
283                         return 2;
284                 }
285                 else if (retval == 2)
286                 {
287                         // command was taken and actively ignored
288                         if (command==Remote::LEFT || command==Remote::DF_LEFT
289                                         || command==Remote::RIGHT || command==Remote::DF_RIGHT)
290                         {
291                                 buttons=true;
292                                 button[selected].setActive(1);
293                                 tabbar.activateFocus(false);
294                                 button[selected].draw();
295                                 tabbar.draw();
296                                 BoxStack::getInstance()->update(this);
297                         }
298                         return 2;
299                 }
300         }
301
302
303         // stop command getting to any more views
304         return 1;
305 }
306
307 void VRecording::moveCursor(Direction direction)
308 {
309   button[selected].setActive(0);
310   button[selected].draw();
311   if (direction == RIGHT)
312   { 
313     if (++selected == last) selected = PLAY;
314   }
315   else
316   {
317     if (--selected < 0) selected = last - 1;
318   }
319   button[selected].setActive(1);
320   button[selected].draw();
321   BoxStack::getInstance()->update(this, &buttonRegion);
322 }
323
324 void VRecording::processMessage(Message* m)
325 {
326   if (m->message == Message::MOUSE_MOVE)
327   {
328     for (int i = PLAY; i < last; i++)
329     {
330       if (button[i].mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
331       {
332         for (int j = PLAY; j < last; j++)
333           button[j].setActive(0);
334         button[i].setActive(1);
335         selected=i;
336         draw();
337         BoxStack::getInstance()->update(this);
338         break;
339       }
340     }
341   }
342   else if (m->message == Message::MOUSE_LBDOWN)
343   {
344     int cancel = true;
345     for (int i = PLAY; i < last; i++)
346     {
347       if (button[i].mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
348       {
349         BoxStack::getInstance()->handleCommand(Remote::OK); //simulate OK press
350         cancel = false;
351         break;
352       }
353     }
354     if (cancel)
355     {
356       //check if press is outside this view! then simulate cancel
357       int x=(m->parameter>>16)-getScreenX();
358       int y=(m->parameter&0xFFFF)-getScreenY();
359       if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
360       {
361         BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
362       }
363     }
364   }
365   else if (m->message == Message::QUESTION_YES)
366   {
367     if (selected == A_DELETE)
368     {
369       Message* m2 = new Message(); // Delete self
370       m2->from = this;
371       m2->to = BoxStack::getInstance();
372       m2->message = Message::CLOSE_ME;
373       Command::getInstance()->postMessageNoLock(m2);
374
375       m2 = new Message(); // OK. Want this to delete before this message does its job
376       m2->from = this;
377       m2->to = vRecList;
378       m2->message = Message::DELETE_SELECTED_RECORDING;
379       Command::getInstance()->postMessageNoLock(m2);
380     }
381   }
382   else if (m->message == Message::MOVE_RECORDING)
383   {
384     Message* m2 = new Message(); // Delete self
385     m2->from = this;
386     m2->to = BoxStack::getInstance();
387     m2->message = Message::CLOSE_ME;
388     Command::getInstance()->postMessageNoLock(m2);
389
390     m2 = new Message();
391     m2->from = this;
392     m2->to = vRecList;
393     m2->message = Message::MOVE_RECORDING;
394     m2->parameter = m->parameter;
395     Command::getInstance()->postMessageNoLock(m2);
396   }
397 }
398