2 Copyright 2007 Chris Tallon
4 This file is part of VOMP.
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.
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.
16 You should have received a copy of the GNU General Public License
17 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
28 #include "woptionpane.h"
29 #include "wremoteconfig.h"
33 #include "messagequeue.h"
36 #include "staticartwork.h"
37 #include "imageloader.h"
39 #ifdef VOMP_PLATTFORM_MVP
40 #include "mediaoptions.h"
45 static const char* TAG = "VOpts";
50 setTitleBarColour(DrawStyle::TITLEBARBACKGROUND);
51 setTitleText(tr("Options"));
52 Image icon = ImageLoader::getInstance()->createStatic(sa_properties);
53 setTitleBarIcon(icon);
57 if (Video::getInstance()->getFormat() == Video::PAL)
58 setPosition(100, 110);
62 tabbar.setPosition(6, 32);
63 tabbar.setSize(getWidth() - 12, getHeight() - 34);
69 // --- edit options start here
70 static const char* options5[] = {"Chop sides", "Letterbox"};
71 static const char* options6[] = {"On", "Off", "Last state"};
72 static const char* options7[] = {"All", "FTA only"};
73 static const char* options15[] = {"Alphabetical", "Chronological"};
75 static const char* options13[] = {"Auto","1024", "2048", "4096", "8192", "16384", "32768", "65536"};
77 static const char* options18[] = {"Off", "On"};
78 #ifdef ADVANCED_MENUES
79 static const char* options19[] = { "Advanced","Classic"};
81 // Get list of languages from VDR and construct options table
82 LangCode = VDR::getInstance()->getLanguageList();
83 options2 = new const char*[LangCode.size()];
84 options2keys = new const char*[LangCode.size()];
85 I18n::lang_code_list::const_iterator iter;
87 for (iter = LangCode.begin(); iter != LangCode.end(); ++iter,++LangNumber)
89 options2[LangNumber] = iter->second.c_str();
90 options2keys[LangNumber] = iter->first.c_str();
94 panes = new Boxx*[numPanes];
96 wop = new WOptionPane();
97 tabbar.addTab(tr("General"), wop);
99 option = new Option(2, "Language", "General", "LangCode", Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);
100 options.push_back(option);
101 wop->addOptionLine(option);
103 u4 suppconn = Video::getInstance()->getSupportedFormats();
106 if (suppconn & Video::COMPOSITERGB) {
108 options3.push_back("RGB+composite");
109 options3keys.push_back("RGB+composite");
111 if (Video::SVIDEO & suppconn) {
112 options3.push_back("S-Video");
113 options3keys.push_back("S-Video");
115 if (Video::HDMI & suppconn) {
116 defaultch = options3.size();
117 options3.push_back("HDMI");
118 options3keys.push_back("HDMI");
120 if (Video::HDMI3D & suppconn) {
121 options3.push_back("HDMI3D");
122 options3keys.push_back("HDMI3D");
124 option = new Option(3, "TV connection type", "TV", "Connection",
125 Option::TYPE_KEYED_TEXT, options3.size(), defaultch, 0,
126 &(options3[0]), &(options3keys[0]));
128 options.push_back(option);
129 wop->addOptionLine(option);
132 u4 suppformats = Video::getInstance()->supportedTVFormats();
135 options16.push_back("NTSC");
136 options16keys.push_back("NTSC");
137 if (suppformats & Video::PAL) {
139 options16.push_back("PAL");
140 options16keys.push_back("PAL");
142 if (Video::NTSC_J & suppformats) {
143 options16.push_back("NTSC-J");
144 options16keys.push_back("NTSC-J");
146 if (Video::PAL_M & suppformats) {
147 options16.push_back("PAL-M");
148 options16keys.push_back("PAL-M");
151 option = new Option(16, "TV standard (needs restart)", "General", "Override Video Format",
152 Option::TYPE_KEYED_TEXT, options16.size(), defaultch, 0,
153 &(options16[0]), &(options16keys[0]));
155 options.push_back(option);
156 wop->addOptionLine(option);
159 u4 supptvsize=Video::getInstance()->supportedTVsize();
162 options4.push_back("4:3");
163 options4keys.push_back("4:3");
164 if (Video::ASPECT16X9 & supptvsize) {
165 options4.push_back("16:9");
166 options4keys.push_back("16:9");
169 if (Video::ASPECT14X9 & supptvsize) {
170 options4.push_back("14:9");
171 options4keys.push_back("14:9");
173 option = new Option(4, "TV aspect ratio", "TV", "Aspect",
174 Option::TYPE_KEYED_TEXT, options4.size(), defaultch, 0,
175 &(options4[0]), &(options4keys[0]));
176 options.push_back(option);
177 wop->addOptionLine(option);
180 option = new Option(5, "16:9 on 4:3 display mode", "TV", "Widemode", Option::TYPE_TEXT, 2, 0, 0, options5);
181 options.push_back(option);
182 wop->addOptionLine(option);
183 option = new Option(6, "Power state after bootup", "General", "Power After Boot", Option::TYPE_TEXT, 3, 0, 0, options6);
184 options.push_back(option);
185 wop->addOptionLine(option);
186 option = new Option(7, "Display channels", "General", "Channels", Option::TYPE_TEXT, 2, 0, 0, options7);
187 options.push_back(option);
188 wop->addOptionLine(option);
189 option = new Option(15, "Recordings sort order", "General", "Recordings Sort Order", Option::TYPE_TEXT, 2, 0, 0, options15);
190 options.push_back(option);
191 wop->addOptionLine(option);
192 option = new Option(18, "Automatic VDR shutdown", "General", "VDR shutdown", Option::TYPE_TEXT, 2, 0, 0, options18);
193 options.push_back(option);
194 wop->addOptionLine(option);
196 InputMan::getInstance()->addOptionsToPanes(0,&options,wop);
197 Video::getInstance()->addOptionsToPanes(0,&options,wop);
198 Audio::getInstance()->addOptionsToPanes(0,&options,wop);
201 /* WRemoteConfig* wrc = new WRemoteConfig();
202 tabbar.addTab(tr("Remote Control"), wrc);*/
203 InputMan::getInstance()->addOptionPagesToWTB(&tabbar);
206 Video::getInstance()->addOptionPagesToWTB(&tabbar);
207 Audio::getInstance()->addOptionPagesToWTB(&tabbar);
208 #ifdef VOMP_PLATTFORM_MVP
209 MediaOptions::getInstance()->addOptionPagesToWTB(&tabbar);
213 wop = new WOptionPane();
214 tabbar.addTab(tr("Timers"), wop);
217 option = new Option(9, "Default start margin (minutes)", "Timers", "Start margin", Option::TYPE_INT, 20, 5, 0, NULL);
218 options.push_back(option);
219 wop->addOptionLine(option);
220 option = new Option(10, "Default end margin (minutes)", "Timers", "End margin", Option::TYPE_INT, 20, 5, 0, NULL);
221 options.push_back(option);
222 wop->addOptionLine(option);
223 option = new Option(11, "Default priority", "Timers", "Priority", Option::TYPE_INT, 100, 99, 0, NULL);
224 options.push_back(option);
225 wop->addOptionLine(option);
226 option = new Option(12, "Default lifetime", "Timers", "Lifetime", Option::TYPE_INT, 100, 99, 0, NULL);
227 options.push_back(option);
228 wop->addOptionLine(option);
230 InputMan::getInstance()->addOptionsToPanes(1,&options,wop);
231 Video::getInstance()->addOptionsToPanes(1,&options,wop);
232 Audio::getInstance()->addOptionsToPanes(1,&options,wop);
235 wop = new WOptionPane();
236 tabbar.addTab(tr("Advanced"), wop);
239 option = new Option(8, "VDR-Pri 0=OK !See forums!", "General", "Live priority", Option::TYPE_INT, 199, -1, -99, NULL);
240 options.push_back(option);
241 wop->addOptionLine(option);
242 option = new Option(13, "TCP receive window size", "Advanced", "TCP receive window", Option::TYPE_TEXT, 8, /*1*/DEFAULT_TCP_WINDOWSIZENR, 0, options13);
243 options.push_back(option);
244 wop->addOptionLine(option);
245 const char * * fontnames;
246 const char * * fontnames_keys;
247 int numfonts=Osd::getInstance()->getFontNames(&fontnames,&fontnames_keys);
249 option = new Option(17, "Font Name", "Advanced", "Font Name", Option::TYPE_KEYED_TEXT, numfonts, 1, 0, fontnames,fontnames_keys);
250 options.push_back(option);
251 wop->addOptionLine(option);
254 int numskins=SkinFactory::getNumberofSkins();
256 option = new Option(20, "Skin Name (needs restart)", "Advanced", "Skin Name", Option::TYPE_KEYED_TEXT, numskins, 0, 0,
257 SkinFactory::getSkinNames(),SkinFactory::getSkinNames());
258 options.push_back(option);
259 wop->addOptionLine(option);
262 #ifdef ADVANCED_MENUES
263 option = new Option(19, "Advanced Menu", "Advanced", "Menu type",Option::TYPE_TEXT, 2, 0, 0, options19);
264 options.push_back(option);
265 wop->addOptionLine(option);
268 InputMan::getInstance()->addOptionsToPanes(2,&options,wop);
269 Video::getInstance()->addOptionsToPanes(2,&options,wop);
270 Audio::getInstance()->addOptionsToPanes(2,&options,wop);
272 MessageQueue::getInstance()->addReceiver(this);
277 MessageQueue::getInstance()->removeReceiver(this);
279 // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten
282 for(std::vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;
284 delete[] options2keys;
287 int VOpts::handleCommand(int command)
289 // either is active, handle back
290 if (command == Input::BACK)
293 return BoxStack::DELETE_ME;
297 int retval = tabbar.handleCommand(command);
300 BoxStack::getInstance()->update(this);
301 return BoxStack::COMMAND_HANDLED;
303 else if (retval == 2)
305 // command was taken and actively ignored
306 return BoxStack::COMMAND_HANDLED;
310 return BoxStack::ABANDON_COMMAND;
317 VDR* vdr = VDR::getInstance();
319 InputMan::getInstance()->saveOptionstoServer(); //Remote
320 Video::getInstance()->saveOptionstoServer(); //Video
321 Audio::getInstance()->saveOptionstoServer(); //Remote
322 #ifdef VOMP_PLATTFORM_MVP
323 MediaOptions::getInstance()->saveOptionstoServer(); //Media
326 // Damn, and the dynamic idea was going *so* well...
327 //Whats about a check with typeid operator?
329 wop = static_cast<WOptionPane*>(panes[0]);
331 wop = static_cast<WOptionPane*>(panes[1]);
333 wop = static_cast<WOptionPane*>(panes[2]);
337 for (u4 i = 0; i < options.size(); i++)
339 if (options[i]->configChoice == options[i]->userSetChoice) continue; // no change
341 LogNT::getInstance()->debug(TAG, "Option {} has changed", i);
345 if (options[i]->optionType == Option::TYPE_TEXT)
347 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->options[options[i]->userSetChoice]);
349 else if (options[i]->optionType == Option::TYPE_KEYED_TEXT)
351 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->optionkeys[options[i]->userSetChoice]);
356 sprintf(buffer, "%i", options[i]->userSetChoice);
357 vdr->configSave(options[i]->configSection, options[i]->configKey, buffer);
361 if (options[i]->opthandler == NULL) //Ok, noone else is handling this, we are doing it
363 switch(options[i]->id)
371 Message* m = new Message();
372 m->message = Message::CHANGE_LANGUAGE;
373 m->p_to = Message::CONTROL;
374 MessageQueue::getInstance()->postMessage(m);
379 if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "RGB+composite")==0)
381 LogNT::getInstance()->debug(TAG, "Setting RGB/Composite");
382 Video::getInstance()->setConnection(Video::COMPOSITERGB);
384 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "S-Video")==0)
386 LogNT::getInstance()->debug(TAG, "Setting S-Video");
387 Video::getInstance()->setConnection(Video::SVIDEO);
389 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI")==0)
391 LogNT::getInstance()->debug(TAG, "Setting HDMI");
392 Video::getInstance()->setConnection(Video::HDMI);
394 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "HDMI3D")==0)
396 LogNT::getInstance()->debug(TAG, "Setting HDMI");
397 Video::getInstance()->setConnection(Video::HDMI3D);
403 if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "16:9")==0)
405 LogNT::getInstance()->debug(TAG, "Setting 16:9 TV");
406 Video::getInstance()->setTVsize(Video::ASPECT16X9);
408 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "4:3")==0)
410 LogNT::getInstance()->debug(TAG, "Setting 4:3 TV");
411 Video::getInstance()->setTVsize(Video::ASPECT4X3);
413 else if (STRCASECMP(options[i]->optionkeys[options[i]->userSetChoice], "14:9")==0)
415 LogNT::getInstance()->debug(TAG, "Setting 14:9 TV");
416 Video::getInstance()->setTVsize(Video::ASPECT14X9);
422 if (options[i]->userSetChoice == 1)
424 LogNT::getInstance()->debug(TAG, "Setting letterbox");
425 Video::getInstance()->setMode(Video::LETTERBOX);
429 LogNT::getInstance()->debug(TAG, "Setting chop-sides");
430 Video::getInstance()->setMode(Video::NORMAL);
436 size_t newTCPsize = 2048;
437 if (options[i]->userSetChoice == 0) newTCPsize = 0; //zero means auto
438 else if (options[i]->userSetChoice == 1) newTCPsize = 1024;
439 else if (options[i]->userSetChoice == 2) newTCPsize = 2048;
440 else if (options[i]->userSetChoice == 3) newTCPsize = 4096;
441 else if (options[i]->userSetChoice == 4) newTCPsize = 8192;
442 else if (options[i]->userSetChoice == 5) newTCPsize = 16384;
443 else if (options[i]->userSetChoice == 6) newTCPsize = 32768;
444 else if (options[i]->userSetChoice == 7) newTCPsize = 65536;
445 LogNT::getInstance()->debug(TAG, "Setting TCP window size {}", newTCPsize);
446 VDR::getInstance()->setReceiveWindow(newTCPsize);
451 Osd::getInstance()->setFont(options[i]->optionkeys[options[i]->userSetChoice]);
456 if (options[i]->userSetChoice == 1)
458 LogNT::getInstance()->debug(TAG, "Setting automatic vdr shutdown");
459 VDR::getInstance()->setVDRShutdown(true);
463 LogNT::getInstance()->debug(TAG, "Setting local shutdown");
464 VDR::getInstance()->setVDRShutdown(false);
470 if (options[i]->userSetChoice == 1)
472 LogNT::getInstance()->debug(TAG, "Setting classic menu");
473 Control::getInstance()->setAdvMenus(false);
477 LogNT::getInstance()->debug(TAG, "Setting advanced menu");
478 Control::getInstance()->setAdvMenus(true);
484 SkinFactory::InitSkin(options[i]->userSetChoice);
485 LogNT::getInstance()->debug(TAG, "Init Skin {}", options[i]->userSetChoice);
492 options[i]->opthandler->handleOptionChanges(options[i]);
497 void VOpts::processMessage(Message* m)
499 if (m->message == Message::MOUSE_MOVE)
501 int x = m->parameter - getScreenX();
502 int y = m->tag - getScreenY();
503 if (tabbar.mouseMove(x, y)) BoxStack::getInstance()->update(this);
505 else if (m->message == Message::MOUSE_LBDOWN)
507 int x = m->parameter - getScreenX();
508 int y = m->tag - getScreenY();
509 if (tabbar.mouseLBDOWN(x, y))
511 BoxStack::getInstance()->update(this);
513 else if (coordsOutsideBox(m))
515 Input::sendInputKey(Input::BACK);