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(VRecordingList* tparent)
27 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()
50 // if this is a child window, inform the parent of our destruct
53 Message* m = new Message();
55 m->message = Message::CHILD_CLOSE;
56 viewman->postMessage(m);
59 // only delete the list if this is not a sub dir window
66 void VRecordingList::setDir(Directory* tdir)
75 snprintf(title, 299, tr("Recordings - %s"), recDir->name);
80 setTitleText(tr("Recordings"));
84 void VRecordingList::drawData()
92 char tempA[300]; // FIXME this is guesswork!
93 char tempB[300]; // FIXME
97 DirectoryList::iterator i;
99 if (dataInvalid == 2) // special case, a child list has closed, check for 0 dir entries
102 // First go through to delete 1 empty dir if necessary
104 for (i = recDir->dirList.begin(); i != recDir->dirList.end(); i++)
107 if (dir->getNumRecordings() == 0)
110 recDir->dirList.erase(i);
116 // Then go through again to draw data. Don't merge these two loops!
118 for (i = recDir->dirList.begin(); i != recDir->dirList.end(); i++)
121 snprintf(tempA, 299, tr("<dir> %lu\t%s"), dir->getNumRecordings(), dir->name);
122 dir->index = sl.addOption(tempA, first);
126 // FIXME convert the whole program to time_t's
130 for (UINT j = 0; j < recDir->recList.size(); j++)
132 rec = recDir->recList[j];
133 btime = localtime((time_t*)&rec->start);
134 strftime(tempA, 299, "%0d/%0m %0H:%0M ", btime);
135 sprintf(tempB, "%s\t%s", tempA, rec->getProgName());
136 rec->index = sl.addOption(tempB, first);
143 void VRecordingList::draw()
147 if (dataInvalid) drawData();
151 // Put the status stuff at the bottom
154 w.setSurface(surface);
156 w.nextSymbol = WSymbol::UP;
157 w.setSurfaceOffset(20, 385);
160 w.nextSymbol = WSymbol::DOWN;
161 w.setSurfaceOffset(50, 385);
164 w.nextSymbol = WSymbol::SKIPBACK;
165 w.setSurfaceOffset(85, 385);
168 w.nextSymbol = WSymbol::SKIPFORWARD;
169 w.setSurfaceOffset(115, 385);
172 w.nextSymbol = WSymbol::PLAY;
173 w.setSurfaceOffset(150, 385);
176 // FIXME Right justify this!
177 drawText(tr("[ok] = menu"), 450, 385, Colour::LIGHTTEXT);
182 int gigFree = Directory::freeSpace / 1024;
183 snprintf(freeSpace, 49, tr("%lu%% used, %iGB free"), Directory::usedPercent, gigFree);
184 drawTextRJ(freeSpace, 560, 5, Colour::LIGHTTEXT);
187 void VRecordingList::doShowingBar()
189 int topOption = sl.getTopOption() + 1;
190 if (sl.getNumOptions() == 0) topOption = 0;
193 sprintf(showing, tr("%i to %i of %i"), topOption, sl.getBottomOption(), sl.getNumOptions());
196 // b.setSurfaceOffset(220, 385);
197 // b.setDimensions(160, 25);
198 // b.fillColour(Colour::VIEWBACKGROUND);
199 // b.drawText(showing, 0, 0, Colour::LIGHTTEXT);
201 rectangle(220, 385, 220+160, 385+25, Colour::VIEWBACKGROUND);
202 drawText(showing, 220, 385, Colour::LIGHTTEXT);
207 void VRecordingList::processMessage(Message* m)
209 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message);
210 if (m->message == Message::DELETE_SELECTED_RECORDING)
212 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing delete selected");
217 if (m->message == Message::PLAY_SELECTED_RECORDING)
223 if (m->message == Message::RESUME_SELECTED_RECORDING)
229 if (m->message == Message::REDRAW_DATA)
236 if (m->message == Message::CHILD_CLOSE)
245 void VRecordingList::doDeleteSelected()
247 Recording* toDelete = getCurrentOptionRecording();
254 saveIndex = toDelete->index;
255 saveTop = sl.getTopOption();
256 Log::getInstance()->log("VRecordingList", Log::DEBUG, "FOUND: %i %s %s", toDelete->index, toDelete->getProgName(), toDelete->fileName);
258 VDR* vdr = VDR::getInstance();
259 vdr->deleteRecording(toDelete->fileName);
263 for(RecordingList::iterator i = recDir->recList.begin(); i != recDir->recList.end(); i++)
267 recDir->recList.erase(i);
274 sl.hintSetCurrent(saveIndex);
275 sl.hintSetTop(saveTop);
279 if (myParent) // if this is not root send a message to parent to say redraw data
280 { // FIXME not really necessary any more ?
281 Message* m1 = new Message();
283 m1->message = Message::REDRAW_DATA;
284 viewman->postMessage(m1);
290 int VRecordingList::doPlay()
292 Recording* toPlay = getCurrentOptionRecording();
295 VVideoRec* vidrec = new VVideoRec(toPlay);
297 viewman->add(vidrec);
298 viewman->updateView(vidrec);
302 // should not get to here
306 int VRecordingList::doResume()
308 Recording* toResume = getCurrentOptionRecording();
311 ULLONG position = VDR::getInstance()->getResumePoint(toResume->fileName);
313 VVideoRec* vidrec = new VVideoRec(toResume);
315 viewman->add(vidrec);
316 viewman->updateView(vidrec);
317 vidrec->go(position);
320 // should not get to here
324 Recording* VRecordingList::getCurrentOptionRecording()
327 for (UINT i = 0; i < recDir->recList.size(); i++)
329 current = recDir->recList[i];
330 if (current->index == sl.getCurrentOption()) return current;
335 int VRecordingList::handleCommand(int command)
346 viewman->updateView(this);
349 case Remote::DF_DOWN:
356 viewman->updateView(this);
359 case Remote::SKIPBACK:
365 viewman->updateView(this);
368 case Remote::SKIPFORWARD:
374 viewman->updateView(this);
379 if (sl.getNumOptions() == 0) return 2;
381 // Check to see if it is a sub directory
383 for(UINT i = 0; i < recDir->dirList.size(); i++)
385 curDir = recDir->dirList[i];
386 if (curDir->index == sl.getCurrentOption())
388 VRecordingList* sub = new VRecordingList(this);
399 // check to see if it's a recording
400 Recording* current = getCurrentOptionRecording();
403 Log::getInstance()->log("VRecordingList", Log::DEBUG, "Found the option you pointed at. %s %s", current->getProgName(), current->fileName);
405 VRecordingMenu* v = new VRecordingMenu();
407 v->setRecording(current);
413 // should not get to here
422 if (doResume()) return 2;
427 // stop command getting to any more views