2 Copyright 2004-2008 Chris Tallon
4 This file is part of VOMP.
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.
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.
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.
21 #include "vrecording.h"
25 #include "vquestion.h"
35 #include "vrecordinglist.h"
36 #include "recording.h"
39 #include "wmovieview.h"
40 #include "wseriesview.h"
41 #include "wpictureview.h"
43 VRecording::VRecording(RecMan* trecman, Recording* trec)
50 Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
52 Log::getInstance()->log("VRecording", Log::DEBUG, "%s", rec->getProgName());
55 if (Video::getInstance()->getFormat() == Video::PAL)
69 if (rec->recInfo && strlen(rec->recInfo->title))
70 setTitleText(rec->recInfo->title);
72 setTitleText(rec->getProgName());
73 setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
75 tabbar.setPosition(10+130+10, 30 + 5);
76 tabbar.setSize(area.w - 20-10-130, area.h - 30 - 10);
82 WTextbox * summary=new WTextbox();
83 summary->setParaMode(true);
85 if (rec->recInfo && strlen(rec->recInfo->summary))
86 summary->setText(rec->recInfo->summary);
88 summary->setText(tr("Summary unavailable"));
90 #ifndef VOMP_PLATTFORM_MVP
92 OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
95 tabbar.addTab(tr("EPG"), summary);
97 WMovieView *movieview = new WMovieView(rec->movieInfo);
98 movieview->setParaMode(true);
99 tabbar.addTab(tr("TheTVDB Info"), movieview);
100 #ifndef VOMP_PLATTFORM_MVP
103 if (rec->movieInfo->actors.size() > 0 && osdv)
105 WActorGallery *gallery= new WActorGallery(rec->movieInfo->actors);
106 tabbar.addTab(tr("Cast"),gallery);
108 WArtworkGallery *artgallery= new WArtworkGallery(*rec->movieInfo);
109 tabbar.addTab(tr("Gallery"),artgallery);
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
119 if (rec->seriesInfo->actors.size() > 0 && osdv)
121 WActorGallery *gallery= new WActorGallery(rec->seriesInfo->actors);
122 tabbar.addTab(tr("Cast"),gallery);
124 WArtworkGallery *artgallery= new WArtworkGallery(*rec->seriesInfo);
125 tabbar.addTab(tr("Gallery"),artgallery);
132 int sfh = getFontHeight();
134 buttonRegion.y = 10+30;
135 buttonRegion.w = 130;
136 buttonRegion.h = sfh*2*last;
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"));
143 for (int i=PLAY, ver=10+30; i<last; i++, ver+= sfh*2)
145 button[i].setPosition(10, ver);
146 button[i].setSize(130, sfh);
151 button[selected].setActive(1);
152 tabbar.activateFocus(false);
155 VRecording::~VRecording()
159 void VRecording::setParent(VRecordingList* tvRecList)
161 vRecList = tvRecList;
164 void VRecording::draw()
167 #ifndef VOMP_PLATTFORM_MVP
169 OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
172 if (rec->movieInfo) {
173 poster=rec->movieInfo->poster;
175 if (rec->seriesInfo) {
176 if (rec->seriesInfo->seasonposter.height) {
177 poster=rec->seriesInfo->seasonposter;
180 if (rec->seriesInfo->posters.size()) {
181 poster=rec->seriesInfo->posters[0];
185 // float aspect=((float)poster.height)/((float)poster.width)/Osd::getInstance()->getPixelAspect();
186 drawTVMedia(poster.info,buttonRegion.x,
188 buttonRegion.w,/*buttonRegion.w*aspect*/0.f,BottomLeft);
194 int VRecording::handleCommand(int command)
196 if (command==Remote::BACK) {
205 tabbar.activateFocus(false);
210 case Remote::DF_DOWN:
213 tabbar.activateFocus(false);
218 case Remote::DF_LEFT:
220 case Remote::DF_RIGHT:
223 button[selected].setActive(0);
224 tabbar.activateFocus(true);
225 button[selected].draw();
227 BoxStack::getInstance()->update(this);
233 if (selected == PLAY)
235 Message* m = new Message(); // Must be done after this view deleted
238 m->message = Message::PLAY_SELECTED_RECORDING;
239 Command::getInstance()->postMessageNoLock(m);
243 if (selected == RESUME)
245 Message* m = new Message(); // Must be done after this view deleted
248 m->message = Message::RESUME_SELECTED_RECORDING;
249 Command::getInstance()->postMessageNoLock(m);
253 if (selected == MOVE)
255 VRecMove* vrm = new VRecMove(recman);
256 vrm->setParent(this);
258 BoxStack::getInstance()->add(vrm);
259 BoxStack::getInstance()->update(vrm);
263 if (selected == A_DELETE)
265 VQuestion* v = new VQuestion(this);
266 v->setSize(260, 180);
268 v->setTitleBarColour(DrawStyle::DANGER);
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)
276 v->setPosition(230, 160);
280 v->setPosition(220, 140);
284 BoxStack::getInstance()->add(v);
285 BoxStack::getInstance()->update(v);
292 int retval = tabbar.handleCommand(command);
295 BoxStack::getInstance()->update(this);
298 else if (retval == 2)
300 // command was taken and actively ignored
301 if (command==Remote::LEFT || command==Remote::DF_LEFT
302 || command==Remote::RIGHT || command==Remote::DF_RIGHT)
305 button[selected].setActive(1);
306 tabbar.activateFocus(false);
307 button[selected].draw();
309 BoxStack::getInstance()->update(this);
316 // stop command getting to any more views
320 void VRecording::moveCursor(Direction direction)
322 button[selected].setActive(0);
323 button[selected].draw();
324 if (direction == RIGHT)
326 if (++selected == last) selected = PLAY;
330 if (--selected < 0) selected = last - 1;
332 button[selected].setActive(1);
333 button[selected].draw();
334 BoxStack::getInstance()->update(this, &buttonRegion);
337 void VRecording::processMessage(Message* m)
339 if (m->message == Message::MOUSE_MOVE)
341 for (int i = PLAY; i < last; i++)
343 if (button[i].mouseMove((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
345 for (int j = PLAY; j < last; j++)
346 button[j].setActive(0);
347 button[i].setActive(1);
348 tabbar.activateFocus(false);
352 BoxStack::getInstance()->update(this);
356 if (tabbar.mouseMove((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
358 BoxStack::getInstance()->update(this);
362 else if (m->message == Message::MOUSE_SCROLL)
364 if (tabbar.mouseAndroidScroll((m->tag >> 16) - getScreenX(), (m->tag & 0xFFFF) - getScreenY(),
365 (short)(m->parameter.num >> 16), (short) (m->parameter.num & 0xFFFF)))
367 BoxStack::getInstance()->update(this);
371 else if (m->message == Message::MOUSE_LBDOWN)
374 for (int i = PLAY; i < last; i++)
376 if (button[i].mouseLBDOWN((m->parameter.num>>16)-getScreenX(),(m->parameter.num&0xFFFF)-getScreenY()))
378 BoxStack::getInstance()->handleCommand(Remote::OK); //simulate OK press
384 if (cancel && tabbar.mouseLBDOWN((m->parameter.num >> 16) - getScreenX(), (m->parameter.num & 0xFFFF) - getScreenY()))
387 button[selected].setActive(0);
389 BoxStack::getInstance()->update(this);
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())
399 BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
403 else if (m->message == Message::QUESTION_YES)
405 if (selected == A_DELETE)
407 Message* m2 = new Message(); // Delete self
409 m2->to = BoxStack::getInstance();
410 m2->message = Message::CLOSE_ME;
411 Command::getInstance()->postMessageNoLock(m2);
413 m2 = new Message(); // OK. Want this to delete before this message does its job
416 m2->message = Message::DELETE_SELECTED_RECORDING;
417 Command::getInstance()->postMessageNoLock(m2);
420 else if (m->message == Message::MOVE_RECORDING)
422 Message* m2 = new Message(); // Delete self
424 m2->to = BoxStack::getInstance();
425 m2->message = Message::CLOSE_ME;
426 Command::getInstance()->postMessageNoLock(m2);
431 m2->message = Message::MOVE_RECORDING;
432 m2->parameter.num = m->parameter.num;
433 Command::getInstance()->postMessageNoLock(m2);