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