libkdegames/kgame
kgameconnectdialog.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kgameconnectdialog.h"
00022
00023 #include <knuminput.h>
00024 #include <klocale.h>
00025 #include <kdebug.h>
00026
00027 #include <QLineEdit>
00028 #include <QComboBox>
00029 #include <QLayout>
00030 #include <qradiobutton.h>
00031 #include <QLabel>
00032 #include <QVBoxLayout>
00033 #include <QList>
00034 #include <QButtonGroup>
00035 #include <dnssd/servicebrowser.h>
00036 #include <QPushButton>
00037 #include <QGroupBox>
00038
00039 class KGameConnectWidgetPrivate
00040 {
00041 public:
00042 KGameConnectWidgetPrivate()
00043 {
00044 mPort = 0;
00045 mHost = 0;
00046 mButtonGroup = 0;
00047 mBrowser = 0;
00048 }
00049
00050 KIntNumInput* mPort;
00051 QLineEdit* mHost;
00052 QButtonGroup* mButtonGroup;
00053 QComboBox *mClientName;
00054 QLabel *mClientNameLabel;
00055 DNSSD::ServiceBrowser *mBrowser;
00056 QLabel *mServerNameLabel;
00057 QLineEdit *mServerName;
00058 QString mType;
00059 };
00060
00061 KGameConnectWidget::KGameConnectWidget(QWidget* parent) : QWidget(parent)
00062 {
00063 d = new KGameConnectWidgetPrivate;
00064
00065 QVBoxLayout* vb = new QVBoxLayout(this);
00066 vb->setMargin(0);
00067 QGroupBox* box = new QGroupBox(this);
00068 QVBoxLayout* boxlay = new QVBoxLayout(box);
00069 d->mButtonGroup = new QButtonGroup(this);
00070 d->mButtonGroup->setExclusive(true);
00071 vb->addWidget(box);
00072 connect(d->mButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(slotTypeChanged(int)));
00073 QRadioButton* buttonCreate = new QRadioButton(i18n("Create a network game"), box);
00074 boxlay->addWidget(buttonCreate);
00075 d->mButtonGroup->addButton(buttonCreate,0);
00076 QRadioButton* buttonJoin = new QRadioButton(i18n("Join a network game"), box);
00077 boxlay->addWidget(buttonJoin);
00078 d->mButtonGroup->addButton(buttonJoin,1);
00079
00080 QWidget *g = new QWidget(this);
00081 vb->addWidget(g);
00082 d->mServerNameLabel = new QLabel(i18n("Game name:"), g);
00083 d->mServerName = new QLineEdit(g);
00084 d->mClientNameLabel = new QLabel(i18n("Network games:"), g);
00085 d->mClientName = new QComboBox(g);
00086
00087 QGridLayout* layout = new QGridLayout(g);
00088 layout->setMargin(0);
00089 layout->addWidget(d->mServerNameLabel, 0, 0);
00090 layout->addWidget(d->mServerName, 0, 1);
00091 layout->addWidget(d->mClientNameLabel, 1, 0);
00092 layout->addWidget(d->mClientName, 1, 1);
00093 connect(d->mClientName,SIGNAL(activated(int)),SLOT(slotGameSelected(int)));
00094 QLabel* label = new QLabel(i18n("Port to connect to:"), g);
00095 d->mPort = new KIntNumInput(g);
00096 layout->addWidget(label, 2, 0);
00097 layout->addWidget(d->mPort, 2, 1);
00098 label = new QLabel(i18n("Host to connect to:"), g);
00099 d->mHost = new QLineEdit(g);
00100 layout->addWidget(label, 3, 0);
00101 layout->addWidget(d->mHost, 3, 1);
00102
00103 QPushButton *button=new QPushButton(i18n("&Start Network"), this);
00104 connect(button, SIGNAL(clicked()), this, SIGNAL(signalNetworkSetup()));
00105 vb->addWidget(button);
00106
00107 d->mClientName->hide();
00108 d->mClientNameLabel->hide();
00109 d->mServerName->hide();
00110 d->mServerNameLabel->hide();
00111 }
00112
00113 void KGameConnectWidget::showDnssdControls()
00114 {
00115 if (!d->mBrowser) return;
00116 if (d->mHost->isEnabled()) {
00117 d->mClientName->show();
00118 d->mClientNameLabel->show();
00119 d->mServerName->hide();
00120 d->mServerNameLabel->hide();
00121 slotGameSelected(d->mClientName->currentIndex());
00122 } else {
00123 d->mClientName->hide();
00124 d->mClientNameLabel->hide();
00125 d->mServerName->show();
00126 d->mServerNameLabel->show();
00127 }
00128 }
00129
00130 void KGameConnectWidget::setType(const QString& type)
00131 {
00132 d->mType = type;
00133 delete d->mBrowser;
00134 d->mBrowser = new DNSSD::ServiceBrowser(type);
00135 connect(d->mBrowser,SIGNAL(finished()),SLOT(slotGamesFound()));
00136 d->mBrowser->startBrowse();
00137 showDnssdControls();
00138 }
00139
00140 void KGameConnectWidget::slotGamesFound()
00141 {
00142 bool autoselect=false;
00143 if (!d->mClientName->count()) autoselect=true;
00144 d->mClientName->clear();
00145 QStringList names;
00146
00147 QListIterator<DNSSD::RemoteService::Ptr> it(d->mBrowser->services());
00148 while (it.hasNext())
00149 names << it.next()->serviceName();
00150 d->mClientName->addItems(names);
00151 if (autoselect && d->mClientName->count()) slotGameSelected(0);
00152 }
00153
00154 void KGameConnectWidget::setName(const QString& name)
00155 {
00156 d->mServerName->setText(name);
00157 }
00158
00159 QString KGameConnectWidget::gameName() const
00160 {
00161 return d->mServerName->text();
00162 }
00163
00164 QString KGameConnectWidget::type() const
00165 {
00166 return d->mType;
00167 }
00168
00169 void KGameConnectWidget::slotGameSelected(int nr)
00170 {
00171 if (nr>=(d->mBrowser->services().count()) || nr<0) return;
00172 if (!d->mHost->isEnabled()) return;
00173 DNSSD::RemoteService::Ptr srv = d->mBrowser->services()[nr];
00174 if (!srv->isResolved() && !srv->resolve()) return;
00175 d->mHost->setText(srv->hostName());
00176 d->mPort->setValue(srv->port());
00177 }
00178 KGameConnectWidget::~KGameConnectWidget()
00179 {
00180 delete d->mBrowser;
00181 delete d;
00182 }
00183
00184 QString KGameConnectWidget::host() const
00185 {
00186 if (d->mHost->isEnabled()) {
00187 return d->mHost->text();
00188 } else {
00189 return QString();
00190 }
00191 }
00192
00193 unsigned short int KGameConnectWidget::port() const
00194 {
00195 return d->mPort->value();
00196 }
00197
00198 void KGameConnectWidget::setHost(const QString& host)
00199 {
00200 d->mHost->setText(host);
00201 }
00202
00203 void KGameConnectWidget::setPort(unsigned short int port)
00204 {
00205 d->mPort->setValue(port);
00206 }
00207
00208 void KGameConnectWidget::setDefault(int state)
00209 {
00210 if (d->mButtonGroup->button(state) == 0) {
00211 kError(11001) << "KGameConnectWidget::setDefault" << state;
00212 return;
00213 }
00214 d->mButtonGroup->button(state)->setChecked(true);
00215 slotTypeChanged(state);
00216 }
00217
00218 void KGameConnectWidget::slotTypeChanged(int t)
00219 {
00220 if (t == 0) {
00221 d->mHost->setEnabled(false);
00222 } else if (t == 1) {
00223 d->mHost->setEnabled(true);
00224 }
00225 showDnssdControls();
00226 emit signalServerTypeChanged(t);
00227 }
00228
00229 class KGameConnectDialogPrivate
00230 {
00231 public:
00232 KGameConnectDialogPrivate()
00233 {
00234 mConnect = 0;
00235 }
00236
00237 KGameConnectWidget* mConnect;
00238 };
00239
00240
00241 KGameConnectDialog::KGameConnectDialog(QWidget* parent, ButtonCodes buttonmask) :
00242 KDialog(parent)
00243
00244
00245 {
00246 setCaption(i18n("Network Game"));
00247 setButtons(buttonmask);
00248 setModal(true);
00249 d = new KGameConnectDialogPrivate;
00250 QFrame *frame = new QFrame(this);
00251 setMainWidget(frame);
00252 QVBoxLayout* vb = new QVBoxLayout(frame);
00253 vb->setSpacing( spacingHint() );
00254 d->mConnect = new KGameConnectWidget(frame);
00255 vb->addWidget(d->mConnect);
00256 }
00257
00258 KGameConnectDialog::~KGameConnectDialog()
00259 {
00260 delete d;
00261 }
00262
00263 int KGameConnectDialog::initConnection( unsigned short int& port,
00264 QString& host, QWidget* parent, bool server)
00265 {
00266 KGameConnectDialog d(parent);
00267 d.setHost(host);
00268 d.setPort(port);
00269 if (server) {
00270 d.setDefault(0);
00271 } else {
00272 d.setDefault(1);
00273 }
00274
00275 int result = d.exec();
00276 if (result == QDialog::Accepted) {
00277 host = d.host();
00278 port = d.port();
00279 }
00280 return result;
00281 }
00282
00283 QString KGameConnectDialog::host() const
00284 {
00285 return d->mConnect->host();
00286 }
00287
00288 unsigned short int KGameConnectDialog::port() const
00289 {
00290 return d->mConnect->port();
00291 }
00292
00293 void KGameConnectDialog::setHost(const QString& host)
00294 {
00295 d->mConnect->setHost(host);
00296 }
00297
00298 void KGameConnectDialog::setPort(unsigned short int port)
00299 {
00300 d->mConnect->setPort(port);
00301 }
00302
00303 void KGameConnectDialog::setDefault(int state)
00304 {
00305 d->mConnect->setDefault(state);
00306 }
00307
00308
00309
00310 #include "kgameconnectdialog.moc"
00311