Skip to content

Commit

Permalink
#2051 fixed -- Widget.Get() throws by default
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisforbes committed Apr 27, 2012
1 parent 5d1a071 commit c30d46c
Show file tree
Hide file tree
Showing 52 changed files with 410 additions and 399 deletions.
2 changes: 1 addition & 1 deletion OpenRA.Game/Widgets/DropDownButtonWidget.cs
Expand Up @@ -85,7 +85,7 @@ public void ShowDropDown<T>(string panelTemplate, int height, IEnumerable<T> opt
var panel = (ScrollPanelWidget)Ui.LoadWidget(panelTemplate, null, new WidgetArgs()
{{ "substitutions", substitutions }});

var itemTemplate = panel.GetWidget<ScrollItemWidget>("TEMPLATE");
var itemTemplate = panel.Get<ScrollItemWidget>("TEMPLATE");
panel.RemoveChildren();
foreach (var option in options)
{
Expand Down
21 changes: 16 additions & 5 deletions OpenRA.Game/Widgets/Widget.cs
Expand Up @@ -363,25 +363,36 @@ public virtual void Removed()
c.Removed();
}

public Widget GetWidget(string id)
public Widget GetOrNull(string id)
{
if (this.Id == id)
return this;

foreach (var child in Children)
{
var w = child.GetWidget(id);
var w = child.GetOrNull(id);
if (w != null)
return w;
}
return null;
}

public T GetWidget<T>(string id) where T : Widget
public T GetOrNull<T>(string id) where T : Widget
{
var widget = GetWidget(id);
return (widget != null) ? (T)widget : null;
return (T) GetOrNull(id);
}

public T Get<T>(string id) where T : Widget
{
var t = GetOrNull<T>(id);
if (t == null)
throw new InvalidOperationException(
"Widget {0} has no child {1} of type {2}".F(
Id, id, typeof(T).Name));
return t;
}

public Widget Get(string id) { return Get<Widget>(id); }
}

public class ContainerWidget : Widget
Expand Down
2 changes: 1 addition & 1 deletion OpenRA.Mods.Cnc/ProductionQueueFromSelection.cs
Expand Up @@ -33,7 +33,7 @@ public ProductionQueueFromSelection(World world, ProductionQueueFromSelectionInf
this.world = world;

tabsWidget = Lazy.New(() =>
Ui.Root.GetWidget<ProductionTabsWidget>(info.ProductionTabsWidget));
Ui.Root.Get<ProductionTabsWidget>(info.ProductionTabsWidget));
}

