Don’t switch mods from inside button click handlers.

Fixes screen flickering and desyncs when returning to the mod chooser.
This commit is contained in:
Paul Chote
2015-06-17 21:55:48 +01:00
parent f72a14faea
commit 75210b692e
5 changed files with 22 additions and 12 deletions

View File

@@ -48,7 +48,8 @@ namespace OpenRA.Mods.Common.LoadScreens
{
var widgetArgs = new WidgetArgs()
{
{ "continueLoading", () => Game.InitializeMod(Game.Settings.Game.Mod, args) },
{ "continueLoading", () => Game.RunAfterTick(() =>
Game.InitializeMod(Game.Settings.Game.Mod, args)) },
};
if (installData.BackgroundWidget != null)

View File

@@ -36,8 +36,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
{
Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id;
Game.InitializeMod("modchooser", null);
Game.RunAfterTick(() =>
{
Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id;
Game.InitializeMod("modchooser", null);
});
};
}
}

View File

@@ -24,9 +24,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
var installMusicContainer = widget.Get("INSTALL_MUSIC_PANEL");
Action loadDefaultMod = () => Game.RunAfterTick(() =>
Game.InitializeMod(Game.Settings.Game.Mod, null));
var cancelButton = installMusicContainer.GetOrNull<ButtonWidget>("CANCEL_BUTTON");
if (cancelButton != null)
cancelButton.OnClick = () => Game.InitializeMod(Game.Settings.Game.Mod, null);
cancelButton.OnClick = loadDefaultMod;
var copyFromDiscButton = installMusicContainer.GetOrNull<ButtonWidget>("COPY_FROM_CD_BUTTON");
if (copyFromDiscButton != null)
@@ -34,7 +37,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
copyFromDiscButton.OnClick = () =>
{
Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs() {
{ "continueLoading", () => Game.InitializeMod(Game.Settings.Game.Mod, null) },
{ "continueLoading", loadDefaultMod },
});
};
}
@@ -47,7 +50,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
downloadButton.OnClick = () =>
{
Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", new WidgetArgs() {
{ "afterInstall", () => Game.InitializeMod(Game.Settings.Game.Mod, null) },
{ "afterInstall", loadDefaultMod },
{ "mirrorListUrl", installData.MusicPackageMirrorList },
});
};

View File

@@ -54,8 +54,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
mainMenu.Get<ButtonWidget>("MODS_BUTTON").OnClick = () =>
{
Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id;
Game.InitializeMod("modchooser", null);
// Switching mods changes the world state (by disposing it),
// so we can't do this inside the input handler.
Game.RunAfterTick(() =>
{
Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id;
Game.InitializeMod("modchooser", null);
});
};
mainMenu.Get<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>

View File

@@ -87,10 +87,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
installButton.IsDisabled = () => world == null || world.Type != WorldType.Shellmap;
var args = new string[] { "Install.Music=true" };
installButton.OnClick = () =>
{
Game.ModData.LoadScreen.Display(); // HACK: prevent a flicker when transitioning to the installation dialog
Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args));
};
Game.RunAfterTick(() =>
Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args)));
var installData = Game.ModData.Manifest.Get<ContentInstaller>();
installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length <= installData.ShippedSoundtracks;