diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 96b179f60e..410f144abf 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -285,7 +285,6 @@ - diff --git a/OpenRA.Game/Widgets/CheckboxWidget.cs b/OpenRA.Game/Widgets/CheckboxWidget.cs index 3795fec7a9..35ebfd4e5d 100644 --- a/OpenRA.Game/Widgets/CheckboxWidget.cs +++ b/OpenRA.Game/Widgets/CheckboxWidget.cs @@ -19,13 +19,15 @@ #endregion using System.Drawing; +using System; namespace OpenRA.Widgets { class CheckboxWidget : Widget { public string Text = ""; - + public Func Checked = () => {return false;}; + public override void Draw() { if (!Visible) @@ -34,8 +36,6 @@ namespace OpenRA.Widgets return; } - var selected = InputHandler.Value != null ? InputHandler.Value.GetState(this) : false; - WidgetUtils.DrawPanel("dialog3", new Rectangle(Bounds.Location, new Size(Bounds.Height, Bounds.Height)), @@ -44,7 +44,7 @@ namespace OpenRA.Widgets Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, Text, new float2(Bounds.Left + Bounds.Height * 2, Bounds.Top), Color.White); - if (selected) + if (Checked()) { Game.chrome.lineRenderer.FillRect( new RectangleF( diff --git a/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs b/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs index 9622c9602d..7490cc197a 100644 --- a/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -20,29 +20,23 @@ namespace OpenRA.Widgets.Delegates { - public class ConnectionDialogsDelegate : WidgetDelegate + public class ConnectionDialogsDelegate : IWidgetDelegate { - public override bool OnMouseUp(Widget w, MouseInput mi) + public ConnectionDialogsDelegate() { - // Main Menu root - if (w.Id == "CONNECTION_BUTTON_ABORT") - { + var r = Game.chrome.rootWidget; + r.GetWidget("CONNECTION_BUTTON_ABORT").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; - } - - if (w.Id == "CONNECTION_BUTTON_CANCEL") - { + }; + r.GetWidget("CONNECTION_BUTTON_CANCEL").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; - } - - if (w.Id == "CONNECTION_BUTTON_RETRY") - { + }; + r.GetWidget("CONNECTION_BUTTON_RETRY").OnMouseUp = mi => { Game.JoinServer(Game.CurrentHost, Game.CurrentPort); return true; - } - return false; + }; } } } diff --git a/OpenRA.Game/Widgets/Delegates/CreateServerMenuDelegate.cs b/OpenRA.Game/Widgets/Delegates/CreateServerMenuDelegate.cs index fd8e2736b5..db59835cf9 100644 --- a/OpenRA.Game/Widgets/Delegates/CreateServerMenuDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/CreateServerMenuDelegate.cs @@ -23,49 +23,27 @@ using System.Linq; using System.Collections.Generic; namespace OpenRA.Widgets.Delegates { - public class CreateServerMenuDelegate : WidgetDelegate + public class CreateServerMenuDelegate : IWidgetDelegate { static bool AdvertiseServerOnline = Game.Settings.InternetServer; - - public override bool GetState(Widget w) + + public CreateServerMenuDelegate() { - if (w.Id == "CREATESERVER_CHECKBOX_ONLINE") - return AdvertiseServerOnline; - - return false; - } - - public override bool OnMouseDown(Widget w, MouseInput mi) - { - if (w.Id == "CREATESERVER_CHECKBOX_ONLINE") - { - AdvertiseServerOnline = !AdvertiseServerOnline; - return true; - } - - return false; - } - - public override bool OnMouseUp(Widget w, MouseInput mi) - { - if (w.Id == "MAINMENU_BUTTON_CREATE") - { + var r = Game.chrome.rootWidget; + r.GetWidget("MAINMENU_BUTTON_CREATE").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("CREATESERVER_BG"); return true; - } - - if (w.Id == "CREATESERVER_BUTTON_CANCEL") - { + }; + + r.GetWidget("CREATESERVER_BUTTON_CANCEL").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; - } - - if (w.Id == "CREATESERVER_BUTTON_START") - { + }; + + r.GetWidget("CREATESERVER_BUTTON_START").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu(null); Log.Write("Creating server"); - // TODO: Get this from a map chooser string map = Game.AvailableMaps.Keys.FirstOrDefault(); @@ -82,9 +60,13 @@ namespace OpenRA.Widgets.Delegates Log.Write("Joining server"); Game.JoinServer(IPAddress.Loopback.ToString(), Game.Settings.ListenPort); return true; - } - - return false; + }; + + r.GetWidget("CREATESERVER_CHECKBOX_ONLINE").Checked = () => {return AdvertiseServerOnline;}; + r.GetWidget("CREATESERVER_CHECKBOX_ONLINE").OnMouseDown = mi => { + AdvertiseServerOnline = !AdvertiseServerOnline; + return true; + }; } } } diff --git a/OpenRA.Game/Widgets/Delegates/MainMenuButtonsDelegate.cs b/OpenRA.Game/Widgets/Delegates/MainMenuButtonsDelegate.cs index f026adea4c..edd949bb6e 100644 --- a/OpenRA.Game/Widgets/Delegates/MainMenuButtonsDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MainMenuButtonsDelegate.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -17,20 +17,14 @@ * along with OpenRA. If not, see . */ #endregion - +using System; namespace OpenRA.Widgets.Delegates { - public class MainMenuButtonsDelegate : WidgetDelegate + public class MainMenuButtonsDelegate : IWidgetDelegate { - public override bool OnMouseUp(Widget w, MouseInput mi) + public MainMenuButtonsDelegate() { - // Main Menu root - if (w.Id == "MAINMENU_BUTTON_QUIT") - { - Game.Exit(); - return true; - } - return false; + Game.chrome.rootWidget.GetWidget("MAINMENU_BUTTON_QUIT").OnMouseUp = mi => {Game.Exit(); return true;}; } } } diff --git a/OpenRA.Game/Widgets/Delegates/ServerBrowserDelegate.cs b/OpenRA.Game/Widgets/Delegates/ServerBrowserDelegate.cs index e0ad07c844..0c33e93083 100644 --- a/OpenRA.Game/Widgets/Delegates/ServerBrowserDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/ServerBrowserDelegate.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. * This file is part of OpenRA. @@ -25,18 +25,17 @@ using OpenRA.Server; namespace OpenRA.Widgets.Delegates { - public class ServerBrowserDelegate : WidgetDelegate + public class ServerBrowserDelegate : IWidgetDelegate { static GameServer[] GameList; static List GameButtons = new List(); - public override bool OnMouseUp(Widget w, MouseInput mi) + public ServerBrowserDelegate() { - // Main Menu root - if (w.Id == "MAINMENU_BUTTON_JOIN") - { + var r = Game.chrome.rootWidget; + r.GetWidget("MAINMENU_BUTTON_JOIN").OnMouseUp = + mi => { var bg = Game.chrome.rootWidget.ShowMenu("JOINSERVER_BG"); - int height = 50; int width = 300; int i = 0; @@ -52,7 +51,13 @@ namespace OpenRA.Widgets.Delegates b.GetType().GetField("Id").SetValue(b, "JOIN_GAME_{0}".F(i)); b.GetType().GetField("Text").SetValue(b, "{0} ({1})".F(game.Name, game.Address)); b.GetType().GetField("Delegate").SetValue(b, "ServerBrowserDelegate"); - + + b.OnMouseUp = nmi => { + Game.chrome.rootWidget.GetWidget("JOINSERVER_BG").Visible = false; + Game.JoinServer(GameList[i].Address.Split(':')[0], int.Parse(GameList[i].Address.Split(':')[1])); + return true; + }; + bg.AddChild(b); GameButtons.Add(b); @@ -60,31 +65,18 @@ namespace OpenRA.Widgets.Delegates } return true; - } - - if (w.Id == "JOINSERVER_BUTTON_DIRECTCONNECT") - { - Game.chrome.rootWidget.GetWidget("JOINSERVER_BG").Visible = false; + }; + + r.GetWidget("JOINSERVER_BUTTON_DIRECTCONNECT").OnMouseUp = mi => { + r.GetWidget("JOINSERVER_BG").Visible = false; Game.JoinServer(Game.Settings.NetworkHost, Game.Settings.NetworkPort); return true; - } - - if (w.Id.Substring(0, 10) == "JOIN_GAME_") - { - Game.chrome.rootWidget.GetWidget("JOINSERVER_BG").Visible = false; - int index = int.Parse(w.Id.Substring(10)); - var game = GameList[index]; - Game.JoinServer(game.Address.Split(':')[0], int.Parse(game.Address.Split(':')[1])); - return true; - } - - if (w.Id == "JOINSERVER_BUTTON_CANCEL") - { + }; + + r.GetWidget("JOINSERVER_BUTTON_CANCEL").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; - } - - return false; + }; } } } diff --git a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs index f8e419d1a6..d5be536d85 100644 --- a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs @@ -1,72 +1,58 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OpenRA.Widgets.Delegates { - public class SettingsMenuDelegate : WidgetDelegate + public class SettingsMenuDelegate : IWidgetDelegate { - public override bool GetState(Widget w) + public SettingsMenuDelegate() { - if (w.Id == "SETTINGS_CHECKBOX_UNITDEBUG") return Game.Settings.UnitDebug; - if (w.Id == "SETTINGS_CHECKBOX_PATHDEBUG") return Game.Settings.PathDebug; - if (w.Id == "SETTINGS_CHECKBOX_INDEXDEBUG") return Game.Settings.IndexDebug; - if (w.Id == "SETTINGS_CHECKBOX_PERFGRAPH") return Game.Settings.PerfGraph; - if (w.Id == "SETTINGS_CHECKBOX_PERFTEXT") return Game.Settings.PerfText; - return false; - } - - public override bool OnMouseDown(Widget w, MouseInput mi) - { - if (w.Id == "SETTINGS_CHECKBOX_UNITDEBUG") - { + var r = Game.chrome.rootWidget; + + // Checkboxes + r.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").Checked = () => {return Game.Settings.UnitDebug;}; + r.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").OnMouseDown = mi => { Game.Settings.UnitDebug = !Game.Settings.UnitDebug; return true; - } - - if (w.Id == "SETTINGS_CHECKBOX_PATHDEBUG") - { + }; + + r.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").Checked = () => {return Game.Settings.PathDebug;}; + r.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").OnMouseDown = mi => { Game.Settings.PathDebug = !Game.Settings.PathDebug; return true; - } - - if (w.Id == "SETTINGS_CHECKBOX_INDEXDEBUG") - { + }; + + r.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").Checked = () => {return Game.Settings.IndexDebug;}; + r.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").OnMouseDown = mi => { Game.Settings.IndexDebug = !Game.Settings.IndexDebug; return true; - } - - if (w.Id == "SETTINGS_CHECKBOX_PERFGRAPH") - { + }; + + r.GetWidget("SETTINGS_CHECKBOX_PERFGRAPH").Checked = () => {return Game.Settings.PerfGraph;}; + r.GetWidget("SETTINGS_CHECKBOX_PERFGRAPH").OnMouseDown = mi => { Game.Settings.PerfGraph = !Game.Settings.PerfGraph; return true; - } - - if (w.Id == "SETTINGS_CHECKBOX_PERFTEXT") - { + }; + + r.GetWidget("SETTINGS_CHECKBOX_PERFTEXT").Checked = () => {return Game.Settings.PerfText;}; + r.GetWidget("SETTINGS_CHECKBOX_PERFTEXT").OnMouseDown = mi => { Game.Settings.PerfText = !Game.Settings.PerfText; return true; - } - - return false; - } - - public override bool OnMouseUp(Widget w, MouseInput mi) - { - if (w.Id == "MAINMENU_BUTTON_SETTINGS") - { + }; + + + // Menu Buttons + r.GetWidget("MAINMENU_BUTTON_SETTINGS").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("SETTINGS_BG"); return true; - } - - if (w.Id == "SETTINGS_BUTTON_OK") - { + }; + + r.GetWidget("SETTINGS_BUTTON_OK").OnMouseUp = mi => { Game.chrome.rootWidget.ShowMenu("MAINMENU_BG"); return true; - } - - return false; + }; } } } diff --git a/OpenRA.Game/Widgets/Delegates/WidgetDelegate.cs b/OpenRA.Game/Widgets/Delegates/WidgetDelegate.cs deleted file mode 100644 index 797944efae..0000000000 --- a/OpenRA.Game/Widgets/Delegates/WidgetDelegate.cs +++ /dev/null @@ -1,33 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. - * This file is part of OpenRA. - * - * OpenRA is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenRA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenRA. If not, see . - */ -#endregion - -namespace OpenRA.Widgets.Delegates -{ - public class WidgetDelegate - { - // For checkboxes - public virtual bool GetState(Widget w) { return false; } - - // For any widget - public virtual bool OnMouseDown(Widget w, MouseInput mi) { return false; } - public virtual bool OnMouseUp(Widget w, MouseInput mi) { return false; } - public virtual bool OnMouseMove(Widget w, MouseInput mi) { return false; } - } -} \ No newline at end of file diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index 9dc2aa55d2..a86697c9bd 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -37,7 +37,7 @@ namespace OpenRA.Widgets public readonly string Height = "0"; public readonly string Delegate = null; - public Lazy InputHandler; + public Lazy InputHandler; public bool Visible = true; public readonly List Children = new List(); @@ -81,19 +81,17 @@ namespace OpenRA.Widgets .Aggregate(Bounds, Rectangle.Union); } - static WidgetDelegate BindHandler(string name) + static IWidgetDelegate BindHandler(string name) { if (name == null) return null; - - foreach (var mod in Game.ModAssemblies) - { - var act = (WidgetDelegate)mod.First.CreateInstance(mod.Second + "." + name); - if (act != null) return act; - } - - throw new InvalidOperationException("Cannot locate widget delegate: {0}".F(name)); + return Game.CreateObject(name); } + // Common Funcs that most widgets will want + public Func OnMouseDown = mi => {return false;}; + public Func OnMouseUp = mi => {return false;}; + public Func OnMouseMove = mi => {return false;}; + public virtual bool HandleInput(MouseInput mi) { // Are we able to handle this event? @@ -107,15 +105,15 @@ namespace OpenRA.Widgets // Mousedown if (InputHandler.Value != null && mi.Event == MouseInputEvent.Down) - return InputHandler.Value.OnMouseDown(this, mi); + return OnMouseDown(mi); // Mouseup if (InputHandler.Value != null && mi.Event == MouseInputEvent.Up) - return InputHandler.Value.OnMouseUp(this, mi); + return OnMouseUp(mi); // Mousemove if (InputHandler.Value != null && mi.Event == MouseInputEvent.Move) - return InputHandler.Value.OnMouseMove(this, mi); + return OnMouseMove(mi); return false; } @@ -138,11 +136,17 @@ namespace OpenRA.Widgets return this; foreach (var child in Children) - if (child.GetWidget(id) != null) - return child; - + { + var w = child.GetWidget(id); + if (w != null) + return w; + } return null; } + public T GetWidget(string id) where T : Widget + { + return (T)GetWidget(id); + } public Widget GetCurrentMenu() { return Children.FirstOrDefault(c => c.Visible); } @@ -159,4 +163,5 @@ namespace OpenRA.Widgets } class ContainerWidget : Widget { } + public interface IWidgetDelegate { } } \ No newline at end of file