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, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
28 #include "woptionpane.h"
29 #include "wremoteconfig.h"
34 #include "mediaoptions.h"
37 //#include "command.h"
42 setTitleBarColour(Colour::TITLEBARBACKGROUND);
43 setTitleText(tr("Options"));
47 if (Video::getInstance()->getFormat() == Video::PAL)
48 setPosition(100, 110);
52 tabbar.setPosition(6, 32);
53 tabbar.setSize(getWidth() - 12, getHeight() - 34);
59 // --- edit options start here
61 static const char* options1[] = {"Old", "New"};
62 static const char* options3[] = {"RGB+composite", "S-Video"};
63 static const char* options4[] = {"4:3", "16:9"};
64 static const char* options5[] = {"Chop sides", "Letterbox"};
65 static const char* options6[] = {"On", "Off", "Last state"};
66 static const char* options7[] = {"All", "FTA only"};
67 static const char* options15[] = {"Alphabetical", "Chronological"};
69 static const char* options13[] = {"1024", "2048", "4096", "8192", "16384", "32768", "65536"};
70 static const char* options14[] = {"No", "Yes"};
72 // Get list of languages from VDR and construct options table
73 LangCode = VDR::getInstance()->getLanguageList();
74 options2 = new const char*[LangCode.size()];
75 options2keys = new const char*[LangCode.size()];
76 I18n::lang_code_list::const_iterator iter;
78 for (iter = LangCode.begin(); iter != LangCode.end(); ++iter,++LangNumber)
80 options2[LangNumber] = iter->second.c_str();
81 options2keys[LangNumber] = iter->first.c_str();
85 panes = new Boxx*[numPanes];
87 wop = new WOptionPane();
88 tabbar.addTab(tr("General"), wop);
91 option = new Option(1, "Remote control type", "General", "Remote type", Option::TYPE_TEXT, 2, 0, 0, options1);
92 options.push_back(option);
93 wop->addOptionLine(option);
94 option = new Option(2, "Language", "General", "LangCode", Option::TYPE_KEYED_TEXT, LangCode.size(), 0, 0, options2, options2keys);
95 options.push_back(option);
96 wop->addOptionLine(option);
97 option = new Option(3, "TV connection type", "TV", "Connection", Option::TYPE_TEXT, 2, 0, 0, options3);
98 options.push_back(option);
99 wop->addOptionLine(option);
100 option = new Option(4, "TV aspect ratio", "TV", "Aspect", Option::TYPE_TEXT, 2, 0, 0, options4);
101 options.push_back(option);
102 wop->addOptionLine(option);
103 option = new Option(5, "16:9 on 4:3 display mode", "TV", "Widemode", Option::TYPE_TEXT, 2, 0, 0, options5);
104 options.push_back(option);
105 wop->addOptionLine(option);
106 option = new Option(6, "Power state after bootup", "General", "Power After Boot", Option::TYPE_TEXT, 3, 0, 0, options6);
107 options.push_back(option);
108 wop->addOptionLine(option);
109 option = new Option(7, "Display channels", "General", "Channels", Option::TYPE_TEXT, 2, 0, 0, options7);
110 options.push_back(option);
111 wop->addOptionLine(option);
112 option = new Option(15, "Recordings sort order", "General", "Recordings Sort Order", Option::TYPE_TEXT, 2, 0, 0, options15);
113 options.push_back(option);
114 wop->addOptionLine(option);
116 Remote::getInstance()->addOptionsToPanes(0,&options,wop);
117 Video::getInstance()->addOptionsToPanes(0,&options,wop);
118 Audio::getInstance()->addOptionsToPanes(0,&options,wop);
121 /* WRemoteConfig* wrc = new WRemoteConfig();
122 tabbar.addTab(tr("Remote Control"), wrc);*/
123 Remote::getInstance()->addOptionPagesToWTB(&tabbar);
126 Video::getInstance()->addOptionPagesToWTB(&tabbar);
127 Audio::getInstance()->addOptionPagesToWTB(&tabbar);
128 MediaOptions::getInstance()->addOptionPagesToWTB(&tabbar);
131 wop = new WOptionPane();
132 tabbar.addTab(tr("Timers"), wop);
135 option = new Option(9, "Default start margin (minutes)", "Timers", "Start margin", Option::TYPE_INT, 20, 5, 0, NULL);
136 options.push_back(option);
137 wop->addOptionLine(option);
138 option = new Option(10, "Default end margin (minutes)", "Timers", "End margin", Option::TYPE_INT, 20, 5, 0, NULL);
139 options.push_back(option);
140 wop->addOptionLine(option);
141 option = new Option(11, "Default priority", "Timers", "Priority", Option::TYPE_INT, 100, 99, 0, NULL);
142 options.push_back(option);
143 wop->addOptionLine(option);
144 option = new Option(12, "Default lifetime", "Timers", "Lifetime", Option::TYPE_INT, 100, 99, 0, NULL);
145 options.push_back(option);
146 wop->addOptionLine(option);
148 Remote::getInstance()->addOptionsToPanes(1,&options,wop);
149 Video::getInstance()->addOptionsToPanes(1,&options,wop);
150 Audio::getInstance()->addOptionsToPanes(1,&options,wop);
153 wop = new WOptionPane();
154 tabbar.addTab(tr("Advanced"), wop);
157 option = new Option(8, "VDR-Pri 0=OK !See forums!", "General", "Live priority", Option::TYPE_INT, 100, 0, 0, NULL);
158 options.push_back(option);
159 wop->addOptionLine(option);
160 option = new Option(13, "TCP receive window size", "Advanced", "TCP receive window", Option::TYPE_TEXT, 7, 1, 0, options13);
161 options.push_back(option);
162 wop->addOptionLine(option);
163 option = new Option(14, "Use WSS (PAL only)", "General", "WSS", Option::TYPE_TEXT, 2, 0, 0, options14);
164 options.push_back(option);
165 wop->addOptionLine(option);
167 Remote::getInstance()->addOptionsToPanes(2,&options,wop);
168 Video::getInstance()->addOptionsToPanes(2,&options,wop);
169 Audio::getInstance()->addOptionsToPanes(2,&options,wop);
174 // for (int i = 0; i < numPanes; i++) delete panes[i]; //Move to TabBar, Marten
177 for(vector<Option*>::iterator j = options.begin(); j != options.end(); j++) delete *j;
179 delete[] options2keys;
182 int VOpts::handleCommand(int command)
184 // either is active, handle back
185 if (command == Remote::BACK)
192 int retval = tabbar.handleCommand(command);
195 BoxStack::getInstance()->update(this);
198 else if (retval == 2)
200 // command was taken and actively ignored
212 VDR* vdr = VDR::getInstance();
214 Remote::getInstance()->saveOptionstoServer(); //Remote
215 Video::getInstance()->saveOptionstoServer(); //Video
216 Audio::getInstance()->saveOptionstoServer(); //Remote
217 MediaOptions::getInstance()->saveOptionstoServer(); //Media
219 // Damn, and the dynamic idea was going *so* well...
220 //Whats about a check with typeid operator?
222 wop = (WOptionPane*)panes[0];
224 wop = (WOptionPane*)panes[1];
226 wop = (WOptionPane*)panes[2];
230 for (UINT i = 0; i < options.size(); i++)
232 if (options[i]->configChoice == options[i]->userSetChoice) continue; // no change
234 Log::getInstance()->log("Options", Log::DEBUG, "Option %i has changed", i);
238 if (options[i]->optionType == Option::TYPE_TEXT)
240 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->options[options[i]->userSetChoice]);
242 else if (options[i]->optionType == Option::TYPE_KEYED_TEXT)
244 vdr->configSave(options[i]->configSection, options[i]->configKey, options[i]->optionkeys[options[i]->userSetChoice]);
249 sprintf(buffer, "%i", options[i]->userSetChoice);
250 vdr->configSave(options[i]->configSection, options[i]->configKey, buffer);
254 if (options[i]->opthandler == NULL) //Ok, noone else is handling this, we are doing it
256 switch(options[i]->id)
260 if (options[i]->userSetChoice == 1)
262 Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");
263 Remote::getInstance()->setRemoteType(Remote::NEWREMOTE);
267 Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");
268 Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);
274 Message* m = new Message();
275 m->message = Message::CHANGE_LANGUAGE;
276 m->to = Command::getInstance();
277 Command::getInstance()->postMessageNoLock(m);
282 if (options[i]->userSetChoice == 1)
284 Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");
285 Video::getInstance()->setConnection(Video::SVIDEO);
289 Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");
290 Video::getInstance()->setConnection(Video::COMPOSITERGB);
296 if (options[i]->userSetChoice == 1)
298 Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");
299 Video::getInstance()->setTVsize(Video::ASPECT16X9);
303 Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");
304 Video::getInstance()->setTVsize(Video::ASPECT4X3);
310 if (options[i]->userSetChoice == 1)
312 Log::getInstance()->log("Options", Log::DEBUG, "Setting letterbox");
313 Video::getInstance()->setMode(Video::LETTERBOX);
317 Log::getInstance()->log("Options", Log::DEBUG, "Setting chop-sides");
318 Video::getInstance()->setMode(Video::NORMAL);
324 size_t newTCPsize = 2048;
325 if (options[i]->userSetChoice == 0) newTCPsize = 1024;
326 else if (options[i]->userSetChoice == 1) newTCPsize = 2048;
327 else if (options[i]->userSetChoice == 2) newTCPsize = 4096;
328 else if (options[i]->userSetChoice == 3) newTCPsize = 8192;
329 else if (options[i]->userSetChoice == 4) newTCPsize = 16384;
330 else if (options[i]->userSetChoice == 5) newTCPsize = 32768;
331 else if (options[i]->userSetChoice == 6) newTCPsize = 65536;
332 Log::getInstance()->log("Options", Log::DEBUG, "Setting TCP window size %i", newTCPsize);
333 VDR::getInstance()->setReceiveWindow(newTCPsize);
340 options[i]->opthandler->handleOptionChanges(options[i]);
345 void VOpts::processMessage(Message* m)
347 if (m->message == Message::MOUSE_MOVE)
349 int x=(m->parameter>>16)-getScreenX();
350 int y=(m->parameter&0xFFFF)-getScreenY();
351 if (tabbar.mouseMove(x,y))
353 BoxStack::getInstance()->update(this);
357 else if (m->message == Message::MOUSE_LBDOWN)
359 int x=(m->parameter>>16)-getScreenX();
360 int y=(m->parameter&0xFFFF)-getScreenY();
361 if (tabbar.mouseLBDOWN(x,y))
363 BoxStack::getInstance()->update(this);
365 else if (x<0 || y <0 || x>(int)getWidth() || y>(int)getHeight())
367 BoxStack::getInstance()->handleCommand(Remote::BACK); //simulate cancel press