Switch tabs when a queue is lost, hide tab-strip when there are no queues available, rename queueType -> queueGroup.

This commit is contained in:
Paul Chote
2011-07-03 21:11:35 +12:00
parent a065ba0338
commit 5f8beb632a
2 changed files with 34 additions and 17 deletions

View File

@@ -52,20 +52,20 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
if (button.IsDisabled()) if (button.IsDisabled())
return true; return true;
if (queueTabs.QueueType == group) if (queueTabs.QueueGroup == group)
queueTabs.SelectNextTab(mi.Modifiers.HasModifier(Modifiers.Shift)); queueTabs.SelectNextTab(mi.Modifiers.HasModifier(Modifiers.Shift));
else else
queueTabs.QueueType = group; queueTabs.QueueGroup = group;
return true; return true;
}; };
button.OnKeyPress = e => button.OnKeyPress = e =>
{ {
if (queueTabs.QueueType == group) if (queueTabs.QueueGroup == group)
queueTabs.SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift)); queueTabs.SelectNextTab(e.Modifiers.HasModifier(Modifiers.Shift));
else else
queueTabs.QueueType = group; queueTabs.QueueGroup = group;
}; };
} }

View File

@@ -59,19 +59,19 @@ namespace OpenRA.Mods.Cnc.Widgets
class ProductionTabsWidget : Widget class ProductionTabsWidget : Widget
{ {
string queueType; string queueGroup;
public string QueueType public string QueueGroup
{ {
get get
{ {
return queueType; return queueGroup;
} }
set set
{ {
queueType = value; queueGroup = value;
ListOffset = 0; ListOffset = 0;
Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget) Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget)
.CurrentQueue = Groups[queueType].Tabs[0].Queue; .CurrentQueue = Groups[queueGroup].Tabs[0].Queue;
} }
} }
@@ -95,6 +95,9 @@ namespace OpenRA.Mods.Cnc.Widgets
this.world = world; this.world = world;
Groups = Rules.Info.Values.SelectMany(a => a.Traits.WithInterface<ProductionQueueInfo>()) Groups = Rules.Info.Values.SelectMany(a => a.Traits.WithInterface<ProductionQueueInfo>())
.Select(q => q.Group).Distinct().ToDictionary(g => g, g => new ProductionTabGroup() { Group = g }); .Select(q => q.Group).Distinct().ToDictionary(g => g, g => new ProductionTabGroup() { Group = g });
// Only visible if the production palette has icons to display
IsVisible = () => queueGroup != null && Groups[queueGroup].Tabs.Count > 0;
} }
public override void DrawInner() public override void DrawInner()
@@ -117,16 +120,13 @@ namespace OpenRA.Mods.Cnc.Widgets
WidgetUtils.DrawRGBA(ChromeProvider.GetImage("scrollbar", rightPressed || rightDisabled ? "down_pressed" : "down_arrow"), WidgetUtils.DrawRGBA(ChromeProvider.GetImage("scrollbar", rightPressed || rightDisabled ? "down_pressed" : "down_arrow"),
new float2(rightButtonRect.Left + 2, rightButtonRect.Top + 2)); new float2(rightButtonRect.Left + 2, rightButtonRect.Top + 2));
if (QueueType == null)
return;
// Draw tab buttons // Draw tab buttons
Game.Renderer.EnableScissor(leftButtonRect.Right, rb.Y + 1, rightButtonRect.Left - leftButtonRect.Right - 1, rb.Height); Game.Renderer.EnableScissor(leftButtonRect.Right, rb.Y + 1, rightButtonRect.Left - leftButtonRect.Right - 1, rb.Height);
var palette = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget); var palette = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget);
var origin = new int2(leftButtonRect.Right - 1 + (int)ListOffset, leftButtonRect.Y); var origin = new int2(leftButtonRect.Right - 1 + (int)ListOffset, leftButtonRect.Y);
SpriteFont font = Game.Renderer.Fonts["TinyBold"]; SpriteFont font = Game.Renderer.Fonts["TinyBold"];
ContentWidth = 0; ContentWidth = 0;
foreach (var tab in Groups[QueueType].Tabs) foreach (var tab in Groups[queueGroup].Tabs)
{ {
var rect = new Rectangle(origin.X + ContentWidth, origin.Y, TabWidth, rb.Height); var rect = new Rectangle(origin.X + ContentWidth, origin.Y, TabWidth, rb.Height);
ButtonWidget.DrawBackground("button", rect, false, tab.Queue == palette.CurrentQueue, rect.Contains(Viewport.LastMousePos)); ButtonWidget.DrawBackground("button", rect, false, tab.Queue == palette.CurrentQueue, rect.Contains(Viewport.LastMousePos));
@@ -156,6 +156,23 @@ namespace OpenRA.Mods.Cnc.Widgets
.Select(p => p.Trait).ToArray(); .Select(p => p.Trait).ToArray();
foreach (var g in Groups.Values) foreach (var g in Groups.Values)
g.Update(allQueues); g.Update(allQueues);
if (queueGroup == null)
return;
var palette = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget);
// Queue destroyed, was last of type: switch to a new group
if (Groups[queueGroup].Tabs.Count == 0)
{
// Find a new group
queueGroup = Groups.Where(g => g.Value.Tabs.Count > 0)
.Select(g => g.Key).FirstOrDefault();
palette.CurrentQueue = queueGroup != null ? Groups[queueGroup].Tabs[0].Queue : null;
}
// Queue destroyed, others of same type: switch to another tab
else if (!Groups[queueGroup].Tabs.Select(t => t.Queue).Contains(palette.CurrentQueue))
palette.CurrentQueue = Groups[queueGroup].Tabs[0].Queue;
} }
} }
@@ -206,7 +223,7 @@ namespace OpenRA.Mods.Cnc.Widgets
if (offsetloc.X > 0 && offsetloc.X <= ContentWidth) if (offsetloc.X > 0 && offsetloc.X <= ContentWidth)
{ {
var palette = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget); var palette = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget);
palette.CurrentQueue = Groups[QueueType].Tabs[offsetloc.X/(TabWidth - 1)].Queue; palette.CurrentQueue = Groups[queueGroup].Tabs[offsetloc.X/(TabWidth - 1)].Queue;
return true; return true;
} }
@@ -227,11 +244,11 @@ namespace OpenRA.Mods.Cnc.Widgets
public void SelectNextTab(bool reverse) public void SelectNextTab(bool reverse)
{ {
if (queueType == null) if (queueGroup == null)
return; return;
var pal = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget); var pal = Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget);
var tabs = Groups[queueType].Tabs.ToList(); var tabs = Groups[queueGroup].Tabs.ToList();
if (reverse) tabs.Reverse(); if (reverse) tabs.Reverse();
var tab = tabs.SkipWhile(q => q.Queue != pal.CurrentQueue) var tab = tabs.SkipWhile(q => q.Queue != pal.CurrentQueue)
@@ -242,7 +259,7 @@ namespace OpenRA.Mods.Cnc.Widgets
public void SelectQueue(ProductionQueue queue) public void SelectQueue(ProductionQueue queue)
{ {
QueueType = queue.Info.Group; queueGroup = queue.Info.Group;
Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget) Widget.RootWidget.GetWidget<ProductionPaletteWidget>(PaletteWidget)
.CurrentQueue = queue; .CurrentQueue = queue;
} }