public void SelectionChanged()
Expand Down
8 changes: 4 additions & 4 deletions OpenRA.Mods.Cnc/Widgets/CncWidgetUtils.cs
Expand Up @@ -20,16 +20,16 @@ public static class CncWidgetUtils
public static void PromptConfirmAction(string title, string text, Action onConfirm, Action onCancel)
{
var prompt = Ui.OpenWindow("CONFIRM_PROMPT");
prompt.GetWidget<LabelWidget>("PROMPT_TITLE").GetText = () => title;
prompt.GetWidget<LabelWidget>("PROMPT_TEXT").GetText = () => text;
prompt.Get<LabelWidget>("PROMPT_TITLE").GetText = () => title;
prompt.Get<LabelWidget>("PROMPT_TEXT").GetText = () => text;

prompt.GetWidget<ButtonWidget>("CONFIRM_BUTTON").OnClick = () =>
prompt.Get<ButtonWidget>("CONFIRM_BUTTON").OnClick = () =>
{
Ui.CloseWindow();
onConfirm();
};

prompt.GetWidget<ButtonWidget>("CANCEL_BUTTON").OnClick = () =>
prompt.Get<ButtonWidget>("CANCEL_BUTTON").OnClick = () =>
{
Ui.CloseWindow();
onCancel();
Expand Down
Expand Up @@ -37,7 +37,7 @@ public CncWorldInteractionControllerWidget(World world, WorldRenderer worldRende
: base(world, worldRenderer)
{
tooltipContainer = Lazy.New(() =>
Ui.Root.GetWidget<TooltipContainerWidget>(TooltipContainer));
Ui.Root.Get<TooltipContainerWidget>(TooltipContainer));
}

public override void MouseEntered()
Expand Down
4 changes: 2 additions & 2 deletions OpenRA.Mods.Cnc/Widgets/Logic/ButtonTooltipLogic.cs
Expand Up @@ -17,8 +17,8 @@ public class ButtonTooltipLogic
[ObjectCreator.UseCtor]
public ButtonTooltipLogic(Widget widget, ToggleButtonWidget button)
{
var label = widget.GetWidget<LabelWidget>("LABEL");
var hotkey = widget.GetWidget<LabelWidget>("HOTKEY");
var label = widget.Get<LabelWidget>("LABEL");
var hotkey = widget.Get<LabelWidget>("HOTKEY");

label.GetText = () => button.TooltipText;
var labelWidth = Game.Renderer.Fonts[label.Font].Measure(button.TooltipText).X;
Expand Down
24 changes: 12 additions & 12 deletions OpenRA.Mods.Cnc/Widgets/Logic/CncConquestObjectivesLogic.cs
Expand Up @@ -19,16 +19,16 @@ public class CncConquestObjectivesLogic
[ObjectCreator.UseCtor]
public CncConquestObjectivesLogic(Widget widget, World world)
{
var panel = widget.GetWidget("CONQUEST_OBJECTIVES");
panel.GetWidget<LabelWidget>("TITLE").GetText = () => "Conquest: " + world.Map.Title;
var panel = widget.Get("CONQUEST_OBJECTIVES");
panel.Get<LabelWidget>("TITLE").GetText = () => "Conquest: " + world.Map.Title;

var statusLabel = panel.GetWidget<LabelWidget>("STATUS");
var statusLabel = panel.Get<LabelWidget>("STATUS");
statusLabel.IsVisible = () => world.LocalPlayer != null;

if (world.LocalPlayer != null)
{
var lp = world.LocalPlayer;
var objectiveCheckbox = panel.GetWidget<CheckboxWidget>("1");
var objectiveCheckbox = panel.Get<CheckboxWidget>("1");
objectiveCheckbox.IsChecked = () => lp.WinState != WinState.Undefined;
objectiveCheckbox.GetCheckType = () => lp.WinState == WinState.Won ?
"checked" : "crossed";
Expand All @@ -39,30 +39,30 @@ public CncConquestObjectivesLogic(Widget widget, World world)
lp.WinState == WinState.Lost ? Color.Red : Color.White;
}

var scrollpanel = panel.GetWidget<ScrollPanelWidget>("PLAYER_LIST");
var itemTemplate = scrollpanel.GetWidget("PLAYER_TEMPLATE");
var scrollpanel = panel.Get<ScrollPanelWidget>("PLAYER_LIST");
var itemTemplate = scrollpanel.Get("PLAYER_TEMPLATE");
scrollpanel.RemoveChildren();

foreach (var p in world.Players.Where(a => !a.NonCombatant))
{
Player pp = p;
var c = world.LobbyInfo.ClientWithIndex(pp.ClientIndex);
var item = itemTemplate.Clone();
var nameLabel = item.GetWidget<LabelWidget>("NAME");
var nameLabel = item.Get<LabelWidget>("NAME");
nameLabel.GetText = () => pp.WinState == WinState.Lost ? pp.PlayerName + " (Dead)" : pp.PlayerName;
nameLabel.GetColor = () => pp.ColorRamp.GetColor(0);

var flag = item.GetWidget<ImageWidget>("FACTIONFLAG");
var flag = item.Get<ImageWidget>("FACTIONFLAG");
flag.GetImageName = () => pp.Country.Race;
flag.GetImageCollection = () => "flags";
item.GetWidget<LabelWidget>("FACTION").GetText = () => pp.Country.Name;
item.Get<LabelWidget>("FACTION").GetText = () => pp.Country.Name;

var team = item.GetWidget<LabelWidget>("TEAM");
var team = item.Get<LabelWidget>("TEAM");
team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
scrollpanel.AddChild(item);

item.GetWidget<LabelWidget>("KILLS").GetText = () => pp.Kills.ToString();
item.GetWidget<LabelWidget>("DEATHS").GetText = () => pp.Deaths.ToString();
item.Get<LabelWidget>("KILLS").GetText = () => pp.Kills.ToString();
item.Get<LabelWidget>("DEATHS").GetText = () => pp.Deaths.ToString();
}
}
}
Expand Down
38 changes: 19 additions & 19 deletions OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs
Expand Up @@ -27,7 +27,7 @@ enum MenuType { None, Cheats }

void AddChatLine(Color c, string from, string text)
{
ingameRoot.GetWidget<ChatDisplayWidget>("CHAT_DISPLAY").AddLine(c, from, text);
ingameRoot.Get<ChatDisplayWidget>("CHAT_DISPLAY").AddLine(c, from, text);
}

void UnregisterEvents()
Expand Down Expand Up @@ -57,7 +57,7 @@ void SetupProductionGroupButton(ToggleButtonWidget button, string group)
button.OnKeyPress = e => selectTab(e.Modifiers.HasModifier(Modifiers.Shift));
button.IsToggled = () => queueTabs.QueueGroup == group;
var chromeName = group.ToLowerInvariant();
var icon = button.GetWidget<ImageWidget>("ICON");
var icon = button.Get<ImageWidget>("ICON");
icon.GetImageName = () => button.IsDisabled() ? chromeName+"-disabled" :
queueTabs.Groups[group].Alert ? chromeName+"-alert" : chromeName;
}
Expand All @@ -72,8 +72,8 @@ public CncIngameChromeLogic(Widget widget, World world)
Game.AddChatLine += AddChatLine;
Game.BeforeGameStart += UnregisterEvents;

ingameRoot = widget.GetWidget("INGAME_ROOT");
var playerRoot = ingameRoot.GetWidget("PLAYER_ROOT");
ingameRoot = widget.Get("INGAME_ROOT");
var playerRoot = ingameRoot.Get("PLAYER_ROOT");

// Observer
if (world.LocalPlayer == null)
Expand All @@ -100,7 +100,7 @@ public void OptionsClicked()
public void InitObserverWidgets(World world, Widget playerRoot)
{
var observerWidgets = Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs());
observerWidgets.GetWidget<ButtonWidget>("OPTIONS_BUTTON").OnClick = OptionsClicked;
observerWidgets.Get<ButtonWidget>("OPTIONS_BUTTON").OnClick = OptionsClicked;
}

