]> git.vomp.tv Git - vompclient.git/blob - woptionpane.cc
*** empty log message ***
[vompclient.git] / woptionpane.cc
1 /*
2     Copyright 2007 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "woptionpane.h"
22 #include "wtextbox.h"
23 #include "i18n.h"
24 #include "woptionbox.h"
25 #include "log.h"
26 #include "vdr.h"
27 #include "remote.h"
28 #include "option.h"
29
30 WOptionPane::WOptionPane()
31 {
32   numOptions = 0;
33   selectedOption = -1;
34 }
35
36 WOptionPane::~WOptionPane()
37 {
38   for(int i = 0; i < numOptions; i++)
39   {
40     delete textBoxes[i];
41     delete optionBoxes[i];
42   }
43 }
44
45 void WOptionPane::draw()
46 {
47   Boxx::draw();
48   drawText(tr("Press back to exit, <, > or [ok] to change"), 10, area.h - 30, Colour::LIGHTTEXT);
49 }
50
51 void WOptionPane::saveOpts()
52 {
53   // Due to the way the pane is constructed, options[0] corresponds to textBoxes[0] and optionBoxes[0] etc
54   
55   for(int i = 0; i < numOptions; i++)
56   {
57     options[i]->userSetChoice = optionBoxes[i]->getSelectedIndex();
58   }
59 }
60
61 void WOptionPane::addOptionLine(Option* option)
62 {
63   int fontHeight = surface->getFontHeight();
64
65   options.resize(numOptions+1);
66   options[numOptions] = option;
67   
68   WTextbox* tb = new WTextbox();
69   tb->setPosition(4, 4 + (numOptions * 30));
70   tb->setSize(300, fontHeight);
71   tb->setText(tr(option->displayText));
72   tb->setTextPos(0, 0);
73   add(tb);
74   
75   textBoxes.resize(numOptions+1);
76   textBoxes[numOptions] = tb;
77
78   WOptionBox* ob = new WOptionBox();
79   ob->setPosition(310, 4 + (numOptions * 30));
80   ob->setSize(190, fontHeight);  
81   add(ob);
82   
83   optionBoxes.resize(numOptions+1);
84   optionBoxes[numOptions] = ob;
85   
86   if (option->optionType == Option::TYPE_TEXT ||
87       option->optionType == Option::TYPE_KEYED_TEXT)
88   {
89     for (UINT j = 0; j < option->numChoices; j++)
90     {
91       Log::getInstance()->log("Options", Log::DEBUG, "Add option: %s", option->options[j]);
92       ob->addOption(tr(option->options[j]));
93     }
94
95     // Set the selected choice
96     ob->setSelected(tr(option->options[option->configChoice]));
97   }
98   else
99   {
100     // int mode
101     ob->setIntMode(option->startInt, option->numChoices);
102     ob->setSelected(option->configChoice);
103   }
104
105   numOptions++;
106   
107 }
108
109 void WOptionPane::deactivateAllControls()
110 {
111     if (selectedOption >= 0) {
112         optionBoxes[selectedOption]->setActive(0);
113         selectedOption = -1;
114     }
115 }
116
117
118 int WOptionPane::handleCommand(int command)
119 {
120   switch(command)
121   {
122     case Remote::DF_UP:
123     case Remote::UP:
124     {
125       if (selectedOption > 0)
126       {
127         optionBoxes[selectedOption]->setActive(0);
128         --selectedOption;
129         optionBoxes[selectedOption]->setActive(1);
130         return 1;
131       }
132       else
133       {
134         optionBoxes[selectedOption--]->setActive(0);
135         return 4; // Signal return control to parent
136       }
137     }
138     case Remote::DF_DOWN:
139     case Remote::DOWN:
140     {
141       if (selectedOption < (numOptions - 1))
142       {
143         if (selectedOption != -1) optionBoxes[selectedOption]->setActive(0);
144         ++selectedOption;
145         optionBoxes[selectedOption]->setActive(1);
146         return 1;
147       }
148       else if (selectedOption == (numOptions - 1))
149       {
150         optionBoxes[selectedOption]->setActive(0);
151         selectedOption = -1;
152         return 4; // Signal return control to parent
153       }
154     }
155     case Remote::DF_LEFT:
156     case Remote::LEFT:
157     {
158       optionBoxes[selectedOption]->left();
159       return 1;
160     }
161     case Remote::DF_RIGHT:
162     case Remote::RIGHT:
163     {
164       optionBoxes[selectedOption]->right();
165       return 1;
166     }
167     case Remote::OK:
168     {
169       optionBoxes[selectedOption]->cycle();
170       return 1;
171     }
172   }
173
174   return 0;
175 }
176
177 bool WOptionPane::mouseMove(int x, int y)
178 {
179     UINT i;
180     for (i=0;i<optionBoxes.size();i++) {
181         if (optionBoxes[i]->mouseMove(x,y)) {
182             if ( selectedOption!=(int)i) {
183                 if (selectedOption != -1 ) optionBoxes[selectedOption]->setActive(0);
184                 selectedOption=i;
185                 return true;
186             } else {
187                 return false;
188             }
189         }
190     }
191
192     return false;
193 }
194
195 bool WOptionPane::mouseLBDOWN(int x, int y)
196 {
197     UINT i;
198     for (i=0;i<optionBoxes.size();i++) {
199         if (optionBoxes[i]->mouseLBDOWN(x,y)) {
200             if ( selectedOption==(int)i) {
201                 optionBoxes[selectedOption]->cycle();
202                 return true;
203             } else {
204                 return false;
205             }
206         }
207     }
208     return false;
209 }
210
211
212
213