diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 4aea013e42..faa6f121fd 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -92,6 +92,9 @@ namespace OpenRA Sprite mapChooserSprite; int mapOffset = 0; + + Widget rootWidget; + public Chrome(Renderer r) { this.renderer = r; @@ -127,6 +130,12 @@ namespace OpenRA ready = new Animation("pips"); ready.PlayRepeating("ready"); clock = new Animation("clock"); + + // TODO: make this generic + var widgetYaml = MiniYaml.FromFile("mods/cnc/menus.yaml"); + // Hack around a bug in MiniYaml + widgetYaml.Values.FirstOrDefault().Value = widgetYaml.Keys.FirstOrDefault(); + rootWidget = ChromeWindow.LoadWidget(widgetYaml.Values.FirstOrDefault()); } List visibleTabs = new List(); @@ -417,6 +426,7 @@ namespace OpenRA public void DrawMainMenu( World world ) { + rootWidget.Draw(rgbaRenderer,renderer); buttons.Clear(); var w = 250; @@ -425,6 +435,7 @@ namespace OpenRA DrawDialogBackground(r, "dialog"); DrawCentered("OpenRA Main Menu", new int2(r.Left + w / 2, r.Top + 20), Color.White); + /* AddUiButton(new int2(r.Left + w/2, r.Top + 70), "Join Game", _ => { @@ -436,7 +447,7 @@ namespace OpenRA { Game.CreateServer(); }); - + */ AddUiButton(new int2(r.Left + w/2, r.Top + 140), "Quit", _ => { diff --git a/OpenRA.Game/Chrome/ChromeWindow.cs b/OpenRA.Game/Chrome/ChromeWindow.cs new file mode 100644 index 0000000000..f538fbd1da --- /dev/null +++ b/OpenRA.Game/Chrome/ChromeWindow.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using System.Drawing; + +namespace OpenRA +{ + class Widget + { + public readonly string Id = null; + public readonly int X = 0; + public readonly int Y = 0; + public readonly int Width = 0; + public readonly int Height = 0; + public readonly List Children = new List(); + + public void Draw(SpriteRenderer rgbaRenderer, Renderer renderer) + { + string collection = "dialog"; + + Rectangle r = new Rectangle(X,Y,Width,Height); + renderer.Device.EnableScissor(r.Left, r.Top, r.Width, r.Height); + + string[] images = { "border-t", "border-b", "border-l", "border-r", "corner-tl", "corner-tr", "corner-bl", "corner-br", "background" }; + var ss = Graphics.Util.MakeArray(9, n => ChromeProvider.GetImage(renderer, collection,images[n])); + + for( var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[8].size.X ) + for( var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[8].size.Y ) + rgbaRenderer.DrawSprite(ss[8], new float2(x, y), "chrome"); + + //draw borders + for (var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[2].size.Y) + { + rgbaRenderer.DrawSprite(ss[2], new float2(r.Left, y), "chrome"); + rgbaRenderer.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), "chrome"); + } + + for (var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[0].size.X) + { + rgbaRenderer.DrawSprite(ss[0], new float2(x, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), "chrome"); + } + + rgbaRenderer.DrawSprite(ss[4], new float2(r.Left, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), "chrome"); + rgbaRenderer.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), "chrome"); + rgbaRenderer.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), "chrome"); + rgbaRenderer.Flush(); + + renderer.Device.DisableScissor(); + + foreach (var child in Children) + child.Draw(rgbaRenderer, renderer); + } + } + + class ChromeWindow + { + public static Widget LoadWidget( MiniYaml node ) + { + Widget widget = NewWidget( node.Value ); + foreach( var child in node.Nodes ) + { + if( child.Key == "Children" ) + { + foreach( var c in child.Value.Nodes ) + { + // Hack around a bug in MiniYaml + c.Value.Value = c.Key; + widget.Children.Add( LoadWidget( c.Value ) ); + } + } + else + FieldLoader.LoadField( widget, child.Key, child.Value ); + } + + return widget; + } + + static Widget NewWidget( string widgetType ) + { + if( widgetType.Contains( "@" ) ) + widgetType = widgetType.Substring( 0, widgetType.IndexOf( "@" ) ); + // TODO: make a particular widget by reflection, or by `switch( widgetType )` + + Log.Write("Creating Widget of type {0}",widgetType); + return new Widget(); + } + } +} \ No newline at end of file diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 0c313a8739..97b8abe32d 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug @@ -276,6 +276,7 @@ + @@ -311,4 +312,7 @@ --> + + + \ No newline at end of file diff --git a/mods/cnc/menus.yaml b/mods/cnc/menus.yaml new file mode 100644 index 0000000000..e29fc2be26 --- /dev/null +++ b/mods/cnc/menus.yaml @@ -0,0 +1,13 @@ +Container: + Id:ROOT + X:10 + Y:10 + Width:400 + Height:400 + Children: + Button: + Id:BUTTON1 + X:40 + Y:80 + Width:100 + Height:80