diff --git a/src/network/network.cpp b/src/network/network.cpp --- 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::strin { 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 --- 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 --- 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(WID_NG_NEWGRF_SEL)->SetDisplayedPlane(sel == nullptr || sel->status != NGLS_ONLINE || sel->info.grfconfig == nullptr); this->GetWidget(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 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -79,6 +79,7 @@ NetworkRecvStatus QueryNetworkGameSocket { NetworkGameList *item = NetworkGameListAddItem(this->connection_string); item->status = NGLS_FULL; + item->refreshing = false; UpdateNetworkGameWindow(); @@ -89,6 +90,7 @@ NetworkRecvStatus QueryNetworkGameSocket { NetworkGameList *item = NetworkGameListAddItem(this->connection_string); item->status = NGLS_BANNED; + item->refreshing = false; UpdateNetworkGameWindow(); @@ -107,6 +109,7 @@ NetworkRecvStatus QueryNetworkGameSocket CheckGameCompatibility(item->info); /* Ensure we consider the server online. */ item->status = NGLS_ONLINE; + item->refreshing = false; UpdateNetworkGameWindow(); @@ -128,6 +131,7 @@ NetworkRecvStatus QueryNetworkGameSocket } else { item->status = NGLS_OFFLINE; } + item->refreshing = false; UpdateNetworkGameWindow();