CheckboxWidget delegate methods.

This commit is contained in:
Paul Chote
2011-01-06 11:40:06 +13:00
parent 7443b3ce89
commit 0cef2e4f53
6 changed files with 78 additions and 140 deletions

View File

@@ -11,6 +11,7 @@
using System; using System;
using System.Drawing; using System.Drawing;
using OpenRA.Graphics; using OpenRA.Graphics;
using System.Reflection;
namespace OpenRA.Widgets namespace OpenRA.Widgets
{ {
@@ -19,7 +20,12 @@ namespace OpenRA.Widgets
public string Text = ""; public string Text = "";
public int baseLine = 1; public int baseLine = 1;
public bool Bold = false; public bool Bold = false;
public Func<bool> Checked = () => false; public Func<bool> IsChecked = () => false;
public event Action<bool> OnChange = _ => {};
object boundObject;
bool boundReadOnly;
FieldInfo boundField;
public override void DrawInner( WorldRenderer wr ) public override void DrawInner( WorldRenderer wr )
{ {
@@ -35,19 +41,37 @@ namespace OpenRA.Widgets
new float2(rect.Left + rect.Height * 1.5f, new float2(rect.Left + rect.Height * 1.5f,
pos.Y - baseLine + (Bounds.Height - textSize.Y)/2), Color.White); pos.Y - baseLine + (Bounds.Height - textSize.Y)/2), Color.White);
if (Checked()) if ((boundObject != null && (bool)boundField.GetValue(boundObject)) || IsChecked())
WidgetUtils.DrawRGBA( WidgetUtils.DrawRGBA(
ChromeProvider.GetImage("checkbox", "checked"), ChromeProvider.GetImage("checkbox", "checked"),
new float2(rect.Left + 2, rect.Top + 2)); new float2(rect.Left + 2, rect.Top + 2));
} }
public void Bind(object obj, string field) { Bind(obj, field, false); }
public void BindReadOnly(object obj, string field) { Bind(obj, field, true); }
void Bind(object obj, string field, bool readOnly)
{
boundObject = obj;
boundReadOnly = readOnly;
boundField = obj.GetType().GetField(field);
}
// TODO: SliderWidget doesn't support delegate methods for mouse input
public override bool HandleMouseInput(MouseInput mi) public override bool HandleMouseInput(MouseInput mi)
{ {
// Checkboxes require lmb // Checkboxes require lmb
if (mi.Button != MouseButton.Left) if (mi.Button != MouseButton.Left || mi.Event != MouseInputEvent.Down)
return false; return false;
return base.HandleMouseInput(mi); bool newVal = !IsChecked();
if (boundObject != null && !boundReadOnly)
{
newVal = !(bool)boundField.GetValue(boundObject);
boundField.SetValue(boundObject, newVal);
}
OnChange(newVal);
return true;
} }
public CheckboxWidget() : base() { } public CheckboxWidget() : base() { }
@@ -56,7 +80,6 @@ namespace OpenRA.Widgets
: base(other) : base(other)
{ {
Text = other.Text; Text = other.Text;
Checked = other.Checked;
} }
public override Widget Clone() { return new CheckboxWidget(this); } public override Widget Clone() { return new CheckboxWidget(this); }

View File

@@ -41,18 +41,10 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
cs.GetWidget<TextFieldWidget>("GAME_TITLE").Text = settings.Server.Name; cs.GetWidget<TextFieldWidget>("GAME_TITLE").Text = settings.Server.Name;
cs.GetWidget<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString(); cs.GetWidget<TextFieldWidget>("LISTEN_PORT").Text = settings.Server.ListenPort.ToString();
cs.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text = settings.Server.ExternalPort.ToString(); cs.GetWidget<TextFieldWidget>("EXTERNAL_PORT").Text = settings.Server.ExternalPort.ToString();
cs.GetWidget<CheckboxWidget>("CHECKBOX_ONLINE").Checked = () => settings.Server.AdvertiseOnline; cs.GetWidget<CheckboxWidget>("CHECKBOX_ONLINE").Bind(settings.Server, "AdvertiseOnline");
cs.GetWidget("CHECKBOX_ONLINE").OnMouseDown = mi => { cs.GetWidget<CheckboxWidget>("CHECKBOX_ONLINE").OnChange += _ => settings.Save();
settings.Server.AdvertiseOnline ^= true; cs.GetWidget<CheckboxWidget>("CHECKBOX_CHEATS").Bind(settings.Server, "AllowCheats");
settings.Save(); cs.GetWidget<CheckboxWidget>("CHECKBOX_CHEATS").OnChange += _ => settings.Save();
return true;
};
cs.GetWidget<CheckboxWidget>("CHECKBOX_CHEATS").Checked = () => settings.Server.AllowCheats;
cs.GetWidget<CheckboxWidget>("CHECKBOX_CHEATS").OnMouseDown = mi => {
settings.Server.AllowCheats ^=true;
settings.Save();
return true;
};
} }
} }
} }

