[Browser] Rework Connect window

pull/368/head
Koncord 7 years ago
parent 92060bd6b6
commit 35b771b19e

@ -122,19 +122,16 @@ void MainWindow::play()
if (id < 0) if (id < 0)
return; return;
ServerInfoDialog infoDialog(this);
ServerModel *sm = ((ServerModel*)proxyModel->sourceModel()); ServerModel *sm = ((ServerModel*)proxyModel->sourceModel());
int sourceId = proxyModel->mapToSource(proxyModel->index(id, ServerData::ADDR)).row(); int sourceId = proxyModel->mapToSource(proxyModel->index(id, ServerData::ADDR)).row();
infoDialog.Server(sm->myData[sourceId].addr); ServerInfoDialog infoDialog(sm->myData[sourceId].addr, this);
if (!infoDialog.refresh()) if (!infoDialog.exec())
{
queryHelper->refresh();
return; return;
}
if (!infoDialog.exec()) if (!infoDialog.isUpdated())
return; return;
QStringList arguments; QStringList arguments;

@ -6,28 +6,65 @@
#include "qdebug.h" #include "qdebug.h"
#include "ServerInfoDialog.hpp" #include "ServerInfoDialog.hpp"
#include <apps/browser/netutils/Utils.hpp>
#include <algorithm> #include <algorithm>
#include <utility> #include <utility>
#include <QThread>
using namespace std; using namespace std;
using namespace RakNet; using namespace RakNet;
ServerInfoDialog::ServerInfoDialog(QWidget *parent): QDialog(parent) ThrWorker::ThrWorker(ServerInfoDialog *dialog, QString addr, unsigned short port): addr(std::move(addr)), port(port), stopped(false)
{ {
setupUi(this); this->dialog = dialog;
connect(btnRefresh, SIGNAL(clicked()), this, SLOT(refresh()));
} }
void ServerInfoDialog::Server(const QString &addr) void ThrWorker::process()
{ {
this->addr = addr; stopped = false;
auto newSD = QueryClient::Get().Update(SystemAddress(addr.toUtf8(), port));
if (dialog != nullptr)
dialog->setData(newSD);
stopped = true;
emit finished();
} }
bool ServerInfoDialog::refresh() ServerInfoDialog::ServerInfoDialog(const QString &addr, QWidget *parent): QDialog(parent)
{ {
setupUi(this);
refreshThread = new QThread;
QStringList list = addr.split(':'); QStringList list = addr.split(':');
auto sd = QueryClient::Get().Update(SystemAddress(list[0].toLatin1(), list[1].toUShort())); worker = new ThrWorker(this, list[0].toLatin1(), list[1].toUShort());
worker->moveToThread(refreshThread);
connect(refreshThread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), refreshThread, SLOT(quit()));
connect(refreshThread, SIGNAL(finished()), this, SLOT(refresh()));
connect(btnRefresh, &QPushButton::clicked, [this]{
if (!refreshThread->isRunning())
refreshThread->start();
});
}
ServerInfoDialog::~ServerInfoDialog()
{
worker->dialog = nullptr;
if (!refreshThread->isRunning())
refreshThread->terminate();
}
bool ServerInfoDialog::isUpdated()
{
return sd.first != UNASSIGNED_SYSTEM_ADDRESS;
}
void ServerInfoDialog::setData(std::pair<RakNet::SystemAddress, QueryData> &newSD)
{
sd = newSD;
}
void ServerInfoDialog::refresh()
{
if (sd.first != UNASSIGNED_SYSTEM_ADDRESS) if (sd.first != UNASSIGNED_SYSTEM_ADDRESS)
{ {
leAddr->setText(sd.first.ToString(true, ':')); leAddr->setText(sd.first.ToString(true, ':'));
@ -37,17 +74,16 @@ bool ServerInfoDialog::refresh()
btnConnect->setDisabled(ping == PING_UNREACHABLE); btnConnect->setDisabled(ping == PING_UNREACHABLE);
listPlayers->clear(); listPlayers->clear();
for (const auto &player : sd.second.players) for (const auto &player : sd.second.players)
listPlayers->addItem(QString::fromStdString(player)); listPlayers->addItem(QString::fromStdString(player));
listPlugins->clear(); listPlugins->clear();
for (auto plugin : sd.second.plugins) for (const auto &plugin : sd.second.plugins)
listPlugins->addItem(QString::fromStdString(plugin.name)); listPlugins->addItem(QString::fromStdString(plugin.name));
listRules->clear(); listRules->clear();
const static vector<std::string> defaultRules {"gamemode", "maxPlayers", "name", "passw", "players", "version"}; const static vector<std::string> defaultRules {"gamemode", "maxPlayers", "name", "passw", "players", "version"};
for (auto rule : sd.second.rules) for (auto &rule : sd.second.rules)
{ {
if (::find(defaultRules.begin(), defaultRules.end(), rule.first) != defaultRules.end()) if (::find(defaultRules.begin(), defaultRules.end(), rule.first) != defaultRules.end())
continue; continue;
@ -60,7 +96,12 @@ bool ServerInfoDialog::refresh()
} }
lblPlayers->setText(QString::number(sd.second.players.size()) + " / " + QString::number(sd.second.GetMaxPlayers())); lblPlayers->setText(QString::number(sd.second.players.size()) + " / " + QString::number(sd.second.GetMaxPlayers()));
return true;
} }
return false; }
int ServerInfoDialog::exec()
{
if (!refreshThread->isRunning())
refreshThread->start();
return QDialog::exec();
} }

@ -6,17 +6,45 @@
#define NEWLAUNCHER_SERVERINFODIALOG_HPP #define NEWLAUNCHER_SERVERINFODIALOG_HPP
#include "ui_ServerInfo.h" #include "ui_ServerInfo.h"
#include <apps/browser/netutils/Utils.hpp>
#include <RakNetTypes.h>
#include <components/openmw-mp/Master/MasterData.hpp>
class ThrWorker;
class ServerInfoDialog : public QDialog, public Ui::Dialog class ServerInfoDialog : public QDialog, public Ui::Dialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ServerInfoDialog(QWidget *parent = nullptr); explicit ServerInfoDialog(const QString &addr, QWidget *parent = nullptr);
void Server(const QString &addr); ~ServerInfoDialog() override;
bool isUpdated();
void setData(std::pair<RakNet::SystemAddress, QueryData> &newSD);
public slots:
void refresh();
int exec() Q_DECL_OVERRIDE;
private:
QThread *refreshThread;
ThrWorker* worker;
std::pair<RakNet::SystemAddress, QueryData> sd;
};
class ThrWorker: public QObject
{
friend class ServerInfoDialog;
Q_OBJECT
public:
ThrWorker(ServerInfoDialog *dialog, QString addr, unsigned short port);
public slots: public slots:
bool refresh(); void process();
signals:
void finished();
private: private:
QString addr; QString addr;
unsigned short port;
bool stopped;
ServerInfoDialog *dialog;
}; };

Loading…
Cancel
Save