Convert RA mapchooser to use a grid of minimap images

This commit is contained in:
Chris Forbes
2011-10-08 18:48:52 +13:00
parent 957c1cc74c
commit a193eeb202
6 changed files with 96 additions and 176 deletions

View File

@@ -188,7 +188,6 @@
<Compile Include="Widgets\PasswordFieldWidget.cs" />
<Compile Include="Widgets\PerfGraphWidget.cs" />
<Compile Include="Widgets\ProgressBarWidget.cs" />
<Compile Include="Widgets\ScrollItem.cs" />
<Compile Include="Widgets\ScrollPanelWidget.cs" />
<Compile Include="Widgets\ShpImageWidget.cs" />
<Compile Include="Widgets\SliderWidget.cs" />
@@ -202,6 +201,7 @@
<Compile Include="Widgets\WorldInteractionControllerWidget.cs" />
<Compile Include="World.cs" />
<Compile Include="WorldUtils.cs" />
<Compile Include="Widgets\ScrollItemWidget.cs" />
<Compile Include="Widgets\ListLayout.cs" />
<Compile Include="Widgets\GridLayout.cs" />
</ItemGroup>

View File

@@ -26,18 +26,18 @@ namespace OpenRA.Widgets
widget.ContentHeight = widget.ItemSpacing;
pos = new int2(widget.ItemSpacing, widget.ItemSpacing);
}
if (pos.X + widget.ItemSpacing + w.Bounds.Width > widget.Bounds.Width - widget.ScrollbarWidth)
{
/* start a new row */
pos.X = widget.ItemSpacing;
pos.Y = widget.ContentHeight;
}
w.Bounds.X += pos.X;
w.Bounds.Y += pos.Y;
pos.X += widget.Bounds.Width + widget.ItemSpacing;
pos.X += w.Bounds.Width + widget.ItemSpacing;
widget.ContentHeight = Math.Max(widget.ContentHeight, pos.Y + widget.ItemSpacing + w.Bounds.Height);
}

View File

