1/*
2 Copyright (C) 1998-2001 Andreas Zehender <az@azweb.de>
3
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16*/
17
18#include "dialogs.h"
19
20#include <QGridLayout>
21#include <QLCDNumber>
22#include <QSlider>
23
24#include <kcombobox.h>
25#include <klocale.h>
26#include <ktabwidget.h>
27
28#include "options.h"
29#include "ui_general.h"
30
31class General : public QWidget, public Ui::General
32{
33public:
34 General(QWidget* parent=0)
35 : QWidget(parent)
36 {
37 setupUi(this);
38 }
39};
40
41bool operator!=(const SConfig &s1, const SConfig &s2)
42{
43 return
44(s1.gamespeed != s2.gamespeed) ||
45(s1.gravity != s2.gravity) ||
46(s1.acc != s2.acc) ||
47(s1.energyNeed != s2.energyNeed) ||
48(s1.sunEnergy != s2.sunEnergy) ||
49(s1.rotationSpeed != s2.rotationSpeed) ||
50(s1.mineActivateTime != s2.mineActivateTime) ||
51(s1.mineFuel != s2.mineFuel) ||
52(s1.shotSpeed != s2.shotSpeed) ||
53(s1.shotEnergyNeed != s2.shotEnergyNeed) ||
54(s1.mineEnergyNeed != s2.mineEnergyNeed) ||
55(s1.rotationEnergyNeed != s2.rotationEnergyNeed) ||
56(s1.startPosX != s2.startPosX) ||
57(s1.startPosY != s2.startPosY) ||
58(s1.startVelX != s2.startVelX) ||
59(s1.startVelY != s2.startVelY) ||
60(s1.bulletLifeTime != s2.bulletLifeTime) ||
61(s1.mineReloadTime != s2.mineReloadTime) ||
62(s1.bulletReloadTime != s2.bulletReloadTime) ||
63(s1.bulletDamage != s2.bulletDamage) ||
64(s1.shipDamage != s2.shipDamage) ||
65(s1.mineDamage != s2.mineDamage) ||
66(s1.maxBullets != s2.maxBullets) ||
67(s1.maxMines != s2.maxMines) ||
68(s1.powerupLifeTime != s2.powerupLifeTime) ||
69(s1.powerupRefreshTime != s2.powerupRefreshTime) ||
70(s1.powerupEnergyAmount != s2.powerupEnergyAmount) ||
71(s1.powerupShieldAmount != s2.powerupShieldAmount);
72}
73
74
75char ConfigSetup::LabelName[EditNum][25]=
76{
77 I18N_NOOP("Game speed:"), I18N_NOOP("Shot speed:"),
78 I18N_NOOP("Energy need:"), I18N_NOOP("Max number:"),
79 I18N_NOOP("Damage:"), I18N_NOOP("Life time:"),
80 I18N_NOOP("Reload time:"), I18N_NOOP("Mine fuel:"),
81 I18N_NOOP("Energy need:"), I18N_NOOP("Activate time:"),
82 I18N_NOOP("Damage:"), I18N_NOOP("Max number:"),
83 I18N_NOOP("Reload time:"), I18N_NOOP("Acceleration:"),
84 I18N_NOOP("Energy need:"), I18N_NOOP("Rotation speed:"),
85 I18N_NOOP("Energy need:"), I18N_NOOP("Crash damage:"),
86 I18N_NOOP("Sun energy:"), I18N_NOOP("Gravity:"),
87 I18N_NOOP("Position X:"), I18N_NOOP("Position Y:"),
88 I18N_NOOP("Velocity X:"), I18N_NOOP("Velocity Y:"),
89 I18N_NOOP("Appearance time:"),I18N_NOOP("Life time:"),
90 I18N_NOOP("Energy amount:"), I18N_NOOP("Shield amount:")
91};
92
93enum ConfigSetup::Type ConfigSetup::VarType[EditNum]=
94{VarFloat,
95 VarFloat,VarFloat,VarInt,VarInt,VarFloat,VarFloat,
96 VarFloat,VarFloat,VarFloat,VarInt,VarInt,VarFloat,
97 VarFloat,VarFloat,VarFloat,
98 VarFloat,VarInt,
99 VarFloat,VarFloat,
100 VarFloat,VarFloat,VarFloat,VarFloat,
101 VarFloat,VarFloat,VarFloat,VarInt};
102
103double ConfigSetup::EditVal[EditNum][3]=
104{{0.2,4.0,1},
105 {0.1,10,3},{0,99,10},{0,10,5},{1,100,20},{50,2000,100},{0,400,10},
106 {5,200,65},{0,99,5},{5,100,15},{1,100,30},{0,10,3},{0,400,10},
107 {0,1.0,0.2},{0,10,1.0},{0.1,4,1},
108 {0,10,0.2},{0,100,50},
109 {1000,30000,9000},{0,10000,2200},
110 {-250,250,-180},{-180,180,-130},{-10,10,3},{-10,10,-1.7},
111 {200,4000,800},{200,4000,400},{0,99,50},{0,99,30}};
112
113int ConfigSetup::EditDiv[EditNum]=
114{100,
115 10,1,1,1,1,10,
116 1,1,10,1,1,10,
117 100,10,10,
118 10,1,
119 1,1,
120 10,10,100,100,
121 1,1,1,1};
122
123int ConfigSetup::Parent[EditNum]=
124{TabGeneral,
125 TabBullet,TabBullet,TabBullet,TabBullet,TabBullet,TabBullet,
126 TabMine,TabMine,TabMine,TabMine,TabMine,TabMine,
127 TabShip,TabShip,TabShip,TabShip,TabShip,
128 TabSun,TabSun,
129 TabStart,TabStart,TabStart,TabStart,
130 TabPowerups,TabPowerups,TabPowerups,TabPowerups};
131
132int ConfigSetup::Position[EditNum]=
133{0,
134 0,1,2,3,4,5,
135 0,1,2,3,4,5,
136 0,1,2,3,4,
137 0,1,
138 0,1,2,3,
139 0,1,2,3};
140
141const int LCDLen=6;
142
143ConfigSetup::ConfigSetup(SConfig *custom,QWidget *parent)
144 :QWidget( parent )
145{
146 QLabel *label[EditNum];
147 QGridLayout *stacklayout[TabNum];
148 QWidget *configWidgets[TabNum];
149 //QGroupBox *box;
150
151 int i;
152
153 resize(500,400);
154 //setCaption(i18n("Game Setup"));
155 //setHelp( "OptionsConfigurations" );
156
157
158 //box=new QGroupBox(i18n("Config"),this);
159 //setMainWidget( box );
160 QVBoxLayout *boxlayout = new QVBoxLayout( this );
161 boxlayout->setMargin(6);
162
163 tabs=new KTabWidget(this);
164 for(i=0;i<TabNum;i++)
165 {
166 configWidgets[i]=new QWidget(tabs);
167 stacklayout[i]=new QGridLayout(configWidgets[i]);
168 stacklayout[i]->setMargin(10);
169 }
170
171 for(i=0;i<EditNum;i++)
172 {
173 label[i]=new QLabel(i18n(LabelName[i]),configWidgets[Parent[i]]);
174 slider[i]=new QSlider(Qt::Horizontal,configWidgets[Parent[i]]);
175 slider[i]->setRange((int)(EditVal[i][0]*EditDiv[i]), (int)(EditVal[i][1]*EditDiv[i]));
176 slider[i]->setPageStep((int)((EditVal[i][1]-EditVal[i][0])/10));
177 slider[i]->setValue((int)(EditVal[i][2]*EditDiv[i]));
178 connect(slider[i],SIGNAL(valueChanged(int)),SLOT(sliderChanged(int)));
179 value[i]=new QLCDNumber(LCDLen,configWidgets[Parent[i]]);
180 value[i]->setFrameStyle(QFrame::NoFrame);
181 }
182
183 configCombo=new KComboBox(this);
184 configCombo->setEditable(false);
185 connect(configCombo,SIGNAL(activated(int)),SLOT(configSelected(int)));
186 for(i=0;i<predefinedConfigNum;i++)
187 configCombo->addItem(i18n(predefinedConfigName[i]));
188 configCombo->addItem(i18nc("custom values","Custom"));
189
190 boxlayout->addSpacing( 2 * 6 );
191 boxlayout->addWidget(configCombo);
192 boxlayout->addWidget(tabs);
193
194 for(i=0;i<EditNum;i++)
195 {
196 stacklayout[Parent[i]]->addWidget(label[i],Position[i],0);
197 stacklayout[Parent[i]]->addWidget(slider[i],Position[i],1);
198 stacklayout[Parent[i]]->addWidget(value[i],Position[i],2);
199 }
200
201 for(i=0;i<TabNum;i++)
202 stacklayout[i]->activate();
203
204 tabs->addTab(configWidgets[0],i18nc("general game settings","General"));
205 tabs->addTab(configWidgets[1],i18n("Bullet"));
206 tabs->addTab(configWidgets[2],i18nc("Name","Mine"));
207 tabs->addTab(configWidgets[3],i18n("Ship"));
208 tabs->addTab(configWidgets[4],i18nc("the star, Sol","Sun"));
209 tabs->addTab(configWidgets[5],i18nc("initial position and velocities of players","Start"));
210 tabs->addTab(configWidgets[6],i18n("Powerups"));
211
212 customConfig=custom;
213
214 updateWidgets();
215}
216
217void ConfigSetup::updateWidgets()
218{
219 config=*customConfig;
220 selectedConfig = -1;
221 configCombo->setCurrentIndex(Options::lastConfig());
222 configSelected(Options::lastConfig());
223}
224
225void ConfigSetup::valueChanged(int ednum,int value)
226{
227 if(selectedConfig==predefinedConfigNum)
228 {
229 switch(ednum)
230 {
231 case EditMaxBullets:config.maxBullets=value;break;
232 case EditBulletDamage:config.bulletDamage=value;break;
233 case EditMaxMines:config.maxMines=value;break;
234 case EditMineDamage:config.mineDamage=value;break;
235 case EditShipDamage:config.shipDamage=value;break;
236 case EditPowerupShieldAmount:config.powerupShieldAmount=value;break;
237 }
238 emit changed();
239 }
240}
241
242void ConfigSetup::valueChanged(int ednum,double value)
243{
244 if(selectedConfig==predefinedConfigNum)
245 {
246 switch(ednum)
247 {
248 case EditSunEnergy:config.sunEnergy=value;break;
249 case EditGravity:config.gravity=value;break;
250 case EditShotSpeed:config.shotSpeed=value;break;
251 case EditShotEnergyNeed:config.shotEnergyNeed=value;break;
252 case EditBulletLifeTime:config.bulletLifeTime=value;break;
253 case EditBulletReloadTime:config.bulletReloadTime=value;break;
254 case EditMineFuel:config.mineFuel=value;break;
255 case EditMineEnergyNeed:config.mineEnergyNeed=value;break;
256 case EditMineActivateTime:config.mineActivateTime=value;break;
257 case EditMineReloadTime:config.mineReloadTime=value;break;
258 case EditGamespeed:config.gamespeed=value;break;
259 case EditPosX:config.startPosX=value;break;
260 case EditPosY:config.startPosY=value;break;
261 case EditVelX:config.startVelX=value;break;
262 case EditVelY:config.startVelY=value;break;
263 case EditAcc:config.acc=value;break;
264 case EditEnergyNeed:config.energyNeed=value;break;
265 case EditRotationSpeed:config.rotationSpeed=value;break;
266 case EditRotationEnergyNeed:config.rotationEnergyNeed=value;break;
267 case EditPowerupRefreshTime:config.powerupRefreshTime=value;break;
268 case EditPowerupLifeTime:config.powerupLifeTime=value;break;
269 case EditPowerupEnergyAmount:config.powerupEnergyAmount=value;break;
270 }
271 emit changed();
272 }
273}
274
275void ConfigSetup::updateSettings()
276{
277 *customConfig=config;
278
279 Options::setLastConfig(selectedConfig);
280 Options::self()->writeConfig();
281}
282
283bool ConfigSetup::hasChanged()
284{
285 if (configCombo->currentIndex() != Options::lastConfig())
286 return true;
287
288 if (configCombo->currentIndex() != predefinedConfigNum)
289 return false;
290
291 return ((*customConfig) != config);
292}
293
294void ConfigSetup::updateWidgetsDefault()
295{
296 configCombo->setCurrentIndex(0);
297 configSelected(0);
298}
299
300bool ConfigSetup::isDefault()
301{
302 return configCombo->currentIndex() == 0;
303}
304
305void ConfigSetup::configSelected(int num)
306{
307 int i;
308 if(!((selectedConfig==predefinedConfigNum)&&(num==predefinedConfigNum)))
309 {
310 selectedConfig = num;
311 for(i=0;i<EditNum;i++)
312 slider[i]->setEnabled(num==predefinedConfigNum);
313 //enableButton( Default, num==predefinedConfigNum );
314 if(num<predefinedConfigNum)
315 displayConfig(predefinedConfig[num]);
316 else
317 displayConfig(config);
318 emit changed();
319 }
320}
321
322void ConfigSetup::displayConfig(SConfig cfg)
323{
324 setValue(EditSunEnergy,cfg.sunEnergy);
325 setValue(EditGravity,cfg.gravity);
326
327 setValue(EditShotSpeed,cfg.shotSpeed);
328 setValue(EditShotEnergyNeed,cfg.shotEnergyNeed);
329 setValue(EditMaxBullets,cfg.maxBullets);
330 setValue(EditBulletDamage,cfg.bulletDamage);
331 setValue(EditBulletLifeTime,cfg.bulletLifeTime);
332 setValue(EditBulletReloadTime,cfg.bulletReloadTime);
333
334 setValue(EditMineFuel,cfg.mineFuel);
335 setValue(EditMineEnergyNeed,cfg.mineEnergyNeed);
336 setValue(EditMineActivateTime,cfg.mineActivateTime);
337 setValue(EditMineDamage,cfg.mineDamage);
338 setValue(EditMaxMines,cfg.maxMines);
339 setValue(EditMineReloadTime,cfg.mineReloadTime);
340
341 setValue(EditGamespeed,cfg.gamespeed);
342
343 setValue(EditPosX,cfg.startPosX);
344 setValue(EditPosY,cfg.startPosY);
345 setValue(EditVelX,cfg.startVelX);
346 setValue(EditVelY,cfg.startVelY);
347
348 setValue(EditAcc,cfg.acc);
349 setValue(EditEnergyNeed,cfg.energyNeed);
350 setValue(EditRotationSpeed,cfg.rotationSpeed);
351 setValue(EditRotationEnergyNeed,cfg.rotationEnergyNeed);
352 setValue(EditShipDamage,cfg.shipDamage);
353
354 setValue(EditPowerupLifeTime,cfg.powerupLifeTime);
355 setValue(EditPowerupRefreshTime,cfg.powerupRefreshTime);
356 setValue(EditPowerupShieldAmount,cfg.powerupShieldAmount);
357 setValue(EditPowerupEnergyAmount,cfg.powerupEnergyAmount);
358}
359
360void ConfigSetup::setValue(int ednum,int val)
361{
362 QString str;
363 str.sprintf("%*i",LCDLen,val);
364 value[ednum]->display(str);
365 slider[ednum]->setValue(val);
366}
367
368void ConfigSetup::setValue(int ednum,double val)
369{
370 QString str;
371 int hval=(int)(val*EditDiv[ednum]+0.5);
372 int n,h;
373
374 if(EditDiv[ednum]==1)
375 str.sprintf("%*i",LCDLen,hval);
376 else
377 {
378 h=1;
379 for(n=0;h<EditDiv[ednum];n++)
380 h*=10;
381 str.sprintf("%*.*f",LCDLen,n,val);
382 }
383 value[ednum]->display(str);
384 slider[ednum]->setValue(hval);
385}
386
387void ConfigSetup::setValue(int ednum,unsigned val)
388{
389 QString str;
390 str.sprintf("%*i",LCDLen,(int)val);
391 value[ednum]->display(str);
392 slider[ednum]->setValue((int)val);
393}
394
395void ConfigSetup::sliderChanged(int val)
396{
397 int i,n,h;
398 QString str;
399
400 for(i=0;(i<EditNum) && (slider[i]!=sender());i++);
401 if(i<EditNum)
402 {
403 if(EditDiv[i]==1)
404 str.sprintf("%*i",LCDLen,val);
405 else
406 {
407 h=1;
408 for(n=0;h<EditDiv[i];n++)
409 h*=10;
410 str.sprintf("%*.*f",LCDLen,n,(double)val/EditDiv[i]);
411 }
412 value[i]->display(str);
413 if(VarType[i]==VarFloat)
414 valueChanged(i,(double)val/EditDiv[i]);
415 else
416 valueChanged(i,val);
417 }
418
419}
420
421SettingsDialog::SettingsDialog(SConfig *customConfig, QWidget *parent, const char *name)
422 : KConfigDialog( parent,QLatin1String( name ), Options::self())
423{
424 General *general = new General();
425 addPage(general, i18nc("general settings","General"), QLatin1String( "games-config-options" ), i18n("General Settings"));
426
427 cs = new ConfigSetup(customConfig);
428 addPage(cs, i18nc("game settings","Game"),QLatin1String( "games-config-custom" ), i18n("Game Settings"));
429 connect(cs, SIGNAL(changed()), this, SLOT(updateButtons()));
430 setHelp(QString(),QLatin1String( "kspaceduel" ));
431// resize(600,400);
432}
433
434SettingsDialog::~SettingsDialog()
435{
436}
437
438void SettingsDialog::updateWidgetsDefault()
439{
440 cs->updateWidgetsDefault();
441}
442
443void SettingsDialog::updateWidgets()
444{
445 cs->updateWidgets();
446}
447
448void SettingsDialog::updateSettings()
449{
450 cs->updateSettings();
451 emit settingsUpdated();
452}
453
454bool SettingsDialog::hasChanged()
455{
456 return cs->hasChanged();
457}
458
459bool SettingsDialog::isDefault()
460{
461 return cs->isDefault();
462}
463
464#include "dialogs.moc"
465