File indexing completed on 2024-04-21 04:04:55
0001 /* 0002 SPDX-FileCopyrightText: 1998-2001 Andreas Zehender <az@azweb.de> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "dialogs.h" 0008 #include "options.h" 0009 #include "ui_general.h" 0010 0011 #include <KLocalizedString> 0012 0013 #include <QGridLayout> 0014 #include <QLCDNumber> 0015 #include <QSlider> 0016 #include <QTabWidget> 0017 0018 class General : public QWidget, public Ui::General 0019 { 0020 public: 0021 General(QWidget* parent = nullptr) 0022 : QWidget(parent) 0023 { 0024 setupUi(this); 0025 } 0026 }; 0027 0028 bool operator!=(const SConfig &s1, const SConfig &s2) 0029 { 0030 return 0031 (s1.gamespeed != s2.gamespeed) || 0032 (s1.gravity != s2.gravity) || 0033 (s1.acc != s2.acc) || 0034 (s1.energyNeed != s2.energyNeed) || 0035 (s1.sunEnergy != s2.sunEnergy) || 0036 (s1.rotationSpeed != s2.rotationSpeed) || 0037 (s1.mineActivateTime != s2.mineActivateTime) || 0038 (s1.mineFuel != s2.mineFuel) || 0039 (s1.shotSpeed != s2.shotSpeed) || 0040 (s1.shotEnergyNeed != s2.shotEnergyNeed) || 0041 (s1.mineEnergyNeed != s2.mineEnergyNeed) || 0042 (s1.rotationEnergyNeed != s2.rotationEnergyNeed) || 0043 (s1.startPosX != s2.startPosX) || 0044 (s1.startPosY != s2.startPosY) || 0045 (s1.startVelX != s2.startVelX) || 0046 (s1.startVelY != s2.startVelY) || 0047 (s1.bulletLifeTime != s2.bulletLifeTime) || 0048 (s1.mineReloadTime != s2.mineReloadTime) || 0049 (s1.bulletReloadTime != s2.bulletReloadTime) || 0050 (s1.bulletDamage != s2.bulletDamage) || 0051 (s1.shipDamage != s2.shipDamage) || 0052 (s1.mineDamage != s2.mineDamage) || 0053 (s1.maxBullets != s2.maxBullets) || 0054 (s1.maxMines != s2.maxMines) || 0055 (s1.powerupLifeTime != s2.powerupLifeTime) || 0056 (s1.powerupRefreshTime != s2.powerupRefreshTime) || 0057 (s1.powerupEnergyAmount != s2.powerupEnergyAmount) || 0058 (s1.powerupShieldAmount != s2.powerupShieldAmount); 0059 } 0060 0061 KLazyLocalizedString ConfigSetup::LabelName[EditNum] = 0062 { 0063 kli18n("Game speed:"), kli18n("Shot speed:"), 0064 kli18n("Energy need:"), kli18n("Max number:"), 0065 kli18n("Damage:"), kli18n("Life time:"), 0066 kli18n("Reload time:"), kli18n("Mine fuel:"), 0067 kli18n("Energy need:"), kli18n("Activate time:"), 0068 kli18n("Damage:"), kli18n("Max number:"), 0069 kli18n("Reload time:"), kli18n("Acceleration:"), 0070 kli18n("Energy need:"), kli18n("Rotation speed:"), 0071 kli18n("Energy need:"), kli18n("Crash damage:"), 0072 kli18n("Sun energy:"), kli18n("Gravity:"), 0073 kli18n("Position X:"), kli18n("Position Y:"), 0074 kli18n("Velocity X:"), kli18n("Velocity Y:"), 0075 kli18n("Appearance time:"),kli18n("Life time:"), 0076 kli18n("Energy amount:"), kli18n("Shield amount:") 0077 }; 0078 0079 enum ConfigSetup::Type ConfigSetup::VarType[EditNum]= 0080 {VarFloat, 0081 VarFloat,VarFloat,VarInt,VarInt,VarFloat,VarFloat, 0082 VarFloat,VarFloat,VarFloat,VarInt,VarInt,VarFloat, 0083 VarFloat,VarFloat,VarFloat, 0084 VarFloat,VarInt, 0085 VarFloat,VarFloat, 0086 VarFloat,VarFloat,VarFloat,VarFloat, 0087 VarFloat,VarFloat,VarFloat,VarInt}; 0088 0089 double ConfigSetup::EditVal[EditNum][3]= 0090 {{0.2,4.0,1}, 0091 {0.1,10,3},{0,99,10},{0,10,5},{1,100,20},{50,2000,100},{0,400,10}, 0092 {5,200,65},{0,99,5},{5,100,15},{1,100,30},{0,10,3},{0,400,10}, 0093 {0,1.0,0.2},{0,10,1.0},{0.1,4,1}, 0094 {0,10,0.2},{0,100,50}, 0095 {1000,30000,9000},{0,10000,2200}, 0096 {-250,250,-180},{-180,180,-130},{-10,10,3},{-10,10,-1.7}, 0097 {200,4000,800},{200,4000,400},{0,99,50},{0,99,30}}; 0098 0099 int ConfigSetup::EditDiv[EditNum]= 0100 {100, 0101 10,1,1,1,1,10, 0102 1,1,10,1,1,10, 0103 100,10,10, 0104 10,1, 0105 1,1, 0106 10,10,100,100, 0107 1,1,1,1}; 0108 0109 int ConfigSetup::Parent[EditNum]= 0110 {TabGeneral, 0111 TabBullet,TabBullet,TabBullet,TabBullet,TabBullet,TabBullet, 0112 TabMine,TabMine,TabMine,TabMine,TabMine,TabMine, 0113 TabShip,TabShip,TabShip,TabShip,TabShip, 0114 TabSun,TabSun, 0115 TabStart,TabStart,TabStart,TabStart, 0116 TabPowerups,TabPowerups,TabPowerups,TabPowerups}; 0117 0118 int ConfigSetup::Position[EditNum]= 0119 {0, 0120 0,1,2,3,4,5, 0121 0,1,2,3,4,5, 0122 0,1,2,3,4, 0123 0,1, 0124 0,1,2,3, 0125 0,1,2,3}; 0126 0127 const int LCDLen=6; 0128 0129 ConfigSetup::ConfigSetup(SConfig *custom,QWidget *parent) 0130 :QWidget( parent ) 0131 { 0132 QLabel *label[EditNum]; 0133 QGridLayout *stacklayout[TabNum]; 0134 QWidget *configWidgets[TabNum]; 0135 //QGroupBox *box; 0136 0137 int i; 0138 0139 resize(500,400); 0140 0141 QVBoxLayout *boxlayout = new QVBoxLayout( this ); 0142 boxlayout->setContentsMargins(6, 6, 6, 6); 0143 0144 tabs=new QTabWidget(this); 0145 for(i=0;i<TabNum;++i) 0146 { 0147 configWidgets[i]=new QWidget(tabs); 0148 stacklayout[i]=new QGridLayout(configWidgets[i]); 0149 stacklayout[i]->setContentsMargins(10, 10, 10, 10); 0150 } 0151 0152 for(i=0;i<EditNum;++i) 0153 { 0154 label[i]=new QLabel(LabelName[i].toString(),configWidgets[Parent[i]]); 0155 slider[i]=new QSlider(Qt::Horizontal,configWidgets[Parent[i]]); 0156 slider[i]->setRange((int)(EditVal[i][0]*EditDiv[i]), (int)(EditVal[i][1]*EditDiv[i])); 0157 slider[i]->setPageStep((int)((EditVal[i][1]-EditVal[i][0])/10)); 0158 slider[i]->setValue((int)(EditVal[i][2]*EditDiv[i])); 0159 connect(slider[i],&QSlider::valueChanged, this, &ConfigSetup::sliderChanged); 0160 value[i]=new QLCDNumber(LCDLen,configWidgets[Parent[i]]); 0161 value[i]->setFrameStyle(QFrame::NoFrame); 0162 } 0163 0164 configCombo=new QComboBox(this); 0165 configCombo->setEditable(false); 0166 connect(configCombo, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated), this, &ConfigSetup::configSelected); 0167 for(i=0;i<predefinedConfigNum;++i) 0168 configCombo->addItem(predefinedConfigName[i].toString()); 0169 configCombo->addItem(i18nc("custom values","Custom")); 0170 0171 boxlayout->addSpacing( 2 * 6 ); 0172 boxlayout->addWidget(configCombo); 0173 boxlayout->addWidget(tabs); 0174 0175 for(i=0;i<EditNum;++i) 0176 { 0177 stacklayout[Parent[i]]->addWidget(label[i],Position[i],0); 0178 stacklayout[Parent[i]]->addWidget(slider[i],Position[i],1); 0179 stacklayout[Parent[i]]->addWidget(value[i],Position[i],2); 0180 } 0181 0182 for(i=0;i<TabNum;++i) 0183 stacklayout[i]->activate(); 0184 0185 tabs->addTab(configWidgets[0],i18nc("general game settings","General")); 0186 tabs->addTab(configWidgets[1],i18n("Bullet")); 0187 tabs->addTab(configWidgets[2],i18nc("Name","Mine")); 0188 tabs->addTab(configWidgets[3],i18n("Ship")); 0189 tabs->addTab(configWidgets[4],i18nc("the star, Sol","Sun")); 0190 tabs->addTab(configWidgets[5],i18nc("initial position and velocities of players","Start")); 0191 tabs->addTab(configWidgets[6],i18n("Powerups")); 0192 0193 customConfig=custom; 0194 0195 updateWidgets(); 0196 } 0197 0198 void ConfigSetup::updateWidgets() 0199 { 0200 config=*customConfig; 0201 selectedConfig = -1; 0202 configCombo->setCurrentIndex(Options::lastConfig()); 0203 configSelected(Options::lastConfig()); 0204 } 0205 0206 void ConfigSetup::valueChanged(int ednum,int value) 0207 { 0208 if(selectedConfig==predefinedConfigNum) 0209 { 0210 switch(ednum) 0211 { 0212 case EditMaxBullets:config.maxBullets=value;break; 0213 case EditBulletDamage:config.bulletDamage=value;break; 0214 case EditMaxMines:config.maxMines=value;break; 0215 case EditMineDamage:config.mineDamage=value;break; 0216 case EditShipDamage:config.shipDamage=value;break; 0217 case EditPowerupShieldAmount:config.powerupShieldAmount=value;break; 0218 } 0219 Q_EMIT changed(); 0220 } 0221 } 0222 0223 void ConfigSetup::valueChanged(int ednum,double value) 0224 { 0225 if(selectedConfig==predefinedConfigNum) 0226 { 0227 switch(ednum) 0228 { 0229 case EditSunEnergy:config.sunEnergy=value;break; 0230 case EditGravity:config.gravity=value;break; 0231 case EditShotSpeed:config.shotSpeed=value;break; 0232 case EditShotEnergyNeed:config.shotEnergyNeed=value;break; 0233 case EditBulletLifeTime:config.bulletLifeTime=value;break; 0234 case EditBulletReloadTime:config.bulletReloadTime=value;break; 0235 case EditMineFuel:config.mineFuel=value;break; 0236 case EditMineEnergyNeed:config.mineEnergyNeed=value;break; 0237 case EditMineActivateTime:config.mineActivateTime=value;break; 0238 case EditMineReloadTime:config.mineReloadTime=value;break; 0239 case EditGamespeed:config.gamespeed=value;break; 0240 case EditPosX:config.startPosX=value;break; 0241 case EditPosY:config.startPosY=value;break; 0242 case EditVelX:config.startVelX=value;break; 0243 case EditVelY:config.startVelY=value;break; 0244 case EditAcc:config.acc=value;break; 0245 case EditEnergyNeed:config.energyNeed=value;break; 0246 case EditRotationSpeed:config.rotationSpeed=value;break; 0247 case EditRotationEnergyNeed:config.rotationEnergyNeed=value;break; 0248 case EditPowerupRefreshTime:config.powerupRefreshTime=value;break; 0249 case EditPowerupLifeTime:config.powerupLifeTime=value;break; 0250 case EditPowerupEnergyAmount:config.powerupEnergyAmount=value;break; 0251 } 0252 Q_EMIT changed(); 0253 } 0254 } 0255 0256 void ConfigSetup::updateSettings() 0257 { 0258 *customConfig=config; 0259 0260 Options::setLastConfig(selectedConfig); 0261 Options::self()->save(); 0262 } 0263 0264 bool ConfigSetup::hasChanged() 0265 { 0266 if (configCombo->currentIndex() != Options::lastConfig()) 0267 return true; 0268 0269 if (configCombo->currentIndex() != predefinedConfigNum) 0270 return false; 0271 0272 return ((*customConfig) != config); 0273 } 0274 0275 void ConfigSetup::updateWidgetsDefault() 0276 { 0277 configCombo->setCurrentIndex(0); 0278 configSelected(0); 0279 } 0280 0281 bool ConfigSetup::isDefault() 0282 { 0283 return configCombo->currentIndex() == 0; 0284 } 0285 0286 void ConfigSetup::configSelected(int num) 0287 { 0288 int i; 0289 if(!((selectedConfig==predefinedConfigNum)&&(num==predefinedConfigNum))) 0290 { 0291 selectedConfig = num; 0292 for(i=0;i<EditNum;i++) 0293 slider[i]->setEnabled(num==predefinedConfigNum); 0294 //enableButton( Default, num==predefinedConfigNum ); 0295 if(num<predefinedConfigNum) 0296 displayConfig(predefinedConfig[num]); 0297 else 0298 displayConfig(config); 0299 Q_EMIT changed(); 0300 } 0301 } 0302 0303 void ConfigSetup::displayConfig(const SConfig &cfg) 0304 { 0305 setValue(EditSunEnergy,cfg.sunEnergy); 0306 setValue(EditGravity,cfg.gravity); 0307 0308 setValue(EditShotSpeed,cfg.shotSpeed); 0309 setValue(EditShotEnergyNeed,cfg.shotEnergyNeed); 0310 setValue(EditMaxBullets,cfg.maxBullets); 0311 setValue(EditBulletDamage,cfg.bulletDamage); 0312 setValue(EditBulletLifeTime,cfg.bulletLifeTime); 0313 setValue(EditBulletReloadTime,cfg.bulletReloadTime); 0314 0315 setValue(EditMineFuel,cfg.mineFuel); 0316 setValue(EditMineEnergyNeed,cfg.mineEnergyNeed); 0317 setValue(EditMineActivateTime,cfg.mineActivateTime); 0318 setValue(EditMineDamage,cfg.mineDamage); 0319 setValue(EditMaxMines,cfg.maxMines); 0320 setValue(EditMineReloadTime,cfg.mineReloadTime); 0321 0322 setValue(EditGamespeed,cfg.gamespeed); 0323 0324 setValue(EditPosX,cfg.startPosX); 0325 setValue(EditPosY,cfg.startPosY); 0326 setValue(EditVelX,cfg.startVelX); 0327 setValue(EditVelY,cfg.startVelY); 0328 0329 setValue(EditAcc,cfg.acc); 0330 setValue(EditEnergyNeed,cfg.energyNeed); 0331 setValue(EditRotationSpeed,cfg.rotationSpeed); 0332 setValue(EditRotationEnergyNeed,cfg.rotationEnergyNeed); 0333 setValue(EditShipDamage,cfg.shipDamage); 0334 0335 setValue(EditPowerupLifeTime,cfg.powerupLifeTime); 0336 setValue(EditPowerupRefreshTime,cfg.powerupRefreshTime); 0337 setValue(EditPowerupShieldAmount,cfg.powerupShieldAmount); 0338 setValue(EditPowerupEnergyAmount,cfg.powerupEnergyAmount); 0339 } 0340 0341 void ConfigSetup::setValue(int ednum,int val) 0342 { 0343 const QString str = QString::asprintf("%*i",LCDLen,val); 0344 value[ednum]->display(str); 0345 slider[ednum]->setValue(val); 0346 } 0347 0348 void ConfigSetup::setValue(int ednum,double val) 0349 { 0350 QString str; 0351 int hval=(int)(val*EditDiv[ednum]+0.5); 0352 int n,h; 0353 0354 if(EditDiv[ednum]==1) 0355 str = QString::asprintf("%*i",LCDLen,hval); 0356 else 0357 { 0358 h=1; 0359 for(n=0;h<EditDiv[ednum];++n) 0360 h*=10; 0361 str = QString::asprintf("%*.*f",LCDLen,n,val); 0362 } 0363 value[ednum]->display(str); 0364 slider[ednum]->setValue(hval); 0365 } 0366 0367 void ConfigSetup::setValue(int ednum,unsigned val) 0368 { 0369 const QString str = QString::asprintf("%*i",LCDLen,(int)val); 0370 value[ednum]->display(str); 0371 slider[ednum]->setValue((int)val); 0372 } 0373 0374 void ConfigSetup::sliderChanged(int val) 0375 { 0376 int i,n,h; 0377 QString str; 0378 0379 for(i=0;(i<EditNum) && (slider[i]!=sender());i++); 0380 if(i<EditNum) 0381 { 0382 if(EditDiv[i]==1) 0383 str = QString::asprintf("%*i",LCDLen,val); 0384 else 0385 { 0386 h=1; 0387 for(n=0;h<EditDiv[i];++n) 0388 h*=10; 0389 str = QString::asprintf("%*.*f",LCDLen,n,(double)val/EditDiv[i]); 0390 } 0391 value[i]->display(str); 0392 if(VarType[i]==VarFloat) 0393 valueChanged(i,(double)val/EditDiv[i]); 0394 else 0395 valueChanged(i,val); 0396 } 0397 0398 } 0399 0400 SettingsDialog::SettingsDialog(SConfig *customConfig, QWidget *parent, const char *name) 0401 : KConfigDialog( parent,QLatin1String( name ), Options::self()) 0402 { 0403 General *general = new General(); 0404 addPage(general, i18nc("general settings","General"), QStringLiteral( "games-config-options" ), i18n("General Settings")); 0405 0406 cs = new ConfigSetup(customConfig); 0407 addPage(cs, i18nc("game settings","Game"),QStringLiteral( "games-config-custom" ), i18n("Game Settings")); 0408 connect(cs, &ConfigSetup::changed, this, &SettingsDialog::updateButtons); 0409 setHelp(QStringLiteral( "options-configurations" ), QStringLiteral( "kspaceduel" )); 0410 // resize(600,400); 0411 } 0412 0413 SettingsDialog::~SettingsDialog() 0414 { 0415 } 0416 0417 void SettingsDialog::updateWidgetsDefault() 0418 { 0419 cs->updateWidgetsDefault(); 0420 } 0421 0422 void SettingsDialog::updateWidgets() 0423 { 0424 cs->updateWidgets(); 0425 } 0426 0427 void SettingsDialog::updateSettings() 0428 { 0429 cs->updateSettings(); 0430 Q_EMIT settingsUpdated(); 0431 } 0432 0433 bool SettingsDialog::hasChanged() 0434 { 0435 return cs->hasChanged(); 0436 } 0437 0438 bool SettingsDialog::isDefault() 0439 { 0440 return cs->isDefault(); 0441 } 0442 0443 #include "moc_dialogs.cpp"