]> git.vomp.tv Git - vompclient.git/blob - vrecordinglist.cc
Directory list updates totals if programmes are deleted
[vompclient.git] / vrecordinglist.cc
1 /*
2     Copyright 2004-2005 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "vrecordinglist.h"
22
23 VRecordingList::VRecordingList(VRecordingList* parent)
24 {
25   myParent = parent;
26   dataInvalid = 0;
27
28   if (Video::getInstance()->getFormat() == Video::PAL)
29   {
30     setScreenPos(80, 70);
31   }
32   else
33   {
34     setScreenPos(70, 35);
35   }
36
37   setDimensions(420, 570);
38
39   setBackgroundColour(Colour::VIEWBACKGROUND);
40   setTitleBarOn(1);
41   setTitleBarColour(Colour::TITLEBARBACKGROUND);
42
43   sl.setScreenPos(screenX + 10, screenY + 30 + 5);
44   sl.setDimensions(height - 30 - 15 - 30, width - 20);
45 }
46
47 VRecordingList::~VRecordingList()
48 {
49   // only delete the list if this is not a sub dir window
50   if (recDir->isRoot) delete recDir;
51 }
52
53 void VRecordingList::setDir(Directory* tdir)
54 {
55   recDir = tdir;
56
57   drawData();
58
59   char title[300];
60   if (!recDir->isRoot)
61   {
62     snprintf(title, 299, "Recordings - %s", recDir->name);
63     setTitleText(title);
64   }
65   else
66   {
67     setTitleText("Recordings");
68   }
69 }
70
71 void VRecordingList::drawData()
72 {
73   sl.clear();
74
75   int first = 1;
76
77   char tempA[300]; // FIXME  this is guesswork!
78   char tempB[300]; // FIXME
79   struct tm* btime;
80
81   char spaces[13];
82   char theNumber[10];
83   int theNumberLength;
84
85   Directory* dir;
86   recDir->dirList->reset();
87   while((dir = (Directory*)recDir->dirList->getCurrent()))
88   {
89     if (dir->getNumRecordings() == 0)
90     {
91       recDir->dirList->remove(dir);
92       continue;
93     }
94
95     strcpy(spaces, "            ");
96     theNumberLength = snprintf(theNumber, 9, "%lu", dir->getNumRecordings());
97
98     spaces[11 - theNumberLength] = '\0';
99
100     //snprintf(tempA, 299, "<dir>            %s", dir->name);
101     snprintf(tempA, 299, "<dir> %s%s%s", theNumber, spaces, dir->name);
102     //int numSize = snprintf(tempA
103
104     dir->index = sl.addOption(tempA, first);
105     first = 0;
106
107     recDir->dirList->next();
108   }
109
110   // temp FIXME
111   List* recList = recDir->recList;
112
113   // FIXME convert the whole program to time_t's
114
115
116   Recording* rec;
117   recList->reset();
118   while((rec = (Recording*)recList->getCurrent()))
119   {
120     btime = localtime((time_t*)&rec->start);
121     strftime(tempA, 299, "%0d/%0m %0H:%0M ", btime);
122     sprintf(tempB, "%s %s", tempA, rec->getProgName());
123     rec->index = sl.addOption(tempB, first);
124     first = 0;
125     recList->next();
126   }
127
128   dataInvalid = 0;
129 }
130
131 void VRecordingList::draw()
132 {
133   View::draw();
134
135   if (dataInvalid) drawData();
136
137   sl.draw();
138
139   // Put the status stuff at the bottom
140
141   WSymbol w;
142
143   w.nextSymbol = WSymbol::UP;
144   w.setScreenPos(screenX + 20, screenY + 385);
145   w.draw();
146
147   w.nextSymbol = WSymbol::DOWN;
148   w.setScreenPos(screenX + 50, screenY + 385);
149   w.draw();
150
151   w.nextSymbol = WSymbol::SKIPBACK;
152   w.setScreenPos(screenX + 85, screenY + 385);
153   w.draw();
154
155   w.nextSymbol = WSymbol::SKIPFORWARD;
156   w.setScreenPos(screenX + 115, screenY + 385);
157   w.draw();
158
159   w.nextSymbol = WSymbol::PLAY;
160   w.setScreenPos(screenX + 150, screenY + 385);
161   w.draw();
162
163   // FIXME Right justify this!
164   drawText("[ok] = menu", 450, 385, Colour::LIGHTTEXT);
165
166   doShowingBar();
167
168   char freeSpace[50];
169   int gigFree = Directory::freeSpace / 1024;
170   snprintf(freeSpace, 49, "%lu%%, %iGB free", Directory::usedPercent, gigFree);
171   drawTextRJ(freeSpace, 560, 5, Colour::LIGHTTEXT);
172 }
173
174 void VRecordingList::doShowingBar()
175 {
176   int topOption = sl.getTopOption() + 1;
177   if (sl.getNumOptions() == 0) topOption = 0;
178
179   char showing[200];
180   sprintf(showing, "%i to %i of %i", topOption, sl.getBottomOption(), sl.getNumOptions());
181   Box b;
182   b.setScreenPos(screenX + 220, screenY + 385);
183   b.setDimensions(25, 160);
184   b.fillColour(Colour::VIEWBACKGROUND);
185   b.drawText(showing, 0, 0, Colour::LIGHTTEXT);
186 }
187
188
189
190 void VRecordingList::processMessage(Message* m)
191 {
192   Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message);
193   if (m->message == Message::DELETE_SELECTED_RECORDING)
194   {
195     Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing delete selected");
196     doDeleteSelected();
197     return;
198   }
199
200   if (m->message == Message::PLAY_SELECTED_RECORDING)
201   {
202     doPlay();
203     return;
204   }
205
206   if (m->message == Message::RESUME_SELECTED_RECORDING)
207   {
208     doResume();
209     return;
210   }
211
212   if (m->message == Message::REDRAW_DATA)
213   {
214     dataInvalid = 1;
215     return;
216   }
217 }
218
219 void VRecordingList::doDeleteSelected()
220 {
221   Recording* toDelete = getCurrentOptionRecording();
222
223   int saveIndex;
224   int saveTop;
225
226   if (toDelete)
227   {
228     saveIndex = toDelete->index;
229     saveTop = sl.getTopOption();
230     Log::getInstance()->log("VRecordingList", Log::DEBUG, "FOUND: %i %s %s\n", toDelete->index, toDelete->getProgName(), toDelete->fileName);
231     recDir->recList->remove(toDelete);
232     Log::getInstance()->log("VRecordingList", Log::DEBUG, "I have removed: %s %s\n", toDelete->getProgName(), toDelete->fileName);
233
234     VDR* vdr = VDR::getInstance();
235     vdr->deleteRecording(toDelete->fileName);
236
237     delete toDelete;
238
239     sl.clear();
240     setDir(recDir);
241     sl.hintSetCurrent(saveIndex);
242     sl.hintSetTop(saveTop);
243     draw();
244   }
245
246   if (myParent) // if this is not root send a message to parent to say redraw data
247   {
248     Message* m1 = new Message();
249     m1->to = myParent;
250     m1->message = Message::REDRAW_DATA;
251     ViewMan::getInstance()->postMessage(m1);
252   }
253
254   Message* m2 = new Message();
255   m2->from = this;
256   m2->to = ViewMan::getInstance();
257   m2->message = Message::UPDATE_SCREEN;
258   ViewMan::getInstance()->postMessage(m2);
259 }
260
261 int VRecordingList::doPlay()
262 {
263   Recording* toPlay = getCurrentOptionRecording();
264   if (toPlay)
265   {
266     VVideoRec* vidrec = new VVideoRec(toPlay);
267     ViewMan::getInstance()->addNoLock(vidrec);
268     vidrec->draw();
269     vidrec->show();
270     vidrec->go(0);
271     return 1;
272   }
273   // should not get to here
274   return 0;
275 }
276
277 int VRecordingList::doResume()
278 {
279   Recording* toResume = getCurrentOptionRecording();
280   if (toResume)
281   {
282     ULLONG position = VDR::getInstance()->getResumePoint(toResume->fileName);
283
284     VVideoRec* vidrec = new VVideoRec(toResume);
285     ViewMan::getInstance()->addNoLock(vidrec);
286     vidrec->draw();
287     vidrec->show();
288     vidrec->go(position);
289     return 1;
290   }
291   // should not get to here
292   return 0;
293 }
294
295 Recording* VRecordingList::getCurrentOptionRecording()
296 {
297   Recording* current;
298   for(recDir->recList->reset(); (current = (Recording*)recDir->recList->getCurrent()); recDir->recList->next())
299   {
300     if (current->index == sl.getCurrentOption()) return current;
301   }
302   return NULL;
303 }
304
305 int VRecordingList::handleCommand(int command)
306 {
307   switch(command)
308   {
309     case Remote::DF_UP:
310     case Remote::UP:
311     {
312       sl.up();
313       sl.draw();
314
315       doShowingBar();
316       show();
317       return 2;
318     }
319     case Remote::DF_DOWN:
320     case Remote::DOWN:
321     {
322       sl.down();
323       sl.draw();
324
325       doShowingBar();
326       show();
327       return 2;
328     }
329     case Remote::SKIPBACK:
330     {
331       sl.pageUp();
332       sl.draw();
333
334       doShowingBar();
335       show();
336       return 2;
337     }
338     case Remote::SKIPFORWARD:
339     {
340       sl.pageDown();
341       sl.draw();
342
343       doShowingBar();
344       show();
345       return 2;
346     }
347     case Remote::OK:
348     {
349       if (sl.getNumOptions() == 0) return 2;
350
351       // Check to see if it is a sub directory
352       Directory* curDir;
353       for(recDir->dirList->reset(); (curDir = (Directory*)recDir->dirList->getCurrent()); recDir->dirList->next())
354       {
355         if (curDir->index == sl.getCurrentOption())
356         {
357           VRecordingList* sub = new VRecordingList(this);
358           sub->setDir(curDir);
359           ViewMan::getInstance()->addNoLock(sub);
360
361           sub->draw();
362           sub->show();
363
364           return 2;
365         }
366       }
367
368       // check to see if it's a recording
369       Recording* current;
370       for(recDir->recList->reset(); (current = (Recording*)recDir->recList->getCurrent()); recDir->recList->next())
371       {
372         if (current->index == sl.getCurrentOption())
373         {
374           Log::getInstance()->log("VRecordingList", Log::DEBUG, "Found the option you pointed at. %s %s", current->getProgName(), current->fileName);
375
376           VRecordingMenu* v = new VRecordingMenu();
377           v->setParent(this);
378           v->setRecording(current);
379           ViewMan::getInstance()->addNoLock(v);
380           v->draw();
381           v->show();
382           return 2;
383         }
384       }
385       // should not get to here
386       return 1;
387     }
388     case Remote::BACK:
389     {
390       return 4;
391     }
392     case Remote::PLAY:
393     {
394       if (doPlay()) return 2;
395       return 1;
396     }
397
398   }
399   // stop command getting to any more views
400   return 1;
401 }