]> git.vomp.tv Git - vompclient-marten.git/blob - vopts.cc
Remove pixel based apis, preparation for vector based osd
[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(Colour::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   static const char* options3[] = {"RGB+composite", "S-Video"};\r
66   static const char* options4[] = {"4:3", "16:9"};\r
67   static const char* options5[] = {"Chop sides", "Letterbox"};\r
68   static const char* options6[] = {"On", "Off", "Last state"};\r
69   static const char* options7[] = {"All", "FTA only"};\r
70   static const char* options15[] = {"Alphabetical", "Chronological"};\r
71 \r
72   static const char* options13[] = {"1024", "2048", "4096", "8192", "16384", "32768", "65536"};\r
73   static const char* options14[] = {"No", "Yes"};\r
74   // Get list of languages from VDR and construct options table\r
75   LangCode = VDR::getInstance()->getLanguageList();\r
76   options2 = new const char*[LangCode.size()];\r
77   options2keys = new const char*[LangCode.size()];\r
78   I18n::lang_code_list::const_iterator iter;\r
79   UINT LangNumber = 0;\r
80   for (iter = LangCode.begin(); iter != LangCode.end(); ++iter,++LangNumber)\r
81   {\r
82     options2[LangNumber] = iter->second.c_str();\r
83     options2keys[LangNumber] = iter->first.c_str();\r
84   }\r
85 \r
86   numPanes = 4;\r
87   panes = new Boxx*[numPanes];\r
88
89   wop = new WOptionPane();\r
90   tabbar.addTab(tr("General"), wop);\r
91   panes[0] = wop;\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   option = new Option(2, "Language",                 "General", "LangCode",              Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);\r
96   options.push_back(option);\r
97   wop->addOptionLine(option);\r
98   option = new Option(3, "TV connection type",       "TV",      "Connection",            Option::TYPE_TEXT, 2, 0, 0, options3);\r
99   options.push_back(option);\r
100   wop->addOptionLine(option);\r
101   option = new Option(4, "TV aspect ratio",          "TV",      "Aspect",                Option::TYPE_TEXT, 2, 0, 0, options4);\r
102   options.push_back(option);\r
103   wop->addOptionLine(option);\r
104   option = new Option(5, "16:9 on 4:3 display mode", "TV",      "Widemode",              Option::TYPE_TEXT, 2, 0, 0, options5);\r
105   options.push_back(option);\r
106   wop->addOptionLine(option);\r
107   option = new Option(6, "Power state after bootup", "General", "Power After Boot",      Option::TYPE_TEXT, 3, 0, 0, options6);\r
108   options.push_back(option);\r
109   wop->addOptionLine(option);\r
110   option = new Option(7, "Display channels",         "General", "Channels",              Option::TYPE_TEXT, 2, 0, 0, options7);\r
111   options.push_back(option);\r
112   wop->addOptionLine(option);\r
113   option = new Option(15, "Recordings sort order",   "General", "Recordings Sort Order", Option::TYPE_TEXT, 2, 0, 0, options15);\r
114   options.push_back(option);\r
115   wop->addOptionLine(option);\r
116 \r
117   Remote::getInstance()->addOptionsToPanes(0,&options,wop);\r
118   Video::getInstance()->addOptionsToPanes(0,&options,wop);\r
119   Audio::getInstance()->addOptionsToPanes(0,&options,wop);\r
120 \r
121     \r
122 /*  WRemoteConfig* wrc = new WRemoteConfig();\r
123   tabbar.addTab(tr("Remote Control"), wrc);*/\r
124   Remote::getInstance()->addOptionPagesToWTB(&tabbar);\r
125  // panes[1] = wrc;\r
126 \r
127   Video::getInstance()->addOptionPagesToWTB(&tabbar);\r
128   Audio::getInstance()->addOptionPagesToWTB(&tabbar);\r
129 #ifdef VOMP_PLATTFORM_MVP\r
130   MediaOptions::getInstance()->addOptionPagesToWTB(&tabbar);\r
131 #endif\r
132 \r
133 \r
134   wop = new WOptionPane(); \r
135   tabbar.addTab(tr("Timers"), wop);\r
136   panes[1] = wop;\r
137   \r
138   option = new Option(9, "Default start margin (minutes)",  "Timers", "Start margin",  Option::TYPE_INT, 20, 5, 0, NULL);\r
139   options.push_back(option);\r
140   wop->addOptionLine(option);\r
141   option = new Option(10, "Default end margin (minutes)",   "Timers", "End margin",    Option::TYPE_INT, 20, 5, 0, NULL);\r
142   options.push_back(option);\r
143   wop->addOptionLine(option);\r
144   option = new Option(11, "Default priority",               "Timers", "Priority",      Option::TYPE_INT, 100, 99, 0, NULL);\r
145   options.push_back(option);\r
146   wop->addOptionLine(option);\r
147   option = new Option(12, "Default lifetime",               "Timers", "Lifetime",      Option::TYPE_INT, 100, 99, 0, NULL);\r
148   options.push_back(option);\r
149   wop->addOptionLine(option);\r
150 \r
151   Remote::getInstance()->addOptionsToPanes(1,&options,wop);\r
152   Video::getInstance()->addOptionsToPanes(1,&options,wop);\r
153   Audio::getInstance()->addOptionsToPanes(1,&options,wop);\r
154 \r
155     \r
156   wop = new WOptionPane(); \r
157   tabbar.addTab(tr("Advanced"), wop);\r
158   panes[2] = wop;\r
159   \r
160   option = new Option(8, "VDR-Pri 0=OK !See forums!",  "General",  "Live priority",      Option::TYPE_INT,  100, 0, 0, NULL);\r
161   options.push_back(option);\r
162   wop->addOptionLine(option);\r
163   option = new Option(13, "TCP receive window size",   "Advanced", "TCP receive window", Option::TYPE_TEXT, 7, /*1*/DEFAULT_TCP_WINDOWSIZENR, 0, options13);\r
164   options.push_back(option);\r
165   wop->addOptionLine(option);\r
166 #ifdef PAL_WSS\r
167   option = new Option(14, "Use WSS (PAL only)",        "General",  "WSS",                Option::TYPE_TEXT, 2, 0, 0, options14);\r
168   options.push_back(option);\r
169   wop->addOptionLine(option);\r
170 #endif\r
171 \r
172   Remote::getInstance()->addOptionsToPanes(2,&options,wop);\r
173   Video::getInstance()->addOptionsToPanes(2,&options,wop);\r
174   Audio::getInstance()->addOptionsToPanes(2,&options,wop);\r
175 }\r
176 \r
177 VOpts::~VOpts()\r
178 {\r
179  // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten\r
180   delete[] panes;\r
181 \r
182   for(vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;\r
183   delete[] options2;\r
184   delete[] options2keys;\r
185 }\r
186 \r
187 int VOpts::handleCommand(int command)\r
188 {\r
189   // either is active, handle back\r
190   if (command == Remote::BACK)\r
191   {\r
192     doSave();\r
193     return 4;\r
194   }\r
195   else\r
196   {\r
197     int retval = tabbar.handleCommand(command);\r
198     if (retval == 1)\r
199     {\r
200       BoxStack::getInstance()->update(this);\r
201       return 2;\r
202     }\r
203     else if (retval == 2)\r
204     {\r
205       // command was taken and actively ignored\r
206       return 2;\r
207     }\r
208     else\r
209     {\r
210       return 1; // ???\r
211     }\r
212   }\r
213 }\r
214 \r
215 void VOpts::doSave()\r
216 {\r
217   VDR* vdr = VDR::getInstance();\r
218 \r
219   Remote::getInstance()->saveOptionstoServer(); //Remote\r
220   Video::getInstance()->saveOptionstoServer(); //Video\r
221   Audio::getInstance()->saveOptionstoServer(); //Remote\r
222 #ifdef VOMP_PLATTFORM_MVP\r
223   MediaOptions::getInstance()->saveOptionstoServer(); //Media\r
224 #endif\r
225 \r
226   // Damn, and the dynamic idea was going *so* well...\r
227   //Whats about a check with typeid operator?\r
228   WOptionPane* wop;\r
229   wop = (WOptionPane*)panes[0];\r
230   wop->saveOpts();  \r
231   wop = (WOptionPane*)panes[1];\r
232   wop->saveOpts();  \r
233   wop = (WOptionPane*)panes[2];\r
234   wop->saveOpts();  \r
235 \r
236 \r
237   for (UINT i = 0; i < options.size(); i++)\r
238   {\r
239     if (options[i]->configChoice == options[i]->userSetChoice) continue; // no change\r
240 \r
241     Log::getInstance()->log("Options", Log::DEBUG, "Option %i has changed", i);\r
242 \r
243     // Save to vdr\r
244 \r
245     if (options[i]->optionType == Option::TYPE_TEXT)\r
246     {\r
247       vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->options[options[i]->userSetChoice]);\r
248     }\r
249     else if (options[i]->optionType == Option::TYPE_KEYED_TEXT)\r
250     {\r
251       vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->optionkeys[options[i]->userSetChoice]);\r
252     }\r
253     else\r
254     {\r
255       char buffer[20];\r
256       sprintf(buffer, "%i", options[i]->userSetChoice);\r
257       vdr->configSave(options[i]->configSection, options[i]->configKey, buffer);\r
258     }\r
259     \r
260     // Set new setting\r
261     if (options[i]->opthandler == NULL) //Ok, noone else is handling this, we are doing it\r
262     {\r
263       switch(options[i]->id)\r
264       {\r
265         case 1:\r
266         {\r
267           if (options[i]->userSetChoice == 1)\r
268           {\r
269             Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");\r
270             Remote::getInstance()->setRemoteType(Remote::NEWREMOTE);\r
271           }\r
272           else\r
273           {\r
274             Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");\r
275             Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);\r
276           }\r
277           break;\r
278         }\r
279         case 2:\r
280         {\r
281           Message* m = new Message();\r
282           m->message = Message::CHANGE_LANGUAGE;\r
283           m->to = Command::getInstance();\r
284           Command::getInstance()->postMessageNoLock(m);\r
285           break;\r
286         }\r
287         case 3:\r
288         {\r
289           if (options[i]->userSetChoice == 1)\r
290           {\r
291             Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");\r
292             Video::getInstance()->setConnection(Video::SVIDEO);\r
293           }\r
294           else\r
295           {\r
296             Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");\r
297             Video::getInstance()->setConnection(Video::COMPOSITERGB);\r
298           }\r
299           break;\r
300         }\r
301         case 4:\r
302         {\r
303           if (options[i]->userSetChoice == 1)\r
304           {\r
305             Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");\r
306             Video::getInstance()->setTVsize(Video::ASPECT16X9);\r
307           }\r
308           else\r
309           {\r
310             Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");\r
311             Video::getInstance()->setTVsize(Video::ASPECT4X3);\r
312           }\r
313           break;\r
314         }\r
315         case 5:\r
316         {\r
317           if (options[i]->userSetChoice == 1)\r
318           {\r
319             Log::getInstance()->log("Options", Log::DEBUG, "Setting letterbox");\r
320             Video::getInstance()->setMode(Video::LETTERBOX);\r
321           }\r
322           else\r
323           {\r
324             Log::getInstance()->log("Options", Log::DEBUG, "Setting chop-sides");\r
325             Video::getInstance()->setMode(Video::NORMAL);\r
326           }\r
327           break;\r
328         }\r
329         case 13:\r
330         {\r
331           size_t newTCPsize = 2048;\r
332           if (options[i]->userSetChoice == 0) newTCPsize = 1024;\r
333           else if (options[i]->userSetChoice == 1) newTCPsize = 2048;\r
334           else if (options[i]->userSetChoice == 2) newTCPsize = 4096;\r
335           else if (options[i]->userSetChoice == 3) newTCPsize = 8192;\r
336           else if (options[i]->userSetChoice == 4) newTCPsize = 16384;\r
337           else if (options[i]->userSetChoice == 5) newTCPsize = 32768;\r
338           else if (options[i]->userSetChoice == 6) newTCPsize = 65536;\r
339           Log::getInstance()->log("Options", Log::DEBUG, "Setting TCP window size %i", newTCPsize);\r
340           VDR::getInstance()->setReceiveWindow(newTCPsize);\r
341           break;\r
342         }\r
343       }\r
344     }\r
345     else\r
346     {\r
347       options[i]->opthandler->handleOptionChanges(options[i]);\r
348     }\r
349   }\r
350 }\r
351 \r
352 void VOpts::processMessage(Message* m)\r
353 {\r
354   if (m->message == Message::MOUSE_MOVE)\r
355   {\r
356     int x=(m->parameter>>16)-getScreenX();\r
357     int y=(m->parameter&0xFFFF)-getScreenY();\r
358     if (tabbar.mouseMove(x,y))\r
359     {\r
360       BoxStack::getInstance()->update(this);\r
361     }\r
362     \r
363   }\r
364   else if (m->message == Message::MOUSE_LBDOWN)\r
365   {\r
366     int x=(m->parameter>>16)-getScreenX();\r
367     int y=(m->parameter&0xFFFF)-getScreenY();\r
368     if (tabbar.mouseLBDOWN(x,y)) \r
369     {\r
370       BoxStack::getInstance()->update(this);\r
371     } \r
372     else if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())\r
373     {\r
374       BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press\r
375     }\r
376   }\r
377 }\r
378 \r