diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index efaf2a2b47..a0905ac62e 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -113,14 +113,15 @@ namespace OpenRA }); } + // Load a widget with world, orderManager, worldRenderer args, without adding it to the widget tree public static Widget LoadWidget(World world, string widget, WidgetArgs args) { - return Widget.LoadWidget(widget, new WidgetArgs(args) + return Game.modData.WidgetLoader.LoadWidget(new WidgetArgs(args) { { "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }, - }); + }, null, widget); } static ActionQueue afterTickActions = new ActionQueue(); diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index 9880387a43..9b3d737401 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -34,7 +34,6 @@ namespace OpenRA.Mods.Cnc.Widgets readonly Action OnGameStart; readonly Action onExit; readonly OrderManager orderManager; - readonly WorldRenderer worldRenderer; public static ColorRamp CurrentColorPreview; static bool staticSetup; @@ -121,11 +120,9 @@ namespace OpenRA.Mods.Cnc.Widgets internal CncLobbyLogic([ObjectCreator.Param( "widget" )] Widget lobby, [ObjectCreator.Param] OrderManager orderManager, [ObjectCreator.Param] Action onExit, - [ObjectCreator.Param] Action onStart, - [ObjectCreator.Param] WorldRenderer worldRenderer) + [ObjectCreator.Param] Action onStart) { this.orderManager = orderManager; - this.worldRenderer = worldRenderer; this.OnGameStart = () => { Widget.CloseWindow(); onStart(); }; this.onExit = onExit; @@ -287,19 +284,6 @@ namespace OpenRA.Mods.Cnc.Widgets chatPanel.AddChild(template); chatPanel.ScrollToBottom(); } - - void UpdatePlayerColor(float hf, float sf, float lf, float r) - { - var ramp = new ColorRamp((byte) (hf*255), (byte) (sf*255), (byte) (lf*255), (byte)(r*255)); - Game.Settings.Player.ColorRamp = ramp; - Game.Settings.Save(); - orderManager.IssueOrder(Order.Command("color {0}".F(ramp))); - } - - void UpdateColorPreview(float hf, float sf, float lf, float r) - { - CurrentColorPreview = new ColorRamp((byte)(hf * 255), (byte)(sf * 255), (byte)(lf * 255), (byte)(r * 255)); - } void UpdateCurrentMap() { @@ -406,30 +390,28 @@ namespace OpenRA.Mods.Cnc.Widgets if (Map.Players[s.MapPlayer].LockColor) return false; - var colorChooser = Game.modData.WidgetLoader.LoadWidget( new WidgetArgs() { {"worldRenderer", worldRenderer} }, null, "COLOR_CHOOSER" ); - var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); - hueSlider.SetOffset(orderManager.LocalClient.ColorRamp.H / 255f); + Action onSelect = c => + { + Game.Settings.Player.ColorRamp = c; + Game.Settings.Save(); + orderManager.IssueOrder(Order.Command("color {0}".F(c))); + }; - var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - satSlider.SetOffset(orderManager.LocalClient.ColorRamp.S / 255f); - - var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - lumSlider.SetOffset(orderManager.LocalClient.ColorRamp.L / 255f); + Action onChange = c => + { + CurrentColorPreview = c; + }; - var rangeSlider = colorChooser.GetWidget("RANGE_SLIDER"); - rangeSlider.SetOffset(orderManager.LocalClient.ColorRamp.R / 255f); - - hueSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - satSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - lumSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - rangeSlider.OnChange += _ => UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - - CncDropDownButtonWidget.ShowDropPanel(color, colorChooser, new List() {colorChooser.GetWidget("BUTTON_OK")}, () => { - UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - return true; + var colorChooser = Game.LoadWidget(orderManager.world, "COLOR_CHOOSER", new WidgetArgs() + { + { "onSelect", onSelect }, + { "onChange", onChange }, + { "initialRamp", orderManager.LocalClient.ColorRamp } }); + + Console.WriteLine(colorChooser.Id); + + CncDropDownButtonWidget.ShowDropPanel(color, colorChooser, new List() { colorChooser.GetWidget("SAVE_BUTTON") }, () => true); return true; } @@ -600,4 +582,51 @@ namespace OpenRA.Mods.Cnc.Widgets orderManager.IssueOrder(Order.Command("ready")); } } + + public class CncColorPickerLogic : IWidgetDelegate + { + ColorRamp ramp; + [ObjectCreator.UseCtor] + public CncColorPickerLogic([ObjectCreator.Param] Widget widget, + [ObjectCreator.Param] ColorRamp initialRamp, + [ObjectCreator.Param] Action onChange, + [ObjectCreator.Param] Action onSelect, + [ObjectCreator.Param] WorldRenderer worldRenderer) + { + var panel = widget.GetWidget("COLOR_CHOOSER"); + var hueSlider = panel.GetWidget("HUE_SLIDER"); + hueSlider.SetOffset(initialRamp.H / 255f); + + var satSlider = panel.GetWidget("SAT_SLIDER"); + satSlider.SetOffset(initialRamp.S / 255f); + + var lumSlider = panel.GetWidget("LUM_SLIDER"); + lumSlider.SetOffset(initialRamp.L / 255f); + + var rangeSlider = panel.GetWidget("RANGE_SLIDER"); + rangeSlider.SetOffset(initialRamp.R / 255f); + + panel.GetWidget("SAVE_BUTTON").OnClick = () => + { + onSelect(ramp); + }; + + Action sliderChanged = () => + { + ramp = new ColorRamp((byte)(255*hueSlider.GetOffset()), + (byte)(255*satSlider.GetOffset()), + (byte)(255*lumSlider.GetOffset()), + (byte)(255*rangeSlider.GetOffset())); + onChange(ramp); + }; + + hueSlider.OnChange += _ => sliderChanged(); + satSlider.OnChange += _ => sliderChanged(); + lumSlider.OnChange += _ => sliderChanged(); + rangeSlider.OnChange += _ => sliderChanged(); + + // Set the initial state + sliderChanged(); + } + } } diff --git a/OpenRA.Mods.RA/OpenWidgetAtGameStart.cs b/OpenRA.Mods.RA/OpenWidgetAtGameStart.cs index 7b1edc088f..58dd6273d2 100644 --- a/OpenRA.Mods.RA/OpenWidgetAtGameStart.cs +++ b/OpenRA.Mods.RA/OpenWidgetAtGameStart.cs @@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA public void WorldLoaded(World world) { - Game.LoadWidget(world, Info.Widget, new WidgetArgs()); + Widget.RootWidget.AddChild(Game.LoadWidget(world, Info.Widget, new WidgetArgs())); } } } \ No newline at end of file diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index 0fa47a7e10..5da3d83262 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -377,17 +377,18 @@ Container@SERVER_LOBBY: Text:Start Game Background@COLOR_CHOOSER: Id:COLOR_CHOOSER + Delegate:CncColorPickerLogic Background:panel-black Width:315 Height:120 Children: - CncMenuButton@BUTTON_OK: - Id:BUTTON_OK + CncMenuButton@SAVE_BUTTON: + Id:SAVE_BUTTON X:210 Y:80 Width:90 Height:25 - Text:Ok + Text:Save Bold:True ShpImage@FACT: Id:FACT