View File

@@ -39,67 +39,33 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
return true; return true;
}; };
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").Checked = var devTrait = world.LocalPlayer.PlayerActor.Trait<DeveloperMode>();
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().DisableShroud; devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").BindReadOnly(devTrait, "DisableShroud");
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").OnMouseDown = mi => devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").OnChange += _ => Order(world, "DevShroud");
{
world.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor, false)); devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_UNITDEBUG").BindReadOnly(devTrait, "UnitInfluenceDebug");
return true; devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_UNITDEBUG").OnChange += _ => Order(world, "DevUnitDebug");
};
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_UNITDEBUG").Checked =
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().UnitInfluenceDebug;
devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi =>
{
world.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor, false));
return true;
};
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_PATHDEBUG").Checked =
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug;
devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi =>
{
world.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor, false));
return true;
};
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_PATHDEBUG").BindReadOnly(devTrait, "PathDebug");
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_PATHDEBUG").OnChange += _ => Order(world, "DevPathDebug");
devmodeBG.GetWidget<ButtonWidget>("GIVE_CASH").OnMouseUp = mi => devmodeBG.GetWidget<ButtonWidget>("GIVE_CASH").OnMouseUp = mi =>
{ {
world.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor, false)); world.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor, false));
return true; return true;
}; };
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").Checked = devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").BindReadOnly(devTrait, "FastBuild");
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastBuild; devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").OnChange += _ => Order(world, "DevFastBuild");
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").OnMouseDown = mi =>
{
world.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor, false));
return true;
};
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").Checked = devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").BindReadOnly(devTrait, "FastCharge");
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastCharge; devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").OnChange += _ => Order(world, "DevFastCharge");
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").OnMouseDown = mi =>
{ devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").BindReadOnly(devTrait, "AllTech");
world.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor, false)); devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").OnChange += _ => Order(world, "DevEnableTech");
return true;
};
devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").Checked = devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").BindReadOnly(devTrait, "UnlimitedPower");
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().AllTech; devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").OnChange += _ => Order(world, "DevUnlimitedPower");
devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").OnMouseDown = mi =>
{
world.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor, false));
return true;
};
devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").Checked =
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().UnlimitedPower;
devmodeBG.GetWidget<CheckboxWidget>("UNLIMITED_POWER").OnMouseDown = mi =>
{
world.IssueOrder(new Order("DevUnlimitedPower", world.LocalPlayer.PlayerActor, false));
return true;
};
devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi => devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi =>
{ {
@@ -109,5 +75,10 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
devModeButton.IsVisible = () => { return world.LobbyInfo.GlobalSettings.AllowCheats; }; devModeButton.IsVisible = () => { return world.LobbyInfo.GlobalSettings.AllowCheats; };
} }
public void Order(World world, string order)
{
world.IssueOrder(new Order(order, world.LocalPlayer.PlayerActor, false));
}
} }
} }

View File

