diff --git a/apps/browser/QueryHelper.cpp b/apps/browser/QueryHelper.cpp index 2155fea6d..ebaee99c2 100644 --- a/apps/browser/QueryHelper.cpp +++ b/apps/browser/QueryHelper.cpp @@ -9,14 +9,18 @@ QueryUpdate *queryUpdate; + QueryHelper::QueryHelper(QAbstractItemModel *model) { + qRegisterMetaType("QueryData"); queryThread = new QThread; queryUpdate = new QueryUpdate; - queryUpdate->_model = model; + _model = model; connect(queryThread, SIGNAL(started()), queryUpdate, SLOT(process())); connect(queryUpdate, SIGNAL(finished()), queryThread, SLOT(quit())); connect(queryUpdate, &QueryUpdate::finished, [this](){emit finished();}); + connect(queryUpdate, SIGNAL(updateModel(QString, unsigned short, QueryData)), + this, SLOT(update(QString, unsigned short, QueryData))); queryUpdate->moveToThread(queryThread); } @@ -31,44 +35,48 @@ void QueryHelper::terminate() queryThread->terminate(); } -void QueryUpdate::process() +void QueryHelper::update(QString addr, unsigned short port, QueryData data) { - auto data = QueryClient::Get().Query(); - if(QueryClient::Get().Status() != ID_MASTER_QUERY) - return; - ServerModel *model = ((ServerModel*)_model); - model->removeRows(0, model->rowCount()); - for(auto server : data) - { - model->insertRow(model->rowCount()); - int row = model->rowCount() - 1; + model->insertRow(model->rowCount()); + int row = model->rowCount() - 1; - QModelIndex mi = model->index(row, ServerData::ADDR); - model->setData(mi, server.first.ToString(true, ':')); + QModelIndex mi = model->index(row, ServerData::ADDR); + model->setData(mi, addr + ":" + QString::number(port)); - mi = model->index(row, ServerData::PLAYERS); - model->setData(mi, (int)server.second.players.size()); + mi = model->index(row, ServerData::PLAYERS); + model->setData(mi, (int)data.players.size()); - mi = model->index(row, ServerData::MAX_PLAYERS); - model->setData(mi, server.second.GetMaxPlayers()); + mi = model->index(row, ServerData::MAX_PLAYERS); + model->setData(mi, data.GetMaxPlayers()); - mi = model->index(row, ServerData::HOSTNAME); - model->setData(mi, server.second.GetName()); + mi = model->index(row, ServerData::HOSTNAME); + model->setData(mi, data.GetName()); - mi = model->index(row, ServerData::MODNAME); - model->setData(mi, server.second.GetGameMode()); + mi = model->index(row, ServerData::MODNAME); + model->setData(mi, data.GetGameMode()); - mi = model->index(row, ServerData::VERSION); - model->setData(mi, server.second.GetVersion()); + mi = model->index(row, ServerData::VERSION); + model->setData(mi, data.GetVersion()); - mi = model->index(row, ServerData::PASSW); - model->setData(mi, server.second.GetPassword() == 1); + mi = model->index(row, ServerData::PASSW); + model->setData(mi, data.GetPassword() == 1); - mi = model->index(row, ServerData::PING); - model->setData(mi, PING_UNREACHABLE); + mi = model->index(row, ServerData::PING); + model->setData(mi, PING_UNREACHABLE); + PingHelper::Get().Add(row, {addr, port}); +} - PingHelper::Get().Add(row, {server.first.ToString(false), server.first.GetPort()}); +void QueryUpdate::process() +{ + auto data = QueryClient::Get().Query(); + if(QueryClient::Get().Status() != ID_MASTER_QUERY) + { + emit finished(); + return; } + + for(auto server : data) + emit updateModel(server.first.ToString(false), server.first.GetPort(), server.second); emit finished(); } diff --git a/apps/browser/QueryHelper.hpp b/apps/browser/QueryHelper.hpp index b7ac16cda..6932670cd 100644 --- a/apps/browser/QueryHelper.hpp +++ b/apps/browser/QueryHelper.hpp @@ -8,7 +8,11 @@ #include +#include #include +#include + +Q_DECLARE_METATYPE(QueryData) class QueryHelper : public QObject { @@ -18,11 +22,14 @@ public: public slots: void refresh(); void terminate(); +private slots: + void update(QString addr, unsigned short port, QueryData data); signals: void finished(); void started(); private: QThread *queryThread; + QAbstractItemModel *_model; }; class QueryUpdate : public QObject @@ -31,10 +38,9 @@ class QueryUpdate : public QObject Q_OBJECT signals: void finished(); + void updateModel(QString addr, unsigned short port, QueryData data); public slots: void process(); -private: - QAbstractItemModel *_model; }; #endif //OPENMW_QUERYHELPER_HPP \ No newline at end of file