#region Copyright & License Information /* * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, * see COPYING. */ #endregion using System; using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { public class MenuButtonsChromeLogic : ChromeLogic { readonly World world; readonly Widget worldRoot; readonly Widget menuRoot; bool disableSystemButtons; Widget currentWidget; [ObjectCreator.UseCtor] public MenuButtonsChromeLogic(Widget widget, World world) { this.world = world; worldRoot = Ui.Root.Get("WORLD_ROOT"); menuRoot = Ui.Root.Get("MENU_ROOT"); // System buttons var options = widget.GetOrNull("OPTIONS_BUTTON"); if (options != null) { var blinking = false; var lp = world.LocalPlayer; options.IsDisabled = () => disableSystemButtons; options.OnClick = () => { blinking = false; OpenMenuPanel(options, new WidgetArgs() { { "activePanel", IngameInfoPanel.AutoSelect } }); }; options.IsHighlighted = () => blinking && Game.LocalTick % 50 < 25; if (lp != null) { Action startBlinking = (player, inhibitAnnouncement) => { if (!inhibitAnnouncement && player == world.LocalPlayer) blinking = true; }; var mo = lp.PlayerActor.TraitOrDefault(); if (mo != null) mo.ObjectiveAdded += startBlinking; } } var diplomacy = widget.GetOrNull("DIPLOMACY_BUTTON"); if (diplomacy != null) { diplomacy.Visible = !world.Map.Visibility.HasFlag(MapVisibility.MissionSelector) && world.Players.Any(a => a != world.LocalPlayer && !a.NonCombatant); diplomacy.IsDisabled = () => disableSystemButtons; diplomacy.OnClick = () => OpenMenuPanel(diplomacy); } var debug = widget.GetOrNull("DEBUG_BUTTON"); if (debug != null) { debug.IsVisible = () => world.LobbyInfo.GlobalSettings.AllowCheats; debug.IsDisabled = () => disableSystemButtons; debug.OnClick = () => OpenMenuPanel(debug, new WidgetArgs() { { "activePanel", IngameInfoPanel.Debug } }); } var stats = widget.GetOrNull("OBSERVER_STATS_BUTTON"); if (stats != null) { stats.IsDisabled = () => disableSystemButtons || world.Map.Visibility.HasFlag(MapVisibility.MissionSelector); stats.OnClick = () => OpenMenuPanel(stats); } } void OpenMenuPanel(MenuButtonWidget button, WidgetArgs widgetArgs = null) { disableSystemButtons = true; var cachedPause = world.PredictedPaused; if (button.HideIngameUI) { // Cancel custom input modes (guard, building placement, etc) world.CancelInputMode(); worldRoot.IsVisible = () => false; } if (button.Pause && world.LobbyInfo.IsSinglePlayer) world.SetPauseState(true); widgetArgs = widgetArgs ?? new WidgetArgs(); widgetArgs.Add("onExit", () => { if (button.HideIngameUI) worldRoot.IsVisible = () => true; if (button.Pause && world.LobbyInfo.IsSinglePlayer) world.SetPauseState(cachedPause); menuRoot.RemoveChild(currentWidget); disableSystemButtons = false; }); currentWidget = Game.LoadWidget(world, button.MenuContainer, menuRoot, widgetArgs); } } }