2 Copyright 2007 Chris Tallon
\r
4 This file is part of VOMP.
\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
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
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
27 #include "boxstack.h"
\r
28 #include "woptionpane.h"
\r
29 #include "wremoteconfig.h"
\r
33 #include "command.h"
\r
35 #ifdef VOMP_PLATTFORM_MVP
\r
36 #include "mediaoptions.h"
\r
39 //#include "command.h"
\r
44 setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
\r
45 setTitleText(tr("Options"));
\r
50 if (Video::getInstance()->getFormat() == Video::PAL)
\r
51 setPosition(100, 110);
\r
53 setPosition(90, 90);
\r
55 tabbar.setPosition(6, 32);
\r
56 tabbar.setSize(getWidth() - 12, getHeight() - 34);
\r
62 // --- edit options start here
\r
64 static const char* options1[] = {"Old", "New"};
\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
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
81 options2[LangNumber] = iter->second.c_str();
\r
82 options2keys[LangNumber] = iter->first.c_str();
\r
86 panes = new Boxx*[numPanes];
\r
88 wop = new WOptionPane();
\r
89 tabbar.addTab(tr("General"), 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
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
101 UINT suppconn = Video::getInstance()->getSupportedFormats();
\r
104 if (suppconn & Video::COMPOSITERGB) {
\r
106 options3.push_back("RGB+composite");
\r
107 options3keys.push_back("RGB+composite");
\r
109 if (Video::SVIDEO & suppconn) {
\r
110 options3.push_back("S-Video");
\r
111 options3keys.push_back("S-Video");
\r
113 if (Video::HDMI & suppconn) {
\r
114 defaultch = options3.size();
\r
115 options3.push_back("HDMI");
\r
116 options3keys.push_back("HDMI");
\r
118 if (Video::HDMI3D & suppconn) {
\r
119 options3.push_back("HDMI3D");
\r
120 options3keys.push_back("HDMI3D");
\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
126 options.push_back(option);
\r
127 wop->addOptionLine(option);
\r
130 UINT suppformats = Video::getInstance()->supportedTVFormats();
\r
133 options16.push_back("NTSC");
\r
134 options16keys.push_back("NTSC");
\r
135 if (suppformats & Video::PAL) {
\r
137 options16.push_back("PAL");
\r
138 options16keys.push_back("PAL");
\r
140 if (Video::NTSC_J & suppformats) {
\r
141 options16.push_back("NTSC-J");
\r
142 options16keys.push_back("NTSC-J");
\r
144 if (Video::PAL_M & suppformats) {
\r
145 options16.push_back("PAL-M");
\r
146 options16keys.push_back("PAL-M");
\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
153 options.push_back(option);
\r
154 wop->addOptionLine(option);
\r
157 UINT supptvsize=Video::getInstance()->supportedTVsize();
\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
167 if (Video::ASPECT14X9 & supptvsize) {
\r
168 options4.push_back("14:9");
\r
169 options4keys.push_back("14:9");
\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
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
191 Remote::getInstance()->addOptionsToPanes(0,&options,wop);
\r
192 Video::getInstance()->addOptionsToPanes(0,&options,wop);
\r
193 Audio::getInstance()->addOptionsToPanes(0,&options,wop);
\r
196 /* WRemoteConfig* wrc = new WRemoteConfig();
\r
197 tabbar.addTab(tr("Remote Control"), wrc);*/
\r
198 Remote::getInstance()->addOptionPagesToWTB(&tabbar);
\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
208 wop = new WOptionPane();
\r
209 tabbar.addTab(tr("Timers"), wop);
\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
225 Remote::getInstance()->addOptionsToPanes(1,&options,wop);
\r
226 Video::getInstance()->addOptionsToPanes(1,&options,wop);
\r
227 Audio::getInstance()->addOptionsToPanes(1,&options,wop);
\r
230 wop = new WOptionPane();
\r
231 tabbar.addTab(tr("Advanced"), wop);
\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
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
246 Remote::getInstance()->addOptionsToPanes(2,&options,wop);
\r
247 Video::getInstance()->addOptionsToPanes(2,&options,wop);
\r
248 Audio::getInstance()->addOptionsToPanes(2,&options,wop);
\r
253 // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten
\r
256 for(vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;
\r
258 delete[] options2keys;
\r
261 int VOpts::handleCommand(int command)
\r
263 // either is active, handle back
\r
264 if (command == Remote::BACK)
\r
271 int retval = tabbar.handleCommand(command);
\r
274 BoxStack::getInstance()->update(this);
\r
277 else if (retval == 2)
\r
279 // command was taken and actively ignored
\r
289 void VOpts::doSave()
\r
291 VDR* vdr = VDR::getInstance();
\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
300 // Damn, and the dynamic idea was going *so* well...
\r
301 //Whats about a check with typeid operator?
\r
303 wop = (WOptionPane*)panes[0];
\r
305 wop = (WOptionPane*)panes[1];
\r
307 wop = (WOptionPane*)panes[2];
\r
311 for (UINT i = 0; i < options.size(); i++)
\r
313 if (options[i]->configChoice == options[i]->userSetChoice) continue; // no change
\r
315 Log::getInstance()->log("Options", Log::DEBUG, "Option %i has changed", i);
\r
319 if (options[i]->optionType == Option::TYPE_TEXT)
\r
321 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->options[options[i]->userSetChoice]);
\r
323 else if (options[i]->optionType == Option::TYPE_KEYED_TEXT)
\r
325 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->optionkeys[options[i]->userSetChoice]);
\r
330 sprintf(buffer, "%i", options[i]->userSetChoice);
\r
331 vdr->configSave(options[i]->configSection, options[i]->configKey, buffer);
\r
335 if (options[i]->opthandler == NULL) //Ok, noone else is handling this, we are doing it
\r
337 switch(options[i]->id)
\r
341 #ifdef MVP_REMOTE_TYPES
\r
342 if (options[i]->userSetChoice == 1)
\r
344 Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");
\r
345 Remote::getInstance()->setRemoteType(Remote::NEWREMOTE);
\r
349 Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");
\r
350 Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);
\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
365 if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "RGB+composite")==0)
\r
367 Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");
\r
368 Video::getInstance()->setConnection(Video::COMPOSITERGB);
\r
370 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "S-Video")==0)
\r
372 Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");
\r
373 Video::getInstance()->setConnection(Video::SVIDEO);
\r
375 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI")==0)
\r
377 Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");
\r
378 Video::getInstance()->setConnection(Video::HDMI);
\r
380 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI3D")==0)
\r
382 Log::getInstance()->log("Options", Log::DEBUG, "Setting HDMI");
\r
383 Video::getInstance()->setConnection(Video::HDMI3D);
\r
389 if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "16:9")==0)
\r
391 Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");
\r
392 Video::getInstance()->setTVsize(Video::ASPECT16X9);
\r
394 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "4:3")==0)
\r
396 Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");
\r
397 Video::getInstance()->setTVsize(Video::ASPECT4X3);
\r
399 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "14:9")==0)
\r
401 Log::getInstance()->log("Options", Log::DEBUG, "Setting 14:9 TV");
\r
402 Video::getInstance()->setTVsize(Video::ASPECT14X9);
\r
408 if (options[i]->userSetChoice == 1)
\r
410 Log::getInstance()->log("Options", Log::DEBUG, "Setting letterbox");
\r
411 Video::getInstance()->setMode(Video::LETTERBOX);
\r
415 Log::getInstance()->log("Options", Log::DEBUG, "Setting chop-sides");
\r
416 Video::getInstance()->setMode(Video::NORMAL);
\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
438 options[i]->opthandler->handleOptionChanges(options[i]);
\r
443 void VOpts::processMessage(Message* m)
\r
445 if (m->message == Message::MOUSE_MOVE)
\r
447 int x=(m->parameter>>16)-getScreenX();
\r
448 int y=(m->parameter&0xFFFF)-getScreenY();
\r
449 if (tabbar.mouseMove(x,y))
\r
451 BoxStack::getInstance()->update(this);
\r
455 else if (m->message == Message::MOUSE_LBDOWN)
\r
457 int x=(m->parameter>>16)-getScreenX();
\r
458 int y=(m->parameter&0xFFFF)-getScreenY();
\r
459 if (tabbar.mouseLBDOWN(x,y))
\r
461 BoxStack::getInstance()->update(this);
\r
463 else if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
\r
465 BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
\r