diff --git a/OpenRA.Game/Widgets/PasswordFieldWidget.cs b/OpenRA.Game/Widgets/PasswordFieldWidget.cs index 6c2620c98b..a1f47b85ae 100644 --- a/OpenRA.Game/Widgets/PasswordFieldWidget.cs +++ b/OpenRA.Game/Widgets/PasswordFieldWidget.cs @@ -8,21 +8,20 @@ */ #endregion -using System; -using System.Drawing; -using OpenRA.Graphics; - namespace OpenRA.Widgets { public class PasswordFieldWidget : TextFieldWidget { public PasswordFieldWidget() : base() {} protected PasswordFieldWidget(PasswordFieldWidget widget) : base(widget) {} + + // TODO: Mouse interaction is wrong with this. public override void DrawInner() { DrawWithString(new string('*', Text.Length)); } + public override Widget Clone() { return new PasswordFieldWidget(this); } } } \ No newline at end of file diff --git a/OpenRA.Game/Widgets/TextFieldWidget.cs b/OpenRA.Game/Widgets/TextFieldWidget.cs index 72f09ed56f..fc19af21e9 100644 --- a/OpenRA.Game/Widgets/TextFieldWidget.cs +++ b/OpenRA.Game/Widgets/TextFieldWidget.cs @@ -10,13 +10,19 @@ using System; using System.Drawing; -using OpenRA.Graphics; +using OpenRA.Traits; namespace OpenRA.Widgets { public class TextFieldWidget : Widget { - public string Text = ""; + string text = ""; + public string Text + { + get { return text; } + set { text = value ?? ""; CursorPosition = CursorPosition.Clamp(0, text.Length); } + } + public int MaxLength = 0; public bool Bold = false; public int VisualHeight = 1; @@ -68,10 +74,8 @@ namespace OpenRA.Widgets public int ClosestCursorPosition(int x) { - if (Text == null) - return 0; - var font = (Bold) ? Game.Renderer.Fonts["Bold"] : Game.Renderer.Fonts["Regular"]; + var textSize = font.Measure(Text); var start = RenderOrigin.X + LeftMargin; @@ -135,10 +139,8 @@ namespace OpenRA.Widgets if (e.KeyName == "delete") { - if (Text.Length > 0 && CursorPosition < Text.Length) - { + if (CursorPosition < Text.Length) Text = Text.Remove(CursorPosition, 1); - } return true; } @@ -148,16 +150,11 @@ namespace OpenRA.Widgets public void TypeChar(KeyInput key) { - if (Text == null) - Text = ""; - - if (key.KeyName == "backspace" && Text.Length > 0 && CursorPosition > 0) + if (key.KeyName == "backspace" && CursorPosition > 0) { - Text = Text.Remove(CursorPosition - 1, 1); CursorPosition--; - } - else if (key.KeyName == "delete" && Text.Length > 0 && CursorPosition < Text.Length - 1) Text = Text.Remove(CursorPosition, 1); + } else if (key.IsValidInput()) { @@ -172,6 +169,7 @@ namespace OpenRA.Widgets protected int blinkCycle = 10; protected bool showCursor = true; + public override void Tick() { if (--blinkCycle <= 0) @@ -185,14 +183,9 @@ namespace OpenRA.Widgets public virtual void DrawWithString(string text) { - if (text == null) text = ""; - var font = (Bold) ? Game.Renderer.Fonts["Bold"] : Game.Renderer.Fonts["Regular"]; var pos = RenderOrigin; - if (CursorPosition > text.Length) - CursorPosition = text.Length; - var textSize = font.Measure(text); var cursorPosition = font.Measure(text.Substring(0,CursorPosition)); @@ -208,7 +201,8 @@ namespace OpenRA.Widgets if (Focused) textPos += new int2(Bounds.Width - LeftMargin - RightMargin - textSize.X, 0); - Game.Renderer.EnableScissor(pos.X + LeftMargin, pos.Y, Bounds.Width - LeftMargin - RightMargin, Bounds.Bottom); + Game.Renderer.EnableScissor(pos.X + LeftMargin, pos.Y, + Bounds.Width - LeftMargin - RightMargin, Bounds.Bottom); } font.DrawText(text, textPos, Color.White); diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs index 3d67f5db15..9103f7189e 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs @@ -46,6 +46,7 @@ namespace OpenRA.Mods.Cnc.Widgets ChromeProvider.GetImage("checkbox", "checked"), new float2(rect.Left + 2, rect.Top + 2)); } + public override Widget Clone() { return new CncCheckboxWidget(this); } } @@ -243,6 +244,7 @@ namespace OpenRA.Mods.Cnc.Widgets { Font = other.Font; } + public override Widget Clone() { return new CncDropDownButtonWidget(this); } public override void DrawInner() diff --git a/OpenRA.Mods.Cnc/Widgets/CncReplayBrowserLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncReplayBrowserLogic.cs index ab39a62aa8..13ddac03d7 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncReplayBrowserLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncReplayBrowserLogic.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Cnc.Widgets var files = Directory.GetFiles(replayDir, "*.rep").Reverse(); foreach (var replayFile in files) AddReplay(rl, replayFile, template); - + SelectReplay(files.FirstOrDefault()); } @@ -59,9 +59,10 @@ namespace OpenRA.Mods.Cnc.Widgets panel.GetWidget("REPLAY_INFO").IsVisible = () => currentSummary != null; } - + ReplaySummary currentSummary; Map currentMap; + void SelectReplay(string filename) { if (filename == null) @@ -81,7 +82,7 @@ namespace OpenRA.Mods.Cnc.Widgets var players = currentSummary.LobbyInfo.Slots.Count(s => currentSummary.LobbyInfo.ClientInSlot(s) != null || s.Bot != null); panel.GetWidget("PLAYERS").GetText = () => players.ToString(); } - catch(Exception e) + catch (Exception e) { Log.Write("debug", "Exception while parsing replay: {0}", e.ToString()); currentSummary = null; diff --git a/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs index c08c57763c..4a24ebf966 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs @@ -43,20 +43,21 @@ namespace OpenRA.Mods.Cnc.Widgets { { "initialMap", map.Uid }, { "onExit", () => {} }, - { "onSelect", new Action(m => map = m) } + { "onSelect", (Action)(m => map = m) } }); }; - - if (string.IsNullOrEmpty(Game.Settings.Server.Map) || !Game.modData.AvailableMaps.TryGetValue(Game.Settings.Server.Map, out map)) + + if (string.IsNullOrEmpty(Game.Settings.Server.Map) || + !Game.modData.AvailableMaps.TryGetValue(Game.Settings.Server.Map, out map)) map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; - + panel.GetWidget("MAP_PREVIEW").Map = () => map; panel.GetWidget("MAP_NAME").GetText = () => map.Title; - + panel.GetWidget("SERVER_NAME").Text = settings.Server.Name ?? ""; panel.GetWidget("LISTEN_PORT").Text = settings.Server.ListenPort.ToString(); advertiseOnline = Game.Settings.Server.AdvertiseOnline; - + var externalPort = panel.GetWidget("EXTERNAL_PORT"); externalPort.Text = settings.Server.ExternalPort.ToString(); externalPort.IsDisabled = () => !advertiseOnline;