changeset 17827:808fd7d57d64 draft

(svn r22618) -Fix [FS#4653]: When changing difficulty settings over the network, do not just reopen the difficulty window if any game options window is opened; instead invalidate them properly.
author frosch <frosch@openttd.org>
date Sat, 02 Jul 2011 12:58:37 +0000
parents 03d75c842b87
children 111bcb2076f3
files src/settings.cpp src/settings_gui.cpp src/window_type.h
diffstat 3 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1009,9 +1009,7 @@
 	/* If we are a network-client, update the difficult setting (if it is open).
 	 * Use this instead of just dirtying the window because we need to load in
 	 * the new difficulty settings */
-	if (_networking && FindWindowById(WC_GAME_OPTIONS, 0) != NULL) {
-		ShowGameDifficulty();
-	}
+	if (_networking) InvalidateWindowClassesData(WC_GAME_OPTIONS, GOID_DIFFICULTY_CHANGED);
 
 	return true;
 }
--- a/src/settings_gui.cpp
+++ b/src/settings_gui.cpp
@@ -659,9 +659,6 @@
 	{
 		this->InitNested(desc);
 
-		/* Copy current settings (ingame or in intro) to temporary holding place
-		 * change that when setting stuff, copy back on clicking 'OK' */
-		this->opt_mod_temp = GetGameSettings();
 		/* Setup disabled buttons when creating window
 		 * disable all other difficulty buttons during gameplay except for 'custom' */
 		this->SetWidgetsDisabledState(_game_mode != GM_MENU,
@@ -672,8 +669,9 @@
 			WIDGET_LIST_END);
 		this->SetWidgetDisabledState(GDW_HIGHSCORE, _game_mode == GM_EDITOR || _networking); // highscore chart in multiplayer
 		this->SetWidgetDisabledState(GDW_ACCEPT, _networking && !_network_server); // Save-button in multiplayer (and if client)
-		this->LowerWidget(GDW_LVL_EASY + this->opt_mod_temp.difficulty.diff_level);
-		this->OnInvalidateData();
+
+		/* Read data */
+		this->OnInvalidateData(GOID_DIFFICULTY_CHANGED);
 	}
 
 	virtual void SetStringParameters(int widget) const
@@ -803,6 +801,17 @@
 	virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
 	{
 		if (!gui_scope) return;
+
+		if (data == GOID_DIFFICULTY_CHANGED) {
+			/* Window was created or settings were changed on server. Reread everything. */
+
+			/* Copy current settings (ingame or in intro) to temporary holding place
+			 * change that when setting stuff, copy back on clicking 'OK' */
+			this->opt_mod_temp = GetGameSettings();
+
+			this->LowerWidget(GDW_LVL_EASY + this->opt_mod_temp.difficulty.diff_level);
+		}
+
 		uint i;
 		const SettingDesc *sd = GetSettingFromName("difficulty.max_no_competitors", &i);
 		for (i = 0; i < GAME_DIFFICULTY_NUM; i++, sd++) {
--- a/src/window_type.h
+++ b/src/window_type.h
@@ -123,6 +123,7 @@
 	GOID_NEWGRF_RESCANNED,     ///< NewGRFs were just rescanned.
 	GOID_NEWGRF_LIST_EDITED,   ///< List of active NewGRFs is being edited.
 	GOID_NEWGRF_PRESET_LOADED, ///< A NewGRF preset was picked.
+	GOID_DIFFICULTY_CHANGED,   ///< Difficulty settings were changed.
 };
 
 struct Window;