summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/network.cpp5
-rw-r--r--src/network/network_gamelist.h2
-rw-r--r--src/network/network_gui.cpp4
-rw-r--r--src/network/network_query.cpp4
4 files changed, 13 insertions, 2 deletions
diff --git a/src/network/network.cpp b/src/network/network.cpp
index 09b748fc5..109a2cce7 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -635,6 +635,7 @@ public:
{
NetworkGameList *item = NetworkGameListAddItem(connection_string);
item->status = NGLS_OFFLINE;
+ item->refreshing = false;
UpdateNetworkGameWindow();
}
@@ -653,6 +654,10 @@ void NetworkQueryServer(const std::string &connection_string)
{
if (!_network_available) return;
+ /* Mark the entry as refreshing, so the GUI can show the refresh is pending. */
+ NetworkGameList *item = NetworkGameListAddItem(connection_string);
+ item->refreshing = true;
+
new TCPQueryConnecter(connection_string);
}
diff --git a/src/network/network_gamelist.h b/src/network/network_gamelist.h
index 24ce41bc8..1c4a68e5c 100644
--- a/src/network/network_gamelist.h
+++ b/src/network/network_gamelist.h
@@ -31,7 +31,7 @@ struct NetworkGameList {
std::string connection_string; ///< Address of the server.
NetworkGameListStatus status = NGLS_OFFLINE; ///< Stats of the server.
bool manually = false; ///< True if the server was added manually.
- uint8 retries = 0; ///< Number of retries (to stop requerying).
+ bool refreshing = false; ///< Whether this server is being queried.
int version = 0; ///< Used to see which servers are no longer available on the Game Coordinator and can be removed.
NetworkGameList *next = nullptr; ///< Next pointer to make a linked game list.
};
diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp
index 03fd0ce5c..6bca0c756 100644
--- a/src/network/network_gui.cpp
+++ b/src/network/network_gui.cpp
@@ -613,6 +613,8 @@ public:
sel->info.clients_on >= sel->info.clients_max || // Server full
!sel->info.compatible); // Revision mismatch
+ this->SetWidgetLoweredState(WID_NG_REFRESH, sel != nullptr && sel->refreshing);
+
/* 'NewGRF Settings' button invisible if no NewGRF is used */
this->GetWidget<NWidgetStacked>(WID_NG_NEWGRF_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr);
this->GetWidget<NWidgetStacked>(WID_NG_NEWGRF_MISSING_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr || !sel->info.version_compatible || sel->info.compatible);
@@ -790,7 +792,7 @@ public:
break;
case WID_NG_REFRESH: // Refresh
- if (this->server != nullptr) NetworkQueryServer(this->server->connection_string);
+ if (this->server != nullptr && !this->server->refreshing) NetworkQueryServer(this->server->connection_string);
break;
case WID_NG_NEWGRF: // NewGRF Settings
diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp
index 033c32e7c..139daafe4 100644
--- a/src/network/network_query.cpp
+++ b/src/network/network_query.cpp
@@ -79,6 +79,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *p)
{
NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
item->status = NGLS_FULL;
+ item->refreshing = false;
UpdateNetworkGameWindow();
@@ -89,6 +90,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *p
{
NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
item->status = NGLS_BANNED;
+ item->refreshing = false;
UpdateNetworkGameWindow();
@@ -107,6 +109,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet
CheckGameCompatibility(item->info);
/* Ensure we consider the server online. */
item->status = NGLS_ONLINE;
+ item->refreshing = false;
UpdateNetworkGameWindow();
@@ -128,6 +131,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
} else {
item->status = NGLS_OFFLINE;
}
+ item->refreshing = false;
UpdateNetworkGameWindow();