@@ -102,16 +102,14 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
Game.Disconnect(); Game.Disconnect();
return true; return true;
}; };
var lockTeamsCheckbox = lobby.GetWidget<CheckboxWidget>("LOCKTEAMS_CHECKBOX"); var lockTeamsCheckbox = lobby.GetWidget<CheckboxWidget>("LOCKTEAMS_CHECKBOX");
lockTeamsCheckbox.IsVisible = () => lockTeamsCheckbox.Visible && true; lockTeamsCheckbox.BindReadOnly(orderManager.LobbyInfo.GlobalSettings, "LockTeams");
lockTeamsCheckbox.Checked = () => orderManager.LobbyInfo.GlobalSettings.LockTeams; lockTeamsCheckbox.OnChange += _ =>
lockTeamsCheckbox.OnMouseDown = mi =>
{ {
if (Game.IsHost) if (Game.IsHost)
orderManager.IssueOrder(Order.Command( orderManager.IssueOrder(Order.Command(
"lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams))); "lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams)));
return true;
}; };
var startGameButton = lobby.GetWidget("START_GAME_BUTTON"); var startGameButton = lobby.GetWidget("START_GAME_BUTTON");
@@ -400,8 +398,8 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
var status = template.GetWidget<CheckboxWidget>("STATUS"); var status = template.GetWidget<CheckboxWidget>("STATUS");
status.Checked = () => c.State == Session.ClientState.Ready; status.IsChecked = () => c.State == Session.ClientState.Ready;
status.OnMouseDown = CycleReady; status.OnChange += CycleReady;
var spectator = template.GetWidget<LabelWidget>("SPECTATOR"); var spectator = template.GetWidget<LabelWidget>("SPECTATOR");
@@ -432,8 +430,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
var status = template.GetWidget<CheckboxWidget>("STATUS"); var status = template.GetWidget<CheckboxWidget>("STATUS");
status.Checked = () => c.State == Session.ClientState.Ready; status.IsChecked = () => c.State == Session.ClientState.Ready;
if (c.Index == orderManager.LocalClient.Index) status.OnMouseDown = CycleReady; if (c.Index == orderManager.LocalClient.Index)
status.OnChange += CycleReady;
var spectator = template.GetWidget<LabelWidget>("SPECTATOR"); var spectator = template.GetWidget<LabelWidget>("SPECTATOR");
@@ -462,10 +461,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
bool SpawnPointAvailable(int index) { return (index == 0) || orderManager.LobbyInfo.Clients.All(c => c.SpawnPoint != index); } bool SpawnPointAvailable(int index) { return (index == 0) || orderManager.LobbyInfo.Clients.All(c => c.SpawnPoint != index); }
bool CycleReady(MouseInput mi) void CycleReady(bool ready)
{ {
orderManager.IssueOrder(Order.Command("ready")); orderManager.IssueOrder(Order.Command("ready"));
return true;
} }
} }
} }

View File

