]> git.vomp.tv Git - vompclient-marten.git/blob - vopts.cc
SDTV support
[vompclient-marten.git] / vopts.cc
1 /*\r
2     Copyright 2007 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 #include "vopts.h"\r
22 \r
23 #include "colour.h"\r
24 #include "video.h"\r
25 #include "audio.h"\r
26 #include "remote.h"\r
27 #include "boxstack.h"\r
28 #include "woptionpane.h"\r
29 #include "wremoteconfig.h"\r
30 #include "log.h"\r
31 #include "option.h"\r
32 #include "vdr.h"\r
33 #include "command.h"\r
34 \r
35 #ifdef VOMP_PLATTFORM_MVP\r
36 #include "mediaoptions.h"\r
37 #endif\r
38 //#include "vdr.h"\r
39 //#include "command.h"\r
40 \r
41 VOpts::VOpts()\r
42 {\r
43   setTitleBarOn(1);\r
44   setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);\r
45   setTitleText(tr("Options"));\r
46 \r
47 \r
48   setSize(520, 360);\r
49   createBuffer();\r
50   if (Video::getInstance()->getFormat() == Video::PAL)\r
51     setPosition(100, 110);\r
52   else\r
53     setPosition(90, 90);\r
54   \r
55   tabbar.setPosition(6, 32);\r
56   tabbar.setSize(getWidth() - 12, getHeight() - 34);\r
57   add(&tabbar);\r
58   \r
59   Option* option;\r
60   WOptionPane* wop;\r
61   \r
62   //  --- edit options start here\r
63   \r
64   static const char* options1[] = {"Old", "New"};\r
65 \r
66   static const char* options5[] = {"Chop sides", "Letterbox"};\r
67   static const char* options6[] = {"On", "Off", "Last state"};\r
68   static const char* options7[] = {"All", "FTA only"};\r
69   static const char* options15[] = {"Alphabetical", "Chronological"};\r
70 \r
71   static const char* options13[] = {"1024", "2048", "4096", "8192", "16384", "32768", "65536"};\r
72   static const char* options14[] = {"No", "Yes"};\r
73   // Get list of languages from VDR and construct options table\r
74   LangCode = VDR::getInstance()->getLanguageList();\r
75   options2 = new const char*[LangCode.size()];\r
76   options2keys = new const char*[LangCode.size()];\r
77   I18n::lang_code_list::const_iterator iter;\r
78   UINT LangNumber = 0;\r
79   for (iter = LangCode.begin(); iter != LangCode.end(); ++iter,++LangNumber)\r
80   {\r
81     options2[LangNumber] = iter->second.c_str();\r
82     options2keys[LangNumber] = iter->first.c_str();\r
83   }\r
84 \r
85   numPanes = 4;\r
86   panes = new Boxx*[numPanes];\r
87
88   wop = new WOptionPane();\r
89   tabbar.addTab(tr("General"), wop);\r
90   panes[0] = wop;\r
91 #ifdef MVP_REMOTE_TYPES\r
92   option = new Option(1, "Remote control type",      "General", "Remote type",           Option::TYPE_TEXT, 2, 0, 0, options1);\r
93   options.push_back(option);\r
94   wop->addOptionLine(option);\r
95 #endif\r
96   option = new Option(2, "Language",                 "General", "LangCode",              Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);\r
97   options.push_back(option);\r
98   wop->addOptionLine(option);\r
99 \r
100 \r
101   UINT suppconn = Video::getInstance()->getSupportedFormats();\r
102   if (suppconn) {\r
103           int defaultch = 0;\r
104           if (suppconn & Video::COMPOSITERGB) {\r
105                   defaultch = 0;\r
106                   options3.push_back("RGB+composite");\r
107                   options3keys.push_back("RGB+composite");\r
108           }\r
109           if (Video::SVIDEO & suppconn) {\r
110                   options3.push_back("S-Video");\r
111                   options3keys.push_back("S-Video");\r
112           }\r
113           if (Video::HDMI & suppconn) {\r
114                   defaultch = options3.size();\r
115                   options3.push_back("HDMI");\r
116                   options3keys.push_back("HDMI");\r
117           }\r
118           if (Video::HDMI3D & suppconn) {\r
119                   options3.push_back("HDMI3D");\r
120                   options3keys.push_back("HDMI3D");\r
121           }\r
122           option = new Option(3, "TV connection type", "TV", "Connection",\r
123                           Option::TYPE_KEYED_TEXT, options3.size(), defaultch, 0,\r
124                           &(options3[0]), &(options3keys[0]));\r
125 \r
126           options.push_back(option);\r
127           wop->addOptionLine(option);\r
128   }\r
129 \r
130   UINT suppformats = Video::getInstance()->supportedTVFormats();\r
131   if (suppformats) {\r
132           int defaultch = 0;\r
133           options16.push_back("NTSC");\r
134           options16keys.push_back("NTSC");\r
135           if (suppformats & Video::PAL) {\r
136                   defaultch = 1;\r
137                   options16.push_back("PAL");\r
138                   options16keys.push_back("PAL");\r
139           }\r
140           if (Video::NTSC_J & suppformats) {\r
141                   options16.push_back("NTSC-J");\r
142                   options16keys.push_back("NTSC-J");\r
143           }\r
144           if (Video::PAL_M & suppformats) {\r
145                   options16.push_back("PAL-M");\r
146                   options16keys.push_back("PAL-M");\r
147           }\r
148 \r
149           option = new Option(16, "TV standard (needs restart)", "General", "Override Video Format",\r
150                           Option::TYPE_KEYED_TEXT, options16.size(), defaultch, 0,\r
151                           &(options16[0]), &(options16keys[0]));\r
152 \r
153           options.push_back(option);\r
154           wop->addOptionLine(option);\r
155   }\r
156 \r
157   UINT supptvsize=Video::getInstance()->supportedTVsize();\r
158   if (supptvsize) {\r
159           int defaultch=0;\r
160           options4.push_back("4:3");\r
161           options4keys.push_back("4:3");\r
162       if (Video::ASPECT16X9 & supptvsize) {\r
163           options4.push_back("16:9");\r
164           options4keys.push_back("16:9");\r
165           defaultch=1;\r
166       }\r
167       if (Video::ASPECT14X9 & supptvsize) {\r
168           options4.push_back("14:9");\r
169           options4keys.push_back("14:9");\r
170       }\r
171           option = new Option(4, "TV aspect ratio", "TV", "Aspect",\r
172                                 Option::TYPE_KEYED_TEXT, options4.size(), defaultch, 0,\r
173                                 &(options4[0]), &(options4keys[0]));\r
174           options.push_back(option);\r
175           wop->addOptionLine(option);\r
176   }\r
177 \r
178   option = new Option(5, "16:9 on 4:3 display mode", "TV",      "Widemode",              Option::TYPE_TEXT, 2, 0, 0, options5);\r
179   options.push_back(option);\r
180   wop->addOptionLine(option);\r
181   option = new Option(6, "Power state after bootup", "General", "Power After Boot",      Option::TYPE_TEXT, 3, 0, 0, options6);\r
182   options.push_back(option);\r
183   wop->addOptionLine(option);\r
184   option = new Option(7, "Display channels",         "General", "Channels",              Option::TYPE_TEXT, 2, 0, 0, options7);\r
185   options.push_back(option);\r
186   wop->addOptionLine(option);\r
187   option = new Option(15, "Recordings sort order",   "General", "Recordings Sort Order", Option::TYPE_TEXT, 2, 0, 0, options15);\r
188   options.push_back(option);\r
189   wop->addOptionLine(option);\r
190 \r
191   Remote::getInstance()->addOptionsToPanes(0,&options,wop);\r
192   Video::getInstance()->addOptionsToPanes(0,&options,wop);\r
193   Audio::getInstance()->addOptionsToPanes(0,&options,wop);\r
194 \r
195     \r
196 /*  WRemoteConfig* wrc = new WRemoteConfig();\r
197   tabbar.addTab(tr("Remote Control"), wrc);*/\r
198   Remote::getInstance()->addOptionPagesToWTB(&tabbar);\r
199  // panes[1] = wrc;\r
200 \r
201   Video::getInstance()->addOptionPagesToWTB(&tabbar);\r
202   Audio::getInstance()->addOptionPagesToWTB(&tabbar);\r
203 #ifdef VOMP_PLATTFORM_MVP\r
204   MediaOptions::getInstance()->addOptionPagesToWTB(&tabbar);\r
205 #endif\r
206 \r
207 \r
208   wop = new WOptionPane(); \r
209   tabbar.addTab(tr("Timers"), wop);\r
210   panes[1] = wop;\r
211   \r
212   option = new Option(9, "Default start margin (minutes)",  "Timers", "Start margin",  Option::TYPE_INT, 20, 5, 0, NULL);\r
213   options.push_back(option);\r
214   wop->addOptionLine(option);\r
215   option = new Option(10, "Default end margin (minutes)",   "Timers", "End margin",    Option::TYPE_INT, 20, 5, 0, NULL);\r
216   options.push_back(option);\r
217   wop->addOptionLine(option);\r
218   option = new Option(11, "Default priority",               "Timers", "Priority",      Option::TYPE_INT, 100, 99, 0, NULL);\r
219   options.push_back(option);\r
220   wop->addOptionLine(option);\r
221   option = new Option(12, "Default lifetime",               "Timers", "Lifetime",      Option::TYPE_INT, 100, 99, 0, NULL);\r
222   options.push_back(option);\r
223   wop->addOptionLine(option);\r
224 \r
225   Remote::getInstance()->addOptionsToPanes(1,&options,wop);\r
226   Video::getInstance()->addOptionsToPanes(1,&options,wop);\r
227   Audio::getInstance()->addOptionsToPanes(1,&options,wop);\r
228 \r
229     \r
230   wop = new WOptionPane(); \r
231   tabbar.addTab(tr("Advanced"), wop);\r
232   panes[2] = wop;\r
233   \r
234   option = new Option(8, "VDR-Pri 0=OK !See forums!",  "General",  "Live priority",      Option::TYPE_INT,  100, 0, 0, NULL);\r
235   options.push_back(option);\r
236   wop->addOptionLine(option);\r
237   option = new Option(13, "TCP receive window size",   "Advanced", "TCP receive window", Option::TYPE_TEXT, 7, /*1*/DEFAULT_TCP_WINDOWSIZENR, 0, options13);\r
238   options.push_back(option);\r
239   wop->addOptionLine(option);\r
240 #ifdef PAL_WSS\r
241   option = new Option(14, "Use WSS (PAL only)",        "General",  "WSS",                Option::TYPE_TEXT, 2, 0, 0, options14);\r
242   options.push_back(option);\r
243   wop->addOptionLine(option);\r
244 #endif\r
245 \r
246   Remote::getInstance()->addOptionsToPanes(2,&options,wop);\r
247   Video::getInstance()->addOptionsToPanes(2,&options,wop);\r
248   Audio::getInstance()->addOptionsToPanes(2,&options,wop);\r
249 }\r
250 \r
251 VOpts::~VOpts()\r
252 {\r
253  // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten\r
254   delete[] panes;\r
255 \r
256   for(vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;\r
257   delete[] options2;\r
258   delete[] options2keys;\r
259 }\r
260 \r
261 int VOpts::handleCommand(int command)\r
262 {\r
263   // either is active, handle back\r
264   if (command == Remote::BACK)\r
265   {\r
266     doSave();\r
267     return 4;\r
268   }\r
269   else\r
270   {\r
271     int retval = tabbar.handleCommand(command);\r
272     if (retval == 1)\r
273     {\r
274       BoxStack::getInstance()->update(this);\r
275       return 2;\r
276     }\r
277     else if (retval == 2)\r
278     {\r
279       // command was taken and actively ignored\r
280       return 2;\r
281     }\r
282     else\r
283     {\r
284       return 1; // ???\r
285     }\r
286   }\r
287 }\r
288 \r
289 void VOpts::doSave()\r
290 {\r
291   VDR* vdr = VDR::getInstance();\r
292 \r
293   Remote::getInstance()->saveOptionstoServer(); //Remote\r
294   Video::getInstance()->saveOptionstoServer(); //Video\r
295   Audio::getInstance()->saveOptionstoServer(); //Remote\r
296 #ifdef VOMP_PLATTFORM_MVP\r
297   MediaOptions::getInstance()->saveOptionstoServer(); //Media\r
298 #endif\r
299 \r
300   // Damn, and the dynamic idea was going *so* well...\r
301   //Whats about a check with typeid operator?\r
302   WOptionPane* wop;\r
303   wop = (WOptionPane*)panes[0];\r
304   wop->saveOpts();  \r
305   wop = (WOptionPane*)panes[1];\r
306   wop->saveOpts();  \r
307   wop = (WOptionPane*)panes[2];\r
308   wop->saveOpts();  \r
309 \r
310 \r
311   for (UINT i = 0; i < options.size(); i++)\r
312   {\r
313     if (options[i]->configChoice == options[i]->userSetChoice) continue; // no change\r
314 \r
315     Log::getInstance()->log("Options", Log::DEBUG, "Option %i has changed", i);\r
316 \r
317     // Save to vdr\r
318 \r
319     if (options[i]->optionType == Option::TYPE_TEXT)\r
320     {\r
321       vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->options[options[i]->userSetChoice]);\r
322     }\r
323     else if (options[i]->optionType == Option::TYPE_KEYED_TEXT)\r
324     {\r
325       vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->optionkeys[options[i]->userSetChoice]);\r
326     }\r
327     else\r
328     {\r
329       char buffer[20];\r
330       sprintf(buffer, "%i", options[i]->userSetChoice);\r
331       vdr->configSave(options[i]->configSection, options[i]->configKey, buffer);\r
332     }\r
333     \r
334     // Set new setting\r
335     if (options[i]->opthandler == NULL) //Ok, noone else is handling this, we are doing it\r
336     {\r
337       switch(options[i]->id)\r
338       {\r
339         case 1:\r
340         {\r
341 #ifdef MVP_REMOTE_TYPES\r
342           if (options[i]->userSetChoice == 1)\r
343           {\r
344             Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");\r
345             Remote::getInstance()->setRemoteType(Remote::NEWREMOTE);\r
346           }\r
347           else\r
348           {\r
349             Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");\r
350             Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);\r
351           }\r
352 #endif\r
353           break;\r
354         }\r
355         case 2:\r
356         {\r
357           Message* m = new Message();\r
358           m->message = Message::CHANGE_LANGUAGE;\r
359           m->to = Command::getInstance();\r
360           Command::getInstance()->postMessageNoLock(m);\r
361           break;\r
362         }\r
363         case 3:\r
364         {\r
365                 if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "RGB+composite")==0)\r
366                 {\r
367                         Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");\r
368                         Video::getInstance()->setConnection(Video::COMPOSITERGB);\r
369                 }\r
370                 else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "S-Video")==0)\r
371                 {\r
372                         Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");\r
373                         Video::getInstance()->setConnection(Video::SVIDEO);\r
374                 }\r
375                 else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI")==0)\r
376                 {\r
377                         Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");\r
378                         Video::getInstance()->setConnection(Video::HDMI);\r
379                 }\r
380                 else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI3D")==0)\r
381                 {\r
382                         Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");\r
383                         Video::getInstance()->setConnection(Video::HDMI3D);\r
384                 }\r
385                 break;\r
386         }\r
387         case 4:\r
388         {\r
389           if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "16:9")==0)\r
390           {\r
391             Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");\r
392             Video::getInstance()->setTVsize(Video::ASPECT16X9);\r
393           }\r
394           else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "4:3")==0)\r
395           {\r
396             Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");\r
397             Video::getInstance()->setTVsize(Video::ASPECT4X3);\r
398           }\r
399           else  if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "14:9")==0)\r
400           {\r
401                   Log::getInstance()->log("Options", Log::DEBUG, "Setting 14:9 TV");\r
402                   Video::getInstance()->setTVsize(Video::ASPECT14X9);\r
403           }\r
404           break;\r
405         }\r
406         case 5:\r
407         {\r
408           if (options[i]->userSetChoice == 1)\r
409           {\r
410             Log::getInstance()->log("Options", Log::DEBUG, "Setting letterbox");\r
411             Video::getInstance()->setMode(Video::LETTERBOX);\r
412           }\r
413           else\r
414           {\r
415             Log::getInstance()->log("Options", Log::DEBUG, "Setting chop-sides");\r
416             Video::getInstance()->setMode(Video::NORMAL);\r
417           }\r
418           break;\r
419         }\r
420         case 13:\r
421         {\r
422           size_t newTCPsize = 2048;\r
423           if (options[i]->userSetChoice == 0) newTCPsize = 1024;\r
424           else if (options[i]->userSetChoice == 1) newTCPsize = 2048;\r
425           else if (options[i]->userSetChoice == 2) newTCPsize = 4096;\r
426           else if (options[i]->userSetChoice == 3) newTCPsize = 8192;\r
427           else if (options[i]->userSetChoice == 4) newTCPsize = 16384;\r
428           else if (options[i]->userSetChoice == 5) newTCPsize = 32768;\r
429           else if (options[i]->userSetChoice == 6) newTCPsize = 65536;\r
430           Log::getInstance()->log("Options", Log::DEBUG, "Setting TCP window size %i", newTCPsize);\r
431           VDR::getInstance()->setReceiveWindow(newTCPsize);\r
432           break;\r
433         }\r
434       }\r
435     }\r
436     else\r
437     {\r
438       options[i]->opthandler->handleOptionChanges(options[i]);\r
439     }\r
440   }\r
441 }\r
442 \r
443 void VOpts::processMessage(Message* m)\r
444 {\r
445   if (m->message == Message::MOUSE_MOVE)\r
446   {\r
447     int x=(m->parameter>>16)-getScreenX();\r
448     int y=(m->parameter&0xFFFF)-getScreenY();\r
449     if (tabbar.mouseMove(x,y))\r
450     {\r
451       BoxStack::getInstance()->update(this);\r
452     }\r
453     \r
454   }\r
455   else if (m->message == Message::MOUSE_LBDOWN)\r
456   {\r
457     int x=(m->parameter>>16)-getScreenX();\r
458     int y=(m->parameter&0xFFFF)-getScreenY();\r
459     if (tabbar.mouseLBDOWN(x,y)) \r
460     {\r
461       BoxStack::getInstance()->update(this);\r
462     } \r
463     else if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())\r
464     {\r
465       BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press\r
466     }\r
467   }\r
468 }\r
469 \r