diff --git a/src/networkdialog.cpp b/src/networkdialog.cpp
index f43d863..5c0b569 100644
--- a/src/networkdialog.cpp
+++ b/src/networkdialog.cpp
@@ -1,273 +1,269 @@
/*
Copyright (c) 2007 Paolo Capriotti
(c) 2007 Riccardo Iaconelli
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
*/
#include "networkdialog.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "settings.h"
NetworkDialog::NetworkDialog(bool client, QWidget* parent, const QUrl* url)
: QDialog(parent)
, m_publisher(0), m_client(client)
{
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
QVBoxLayout *topLayout = new QVBoxLayout;
setLayout(topLayout);
m_okButton = buttonBox->button(QDialogButtonBox::Ok);
m_okButton->setDefault(true);
m_okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
connect(buttonBox, &QDialogButtonBox::accepted, this, &NetworkDialog::slotOkClicked);
connect(buttonBox, &QDialogButtonBox::rejected, this, &NetworkDialog::reject);
QLabel* tmp;
QWidget* main = new QWidget(this);
QHBoxLayout* tmpLayout;
QVBoxLayout* mainLayout = new QVBoxLayout;
// feedback
m_feedback = new QLabel(QLatin1String(""), this);
m_feedback->setAlignment(Qt::AlignHCenter);
{
QFont font = m_feedback->font();
font.setStyle(QFont::StyleItalic);
m_feedback->setFont(font);
}
m_feedback->hide();
mainLayout->addWidget(m_feedback);
// nick
tmp = new QLabel(i18n("&Nickname:"), main);
m_nickname = new KLineEdit(main);
m_nickname->setClearButtonEnabled(true);
m_nickname->setText(Settings::findNick());
tmp->setBuddy(m_nickname);
tmpLayout = new QHBoxLayout;
tmpLayout->addWidget(tmp);
tmpLayout->addWidget(m_nickname, 1);
mainLayout->addItem(tmpLayout);
// client part
if (m_client) {
tmp = new QLabel(i18n("&Join game:"), main);
m_games=new KComboBox(main);
KDNSSD::ServiceBrowser* browser=new KDNSSD::ServiceBrowser(QStringLiteral("_kbattleship._tcp"), true);
m_games->setModel(new KDNSSD::ServiceModel(browser, this));
tmp->setBuddy(m_games);
tmpLayout = new QHBoxLayout;
tmpLayout->addWidget(tmp);
tmpLayout->addWidget(m_games, 1);
-#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
connect(m_games, static_cast(&KComboBox::currentIndexChanged), this, &NetworkDialog::serviceSelected);
-#else
- connect(m_games, static_cast(&KComboBox::currentIndexChanged) , this, &NetworkDialog::serviceSelected);
-#endif
mainLayout->addItem(tmpLayout);
QWidget* frame=new QWidget(main);
QVBoxLayout* frameLayout = new QVBoxLayout;
const QString hostName = url? url->host() : Settings::hostname();
tmp = new QLabel(i18n("&Hostname:"), frame);
m_hostname = new KLineEdit(main);
m_hostname->setClearButtonEnabled(true);
m_hostname->setText(hostName);
tmp->setBuddy(m_hostname);
tmpLayout = new QHBoxLayout;
tmpLayout->addWidget(tmp);
tmpLayout->addWidget(m_hostname, 1);
//TODO PORT QT5 tmpLayout->setSpacing(QDialog::spacingHint());
frameLayout->addItem(tmpLayout);
// port
const int port = ( url && url->port() != -1 )? url->port(): Settings::port();
tmp = new QLabel(i18n("&Port:"), main);
m_port = new KPluralHandlingSpinBox(main);
m_port->setRange(1, 99999);
m_port->setValue(port);
tmp->setBuddy(m_port);
tmpLayout = new QHBoxLayout;
tmpLayout->addWidget(tmp);
tmpLayout->addStretch();
tmpLayout->addWidget(m_port);
frameLayout->addItem(tmpLayout);
frame->setLayout(frameLayout);
mainLayout->addWidget(frame);
frame->setVisible(false);
QPushButton* sw=new QPushButton(i18n("&Enter server address manually"), main);
sw->setCheckable(true);
connect(sw, &QPushButton::toggled, frame, &QWidget::setVisible);
connect(sw, &QPushButton::toggled, m_games, &KComboBox::setDisabled);
mainLayout->addWidget(sw);
if(url) {
sw->click();
}
}
else {
m_hostname = 0;
m_games = 0;
// port
tmp = new QLabel(i18n("&Port:"), main);
m_port = new KPluralHandlingSpinBox(main);
m_port->setRange(1, 99999);
m_port->setValue(Settings::port());
tmp->setBuddy(m_port);
tmpLayout = new QHBoxLayout;
tmpLayout->addWidget(tmp);
tmpLayout->addStretch();
tmpLayout->addWidget(m_port);
mainLayout->addItem(tmpLayout);
}
mainLayout->addStretch();
main->setLayout(mainLayout);
topLayout->addWidget(main);
topLayout->addWidget(buttonBox);
setWindowTitle(i18n("Network Parameters"));
connect(this, &NetworkDialog::accepted, this, &NetworkDialog::savePreferences);
}
NetworkDialog::~NetworkDialog()
{
delete m_publisher;
}
void NetworkDialog::savePreferences()
{
Settings::setNickname(nickname());
if (m_hostname) {
Settings::setHostname(hostname());
}
Settings::setPort(port());
Settings::self()->save();
}
void NetworkDialog::serviceSelected(int idx)
{
if (idx==-1) {
return;
}
KDNSSD::RemoteService::Ptr service=m_games->itemData(idx,KDNSSD::ServiceModel::ServicePtrRole ).value();
m_hostname->setText(service->hostName());
m_port->setValue(service->port());
}
QString NetworkDialog::hostname() const
{
if (m_hostname) {
return m_hostname->text();
}
else {
return QString();
}
}
int NetworkDialog::port() const
{
return m_port->value();
}
QString NetworkDialog::nickname() const
{
return m_nickname->text();
}
QTcpSocket* NetworkDialog::socket() const
{
return m_socket;
}
void NetworkDialog::slotOkClicked()
{
m_okButton->setEnabled(false);
m_feedback->show();
if (m_client) {
m_feedback->setText(i18n("Connecting to remote host..."));
m_socket = new QTcpSocket;
connect(m_socket, &QTcpSocket::connected, this, &NetworkDialog::clientOK);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
connect(m_socket, QOverload::of(&QTcpSocket::error), this, &NetworkDialog::clientError);
#else
connect(m_socket, QOverload::of(&QTcpSocket::errorOccurred), this, &NetworkDialog::clientError);
#endif
m_socket->connectToHost(m_hostname->text(), m_port->value());
}
else {
m_feedback->setText(i18n("Waiting for an incoming connection..."));
QTcpServer* server = new QTcpServer;
connect(server, &QTcpServer::newConnection, this, &NetworkDialog::serverOK);
m_publisher=new KDNSSD::PublicService(nickname(), QStringLiteral("_kbattleship._tcp"), m_port->value());
m_publisher->publishAsync();
server->listen(QHostAddress::Any, static_cast(m_port->value()));
}
}
void NetworkDialog::clientOK()
{
accept();
}
void NetworkDialog::clientError()
{
m_socket->deleteLater();
m_socket = 0;
m_feedback->setText(i18n("Could not connect to host"));
m_okButton->setEnabled(true);
}
void NetworkDialog::serverOK()
{
QTcpServer* server = qobject_cast(sender());
Q_ASSERT(server);
m_socket = server->nextPendingConnection();
Q_ASSERT(m_socket);
// refuse all other connections
while (server->hasPendingConnections()) {
delete server->nextPendingConnection();
}
// reparent socket, so that we can safely destroy the server
m_socket->setParent(this);
delete server;
// we're done
accept();
}