public void InitPlayerWidgets(World world, Widget playerRoot)
Expand All @@ -109,29 +109,29 @@ public void InitPlayerWidgets(World world, Widget playerRoot)
var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
playerWidgets.IsVisible = () => true;

var sidebarRoot = playerWidgets.GetWidget("SIDEBAR_BACKGROUND");
var sidebarRoot = playerWidgets.Get("SIDEBAR_BACKGROUND");

BindOrderButton<SellOrderGenerator>(world, sidebarRoot, "SELL_BUTTON", "sell");
BindOrderButton<RepairOrderGenerator>(world, sidebarRoot, "REPAIR_BUTTON", "repair");

var playerResources = world.LocalPlayer.PlayerActor.Trait<PlayerResources>();
sidebarRoot.GetWidget<LabelWidget>("CASH").GetText = () =>
sidebarRoot.Get<LabelWidget>("CASH").GetText = () =>
"${0}".F(playerResources.DisplayCash + playerResources.DisplayOre);

queueTabs = playerWidgets.GetWidget<ProductionTabsWidget>("PRODUCTION_TABS");
queueTabs = playerWidgets.Get<ProductionTabsWidget>("PRODUCTION_TABS");
world.ActorAdded += queueTabs.ActorChanged;
world.ActorRemoved += queueTabs.ActorChanged;

