diff --git a/apps/browser/CMakeLists.txt b/apps/browser/CMakeLists.txt index 52bf0adf2..3e1d53b87 100644 --- a/apps/browser/CMakeLists.txt +++ b/apps/browser/CMakeLists.txt @@ -16,6 +16,7 @@ set(BROWSER netutils/QueryClient.cpp PingUpdater.cpp PingHelper.cpp + QueryHelper.cpp ${CMAKE_SOURCE_DIR}/files/tes3mp/browser.rc ) @@ -26,6 +27,7 @@ set(BROWSER_HEADER_MOC MySortFilterProxyModel.hpp PingUpdater.hpp PingHelper.hpp + QueryHelper.hpp ) set(BROWSER_HEADER diff --git a/apps/browser/MainWindow.cpp b/apps/browser/MainWindow.cpp index fb21d88c3..59e4dd60b 100644 --- a/apps/browser/MainWindow.cpp +++ b/apps/browser/MainWindow.cpp @@ -3,17 +3,17 @@ // #include "MainWindow.hpp" +#include "QueryHelper.hpp" +#include "PingHelper.hpp" #include "ServerInfoDialog.hpp" #include "components/files/configurationmanager.hpp" -#include "PingHelper.hpp" #include #include #include #include #include #include -#include -#include + using namespace Process; using namespace std; @@ -35,12 +35,13 @@ MainWindow::MainWindow(QWidget *parent) tblFavorites->hideColumn(ServerData::ADDR); PingHelper::Get().SetModel((ServerModel*)proxyModel->sourceModel()); + queryHelper = new QueryHelper(proxyModel->sourceModel()); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabSwitched(int))); connect(actionAdd, SIGNAL(triggered(bool)), this, SLOT(addServer())); connect(actionAdd_by_IP, SIGNAL(triggered(bool)), this, SLOT(addServerByIP())); connect(actionDelete, SIGNAL(triggered(bool)), this, SLOT(deleteServer())); - connect(actionRefresh, SIGNAL(triggered(bool)), this, SLOT(refresh())); + connect(actionRefresh, SIGNAL(triggered(bool)), queryHelper, SLOT(refresh())); connect(actionPlay, SIGNAL(triggered(bool)), this, SLOT(play())); connect(tblServerBrowser, SIGNAL(clicked(QModelIndex)), this, SLOT(serverSelected())); connect(tblFavorites, SIGNAL(clicked(QModelIndex)), this, SLOT(serverSelected())); @@ -51,6 +52,7 @@ MainWindow::MainWindow(QWidget *parent) connect(comboLatency, SIGNAL(currentIndexChanged(int)), this, SLOT(maxLatencyChanged(int))); connect(leGamemode, SIGNAL(textChanged(const QString &)), this, SLOT(gamemodeChanged(const QString &))); loadFavorites(); + queryHelper->refresh(); } MainWindow::~MainWindow() @@ -107,49 +109,6 @@ void MainWindow::deleteServer() } } -bool MainWindow::refresh() -{ - auto data = QueryClient::Get().Query(); - if(QueryClient::Get().Status() != ID_MASTER_QUERY) - return false; - - ServerModel *model = ((ServerModel*)proxyModel->sourceModel()); - model->removeRows(0, model->rowCount()); - for(auto server : data) - { - model->insertRow(model->rowCount()); - int row = model->rowCount() - 1; - - QModelIndex mi = model->index(row, ServerData::ADDR); - model->setData(mi, server.first.ToString(true, ':')); - - mi = model->index(row, ServerData::PLAYERS); - model->setData(mi, (int)server.second.players.size()); - - mi = model->index(row, ServerData::MAX_PLAYERS); - model->setData(mi, server.second.GetMaxPlayers()); - - mi = model->index(row, ServerData::HOSTNAME); - model->setData(mi, server.second.GetName()); - - mi = model->index(row, ServerData::MODNAME); - model->setData(mi, server.second.GetGameMode()); - - mi = model->index(row, ServerData::VERSION); - model->setData(mi, server.second.GetVersion()); - - mi = model->index(row, ServerData::PASSW); - model->setData(mi, server.second.GetPassword() == 1); - - mi = model->index(row, ServerData::PING); - model->setData(mi, PING_UNREACHABLE); - - PingHelper::Get().Add(row, {server.first.ToString(false), server.first.GetPort()}); - } - - return true; -} - void MainWindow::play() { QTableView *curTable = tabWidget->currentIndex() ? tblFavorites : tblServerBrowser; diff --git a/apps/browser/MainWindow.hpp b/apps/browser/MainWindow.hpp index d5d274cf9..cf047d84b 100644 --- a/apps/browser/MainWindow.hpp +++ b/apps/browser/MainWindow.hpp @@ -11,6 +11,8 @@ #include "MySortFilterProxyModel.hpp" #include +class QueryHelper; + class MainWindow : public QMainWindow, private Ui::MainWindow { Q_OBJECT @@ -20,8 +22,6 @@ public: protected: void closeEvent(QCloseEvent * event) Q_DECL_OVERRIDE; void addServerAndUpdate(QString addr); -public slots: - bool refresh(); protected slots: void tabSwitched(int index); void addServer(); @@ -34,6 +34,7 @@ protected slots: void maxLatencyChanged(int index); void gamemodeChanged(const QString &text); private: + QueryHelper *queryHelper; Process::ProcessInvoker *mGameInvoker; ServerModel *browser, *favorites; MySortFilterProxyModel *proxyModel; diff --git a/apps/browser/QueryHelper.cpp b/apps/browser/QueryHelper.cpp new file mode 100644 index 000000000..f686ca73a --- /dev/null +++ b/apps/browser/QueryHelper.cpp @@ -0,0 +1,72 @@ +// +// Created by koncord on 27.05.17. +// + +#include "netutils/QueryClient.hpp" +#include "netutils/Utils.hpp" +#include "QueryHelper.hpp" +#include "PingHelper.hpp" + +QueryUpdate *queryUpdate; + +QueryHelper::QueryHelper(QAbstractItemModel *model) +{ + queryThread = new QThread; + queryUpdate = new QueryUpdate; + queryUpdate->_model = model; + connect(queryThread, SIGNAL(started()), queryUpdate, SLOT(process())); + connect(queryUpdate, SIGNAL(finished()), queryThread, SLOT(quit())); + queryUpdate->moveToThread(queryThread); +} + +void QueryHelper::refresh() +{ + queryThread->start(); +} + +void QueryHelper::terminate() +{ + queryThread->terminate(); +} + +void QueryUpdate::process() +{ + 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; + + QModelIndex mi = model->index(row, ServerData::ADDR); + model->setData(mi, server.first.ToString(true, ':')); + + mi = model->index(row, ServerData::PLAYERS); + model->setData(mi, (int)server.second.players.size()); + + mi = model->index(row, ServerData::MAX_PLAYERS); + model->setData(mi, server.second.GetMaxPlayers()); + + mi = model->index(row, ServerData::HOSTNAME); + model->setData(mi, server.second.GetName()); + + mi = model->index(row, ServerData::MODNAME); + model->setData(mi, server.second.GetGameMode()); + + mi = model->index(row, ServerData::VERSION); + model->setData(mi, server.second.GetVersion()); + + mi = model->index(row, ServerData::PASSW); + model->setData(mi, server.second.GetPassword() == 1); + + mi = model->index(row, ServerData::PING); + model->setData(mi, PING_UNREACHABLE); + + PingHelper::Get().Add(row, {server.first.ToString(false), server.first.GetPort()}); + } + emit finished(); +} diff --git a/apps/browser/QueryHelper.hpp b/apps/browser/QueryHelper.hpp new file mode 100644 index 000000000..ee04de7fd --- /dev/null +++ b/apps/browser/QueryHelper.hpp @@ -0,0 +1,37 @@ +// +// Created by koncord on 27.05.17. +// + + +#ifndef OPENMW_QUERYHELPER_HPP +#define OPENMW_QUERYHELPER_HPP + + +#include +#include + +class QueryHelper : public QObject +{ +Q_OBJECT +public: + explicit QueryHelper(QAbstractItemModel *model); +public slots: + void refresh(); + void terminate(); +private: + QThread *queryThread; +}; + +class QueryUpdate : public QObject +{ + friend class QueryHelper; +Q_OBJECT +signals: + void finished(); +public slots: + void process(); +private: + QAbstractItemModel *_model; +}; + +#endif //OPENMW_QUERYHELPER_HPP \ No newline at end of file diff --git a/apps/browser/main.cpp b/apps/browser/main.cpp index c1a7b19e1..01405304f 100644 --- a/apps/browser/main.cpp +++ b/apps/browser/main.cpp @@ -44,6 +44,5 @@ int main(int argc, char *argv[]) MainWindow d; d.show(); - d.refresh(); return app.exec(); } \ No newline at end of file