]> git.vomp.tv Git - vompclient.git/blob - voptionsmenu.cc
Fix line endings
[vompclient.git] / voptionsmenu.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
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.
10
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.
15
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "voptionsmenu.h"
22
23 VOptionsMenu::VOptionsMenu()
24 {
25   viewman = ViewMan::getInstance();
26
27   create(460, 200);
28   if (Video::getInstance()->getFormat() == Video::PAL)
29   {
30     setScreenPos(140, 170);
31   }
32   else
33   {
34     setScreenPos(130, 140);
35   }
36
37   setBackgroundColour(Colour::VIEWBACKGROUND);
38   setTitleBarOn(1);
39   setTitleBarColour(Colour::TITLEBARBACKGROUND);
40   setTitleText(tr("Options"));
41
42   int fontHeight = surface->getFontHeight();
43
44   // Build gui
45   WButton* wb;
46
47   wb = new WButton();
48   wb->setText(tr("General"));
49   wb->setSurface(surface);
50   wb->setSurfaceOffset(160, 60);
51   wb->setDimensions(140, fontHeight);
52   wb->setTag(1);
53   buttons.push_back(wb);
54
55   wb = new WButton();
56   wb->setText(tr("Timers"));
57   wb->setSurface(surface);
58   wb->setSurfaceOffset(160, 100);
59   wb->setDimensions(140, fontHeight);
60   wb->setTag(2);
61   buttons.push_back(wb);
62
63   wb = new WButton();
64   wb->setText(tr("Advanced"));
65   wb->setSurface(surface);
66   wb->setSurfaceOffset(160, 140);
67   wb->setDimensions(140, fontHeight);
68   wb->setTag(3);
69   buttons.push_back(wb);
70
71
72   selectedButton = buttons.begin();
73   (*selectedButton)->setActive(1);
74 }
75
76 VOptionsMenu::~VOptionsMenu()
77 {
78   while (!buttons.empty())
79   {
80     delete buttons.back();
81     buttons.pop_back();
82   }
83 }
84
85 void VOptionsMenu::draw()
86 {
87   View::draw();
88
89   vector<WButton*>::iterator i;
90   for(i = buttons.begin(); i != buttons.end(); i++)
91   {
92     (*i)->draw();
93   }
94 }
95
96 int VOptionsMenu::handleCommand(int command)
97 {
98   switch(command)
99   {
100     case Remote::DF_UP:
101     case Remote::UP:
102     {
103       if (selectedButton == buttons.begin()) return 2;
104       (*selectedButton)->setActive(0);
105       selectedButton--;
106       (*selectedButton)->setActive(1);
107       draw(); // fixme - just draw buttons
108       viewman->updateView(this);
109       return 2;
110     }
111     case Remote::DF_DOWN:
112     case Remote::DOWN:
113     {
114       if (selectedButton == (buttons.end() - 1)) return 2;
115       (*selectedButton)->setActive(0);
116       selectedButton++;
117       (*selectedButton)->setActive(1);
118       draw(); // fixme - just draw buttons
119       viewman->updateView(this);
120       return 2;
121     }
122     case Remote::BACK:
123     {
124       return 4;
125     }
126     case Remote::OK:
127     {
128       switch((*selectedButton)->getTag())
129       {
130         case 1: doGeneral();   break;
131         case 2: doTimers();    break;
132         case 3: doAdvanced();  break;
133       }
134       return 2;
135     }
136   }
137
138   return 1;
139 }
140
141 void VOptionsMenu::processMessage(Message* m)
142 {
143   if (m->message == Message::MOUSE_MOVE)
144   {
145     int x=(m->parameter>>16)-getScreenX();
146     int y=(m->parameter&0xFFFF)-getScreenY();
147     vector<WButton*>::iterator i;
148     for (i=buttons.begin(); i!=buttons.end();i++)
149     {
150       if ((*i)->mouseMove(x,y))
151       {
152         (*selectedButton)->setActive(0);
153         selectedButton=i;
154         draw();
155         ViewMan::getInstance()->updateView(this);
156         break;
157       }
158     }
159   }
160   else if (m->message == Message::MOUSE_LBDOWN)
161   {
162     int x=(m->parameter>>16)-getScreenX();
163     int y=(m->parameter&0xFFFF)-getScreenY();
164     vector<WButton*>::iterator i;
165     bool butpress=false;
166     for (i=buttons.begin(); i!=buttons.end();i++)
167     {
168       if ((*i)->mouseLBDOWN(x,y))
169       {
170         ViewMan::getInstance()->handleCommand(Remote::OK); //simulate OK press
171         butpress=true;
172         break;
173       }
174     }
175     if (!butpress)
176     {
177       //check if press is outside this view! then simulate cancel
178       if (x<0 || y <0 || x>getWidth() || y>getHeight())
179       {
180         ViewMan::getInstance()->handleCommand(Remote::BACK); //simulate cancel press
181       }
182     }
183   }
184   else if (m->message == Message::CHANGED_OPTIONS)
185   {
186     doApplyChanges((map<int,int>*)m->parameter);
187     //viewman->removeView(this);
188
189     if (!VDR::getInstance()->isConnected()) Command::getInstance()->connectionLost();
190   }
191 }
192
193 void VOptionsMenu::doApplyChanges(map<int,int>* changedOptions)
194 {
195   Video* video = Video::getInstance();
196   map<int,int>::iterator i;
197
198   for(i = changedOptions->begin(); i != changedOptions->end(); i++)
199   {
200 //    printf("I FIRST = %i SECOND = %i\n", i->first, i->second);
201
202     switch(i->first)
203     {
204       case 1:
205       {
206         if (i->second == 1)
207         {
208           Log::getInstance()->log("Options", Log::DEBUG, "Setting New Remote");
209           Remote::getInstance()->setRemoteType(Remote::NEWREMOTE);
210         }
211         else
212         {
213           Log::getInstance()->log("Options", Log::DEBUG, "Setting Old Remote");
214           Remote::getInstance()->setRemoteType(Remote::OLDREMOTE);
215         }
216         break;
217       }
218       case 2:
219       {
220         I18n::initialize();
221         VWelcome::getInstance()->redrawLang();
222         break;
223       }
224       case 3:
225       {
226         if (i->second == 1)
227         {
228           Log::getInstance()->log("Options", Log::DEBUG, "Setting S-Video");
229           video->setConnection(Video::SVIDEO);
230         }
231         else
232         {
233           Log::getInstance()->log("Options", Log::DEBUG, "Setting RGB/Composite");
234           video->setConnection(Video::COMPOSITERGB);
235         }
236         break;
237       }
238       case 4:
239       {
240         if (i->second == 1)
241         {
242           Log::getInstance()->log("Options", Log::DEBUG, "Setting 16:9 TV");
243           video->setTVsize(Video::ASPECT16X9);
244         }
245         else
246         {
247           Log::getInstance()->log("Options", Log::DEBUG, "Setting 4:3 TV");
248           video->setTVsize(Video::ASPECT4X3);
249         }
250         break;
251       }
252       case 5:
253       {
254         if (i->second == 1)
255         {
256           Log::getInstance()->log("Options", Log::DEBUG, "Setting letterbox");
257           video->setMode(Video::LETTERBOX);
258         }
259         else
260         {
261           Log::getInstance()->log("Options", Log::DEBUG, "Setting chop-sides");
262           video->setMode(Video::NORMAL);
263         }
264         break;
265       }
266       case 13:
267       {
268         size_t newTCPsize = 2048;
269
270         if (i->second == 0) newTCPsize = 1024;
271         else if (i->second == 1) newTCPsize = 2048;
272         else if (i->second == 2) newTCPsize = 4096;
273         else if (i->second == 3) newTCPsize = 8192;
274         else if (i->second == 4) newTCPsize = 16384;
275         else if (i->second == 5) newTCPsize = 32768;
276         else if (i->second == 6) newTCPsize = 65536;
277
278         Log::getInstance()->log("Options", Log::DEBUG, "Setting TCP window size %i", newTCPsize);
279         VDR::getInstance()->setReceiveWindow(newTCPsize);
280         break;
281       }
282     }
283   }
284
285   delete changedOptions;
286
287 }
288
289 void VOptionsMenu::doGeneral()
290 {
291   static const int numOptions = 7;
292
293   static const char* options1[] = {"Old", "New"};
294   static const char* options3[] = {"RGB+composite", "S-Video"};
295   static const char* options4[] = {"4:3", "16:9"};
296   static const char* options5[] = {"Chop sides", "Letterbox"};
297   static const char* options6[] = {"On", "Off", "Last state"};
298   static const char* options7[] = {"All", "FTA only"};
299
300   const static OPTIONDATA optionData[numOptions] =
301   {
302     {1, "Remote control type",      "General", "Remote type",      OPTIONTYPE_TEXT, 2, 0, 0, options1 },
303     {2, "Language",                 "General", "Language",         OPTIONTYPE_TEXT, I18n::NumLanguages, 0, 0, I18n::Languages },
304     {3, "TV connection type",       "TV",      "Connection",       OPTIONTYPE_TEXT, 2, 0, 0, options3 },
305     {4, "TV aspect ratio",          "TV",      "Aspect",           OPTIONTYPE_TEXT, 2, 0, 0, options4 },
306     {5, "16:9 on 4:3 display mode", "TV",      "Widemode",         OPTIONTYPE_TEXT, 2, 0, 0, options5 },
307     {6, "Power state after bootup", "General", "Power After Boot", OPTIONTYPE_TEXT, 3, 0, 0, options6 },
308     {7, "Display channels",         "General", "Channels",         OPTIONTYPE_TEXT, 2, 0, 0, options7 },
309   };
310
311   // As all the above data is const static, it can be sent to the new View, this stack frame can
312   // quit and the pointers will all still be valid. I think. (Hope).
313
314   VOptions* v = new VOptions(this, tr("General Options"), optionData, numOptions);
315   v->draw();
316   viewman->add(v);
317   viewman->updateView(v);
318 }
319
320
321 void VOptionsMenu::doTimers()
322 {
323   static const int numOptions = 4;
324
325   const static OPTIONDATA optionData[numOptions] =
326   {
327     {9, "Default start margin (minutes)",  "Timers", "Start margin",  OPTIONTYPE_INT, 20, 5, 0, NULL },
328     {10, "Default end margin (minutes)",   "Timers", "End margin",    OPTIONTYPE_INT, 20, 5, 0, NULL },
329     {11, "Default priority",               "Timers", "Priority",      OPTIONTYPE_INT, 100, 99, 0, NULL },
330     {12, "Default lifetime",               "Timers", "Lifetime",      OPTIONTYPE_INT, 100, 99, 0, NULL },
331   };
332
333   // As all the above data is const static, it can be sent to the new View, this stack frame can
334   // quit and the pointers will all still be valid. I think. (Hope).
335
336   VOptions* v = new VOptions(this, tr("Timer Options"), optionData, numOptions);
337   v->draw();
338   viewman->add(v);
339   viewman->updateView(v);
340 }
341
342 void VOptionsMenu::doAdvanced()
343 {
344   static const int numOptions = 3;
345
346   static const char* options13[] = {"1024", "2048", "4096", "8192", "16384", "32768", "65536"};
347   static const char* options14[] = {"No", "Yes"};
348
349   const static OPTIONDATA optionData[numOptions] =
350   {
351     {8, "VDR-Pri 0=OK !See forums!",  "General",  "Live priority",      OPTIONTYPE_INT,  100, 0, 0, NULL },
352     {13, "TCP receive window size",   "Advanced", "TCP receive window", OPTIONTYPE_TEXT, 7, 1, 0, options13 },
353     {14, "Use WSS (PAL only)",        "General",  "WSS",                OPTIONTYPE_TEXT, 2, 0, 0, options14 }
354   };
355
356   // As all the above data is const static, it can be sent to the new View, this stack frame can
357   // quit and the pointers will all still be valid. I think. (Hope).
358
359   VOptions* v = new VOptions(this, tr("Advanced Options"), optionData, numOptions);
360   v->draw();
361   viewman->add(v);
362   viewman->updateView(v);
363 }