var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES");
SetupProductionGroupButton(queueTypes.GetWidget<ToggleButtonWidget>("BUILDING"), "Building");
SetupProductionGroupButton(queueTypes.GetWidget<ToggleButtonWidget>("DEFENSE"), "Defense");
SetupProductionGroupButton(queueTypes.GetWidget<ToggleButtonWidget>("INFANTRY"), "Infantry");
SetupProductionGroupButton(queueTypes.GetWidget<ToggleButtonWidget>("VEHICLE"), "Vehicle");
SetupProductionGroupButton(queueTypes.GetWidget<ToggleButtonWidget>("AIRCRAFT"), "Aircraft");
var queueTypes = sidebarRoot.Get("PRODUCTION_TYPES");
SetupProductionGroupButton(queueTypes.Get<ToggleButtonWidget>("BUILDING"), "Building");
SetupProductionGroupButton(queueTypes.Get<ToggleButtonWidget>("DEFENSE"), "Defense");
SetupProductionGroupButton(queueTypes.Get<ToggleButtonWidget>("INFANTRY"), "Infantry");
SetupProductionGroupButton(queueTypes.Get<ToggleButtonWidget>("VEHICLE"), "Vehicle");
SetupProductionGroupButton(queueTypes.Get<ToggleButtonWidget>("AIRCRAFT"), "Aircraft");

playerWidgets.GetWidget<ButtonWidget>("OPTIONS_BUTTON").OnClick = OptionsClicked;
playerWidgets.Get<ButtonWidget>("OPTIONS_BUTTON").OnClick = OptionsClicked;

var cheatsButton = playerWidgets.GetWidget<ButtonWidget>("CHEATS_BUTTON");
var cheatsButton = playerWidgets.Get<ButtonWidget>("CHEATS_BUTTON");
cheatsButton.OnClick = () =>
{
if (menu != MenuType.None)
Expand All @@ -142,7 +142,7 @@ public void InitPlayerWidgets(World world, Widget playerRoot)
};
cheatsButton.IsVisible = () => world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats;

var winLossWatcher = playerWidgets.GetWidget<LogicTickerWidget>("WIN_LOSS_WATCHER");
var winLossWatcher = playerWidgets.Get<LogicTickerWidget>("WIN_LOSS_WATCHER");
winLossWatcher.OnTick = () =>
{
if (world.LocalPlayer.WinState != WinState.Undefined)
Expand All @@ -157,11 +157,11 @@ public void InitPlayerWidgets(World world, Widget playerRoot)
static void BindOrderButton<T>(World world, Widget parent, string button, string icon)
where T : IOrderGenerator, new()
{
var w = parent.GetWidget<ToggleButtonWidget>(button);
var w = parent.Get<ToggleButtonWidget>(button);
w.OnClick = () => world.ToggleInputMode<T>();
w.IsToggled = () => world.OrderGenerator is T;

w.GetWidget<ImageWidget>("ICON").GetImageName =
w.Get<ImageWidget>("ICON").GetImageName =
() => world.OrderGenerator is T ? icon+"-active" : icon;
}
}
Expand Down
16 changes: 8 additions & 8 deletions OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs
Expand Up @@ -23,14 +23,14 @@ public class CncIngameMenuLogic
public CncIngameMenuLogic(Widget widget, World world, Action onExit)
{
var resumeDisabled = false;
menu = widget.GetWidget("INGAME_MENU");
menu = widget.Get("INGAME_MENU");
var mpe = world.WorldActor.Trait<CncMenuPaletteEffect>();
mpe.Fade(CncMenuPaletteEffect.EffectType.Desaturated);

menu.GetWidget<LabelWidget>("VERSION_LABEL").GetText = WidgetUtils.ActiveModVersion;
menu.Get<LabelWidget>("VERSION_LABEL").GetText = WidgetUtils.ActiveModVersion;

bool hideButtons = false;
menu.GetWidget("MENU_BUTTONS").IsVisible = () => !hideButtons;
menu.Get("MENU_BUTTONS").IsVisible = () => !hideButtons;

// TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions
Action onQuit = () =>
Expand All @@ -48,16 +48,16 @@ public CncIngameMenuLogic(Widget widget, World world, Action onExit)

Action doNothing = () => {};

menu.GetWidget<ButtonWidget>("QUIT_BUTTON").OnClick = () =>
menu.Get<ButtonWidget>("QUIT_BUTTON").OnClick = () =>
CncWidgetUtils.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, doNothing);

Action onSurrender = () => world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
var surrenderButton = menu.GetWidget<ButtonWidget>("SURRENDER_BUTTON");
var surrenderButton = menu.Get<ButtonWidget>("SURRENDER_BUTTON");
surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined);
surrenderButton.OnClick = () =>
CncWidgetUtils.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, doNothing);

