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 | |
31 | class General : public QWidget, public Ui::General |
32 | { |
33 | public: |
34 | General(QWidget* parent=0) |
35 | : QWidget(parent) |
36 | { |
37 | setupUi(this); |
38 | } |
39 | }; |
40 | |
41 | bool 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 | |
75 | char 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 | |
93 | enum 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 | |
103 | double 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 | |
113 | int 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 | |
123 | int 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 | |
132 | int 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 | |
141 | const int LCDLen=6; |
142 | |
143 | ConfigSetup::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 | |
217 | void ConfigSetup::updateWidgets() |
218 | { |
219 | config=*customConfig; |
220 | selectedConfig = -1; |
221 | configCombo->setCurrentIndex(Options::lastConfig()); |
222 | configSelected(Options::lastConfig()); |
223 | } |
224 | |
225 | void 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 | |
242 | void 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 | |
275 | void ConfigSetup::updateSettings() |
276 | { |
277 | *customConfig=config; |
278 | |
279 | Options::setLastConfig(selectedConfig); |
280 | Options::self()->writeConfig(); |
281 | } |
282 | |
283 | bool 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 | |
294 | void ConfigSetup::updateWidgetsDefault() |
295 | { |
296 | configCombo->setCurrentIndex(0); |
297 | configSelected(0); |
298 | } |
299 | |
300 | bool ConfigSetup::isDefault() |
301 | { |
302 | return configCombo->currentIndex() == 0; |
303 | } |
304 | |
305 | void 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 | |
322 | void 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 | |
360 | void 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 | |
368 | void 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 | |
387 | void 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 | |
395 | void 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 | |
421 | SettingsDialog::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 | |
434 | SettingsDialog::~SettingsDialog() |
435 | { |
436 | } |
437 | |
438 | void SettingsDialog::updateWidgetsDefault() |
439 | { |
440 | cs->updateWidgetsDefault(); |
441 | } |
442 | |
443 | void SettingsDialog::updateWidgets() |
444 | { |
445 | cs->updateWidgets(); |
446 | } |
447 | |
448 | void SettingsDialog::updateSettings() |
449 | { |
450 | cs->updateSettings(); |
451 | emit settingsUpdated(); |
452 | } |
453 | |
454 | bool SettingsDialog::hasChanged() |
455 | { |
456 | return cs->hasChanged(); |
457 | } |
458 | |
459 | bool SettingsDialog::isDefault() |
460 | { |
461 | return cs->isDefault(); |
462 | } |
463 | |
464 | #include "dialogs.moc" |
465 | |