You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/kspaceduel/dialogs.cpp

435 lines
12 KiB

#include <qlabel.h>
#include <qcombobox.h>
#include <qtabwidget.h>
#include <qslider.h>
#include <qlcdnumber.h>
#include <qlayout.h>
#include <klocale.h>
#include "options.h"
#include "dialogs.h"
#include "general.h"
bool operator!=(const SConfig &s1, const SConfig &s2)
{
return
(s1.gamespeed != s2.gamespeed) ||
(s1.gravity != s2.gravity) ||
(s1.acc != s2.acc) ||
(s1.energyNeed != s2.energyNeed) ||
(s1.sunEnergy != s2.sunEnergy) ||
(s1.rotationSpeed != s2.rotationSpeed) ||
(s1.mineActivateTime != s2.mineActivateTime) ||
(s1.mineFuel != s2.mineFuel) ||
(s1.shotSpeed != s2.shotSpeed) ||
(s1.shotEnergyNeed != s2.shotEnergyNeed) ||
(s1.mineEnergyNeed != s2.mineEnergyNeed) ||
(s1.rotationEnergyNeed != s2.rotationEnergyNeed) ||
(s1.startPosX != s2.startPosX) ||
(s1.startPosY != s2.startPosY) ||
(s1.startVelX != s2.startVelX) ||
(s1.startVelY != s2.startVelY) ||
(s1.bulletLifeTime != s2.bulletLifeTime) ||
(s1.mineReloadTime != s2.mineReloadTime) ||
(s1.bulletReloadTime != s2.bulletReloadTime) ||
(s1.bulletDamage != s2.bulletDamage) ||
(s1.shipDamage != s2.shipDamage) ||
(s1.mineDamage != s2.mineDamage) ||
(s1.maxBullets != s2.maxBullets) ||
(s1.maxMines != s2.maxMines) ||
(s1.powerupLifeTime != s2.powerupLifeTime) ||
(s1.powerupRefreshTime != s2.powerupRefreshTime) ||
(s1.powerupEnergyAmount != s2.powerupEnergyAmount) ||
(s1.powerupShieldAmount != s2.powerupShieldAmount);
}
char ConfigSetup::LabelName[EditNum][25]=
{
I18N_NOOP("Game speed:"), I18N_NOOP("Shot speed:"),
I18N_NOOP("Energy need:"), I18N_NOOP("Max number:"),
I18N_NOOP("Damage:"), I18N_NOOP("Life time:"),
I18N_NOOP("Reload time:"), I18N_NOOP("Mine fuel:"),
I18N_NOOP("Energy need:"), I18N_NOOP("Activate time:"),
I18N_NOOP("Damage:"), I18N_NOOP("Max number:"),
I18N_NOOP("Reload time:"), I18N_NOOP("Acceleration:"),
I18N_NOOP("Energy need:"), I18N_NOOP("Rotation speed:"),
I18N_NOOP("Energy need:"), I18N_NOOP("Crash damage:"),
I18N_NOOP("Sun energy:"), I18N_NOOP("Gravity:"),
I18N_NOOP("Position X:"), I18N_NOOP("Position Y:"),
I18N_NOOP("Velocity X:"), I18N_NOOP("Velocity Y:"),
I18N_NOOP("Appearance time:"),I18N_NOOP("Life time:"),
I18N_NOOP("Energy amount:"), I18N_NOOP("Shield amount:")
};
enum ConfigSetup::Type ConfigSetup::VarType[EditNum]=
{VarFloat,
VarFloat,VarFloat,VarInt,VarInt,VarFloat,VarFloat,
VarFloat,VarFloat,VarFloat,VarInt,VarInt,VarFloat,
VarFloat,VarFloat,VarFloat,
VarFloat,VarInt,
VarFloat,VarFloat,
VarFloat,VarFloat,VarFloat,VarFloat,
VarFloat,VarFloat,VarFloat,VarInt};
double ConfigSetup::EditVal[EditNum][3]=
{{0.2,4.0,1},
{0.1,10,3},{0,99,10},{0,10,5},{1,100,20},{50,2000,100},{0,400,10},
{5,200,65},{0,99,5},{5,100,15},{1,100,30},{0,10,3},{0,400,10},
{0,1.0,0.2},{0,10,1.0},{0.1,4,1},
{0,10,0.2},{0,100,50},
{1000,30000,9000},{0,10000,2200},
{-250,250,-130},{-180,180,-100},{-10,10,3},{-10,10,-1.7},
{200,4000,800},{200,4000,400},{0,99,50},{0,99,30}};
int ConfigSetup::EditDiv[EditNum]=
{100,
10,1,1,1,1,10,
1,1,10,1,1,10,
100,10,10,
10,1,
1,1,
10,10,100,100,
1,1,1,1};
int ConfigSetup::Parent[EditNum]=
{TabGeneral,
TabBullet,TabBullet,TabBullet,TabBullet,TabBullet,TabBullet,
TabMine,TabMine,TabMine,TabMine,TabMine,TabMine,
TabShip,TabShip,TabShip,TabShip,TabShip,
TabSun,TabSun,
TabStart,TabStart,TabStart,TabStart,
TabPowerups,TabPowerups,TabPowerups,TabPowerups};
int ConfigSetup::Position[EditNum]=
{0,
0,1,2,3,4,5,
0,1,2,3,4,5,
0,1,2,3,4,
0,1,
0,1,2,3,
0,1,2,3};
const int LCDLen=6;
ConfigSetup::ConfigSetup(SConfig *custom,QWidget *parent,const char *name)
:QWidget( parent, name )
{
QLabel *label[EditNum];
QGridLayout *stacklayout[TabNum];
QWidget *configWidgets[TabNum];
//QGroupBox *box;
int i;
resize(500,400);
//setCaption(i18n("Game Setup"));
//setHelp( "OptionsConfigurations" );
//box=new QGroupBox(i18n("Config"),this);
//setMainWidget( box );
QVBoxLayout *boxlayout = new QVBoxLayout( this, 6 );
tabs=new QTabWidget(this);
for(i=0;i<TabNum;i++)
{
configWidgets[i]=new QWidget(tabs);
stacklayout[i]=new QGridLayout(configWidgets[i],6,3,10);
}
for(i=0;i<EditNum;i++)
{
label[i]=new QLabel(i18n(LabelName[i]),configWidgets[Parent[i]]);
slider[i]=new QSlider(EditVal[i][0]*EditDiv[i],EditVal[i][1]*EditDiv[i],
(EditVal[i][1]-EditVal[i][0])/10,
EditVal[i][2]*EditDiv[i],
QSlider::Horizontal,configWidgets[Parent[i]]);
connect(slider[i],SIGNAL(valueChanged(int)),SLOT(sliderChanged(int)));
value[i]=new QLCDNumber(LCDLen,configWidgets[Parent[i]]);
value[i]->setFrameStyle(QFrame::NoFrame);
}
configCombo=new QComboBox(false,this);
connect(configCombo,SIGNAL(activated(int)),SLOT(configSelected(int)));
for(i=0;i<predefinedConfigNum;i++)
configCombo->insertItem(i18n(predefinedConfigName[i]));
configCombo->insertItem(i18n("Custom"));
boxlayout->addSpacing( 2 * 6 );
boxlayout->addWidget(configCombo);
boxlayout->addWidget(tabs);
for(i=0;i<EditNum;i++)
{
stacklayout[Parent[i]]->addWidget(label[i],Position[i],0);
stacklayout[Parent[i]]->addWidget(slider[i],Position[i],1);
stacklayout[Parent[i]]->addWidget(value[i],Position[i],2);
}
for(i=0;i<TabNum;i++)
stacklayout[i]->activate();
tabs->addTab(configWidgets[0],i18n("General"));
tabs->addTab(configWidgets[1],i18n("Bullet"));
tabs->addTab(configWidgets[2],i18n("Name","Mine"));
tabs->addTab(configWidgets[3],i18n("Ship"));
tabs->addTab(configWidgets[4],i18n("Sun"));
tabs->addTab(configWidgets[5],i18n("Start"));
tabs->addTab(configWidgets[6],i18n("Powerups"));
customConfig=custom;
updateWidgets();
}
void ConfigSetup::updateWidgets()
{
config=*customConfig;
selectedConfig = -1;
configCombo->setCurrentItem(Options::lastConfig());
configSelected(Options::lastConfig());
}
void ConfigSetup::valueChanged(int ednum,int value)
{
if(selectedConfig==predefinedConfigNum)
{
switch(ednum)
{
case EditMaxBullets:config.maxBullets=value;break;
case EditBulletDamage:config.bulletDamage=value;break;
case EditMaxMines:config.maxMines=value;break;
case EditMineDamage:config.mineDamage=value;break;
case EditShipDamage:config.shipDamage=value;break;
case EditPowerupShieldAmount:config.powerupShieldAmount=value;break;
}
emit changed();
}
}
void ConfigSetup::valueChanged(int ednum,double value)
{
if(selectedConfig==predefinedConfigNum)
{
switch(ednum)
{
case EditSunEnergy:config.sunEnergy=value;break;
case EditGravity:config.gravity=value;break;
case EditShotSpeed:config.shotSpeed=value;break;
case EditShotEnergyNeed:config.shotEnergyNeed=value;break;
case EditBulletLifeTime:config.bulletLifeTime=value;break;
case EditBulletReloadTime:config.bulletReloadTime=value;break;
case EditMineFuel:config.mineFuel=value;break;
case EditMineEnergyNeed:config.mineEnergyNeed=value;break;
case EditMineActivateTime:config.mineActivateTime=value;break;
case EditMineReloadTime:config.mineReloadTime=value;break;
case EditGamespeed:config.gamespeed=value;break;
case EditPosX:config.startPosX=value;break;
case EditPosY:config.startPosY=value;break;
case EditVelX:config.startVelX=value;break;
case EditVelY:config.startVelY=value;break;
case EditAcc:config.acc=value;break;
case EditEnergyNeed:config.energyNeed=value;break;
case EditRotationSpeed:config.rotationSpeed=value;break;
case EditRotationEnergyNeed:config.rotationEnergyNeed=value;break;
case EditPowerupRefreshTime:config.powerupRefreshTime=value;break;
case EditPowerupLifeTime:config.powerupLifeTime=value;break;
case EditPowerupEnergyAmount:config.powerupEnergyAmount=value;break;
}
emit changed();
}
}
void ConfigSetup::updateSettings()
{
*customConfig=config;
Options::setLastConfig(selectedConfig);
Options::writeConfig();
}
bool ConfigSetup::hasChanged()
{
if (configCombo->currentItem() != Options::lastConfig())
return true;
if (configCombo->currentItem() != predefinedConfigNum)
return false;
return ((*customConfig) != config);
}
void ConfigSetup::updateWidgetsDefault()
{
configCombo->setCurrentItem(0);
configSelected(0);
}
bool ConfigSetup::isDefault()
{
return configCombo->currentItem() == 0;
}
void ConfigSetup::configSelected(int num)
{
int i;
if(!((selectedConfig==predefinedConfigNum)&&(num==predefinedConfigNum)))
{
selectedConfig = num;
for(i=0;i<EditNum;i++)
slider[i]->setEnabled(num==predefinedConfigNum);
//enableButton( Default, num==predefinedConfigNum );
if(num<predefinedConfigNum)
displayConfig(predefinedConfig[num]);
else
displayConfig(config);
emit changed();
}
}
void ConfigSetup::displayConfig(SConfig cfg)
{
setValue(EditSunEnergy,cfg.sunEnergy);
setValue(EditGravity,cfg.gravity);
setValue(EditShotSpeed,cfg.shotSpeed);
setValue(EditShotEnergyNeed,cfg.shotEnergyNeed);
setValue(EditMaxBullets,cfg.maxBullets);
setValue(EditBulletDamage,cfg.bulletDamage);
setValue(EditBulletLifeTime,cfg.bulletLifeTime);
setValue(EditBulletReloadTime,cfg.bulletReloadTime);
setValue(EditMineFuel,cfg.mineFuel);
setValue(EditMineEnergyNeed,cfg.mineEnergyNeed);
setValue(EditMineActivateTime,cfg.mineActivateTime);
setValue(EditMineDamage,cfg.mineDamage);
setValue(EditMaxMines,cfg.maxMines);
setValue(EditMineReloadTime,cfg.mineReloadTime);
setValue(EditGamespeed,cfg.gamespeed);
setValue(EditPosX,cfg.startPosX);
setValue(EditPosY,cfg.startPosY);
setValue(EditVelX,cfg.startVelX);
setValue(EditVelY,cfg.startVelY);
setValue(EditAcc,cfg.acc);
setValue(EditEnergyNeed,cfg.energyNeed);
setValue(EditRotationSpeed,cfg.rotationSpeed);
setValue(EditRotationEnergyNeed,cfg.rotationEnergyNeed);
setValue(EditShipDamage,cfg.shipDamage);
setValue(EditPowerupLifeTime,cfg.powerupLifeTime);
setValue(EditPowerupRefreshTime,cfg.powerupRefreshTime);
setValue(EditPowerupShieldAmount,cfg.powerupShieldAmount);
setValue(EditPowerupEnergyAmount,cfg.powerupEnergyAmount);
}
void ConfigSetup::setValue(int ednum,int val)
{
QString str;
str.sprintf("%*i",LCDLen,val);
value[ednum]->display(str);
slider[ednum]->setValue(val);
}
void ConfigSetup::setValue(int ednum,double val)
{
QString str;
int hval=(int)(val*EditDiv[ednum]+0.5);
int n,h;
if(EditDiv[ednum]==1)
str.sprintf("%*i",LCDLen,hval);
else
{
h=1;
for(n=0;h<EditDiv[ednum];n++)
h*=10;
str.sprintf("%*.*f",LCDLen,n,val);
}
value[ednum]->display(str);
slider[ednum]->setValue(hval);
}
void ConfigSetup::setValue(int ednum,unsigned val)
{
QString str;
str.sprintf("%*i",LCDLen,(int)val);
value[ednum]->display(str);
slider[ednum]->setValue((int)val);
}
void ConfigSetup::sliderChanged(int val)
{
int i,n,h;
QString str;
for(i=0;(i<EditNum)&&(slider[i]!=sender());i++);
if(i<EditNum)
{
if(EditDiv[i]==1)
str.sprintf("%*i",LCDLen,val);
else
{
h=1;
for(n=0;h<EditDiv[i];n++)
h*=10;
str.sprintf("%*.*f",LCDLen,n,(double)val/EditDiv[i]);
}
value[i]->display(str);
if(VarType[i]==VarFloat)
valueChanged(i,(double)val/EditDiv[i]);
else
valueChanged(i,val);
}
}
SettingsDialog::SettingsDialog(SConfig *customConfig, QWidget *parent, const char *name)
: KConfigDialog( parent, name, Options::self())
{
General *general = new General();
addPage(general, i18n("General"), "package_settings", i18n("General Settings"));
cs = new ConfigSetup(customConfig);
addPage(cs, i18n("Game"), "kspaceduel", i18n("Game Settings"));
connect(cs, SIGNAL(changed()), this, SLOT(updateButtons()));
// resize(600,400);
}
SettingsDialog::~SettingsDialog()
{
}
void SettingsDialog::updateWidgetsDefault()
{
cs->updateWidgetsDefault();
}
void SettingsDialog::updateWidgets()
{
cs->updateWidgets();
}
void SettingsDialog::updateSettings()
{
cs->updateSettings();
emit settingsUpdated();
}
bool SettingsDialog::hasChanged()
{
return cs->hasChanged();
}
bool SettingsDialog::isDefault()
{
return cs->isDefault();
}
#include "dialogs.moc"