menu.GetWidget<ButtonWidget>("MUSIC_BUTTON").OnClick = () =>
menu.Get<ButtonWidget>("MUSIC_BUTTON").OnClick = () =>
{
hideButtons = true;
Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
Expand All @@ -66,7 +66,7 @@ public CncIngameMenuLogic(Widget widget, World world, Action onExit)
});
};

menu.GetWidget<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>
menu.Get<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>
{
hideButtons = true;
Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
Expand All @@ -76,7 +76,7 @@ public CncIngameMenuLogic(Widget widget, World world, Action onExit)
});
};

var resumeButton = menu.GetWidget<ButtonWidget>("RESUME_BUTTON");
var resumeButton = menu.Get<ButtonWidget>("RESUME_BUTTON");
resumeButton.IsDisabled = () => resumeDisabled;
resumeButton.OnClick = () =>
{
Expand Down
12 changes: 6 additions & 6 deletions OpenRA.Mods.Cnc/Widgets/Logic/CncInstallFromCDLogic.cs
Expand Up @@ -36,17 +36,17 @@ public CncInstallFromCDLogic(Widget widget, Action afterInstall, string[] filesT
this.filesToExtract = filesToExtract;

panel = widget;
progressBar = panel.GetWidget<ProgressBarWidget>("PROGRESS_BAR");
statusLabel = panel.GetWidget<LabelWidget>("STATUS_LABEL");
progressBar = panel.Get<ProgressBarWidget>("PROGRESS_BAR");
statusLabel = panel.Get<LabelWidget>("STATUS_LABEL");

backButton = panel.GetWidget<ButtonWidget>("BACK_BUTTON");
backButton = panel.Get<ButtonWidget>("BACK_BUTTON");
backButton.OnClick = Ui.CloseWindow;

retryButton = panel.GetWidget<ButtonWidget>("RETRY_BUTTON");
retryButton = panel.Get<ButtonWidget>("RETRY_BUTTON");
retryButton.OnClick = CheckForDisk;

installingContainer = panel.GetWidget("INSTALLING");
insertDiskContainer = panel.GetWidget("INSERT_DISK");
installingContainer = panel.Get("INSTALLING");
insertDiskContainer = panel.Get("INSERT_DISK");

CheckForDisk();
}
Expand Down
10 changes: 5 additions & 5 deletions OpenRA.Mods.Cnc/Widgets/Logic/CncInstallLogic.cs
Expand Up @@ -19,27 +19,27 @@ public class CncInstallLogic
[ObjectCreator.UseCtor]
public CncInstallLogic(Widget widget, Dictionary<string,string> installData, Action continueLoading)
{
var panel = widget.GetWidget("INSTALL_PANEL");
var panel = widget.Get("INSTALL_PANEL");
var args = new WidgetArgs()
{
{ "afterInstall", () => { Ui.CloseWindow(); continueLoading(); } },
{ "installData", installData }
};

panel.GetWidget<ButtonWidget>("DOWNLOAD_BUTTON").OnClick = () =>
panel.Get<ButtonWidget>("DOWNLOAD_BUTTON").OnClick = () =>
Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", args);

panel.GetWidget<ButtonWidget>("INSTALL_BUTTON").OnClick = () =>
panel.Get<ButtonWidget>("INSTALL_BUTTON").OnClick = () =>
Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs(args)
{
{ "filesToCopy", new[] { "CONQUER.MIX", "DESERT.MIX", "SCORES.MIX",
"SOUNDS.MIX", "TEMPERAT.MIX", "WINTER.MIX" } },
{ "filesToExtract", new[] { "speech.mix", "tempicnh.mix", "transit.mix" } },
});

panel.GetWidget<ButtonWidget>("QUIT_BUTTON").OnClick = Game.Exit;
panel.Get<ButtonWidget>("QUIT_BUTTON").OnClick = Game.Exit;

panel.GetWidget<ButtonWidget>("MODS_BUTTON").OnClick = () =>
panel.Get<ButtonWidget>("MODS_BUTTON").OnClick = () =>
{
Ui.OpenWindow("MODS_PANEL", new WidgetArgs()
{
Expand Down

0 comments on commit c30d46c

Please sign in to comment.