diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index ce24c64b20..80e2fdf05e 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -23,6 +23,17 @@ namespace OpenRA public enum MouseScrollType { Disabled, Standard, Inverted, Joystick } public enum StatusBarsType { Standard, DamageShow, AlwaysShow } + [Flags] + public enum MPGameFilters + { + None = 0, + Waiting = 1, + Empty = 2, + Protected = 4, + Started = 8, + Incompatible = 16 + } + public class ServerSettings { [Desc("Sets the server name.")] @@ -182,6 +193,8 @@ namespace OpenRA public bool FetchNews = true; public string NewsUrl = "http://master.openra.net/gamenews"; + + public MPGameFilters MPGameFilters = MPGameFilters.Waiting | MPGameFilters.Empty | MPGameFilters.Protected; } public class KeySettings diff --git a/OpenRA.Mods.Common/Widgets/Logic/MultiplayerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MultiplayerLogic.cs index 86730c90d7..f94d15758f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MultiplayerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MultiplayerLogic.cs @@ -52,12 +52,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic Download currentQuery; Widget serverList; - bool showWaiting = true; - bool showEmpty = true; - bool showStarted = false; - bool showProtected = true; - bool showIncompatible = false; - public string ProgressLabelText() { switch (searchStatus) @@ -145,40 +139,48 @@ namespace OpenRA.Mods.Common.Widgets.Logic progressText.IsVisible = () => searchStatus != SearchStatus.Hidden; progressText.GetText = ProgressLabelText; + var gs = Game.Settings.Game; + Action toggleFilterFlag = f => + { + gs.MPGameFilters ^= f; + Game.Settings.Save(); + RefreshServerList(); + }; + var filtersPanel = Ui.LoadWidget("MULTIPLAYER_FILTER_PANEL", null, new WidgetArgs()); var showWaitingCheckbox = filtersPanel.GetOrNull("WAITING_FOR_PLAYERS"); if (showWaitingCheckbox != null) { - showWaitingCheckbox.IsChecked = () => showWaiting; - showWaitingCheckbox.OnClick = () => { showWaiting ^= true; RefreshServerList(); }; + showWaitingCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Waiting); + showWaitingCheckbox.OnClick = () => toggleFilterFlag(MPGameFilters.Waiting); } var showEmptyCheckbox = filtersPanel.GetOrNull("EMPTY"); if (showEmptyCheckbox != null) { - showEmptyCheckbox.IsChecked = () => showEmpty; - showEmptyCheckbox.OnClick = () => { showEmpty ^= true; RefreshServerList(); }; + showEmptyCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Empty); + showEmptyCheckbox.OnClick = () => toggleFilterFlag(MPGameFilters.Empty); } var showAlreadyStartedCheckbox = filtersPanel.GetOrNull("ALREADY_STARTED"); if (showAlreadyStartedCheckbox != null) { - showAlreadyStartedCheckbox.IsChecked = () => showStarted; - showAlreadyStartedCheckbox.OnClick = () => { showStarted ^= true; RefreshServerList(); }; + showAlreadyStartedCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Started); + showAlreadyStartedCheckbox.OnClick = () => toggleFilterFlag(MPGameFilters.Started); } var showProtectedCheckbox = filtersPanel.GetOrNull("PASSWORD_PROTECTED"); if (showProtectedCheckbox != null) { - showProtectedCheckbox.IsChecked = () => showProtected; - showProtectedCheckbox.OnClick = () => { showProtected ^= true; RefreshServerList(); }; + showProtectedCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Protected); + showProtectedCheckbox.OnClick = () => toggleFilterFlag(MPGameFilters.Protected); } var showIncompatibleCheckbox = filtersPanel.GetOrNull("INCOMPATIBLE_VERSION"); if (showIncompatibleCheckbox != null) { - showIncompatibleCheckbox.IsChecked = () => showIncompatible; - showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; RefreshServerList(); }; + showIncompatibleCheckbox.IsChecked = () => gs.MPGameFilters.HasFlag(MPGameFilters.Incompatible); + showIncompatibleCheckbox.OnClick = () => toggleFilterFlag(MPGameFilters.Incompatible); } var filtersButton = widget.GetOrNull("FILTERS_DROPDOWNBUTTON"); @@ -541,19 +543,20 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool Filtered(GameServer game) { - if (game.State == (int)ServerState.GameStarted && !showStarted) + var filters = Game.Settings.Game.MPGameFilters; + if (game.State == (int)ServerState.GameStarted && !filters.HasFlag(MPGameFilters.Started)) return true; - if (game.State == (int)ServerState.WaitingPlayers && !showWaiting && game.Players != 0) + if (game.State == (int)ServerState.WaitingPlayers && !filters.HasFlag(MPGameFilters.Waiting) && game.Players != 0) return true; - if (game.Players == 0 && !showEmpty) + if (game.Players == 0 && !filters.HasFlag(MPGameFilters.Empty)) return true; - if (!game.IsCompatible && !showIncompatible) + if (!game.IsCompatible && !filters.HasFlag(MPGameFilters.Incompatible)) return true; - if (game.Protected && !showProtected) + if (game.Protected && !filters.HasFlag(MPGameFilters.Protected)) return true; return false;