diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 68179d21e5..d570463595 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -227,6 +227,7 @@ + diff --git a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs index 2210b07428..ef4b9e340d 100644 --- a/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MapChooserDelegate.cs @@ -54,7 +54,7 @@ namespace OpenRA.Widgets.Delegates }; var itemTemplate = ml.GetWidget("MAP_TEMPLATE"); - int offset = 0; + int offset = itemTemplate.Bounds.Y; foreach (var kv in Game.AvailableMaps) { var map = kv.Value; @@ -67,11 +67,11 @@ namespace OpenRA.Widgets.Delegates template.OnMouseUp = mi => {Map = map; return true;}; template.Parent = ml; - template.Bounds = new Rectangle(0, offset, template.Bounds.Width, template.Bounds.Height); + template.Bounds = new Rectangle(template.Bounds.X, offset, template.Bounds.Width, template.Bounds.Height); template.IsVisible = () => true; ml.AddChild(template); - offset += template.Bounds.Height + 5; + offset += template.Bounds.Height; } } diff --git a/OpenRA.Game/Widgets/ListBoxWidget.cs b/OpenRA.Game/Widgets/ListBoxWidget.cs new file mode 100644 index 0000000000..6278f40da4 --- /dev/null +++ b/OpenRA.Game/Widgets/ListBoxWidget.cs @@ -0,0 +1,129 @@ +using System.Drawing; +#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 +{ + class ListBoxWidget : Widget + { + public readonly string Background = "dialog"; + public readonly int ScrollbarWidth = 24; + public readonly float ScrollVelocity = 4f; + public readonly int HeaderHeight = 25; + + float ListOffset = 0; + bool UpPressed = false; + bool DownPressed = false; + Rectangle upButtonRect; + Rectangle downButtonRect; + Rectangle backgroundRect; + Rectangle scrollbarRect; + + public ListBoxWidget() : base() {} + public ListBoxWidget(Widget other) + : base(other) + { + Background = (other as ListBoxWidget).Background; + upButtonRect = (other as ListBoxWidget).upButtonRect; + downButtonRect = (other as ListBoxWidget).downButtonRect; + scrollbarRect = (other as ListBoxWidget).scrollbarRect; + backgroundRect = (other as ListBoxWidget).backgroundRect; + + UpPressed = (other as ListBoxWidget).UpPressed; + DownPressed = (other as ListBoxWidget).DownPressed; + } + + public override void DrawInner(World world) {} + public override void Draw(World world) + { + if (!IsVisible()) + return; + + backgroundRect = new Rectangle(RenderBounds.X, RenderBounds.Y, RenderBounds.Width - ScrollbarWidth, RenderBounds.Height); + upButtonRect = new Rectangle(RenderBounds.Right - ScrollbarWidth, RenderBounds.Y, ScrollbarWidth, ScrollbarWidth); + downButtonRect = new Rectangle(RenderBounds.Right - ScrollbarWidth, RenderBounds.Bottom - ScrollbarWidth, ScrollbarWidth, ScrollbarWidth); + scrollbarRect = new Rectangle(RenderBounds.Right - ScrollbarWidth, RenderBounds.Y + ScrollbarWidth, ScrollbarWidth, RenderBounds.Height - 2*ScrollbarWidth); + + string upButtonBg = (UpPressed) ? "dialog3" : "dialog2"; + string downButtonBg = (DownPressed) ? "dialog3" : "dialog2"; + string scrolbarBg = "dialog3"; + string scrollbarButton = "dialog2"; + + WidgetUtils.DrawPanel(Background, backgroundRect); + WidgetUtils.DrawPanel(upButtonBg, upButtonRect); + WidgetUtils.DrawPanel(downButtonBg, downButtonRect); + WidgetUtils.DrawPanel(scrolbarBg, scrollbarRect); + + + Game.chrome.renderer.Device.EnableScissor(backgroundRect.X, backgroundRect.Y + HeaderHeight, backgroundRect.Width, backgroundRect.Height - HeaderHeight); + + foreach (var child in Children) + child.Draw(world); + + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); + Game.chrome.renderer.Device.DisableScissor(); + } + public override int2 ChildOrigin { get { return RenderOrigin + new int2(0, (int)ListOffset); } } + + public override void Tick (World world) + { + if (UpPressed && ListOffset <= 0) ListOffset += ScrollVelocity; + if (DownPressed) ListOffset -= ScrollVelocity; + } + + public override bool HandleInput(MouseInput mi) + { + if (Chrome.selectedWidget == this) + { + UpPressed = upButtonRect.Contains(mi.Location.X,mi.Location.Y); + DownPressed = downButtonRect.Contains(mi.Location.X,mi.Location.Y); + } + + // Relinquish focus + if (Chrome.selectedWidget == this && mi.Event == MouseInputEvent.Up) + { + Chrome.selectedWidget = null; + UpPressed = DownPressed = false; + } + + // Are we able to handle this event? + if (!Visible || !GetEventBounds().Contains(mi.Location.X,mi.Location.Y)) + return base.HandleInput(mi); + + + if (base.HandleInput(mi)) + return true; + + // Give button focus only while the mouse is down + // This is a bit of a hack: it will become cleaner soonish + // It will also steal events from any potential children + // We also want to play a click sound + if (mi.Event == MouseInputEvent.Down) + { + Chrome.selectedWidget = this; + return true; + } + + return false; + } + + public override Widget Clone() { return new ListBoxWidget(this); } + } +} \ No newline at end of file diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index bf78706d91..920d3366aa 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -182,7 +182,7 @@ namespace OpenRA.Widgets public abstract void DrawInner( World world ); - public void Draw(World world) + public virtual void Draw(World world) { if (IsVisible()) { diff --git a/mods/cnc/menus.yaml b/mods/cnc/menus.yaml index 996421b49b..d0d8bf3243 100644 --- a/mods/cnc/menus.yaml +++ b/mods/cnc/menus.yaml @@ -769,19 +769,19 @@ Container: Height:20 Text:Choose Map Bold:True - Container@MAP_LIST: + ListBox@MAP_LIST: Id:MAP_LIST - X:50 + X:20 Y:50 - Width:450 - Height:500 + Width:500 + Height:480 Children: Button@MAP_TEMPLATE: Id:MAP_TEMPLATE - Width:440 + Width:PARENT_RIGHT-28 Height:25 - X:0 - Y:0 + X:2 + Y:25 Visible:false Label@CURMAP_TITLE_LABEL: Id:CURMAP_TITLE_LABEL @@ -849,7 +849,7 @@ Container: Height:20 Background@MAPCHOOSER_MAP_BG: X:PARENT_RIGHT-268 - Y:39 + Y:50 Width:252 Height:252 Background:dialog3 diff --git a/mods/ra/menus.yaml b/mods/ra/menus.yaml index 7bb00b5cbe..2a780442a0 100644 --- a/mods/ra/menus.yaml +++ b/mods/ra/menus.yaml @@ -769,19 +769,19 @@ Container: Height:20 Text:Choose Map Bold:True - Container@MAP_LIST: + ListBox@MAP_LIST: Id:MAP_LIST - X:50 + X:20 Y:50 - Width:450 - Height:500 + Width:500 + Height:480 Children: Button@MAP_TEMPLATE: Id:MAP_TEMPLATE - Width:440 + Width:PARENT_RIGHT-28 Height:25 - X:0 - Y:0 + X:2 + Y:25 Visible:false Label@CURMAP_TITLE_LABEL: Id:CURMAP_TITLE_LABEL @@ -849,7 +849,7 @@ Container: Height:20 Background@MAPCHOOSER_MAP_BG: X:PARENT_RIGHT-268 - Y:39 + Y:50 Width:252 Height:252 Background:dialog3 @@ -1104,6 +1104,4 @@ Container: Width:25 Height:25 ImageCollection:music - ImageName:prev - - + ImageName:prev \ No newline at end of file