@@ -21,10 +21,12 @@ namespace OpenRA.Widgets
public Func<Map> Map = () => null;
public Func<Dictionary<int2, Color>> SpawnColors = () => new Dictionary<int2, Color>();
public Action<MouseInput> OnMouseDown = _ => {};
public bool IgnoreMouseInput = false;
Cache<Map,Bitmap> PreviewCache = new Cache<Map, Bitmap>(stub => Minimap.RenderMapPreview( new Map( stub.Path )));
static Cache<Map,Bitmap> PreviewCache = new Cache<Map, Bitmap>(stub => Minimap.RenderMapPreview( new Map( stub.Path )));
public MapPreviewWidget() : base() { }
protected MapPreviewWidget(MapPreviewWidget other)
: base(other)
{
@@ -32,10 +34,14 @@ namespace OpenRA.Widgets
Map = other.Map;
SpawnColors = other.SpawnColors;
}
public override Widget Clone() { return new MapPreviewWidget(this); }
public override bool HandleMouseInput(MouseInput mi)
{
if (IgnoreMouseInput)
return base.HandleMouseInput(mi);
if (mi.Event != MouseInputEvent.Down)
return false;
@@ -70,15 +76,15 @@ namespace OpenRA.Widgets
mapChooserSheet.Texture.SetData( preview );
mapChooserSprite = new Sprite( mapChooserSheet, new Rectangle( 0, 0, map.Bounds.Width, map.Bounds.Height ), TextureChannel.Alpha );
// Update map rect
PreviewScale = Math.Min(RenderBounds.Width * 1.0f / map.Bounds.Width, RenderBounds.Height * 1.0f / map.Bounds.Height);
var size = Math.Max(map.Bounds.Width, map.Bounds.Height);
var dw = (int)(PreviewScale * (size - map.Bounds.Width)) / 2;
var dh = (int)(PreviewScale * (size - map.Bounds.Height)) / 2;
MapRect = new Rectangle(RenderBounds.X + dw, RenderBounds.Y + dh, (int)(map.Bounds.Width * PreviewScale), (int)(map.Bounds.Height * PreviewScale));
}
// Update map rect
PreviewScale = Math.Min(RenderBounds.Width * 1.0f / map.Bounds.Width, RenderBounds.Height * 1.0f / map.Bounds.Height);
var size = Math.Max(map.Bounds.Width, map.Bounds.Height);
var dw = (int)(PreviewScale * (size - map.Bounds.Width)) / 2;
var dh = (int)(PreviewScale * (size - map.Bounds.Height)) / 2;
MapRect = new Rectangle(RenderBounds.X + dw, RenderBounds.Y + dh, (int)(map.Bounds.Width * PreviewScale), (int)(map.Bounds.Height * PreviewScale));
Game.Renderer.RgbaSpriteRenderer.DrawSprite( mapChooserSprite,
new float2(MapRect.Location),
new float2( MapRect.Size ) );

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
public class MapChooserLogic
{
Map map;
Widget scrollpanel;
ScrollPanelWidget scrollpanel;
ScrollItemWidget itemTemplate;
string gameMode;
@@ -30,14 +30,20 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{
map = Game.modData.AvailableMaps[WidgetUtils.ChooseInitialMap(initialMap)];
widget.GetWidget<MapPreviewWidget>("MAP_PREVIEW").Map = () => map;
widget.GetWidget<LabelWidget>("CURMAP_TITLE").GetText = () => map.Title;
widget.GetWidget<LabelWidget>("CURMAP_AUTHOR").GetText = () => map.Author;
widget.GetWidget<LabelWidget>("CURMAP_DESC").GetText = () => map.Description;
widget.GetWidget<LabelWidget>("CURMAP_DESC_LABEL").IsVisible = () => map.Description != null;
widget.GetWidget<LabelWidget>("CURMAP_SIZE").GetText = () => "{0}x{1}".F(map.Bounds.Width, map.Bounds.Height);
widget.GetWidget<LabelWidget>("CURMAP_THEATER").GetText = () => Rules.TileSets[map.Tileset].Name;
widget.GetWidget<LabelWidget>("CURMAP_PLAYERS").GetText = () => map.PlayerCount.ToString();
var mapPreview = widget.GetWidget<MapPreviewWidget>("MAP_PREVIEW");
if (mapPreview != null)
mapPreview.Map = () => map;
if (WidgetUtils.ActiveModTitle() != "Red Alert") // hack
{
widget.GetWidget<LabelWidget>("CURMAP_TITLE").GetText = () => map.Title;
widget.GetWidget<LabelWidget>("CURMAP_AUTHOR").GetText = () => map.Author;
widget.GetWidget<LabelWidget>("CURMAP_DESC").GetText = () => map.Description;
widget.GetWidget<LabelWidget>("CURMAP_DESC_LABEL").IsVisible = () => map.Description != null;
widget.GetWidget<LabelWidget>("CURMAP_SIZE").GetText = () => "{0}x{1}".F(map.Bounds.Width, map.Bounds.Height);
widget.GetWidget<LabelWidget>("CURMAP_THEATER").GetText = () => Rules.TileSets[map.Tileset].Name;
widget.GetWidget<LabelWidget>("CURMAP_PLAYERS").GetText = () => map.PlayerCount.ToString();
}
widget.GetWidget<ButtonWidget>("BUTTON_OK").OnClick = () => { Widget.CloseWindow(); onSelect(map); };
widget.GetWidget<ButtonWidget>("BUTTON_CANCEL").OnClick = () => { Widget.CloseWindow(); onExit(); };
@@ -80,7 +86,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
void EnumerateMaps()
{
scrollpanel.RemoveChildren();
(scrollpanel as ScrollPanelWidget).ScrollToTop();
// hack for RA's new 2d mapchooser
if (WidgetUtils.ActiveModTitle() == "Red Alert")
scrollpanel.Layout = new GridLayout(scrollpanel);
scrollpanel.ScrollToTop();
var maps = Game.modData.AvailableMaps
.Where(kv => kv.Value.Selectable)
@@ -94,17 +105,32 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var item = ScrollItemWidget.Setup(itemTemplate, () => m == map, () => map = m);
var titleLabel = item.GetWidget<LabelWidget>("TITLE");
titleLabel.GetText = () => m.Title;
var playersLabel = item.GetWidget<LabelWidget>("PLAYERS");
if (playersLabel != null)
{
playersLabel.GetText = () => "{0}".F(m.PlayerCount);
titleLabel.GetText = () => m.Title;
}
else
titleLabel.GetText = () => "{0} ({1})".F(m.Title, m.PlayerCount);
item.GetWidget<LabelWidget>("TYPE").GetText = () => m.Type;
var previewWidget = item.GetWidget<MapPreviewWidget>("PREVIEW");
if (previewWidget != null)
{
previewWidget.IgnoreMouseOver = true;
previewWidget.IgnoreMouseInput = true;
previewWidget.Map = () => m;
}
var typeWidget = item.GetWidget<LabelWidget>("TYPE");
if (typeWidget != null)
typeWidget.GetText = () => m.Type;
var detailsWidget = item.GetWidget<LabelWidget>("DETAILS");
if (detailsWidget != null)
detailsWidget.GetText = () => "{0} ({1})".F(m.Type, m.PlayerCount);
var authorWidget = item.GetWidget<LabelWidget>("AUTHOR");
if (authorWidget != null)
authorWidget.GetText = () => m.Author;
scrollpanel.AddChild(item);
}
}

View File

@@ -17,165 +17,53 @@ Background@MAP_CHOOSER:
ScrollPanel@MAP_LIST:
Id:MAP_LIST
X:20
Y:67
Width:504
Y:47
Width:PARENT_RIGHT - 40
Height:474
Children:
ScrollItem@MAP_TEMPLATE:
Id:MAP_TEMPLATE
Width:PARENT_RIGHT-27
Height:25
Width:180
Height:208
X:2
Y:0
Visible:false
Children:
Label@TITLE:
X:10
X:2
Y:PARENT_BOTTOM-47
Id:TITLE
Width:PARENT_RIGHT-100
Width:PARENT_RIGHT-4
Height:25
Label@TYPE:
Id:TYPE
Width:90
X:PARENT_RIGHT-100
Align:Right
Align:Center
Label@DETAILS:
Id:DETAILS
Width:PARENT_RIGHT-4
X:2
Y:PARENT_BOTTOM-35
Align:Center
Height:25
Container@MAP_LABELS:
Width:494
Font:Tiny
Label@AUTHOR:
Id:AUTHOR
Width:PARENT_RIGHT-4
X:2
Y:PARENT_BOTTOM-26
Align:Center
Height:25
Font:Tiny
MapPreview@PREVIEW:
Id:PREVIEW
X:(PARENT_RIGHT - WIDTH)/2
Y:4
Width:160
Height:160
DropDownButton@GAMEMODE_FILTER:
Id:GAMEMODE_FILTER
X:PARENT_RIGHT - 220
Y:17
Width:200
Height:25
X:25
Y:40
Children:
Label@TITLE:
Width:125
Height:25
X:0
Y:0
Text:Title
Align:Center
Font:Bold
DropDownButton@GAMEMODE_FILTER:
Id:GAMEMODE_FILTER
X:300
Width:200
Height:25
Background@MAPCHOOSER_MAP_BG:
X:PARENT_RIGHT-268
Y:50
Width:252
Height:252
Background:dialog3
Children:
MapPreview@MAP_PREVIEW:
Id:MAP_PREVIEW
X:4
Y:4
Width:244
Height:244
Container@MAP_LABEL_CONTAINER:
Width:70
Height:200
X:PARENT_RIGHT - 255
Y:311
Children:
Label@CURMAP_TITLE_LABEL:
Id:CURMAP_TITLE_LABEL
X:0
Y:0
Align:Right
Width:70
Height:20
Text:Title:
Font:Bold
Label@CURMAP_TITLE:
Id:CURMAP_TITLE
X:75
Y:0
Align:Left
Width:70
Height:20
Label@CURMAP_AUTHOR_LABEL:
Id:CURMAP_AUTHOR_LABEL
X:0
Y:20
Align:Right
Width:70
Height:20
Text:Author:
Font:Bold
Label@CURMAP_AUTHOR:
Id:CURMAP_AUTHOR
X:75
Y:20
Align:Left
Width:175
Height:20
WordWrap:True
Label@CURMAP_SIZE_LABEL:
Id:CURMAP_SIZE_LABEL
X:0
Y:40
Align:Right
Width:70
Height:20
Text:Size:
Font:Bold
Label@CURMAP_SIZE:
Id:CURMAP_SIZE
X:75
Y:40
Align:Left
Width:70
Height:20
Label@CURMAP_THEATER_LABEL:
Id:CURMAP_THEATER_LABEL
X:0
Y:60
Align:Right
Width:70
Height:20
Text:Theater:
Font:Bold
Label@CURMAP_THEATER:
Id:CURMAP_THEATER
X:75
Y:60
Align:Left
Width:70
Height:20
Label@CURMAP_PLAYERS_LABEL:
Id:CURMAP_PLAYERS_LABEL
X:0
Y:80
Align:Right
Width:70
Height:20
Text:Players:
Font:Bold
Label@CURMAP_PLAYERS:
Id:CURMAP_PLAYERS
X:75
Y:80
Align:Left
Width:70
Height:20
Label@CURMAP_DESC_LABEL:
Id:CURMAP_DESC_LABEL
X:0
Y:100
Align:Right
Width:70
Height:20
Text:Desc:
Font:Bold
Label@CURMAP_DESC:
Id:CURMAP_DESC
X:75
Y:100
Align:Left
Width:170
Height:20
WordWrap:True
Button@BUTTON_OK:
Id:BUTTON_OK
X:PARENT_RIGHT - 295