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