2 Copyright 2004-2005 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "vrecordinglist.h"
23 VRecordingList::VRecordingList()
25 viewman = ViewMan::getInstance();
30 if (Video::getInstance()->getFormat() == Video::PAL)
39 setBackgroundColour(Colour::VIEWBACKGROUND);
41 setTitleBarColour(Colour::TITLEBARBACKGROUND);
43 sl.setSurface(surface);
44 sl.setSurfaceOffset(10, 30 + 5);
45 sl.setDimensions(area.w - 20, area.h - 30 - 15 - 30);
48 VRecordingList::~VRecordingList()
53 void VRecordingList::drawData(bool doIndexPop)
55 int saveIndex = sl.getCurrentOption();
56 int saveTop = sl.getTopOption();
64 char tempA[300]; // FIXME this is guesswork!
65 char tempB[300]; // FIXME
68 Directory* currentSubDir;
69 DirectoryList::iterator i;
70 DirectoryList* dirList = recman->getDirectories();
71 for (i = dirList->begin(); i != dirList->end(); i++)
74 SNPRINTF(tempA, 299, tr("<dir> %lu\t%s"), currentSubDir->getNumRecordings(), currentSubDir->name);
75 currentSubDir->index = sl.addOption(tempA, 0, first);
79 // FIXME convert the whole program to time_t's
81 Recording* currentRec;
82 RecordingList::iterator j;
83 RecordingList* recList = recman->getRecordings();
84 for (j = recList->begin(); j != recList->end(); j++)
87 time_t recStartTime = (time_t)currentRec->getStartTime();
88 btime = localtime(&recStartTime);
90 strftime(tempA, 299, "%0d/%0m %0H:%0M ", btime);
92 strftime(tempA, 299, "%d/%m %H:%M ", btime);
94 sprintf(tempB, "%s\t%s", tempA, currentRec->getProgName());
95 currentRec->index = sl.addOption(tempB, 0, first);
101 sl.hintSetCurrent(slIndexStack.top());
106 sl.hintSetCurrent(saveIndex);
107 sl.hintSetTop(saveTop);
113 void VRecordingList::draw(bool doIndexPop)
117 if (recman->isSubDir())
120 SNPRINTF(title, 299, tr("Recordings - %s"), recman->getCurDirName());
125 setTitleText(tr("Recordings"));
133 drawText(tr("Loading..."), 240, 180, Colour::LIGHTTEXT);
138 int gigFree = recman->getFreeSpace() / 1024;
139 SNPRINTF(freeSpace, 49, tr("%lu%% used, %iGB free"), recman->getUsedPercent(), gigFree);
140 drawTextRJ(freeSpace, 560, 5, Colour::LIGHTTEXT);
145 w.setSurface(surface);
147 w.nextSymbol = WSymbol::UP;
148 w.setSurfaceOffset(20, 385);
151 w.nextSymbol = WSymbol::DOWN;
152 w.setSurfaceOffset(50, 385);
155 w.nextSymbol = WSymbol::SKIPBACK;
156 w.setSurfaceOffset(85, 385);
159 w.nextSymbol = WSymbol::SKIPFORWARD;
160 w.setSurfaceOffset(115, 385);
163 w.nextSymbol = WSymbol::PLAY;
164 w.setSurfaceOffset(150, 385);
167 drawTextRJ(tr("[ok] = menu"), 560, 385, Colour::LIGHTTEXT);
169 // All static stuff done
171 drawData(doIndexPop);
175 void VRecordingList::doShowingBar()
177 int topOption = sl.getTopOption() + 1;
178 if (sl.getNumOptions() == 0) topOption = 0;
180 rectangle(220, 385, 180, 25, Colour::VIEWBACKGROUND);
182 sprintf(showing, tr("%i to %i of %i"), topOption, sl.getBottomOption(), sl.getNumOptions());
183 drawText(showing, 220, 385, Colour::LIGHTTEXT);
186 void VRecordingList::processMessage(Message* m)
188 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message);
190 if (m->message == Message::MOUSE_MOVE)
192 if (sl.mouseMove((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
196 viewman->updateView(this);
199 else if (m->message == Message::MOUSE_LBDOWN)
201 if (sl.mouseLBDOWN((m->parameter>>16)-getScreenX(),(m->parameter&0xFFFF)-getScreenY()))
203 ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press
207 //check if press is outside this view! then simulate cancel
208 int x=(m->parameter>>16)-getScreenX();
209 int y=(m->parameter&0xFFFF)-getScreenY();
210 if (x<0 || y <0 || x>getWidth() || y>getHeight())
212 ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
216 else if (m->message == Message::DELETE_SELECTED_RECORDING)
218 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing delete selected");
221 else if (m->message == Message::MOVE_RECORDING)
223 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing move recording");
224 doMoveRecording((Directory*)m->parameter);
226 else if (m->message == Message::PLAY_SELECTED_RECORDING)
230 else if (m->message == Message::RESUME_SELECTED_RECORDING)
236 void VRecordingList::doDeleteSelected()
238 Recording* toDelete = getCurrentOptionRecording();
240 if (!toDelete) return;
242 Log::getInstance()->log("VRecordingList", Log::DEBUG, "FOUND: %i %s %s", toDelete->index, toDelete->getProgName(), toDelete->getFileName());
244 int success = recman->deleteRecording(toDelete);
245 if (!VDR::getInstance()->isConnected())
247 Command::getInstance()->connectionLost();
253 VInfo* vi = new VInfo();
254 vi->create(360, 200);
255 if (Video::getInstance()->getFormat() == Video::PAL)
256 vi->setScreenPos(190, 170);
258 vi->setScreenPos(180, 120);
259 vi->setOneLiner(tr("Failed to delete recording"));
262 vi->setTitleBarColour(Colour::DANGER);
266 viewman->updateView(vi);
271 viewman->updateView(this);
276 void VRecordingList::doMoveRecording(Directory* toDir)
278 Recording* toMove = getCurrentOptionRecording();
279 if (!toMove || !toDir) return;
281 Log::getInstance()->log("VRecordingList", Log::DEBUG, "MOVE: %s %s", toMove->getProgName(), toDir->name);
283 int success = recman->moveRecording(toMove, toDir);
284 if (!VDR::getInstance()->isConnected())
286 Command::getInstance()->connectionLost();
292 VInfo* vi = new VInfo();
293 vi->create(360, 200);
294 if (Video::getInstance()->getFormat() == Video::PAL)
295 vi->setScreenPos(190, 170);
297 vi->setScreenPos(180, 120);
298 vi->setOneLiner(tr("Failed to move recording"));
301 vi->setTitleBarColour(Colour::DANGER);
305 viewman->updateView(vi);
310 viewman->updateView(this);
314 int VRecordingList::doPlay(bool resume)
316 Recording* toPlay = getCurrentOptionRecording();
319 toPlay->loadRecInfo(); // check if still need this
322 bool isRadio = toPlay->isRadio();
326 VRadioRec* radrec = new VRadioRec(toPlay);
328 viewman->add(radrec);
329 viewman->updateView(radrec);
334 VVideoRec* vidrec = new VVideoRec(toPlay);
336 viewman->add(vidrec);
337 viewman->updateView(vidrec);
342 // should not get to here
346 Recording* VRecordingList::getCurrentOptionRecording()
348 Recording* currentRec;
349 RecordingList::iterator j;
350 RecordingList* recList = recman->getRecordings();
351 for (j = recList->begin(); j != recList->end(); j++)
354 if (currentRec->index == sl.getCurrentOption()) return currentRec;
360 int VRecordingList::handleCommand(int command)
371 viewman->updateView(this);
374 case Remote::DF_DOWN:
377 Log::getInstance()->log("P", Log::DEBUG, "1");
379 Log::getInstance()->log("P", Log::DEBUG, "1.5");
381 Log::getInstance()->log("P", Log::DEBUG, "2");
384 Log::getInstance()->log("P", Log::DEBUG, "3");
385 viewman->updateView(this);
386 Log::getInstance()->log("P", Log::DEBUG, "4");
389 case Remote::SKIPBACK:
395 viewman->updateView(this);
398 case Remote::SKIPFORWARD:
404 viewman->updateView(this);
409 if (sl.getNumOptions() == 0) return 2;
411 // Check to see if it is a sub directory
412 Directory* currentSubDir;
413 DirectoryList::iterator i;
414 DirectoryList* dirList = recman->getDirectories();
415 for (i = dirList->begin(); i != dirList->end(); i++)
418 if (currentSubDir->index == sl.getCurrentOption())
420 if (recman->down(currentSubDir))
422 slIndexStack.push(sl.getCurrentOption());
425 viewman->updateView(this);
431 // check to see if it's a recording
432 Recording* current = getCurrentOptionRecording();
435 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Found the option you pointed at. %s %s", current->getProgName(), current->getFileName());
437 VRecordingMenu* v = new VRecordingMenu(recman);
439 v->setRecording(current);
442 viewman->updateView(v);
445 // should not get to here
450 if (recman->isSubDir())
455 viewman->updateView(this);
465 if (doPlay(true)) return 2;
476 // stop command getting to any more views
480 bool VRecordingList::load()
482 VDR* vdr = VDR::getInstance();
484 recman = new RecMan();
485 bool success = vdr->getRecordingsList(recman);
490 char* defaultSortOrder = vdr->configLoad("General", "Recordings Sort Order");
491 if (defaultSortOrder)
493 if (!STRCASECMP(defaultSortOrder, "Chronological")) recman->setSortOrderChron();
494 delete[] defaultSortOrder;
500 viewman->updateView(this);
506 void VRecordingList::reSort()
508 recman->toggleSortOrder();
512 viewman->updateView(this);