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/libksirtet/lib/wizard.cpp

230 lines
6.7 KiB

#include "wizard.h"
#include "wizard.moc"
#include <sys/types.h>
#include <netinet/in.h>
#include <tqvbuttongroup.h>
#include <tqradiobutton.h>
#include <tqhbox.h>
#include <tqvbox.h>
#include <tqsignalmapper.h>
#include <tqvgroupbox.h>
#include <tqgrid.h>
#include <tqfile.h>
#include <tdeapplication.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kdialogbase.h>
#include "types.h"
#include "defines.h"
#include "socket.h"
#ifdef __bsdi__
#define IPPORT_USERRESERVED IPPORT_DYNAMIC
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__sgi)
#define IPPORT_USERRESERVED IPPORT_RESERVED
#endif
#define MIN_USER_PORT (unsigned short int)IPPORT_USERRESERVED
#define MAX_USER_PORT 65535
MPWizard::MPWizard(const MPGameInfo &gi, ConnectionData &_cd,
TQWidget *parent, const char *name)
: KWizard(parent, name, TRUE), cd(_cd)
{
// setupTypePage(); // #### REMOVE NETWORK GAMES UNTIL FIXED
type = Local;
setupLocalPage(gi);
}
//-----------------------------------------------------------------------------
void MPWizard::setupTypePage()
{
TDEConfigGroupSaver cg(kapp->config(), MP_GROUP);
typePage = new TQVBox(this);
typePage->setMargin(KDialogBase::marginHint());
TQVButtonGroup *vbg = new TQVButtonGroup(typePage);
connect(vbg, TQ_SIGNAL(clicked(int)), TQ_SLOT(typeChanged(int)));
TQRadioButton *b;
b = new TQRadioButton(i18n("Create a local game"), vbg);
b = new TQRadioButton(i18n("Create a network game"), vbg);
b = new TQRadioButton(i18n("Join a network game"), vbg);
type = (Type)cg.config()->readNumEntry(MP_GAMETYPE, 0);
if ( type<0 || type>2 ) type = Local;
vbg->setButton(type);
typePage->setSpacing(KDialogBase::spacingHint());
net = new TQVGroupBox(i18n("Network Settings"), typePage);
TQGrid *grid = new TQGrid(2, net);
lserver = new TQLabel(" ", grid);
grid->setSpacing(KDialogBase::spacingHint());
eserver = new TQLineEdit(grid);
(void)new TQLabel(i18n("Port:"), grid);
int p = cg.config()->readNumEntry(MP_PORT, (uint)MIN_USER_PORT);
eport = new KIntNumInput(p, grid);
eport->setRange(MIN_USER_PORT, MAX_USER_PORT, 1, false);
addPage(typePage, i18n("Choose Game Type"));
setHelpEnabled(typePage, FALSE);
typeChanged(type);
}
//-----------------------------------------------------------------------------
void MPWizard::setupLocalPage(const MPGameInfo &gi)
{
localPage = new TQVBox(this);
localPage->setMargin(KDialogBase::marginHint());
wl = new WidgetList<PlayerLine>(5, localPage);
TQSignalMapper *husm = new TQSignalMapper(this);
if (gi.humanSettingSlot) connect(husm, TQ_SIGNAL(mapped(int)),
gi.humanSettingSlot);
TQSignalMapper *aism = new TQSignalMapper(this);
if (gi.AISettingSlot) connect(aism, TQ_SIGNAL(mapped(int)), gi.AISettingSlot);
TDEConfigGroupSaver cg(kapp->config(), MP_GROUP);
TQString n;
PlayerComboBox::Type type;
PlayerLine *pl;
Q_ASSERT( gi.maxNbLocalPlayers>0 );
for (uint i=0; i<gi.maxNbLocalPlayers; i++) {
type = (PlayerComboBox::Type)
cg.config()->readNumEntry(TQString(MP_PLAYER_TYPE).arg(i),
(i==0 ? PlayerComboBox::Human : PlayerComboBox::None));
n = cg.config()->readEntry(TQString(MP_PLAYER_NAME).arg(i),
i18n("Player #%1").arg(i));
pl = new PlayerLine(type, n, gi.humanSettingSlot, gi.AISettingSlot,
i!=0, gi.AIAllowed, wl);
connect(pl, TQ_SIGNAL(typeChanged(int)), TQ_SLOT(lineTypeChanged(int)));
husm->setMapping(pl, i);
connect(pl, TQ_SIGNAL(setHuman()), husm, TQ_SLOT(map()));
aism->setMapping(pl, i);
connect(pl, TQ_SIGNAL(setAI()), aism, TQ_SLOT(map()));
wl->append(pl);
}
((TQVBox *)localPage)->setSpacing(KDialogBase::spacingHint());
// keys = new TQPushButton(i18n("Configure Keys..."), localPage);
// connect(keys, TQ_SIGNAL(clicked()), TQ_SLOT(configureKeysSlot()));
addPage(localPage, i18n("Local Player's Settings"));
setHelpEnabled(localPage, FALSE);
lineTypeChanged(0);
}
TQString MPWizard::name(uint i) const
{
TQString s = wl->widget(i)->name();
if ( s.length()==0 ) s = i18n("Player #%1").arg(i);
return s;
}
void MPWizard::typeChanged(int t)
{
type = (Type)t;
TQString str;
if ( type!=Client ) {
str = "localhost";
lserver->setText(i18n("Hostname:"));
} else {
TDEConfigGroupSaver cg(kapp->config(), MP_GROUP);
str = cg.config()->readEntry(MP_SERVER_ADDRESS,
i18n("the.server.address"));
lserver->setText(i18n("Server address:"));
}
eserver->setText(str);
eserver->setEnabled(type==Client);
eport->setEnabled(type!=Local);
net->setEnabled(type!=Local);
}
void MPWizard::lineTypeChanged(int)
{
bool b = FALSE;
for (uint i=0; i<wl->size(); i++)
if ( wl->widget(i)->type()==PlayerComboBox::Human ) {
b = TRUE;
break;
}
// keys->setEnabled(b);
}
void MPWizard::accept()
{
TDEConfigGroupSaver cg(kapp->config(), MP_GROUP);
cd.network = ( type!=Local );
cd.server = ( type!=Client );
if (cd.network) {
//**********************************************************
// create socket
int flags = KExtendedSocket::inetSocket
| KExtendedSocket::streamSocket;
if (cd.server) flags |= KExtendedSocket::passiveSocket;
TQString host = TQFile::encodeName(eserver->text());
KExtendedSocket *socket
= new KExtendedSocket(host, eport->value(), flags);
// do lookup
int res = socket->lookup();
if ( checkSocket(res, socket, i18n("Error looking up for \"%1\"")
.arg(host), this) ) {
delete socket;
return;
}
// connect (client) or listen (server)
res = (cd.server ? socket->listen() : socket->connect());
if ( checkSocket(res, socket, i18n("Error opening socket"), this) ) {
delete socket;
return;
}
cd.rhd.socket = new Socket(socket, true);
if ( !cd.server )
cg.config()->writeEntry(MP_SERVER_ADDRESS, eserver->text());
cg.config()->writeEntry(MP_PORT, eport->value());
}
BoardData bd;
for (uint i=0; i<wl->size(); i++) {
if ( wl->widget(i)->type()==PlayerComboBox::None ) continue;
bd.name = name(i);
bd.type = wl->widget(i)->type();
cd.rhd.bds += bd;
}
cg.config()->writeEntry(MP_GAMETYPE, (int)type);
for (uint i=0; i<wl->size(); i++) {
cg.config()->writeEntry(TQString(MP_PLAYER_TYPE).arg(i),
(int)wl->widget(i)->type());
cg.config()->writeEntry(TQString(MP_PLAYER_NAME).arg(i), name(i));
}
KWizard::accept();
}
void MPWizard::showPage(TQWidget *page)
{
if ( page==localPage ) setFinishEnabled(localPage, TRUE);
KWizard::showPage(page);
}
void MPWizard::configureKeysSlot()
{
uint nb = 0;
for (uint i=0; i<wl->size(); i++)
if ( wl->widget(i)->type()==PlayerComboBox::Human ) nb++;
emit configureKeys(nb);
}