@@ -72,22 +72,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
return bg.GetWidget("BUTTON_PLAY").OnMouseUp(mi); return bg.GetWidget("BUTTON_PLAY").OnMouseUp(mi);
}; };
var shuffle = bg.GetWidget<CheckboxWidget>("SHUFFLE"); bg.GetWidget<CheckboxWidget>("SHUFFLE").Bind(Game.Settings.Sound, "Shuffle");
shuffle.OnMouseDown = mi => bg.GetWidget<CheckboxWidget>("REPEAT").Bind(Game.Settings.Sound, "Repeat");
{
Game.Settings.Sound.Shuffle ^= true;
return true;
};
shuffle.Checked = () => Game.Settings.Sound.Shuffle;
var repeat = bg.GetWidget<CheckboxWidget>("REPEAT");
repeat.OnMouseDown = mi =>
{
Game.Settings.Sound.Repeat ^= true;
return true;
};
repeat.Checked = () => Game.Settings.Sound.Repeat;
bg.GetWidget<LabelWidget>("TIME").GetText = () => bg.GetWidget<LabelWidget>("TIME").GetText = () =>
{ {
if (CurrentSong == null) if (CurrentSong == null)

View File

@@ -46,13 +46,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
}; };
name.OnEnterKey = () => { name.LoseFocus(); return true; }; name.OnEnterKey = () => { name.LoseFocus(); return true; };
var edgeScroll = general.GetWidget<CheckboxWidget>("EDGE_SCROLL"); general.GetWidget<CheckboxWidget>("EDGE_SCROLL").Bind(Game.Settings.Game, "ViewportEdgeScroll");
edgeScroll.Checked = () => Game.Settings.Game.ViewportEdgeScroll;
edgeScroll.OnMouseDown = mi =>
{
Game.Settings.Game.ViewportEdgeScroll ^= true;
return true;
};
// Added scroll sensitivity - Gecko // Added scroll sensitivity - Gecko
var edgeScrollSlider = general.GetWidget<SliderWidget>("EDGE_SCROLL_AMOUNT"); var edgeScrollSlider = general.GetWidget<SliderWidget>("EDGE_SCROLL_AMOUNT");
@@ -63,21 +57,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset();
} }
var inverseScroll = general.GetWidget<CheckboxWidget>("INVERSE_SCROLL"); general.GetWidget<CheckboxWidget>("INVERSE_SCROLL").Bind(Game.Settings.Game, "InverseDragScroll");
inverseScroll.Checked = () => Game.Settings.Game.InverseDragScroll; general.GetWidget<CheckboxWidget>("TEAMCHAT_TOGGLE").Bind(Game.Settings.Game, "TeamChatToggle");
inverseScroll.OnMouseDown = mi =>
{
Game.Settings.Game.InverseDragScroll ^= true;
return true;
};
var teamChatToggle = general.GetWidget<CheckboxWidget>("TEAMCHAT_TOGGLE");
teamChatToggle.Checked = () => Game.Settings.Game.TeamChatToggle;
teamChatToggle.OnMouseDown = mi =>
{
Game.Settings.Game.TeamChatToggle ^= true;
return true;
};
// Audio // Audio
var audio = bg.GetWidget("AUDIO_PANE"); var audio = bg.GetWidget("AUDIO_PANE");
@@ -95,14 +77,12 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
// Display // Display
var display = bg.GetWidget("DISPLAY_PANE"); var display = bg.GetWidget("DISPLAY_PANE");
display.GetWidget<CheckboxWidget>("FULLSCREEN_CHECKBOX").Bind(Game.Settings.Game, "TeamChatToggle");
var fullscreen = display.GetWidget<CheckboxWidget>("FULLSCREEN_CHECKBOX"); var fullscreen = display.GetWidget<CheckboxWidget>("FULLSCREEN_CHECKBOX");
fullscreen.Checked = () => {return Game.Settings.Graphics.Mode != WindowMode.Windowed;}; fullscreen.IsChecked = () => Game.Settings.Graphics.Mode != WindowMode.Windowed;
fullscreen.OnMouseDown = mi => fullscreen.OnChange += c => Game.Settings.Graphics.Mode = (Game.Settings.Graphics.Mode == WindowMode.Windowed) ? WindowMode.PseudoFullscreen : WindowMode.Windowed;
{
Game.Settings.Graphics.Mode = (Game.Settings.Graphics.Mode == WindowMode.Windowed) ? WindowMode.PseudoFullscreen : WindowMode.Windowed;
return true;
};
var width = display.GetWidget<TextFieldWidget>("SCREEN_WIDTH"); var width = display.GetWidget<TextFieldWidget>("SCREEN_WIDTH");
Game.Settings.Graphics.WindowedSize.X = (Game.Settings.Graphics.WindowedSize.X < Game.Settings.Graphics.MinResolution.X)? Game.Settings.Graphics.WindowedSize.X = (Game.Settings.Graphics.WindowedSize.X < Game.Settings.Graphics.MinResolution.X)?
Game.Settings.Graphics.MinResolution.X : Game.Settings.Graphics.WindowedSize.X; Game.Settings.Graphics.MinResolution.X : Game.Settings.Graphics.WindowedSize.X;
@@ -141,22 +121,9 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
// Debug // Debug
var debug = bg.GetWidget("DEBUG_PANE"); var debug = bg.GetWidget("DEBUG_PANE");
var perfdebug = debug.GetWidget<CheckboxWidget>("PERFDEBUG_CHECKBOX"); debug.GetWidget<CheckboxWidget>("PERFDEBUG_CHECKBOX").Bind(Game.Settings.Debug, "PerfGraph");
perfdebug.Checked = () => {return Game.Settings.Debug.PerfGraph;}; debug.GetWidget<CheckboxWidget>("GAMETIME_CHECKBOX").Bind(Game.Settings.Game, "MatchTimer");
perfdebug.OnMouseDown = mi =>
{
Game.Settings.Debug.PerfGraph ^= true;
return true;
};
var timedebug = debug.GetWidget<CheckboxWidget>("GAMETIME_CHECKBOX");
timedebug.Checked = () => {return Game.Settings.Game.MatchTimer;};
timedebug.OnMouseDown = mi =>
{
Game.Settings.Game.MatchTimer ^= true;
return true;
};
bg.GetWidget("BUTTON_CLOSE").OnMouseUp = mi => { bg.GetWidget("BUTTON_CLOSE").OnMouseUp = mi => {
Game.Settings.Save(); Game.Settings.Save();
Widget.CloseWindow(); Widget.CloseWindow();