]> git.vomp.tv Git - vompclient.git/blob - vrecordinglist.cc
Mouse support (part 1)
[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()
24 {
25   viewman = ViewMan::getInstance();
26   recman = NULL;
27   loading = true;
28
29   create(570, 420);
30   if (Video::getInstance()->getFormat() == Video::PAL)
31   {
32     setScreenPos(80, 70);
33   }
34   else
35   {
36     setScreenPos(70, 35);
37   }
38
39   setBackgroundColour(Colour::VIEWBACKGROUND);
40   setTitleBarOn(1);
41   setTitleBarColour(Colour::TITLEBARBACKGROUND);
42
43   sl.setSurface(surface);
44   sl.setSurfaceOffset(10, 30 + 5);
45   sl.setDimensions(area.w - 20, area.h - 30 - 15 - 30);
46 }
47
48 VRecordingList::~VRecordingList()
49 {
50   delete recman;
51 }
52
53 void VRecordingList::drawData(bool doIndexPop)
54 {
55   int saveIndex = sl.getCurrentOption();
56   int saveTop = sl.getTopOption();
57
58   sl.clear();
59   sl.addColumn(0);
60   sl.addColumn(110);
61
62   int first = 1;
63
64   char tempA[300]; // FIXME  this is guesswork!
65   char tempB[300]; // FIXME
66   struct tm* btime;
67
68   Directory* currentSubDir;
69   DirectoryList::iterator i;
70   DirectoryList* dirList = recman->getDirectories();
71   for (i = dirList->begin(); i != dirList->end(); i++)
72   {
73     currentSubDir = *i;
74     SNPRINTF(tempA, 299, tr("<dir> %lu\t%s"), currentSubDir->getNumRecordings(), currentSubDir->name);
75     currentSubDir->index = sl.addOption(tempA, 0, first);
76     first = 0;
77   }
78
79   // FIXME convert the whole program to time_t's
80
81   Recording* currentRec;
82   RecordingList::iterator j;
83   RecordingList* recList = recman->getRecordings();
84   for (j = recList->begin(); j != recList->end(); j++)
85   {
86     currentRec = *j;
87     time_t recStartTime = (time_t)currentRec->getStartTime();
88     btime = localtime(&recStartTime);
89 #ifndef _MSC_VER
90     strftime(tempA, 299, "%0d/%0m %0H:%0M ", btime);
91 #else
92     strftime(tempA, 299, "%d/%m %H:%M ", btime);
93 #endif
94     sprintf(tempB, "%s\t%s", tempA, currentRec->getProgName());
95     currentRec->index = sl.addOption(tempB, 0, first);
96     first = 0;
97   }
98
99   if (doIndexPop)
100   {
101     sl.hintSetCurrent(slIndexStack.top());
102     slIndexStack.pop();
103   }
104   else
105   {
106     sl.hintSetCurrent(saveIndex);
107     sl.hintSetTop(saveTop);
108   }
109   sl.draw();
110   doShowingBar();
111 }
112
113 void VRecordingList::draw(bool doIndexPop)
114 {
115   if (!loading)
116   {
117     if (recman->isSubDir())
118     {
119       char title[300];
120       SNPRINTF(title, 299, tr("Recordings - %s"), recman->getCurDirName());
121       setTitleText(title);
122     }
123     else
124     {
125       setTitleText(tr("Recordings"));
126     }
127   }
128
129   View::draw();
130
131   if (loading)
132   {
133     drawText(tr("Loading..."), 240, 180, Colour::LIGHTTEXT);
134   }
135   else
136   {
137     char freeSpace[50];
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);
141
142     // Symbols
143
144     WSymbol w;
145     w.setSurface(surface);
146
147     w.nextSymbol = WSymbol::UP;
148     w.setSurfaceOffset(20, 385);
149     w.draw();
150
151     w.nextSymbol = WSymbol::DOWN;
152     w.setSurfaceOffset(50, 385);
153     w.draw();
154
155     w.nextSymbol = WSymbol::SKIPBACK;
156     w.setSurfaceOffset(85, 385);
157     w.draw();
158
159     w.nextSymbol = WSymbol::SKIPFORWARD;
160     w.setSurfaceOffset(115, 385);
161     w.draw();
162
163     w.nextSymbol = WSymbol::PLAY;
164     w.setSurfaceOffset(150, 385);
165     w.draw();
166
167     drawTextRJ(tr("[ok] = menu"), 560, 385, Colour::LIGHTTEXT);
168
169     // All static stuff done
170
171     drawData(doIndexPop);
172   }
173 }
174
175 void VRecordingList::doShowingBar()
176 {
177   int topOption = sl.getTopOption() + 1;
178   if (sl.getNumOptions() == 0) topOption = 0;
179
180   rectangle(220, 385, 180, 25, Colour::VIEWBACKGROUND);
181   char showing[200];
182   sprintf(showing, tr("%i to %i of %i"), topOption, sl.getBottomOption(), sl.getNumOptions());
183   drawText(showing, 220, 385, Colour::LIGHTTEXT);
184 }
185
186 void VRecordingList::processMessage(Message* m)
187 {
188   Log::getInstance()->log("VRecordingList", Log::DEBUG, "Got message value %lu", m->message);
189   if (m->message == Message::DELETE_SELECTED_RECORDING)
190   {
191     Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing delete selected");
192     doDeleteSelected();
193     return;
194   }
195
196   if (m->message == Message::MOVE_RECORDING)
197   {
198     Log::getInstance()->log("VRecordingList", Log::DEBUG, "Doing move recording");
199     doMoveRecording((Directory*)m->parameter);
200     return;
201   }
202
203   if (m->message == Message::PLAY_SELECTED_RECORDING)
204   {
205     doPlay(false);
206     return;
207   }
208
209   if (m->message == Message::RESUME_SELECTED_RECORDING)
210   {
211     doPlay(true);
212     return;
213   }
214 }
215
216 void VRecordingList::doDeleteSelected()
217 {
218   Recording* toDelete = getCurrentOptionRecording();
219
220   if (!toDelete) return;
221
222   Log::getInstance()->log("VRecordingList", Log::DEBUG, "FOUND: %i %s %s", toDelete->index, toDelete->getProgName(), toDelete->getFileName());
223
224   int success = recman->deleteRecording(toDelete);
225   if (!VDR::getInstance()->isConnected())
226   {
227     Command::getInstance()->connectionLost();
228     return;
229   }
230
231   if (success != 1)
232   {
233     VInfo* vi = new VInfo();
234     vi->create(360, 200);
235     if (Video::getInstance()->getFormat() == Video::PAL)
236       vi->setScreenPos(190, 170);
237     else
238       vi->setScreenPos(180, 120);
239     vi->setOneLiner(tr("Failed to delete recording"));
240     vi->setExitable();
241     vi->setBorderOn(1);
242     vi->setTitleBarColour(Colour::DANGER);
243     vi->okButton();
244     vi->draw();
245     viewman->add(vi);
246     viewman->updateView(vi);
247   }
248   else
249   {
250     draw();
251     viewman->updateView(this);
252   }
253
254 }
255
256 void VRecordingList::doMoveRecording(Directory* toDir)
257 {
258   Recording* toMove = getCurrentOptionRecording();
259   if (!toMove || !toDir) return;
260
261   Log::getInstance()->log("VRecordingList", Log::DEBUG, "MOVE: %s %s", toMove->getProgName(), toDir->name);
262
263   int success = recman->moveRecording(toMove, toDir);
264   if (!VDR::getInstance()->isConnected())
265   {
266     Command::getInstance()->connectionLost();
267     return;
268   }
269
270   if (success != 1)
271   {
272     VInfo* vi = new VInfo();
273     vi->create(360, 200);
274     if (Video::getInstance()->getFormat() == Video::PAL)
275       vi->setScreenPos(190, 170);
276     else
277       vi->setScreenPos(180, 120);
278     vi->setOneLiner(tr("Failed to move recording"));
279     vi->setExitable();
280     vi->setBorderOn(1);
281     vi->setTitleBarColour(Colour::DANGER);
282     vi->okButton();
283     vi->draw();
284     viewman->add(vi);
285     viewman->updateView(vi);
286   }
287   else
288   {
289     draw();
290     viewman->updateView(this);
291   }
292 }
293
294 int VRecordingList::doPlay(bool resume)
295 {
296   Recording* toPlay = getCurrentOptionRecording();
297   if (toPlay)
298   {
299     toPlay->loadRecInfo(); // check if still need this
300     toPlay->loadMarks();
301
302     bool isRadio = toPlay->isRadio();
303
304     if (isRadio)
305     {
306       VRadioRec* radrec = new VRadioRec(toPlay);
307       radrec->draw();
308       viewman->add(radrec);
309       viewman->updateView(radrec);
310       radrec->go();
311     }
312     else
313     {
314       VVideoRec* vidrec = new VVideoRec(toPlay);
315       vidrec->draw();
316       viewman->add(vidrec);
317       viewman->updateView(vidrec);
318       vidrec->go(resume);
319     }
320     return 1;
321   }
322   // should not get to here
323   return 0;
324 }
325
326 Recording* VRecordingList::getCurrentOptionRecording()
327 {
328   Recording* currentRec;
329   RecordingList::iterator j;
330   RecordingList* recList = recman->getRecordings();
331   for (j = recList->begin(); j != recList->end(); j++)
332   {
333     currentRec = *j;
334     if (currentRec->index == sl.getCurrentOption()) return currentRec;
335   }
336
337   return NULL;
338 }
339
340 int VRecordingList::handleCommand(int command)
341 {
342   switch(command)
343   {
344     case Remote::DF_UP:
345     case Remote::UP:
346     {
347       sl.up();
348       sl.draw();
349
350       doShowingBar();
351       viewman->updateView(this);
352       return 2;
353     }
354     case Remote::DF_DOWN:
355     case Remote::DOWN:
356     {
357       Log::getInstance()->log("P", Log::DEBUG, "1");
358       sl.down();
359       Log::getInstance()->log("P", Log::DEBUG, "1.5");
360       sl.draw();
361       Log::getInstance()->log("P", Log::DEBUG, "2");
362
363       doShowingBar();
364       Log::getInstance()->log("P", Log::DEBUG, "3");
365       viewman->updateView(this);
366       Log::getInstance()->log("P", Log::DEBUG, "4");
367       return 2;
368     }
369     case Remote::SKIPBACK:
370     {
371       sl.pageUp();
372       sl.draw();
373
374       doShowingBar();
375       viewman->updateView(this);
376       return 2;
377     }
378     case Remote::SKIPFORWARD:
379     {
380       sl.pageDown();
381       sl.draw();
382
383       doShowingBar();
384       viewman->updateView(this);
385       return 2;
386     }
387     case Remote::OK:
388     {
389       if (sl.getNumOptions() == 0) return 2;
390
391       // Check to see if it is a sub directory
392       Directory* currentSubDir;
393       DirectoryList::iterator i;
394       DirectoryList* dirList = recman->getDirectories();
395       for (i = dirList->begin(); i != dirList->end(); i++)
396       {
397         currentSubDir = *i;
398         if (currentSubDir->index == sl.getCurrentOption())
399         {
400           if (recman->down(currentSubDir))
401           {
402             slIndexStack.push(sl.getCurrentOption());
403             sl.clear();
404             draw();
405             viewman->updateView(this);
406           }
407           return 2;
408         }
409       }
410
411       // check to see if it's a recording
412       Recording* current = getCurrentOptionRecording();
413       if (current)
414       {
415         Log::getInstance()->log("VRecordingList", Log::DEBUG, "Found the option you pointed at. %s %s", current->getProgName(), current->getFileName());
416
417         VRecordingMenu* v = new VRecordingMenu(recman);
418         v->setParent(this);
419         v->setRecording(current);
420         v->draw();
421         viewman->add(v);
422         viewman->updateView(v);
423         return 2;
424       }
425       // should not get to here
426       return 1;
427     }
428     case Remote::BACK:
429     {
430       if (recman->isSubDir())
431       {
432         recman->up();
433         sl.clear();
434         draw(true);
435         viewman->updateView(this);
436         return 2;
437       }
438       else
439       {
440         return 4;
441       }
442     }
443     case Remote::PLAY:
444     {
445       if (doPlay(true)) return 2;
446       return 1;
447     }
448
449   }
450   // stop command getting to any more views
451   return 1;
452 }
453
454 bool VRecordingList::load()
455 {
456   recman = new RecMan();
457   bool success = VDR::getInstance()->getRecordingsList(recman);
458   if (success)
459   {
460     loading = false;
461     draw();
462     viewman->updateView(this);
463   }
464
465   return success;
466 }
467