Split the colorpicker logic into its own handler. Game.LoadWidget no longer adds the loaded widget to the RootWidget.

This commit is contained in:
Paul Chote
2011-05-13 15:32:04 +12:00
parent 529ed51034
commit 21267688b0
4 changed files with 75 additions and 44 deletions

View File

@@ -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) 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 }, { "world", world },
{ "orderManager", orderManager }, { "orderManager", orderManager },
{ "worldRenderer", worldRenderer }, { "worldRenderer", worldRenderer },
}); }, null, widget);
} }
static ActionQueue afterTickActions = new ActionQueue(); static ActionQueue afterTickActions = new ActionQueue();

View File

@@ -34,7 +34,6 @@ namespace OpenRA.Mods.Cnc.Widgets
readonly Action OnGameStart; readonly Action OnGameStart;
readonly Action onExit; readonly Action onExit;
readonly OrderManager orderManager; readonly OrderManager orderManager;
readonly WorldRenderer worldRenderer;
public static ColorRamp CurrentColorPreview; public static ColorRamp CurrentColorPreview;
static bool staticSetup; static bool staticSetup;
@@ -121,11 +120,9 @@ namespace OpenRA.Mods.Cnc.Widgets
internal CncLobbyLogic([ObjectCreator.Param( "widget" )] Widget lobby, internal CncLobbyLogic([ObjectCreator.Param( "widget" )] Widget lobby,
[ObjectCreator.Param] OrderManager orderManager, [ObjectCreator.Param] OrderManager orderManager,
[ObjectCreator.Param] Action onExit, [ObjectCreator.Param] Action onExit,
[ObjectCreator.Param] Action onStart, [ObjectCreator.Param] Action onStart)
[ObjectCreator.Param] WorldRenderer worldRenderer)
{ {
this.orderManager = orderManager; this.orderManager = orderManager;
this.worldRenderer = worldRenderer;
this.OnGameStart = () => { Widget.CloseWindow(); onStart(); }; this.OnGameStart = () => { Widget.CloseWindow(); onStart(); };
this.onExit = onExit; this.onExit = onExit;
@@ -288,19 +285,6 @@ namespace OpenRA.Mods.Cnc.Widgets
chatPanel.ScrollToBottom(); 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() void UpdateCurrentMap()
{ {
if (MapUid == orderManager.LobbyInfo.GlobalSettings.Map) return; if (MapUid == orderManager.LobbyInfo.GlobalSettings.Map) return;
@@ -406,30 +390,28 @@ namespace OpenRA.Mods.Cnc.Widgets
if (Map.Players[s.MapPlayer].LockColor) if (Map.Players[s.MapPlayer].LockColor)
return false; return false;
var colorChooser = Game.modData.WidgetLoader.LoadWidget( new WidgetArgs() { {"worldRenderer", worldRenderer} }, null, "COLOR_CHOOSER" ); Action<ColorRamp> onSelect = c =>
var hueSlider = colorChooser.GetWidget<SliderWidget>("HUE_SLIDER"); {
hueSlider.SetOffset(orderManager.LocalClient.ColorRamp.H / 255f); Game.Settings.Player.ColorRamp = c;
Game.Settings.Save();
orderManager.IssueOrder(Order.Command("color {0}".F(c)));
};
var satSlider = colorChooser.GetWidget<SliderWidget>("SAT_SLIDER"); Action<ColorRamp> onChange = c =>
satSlider.SetOffset(orderManager.LocalClient.ColorRamp.S / 255f); {
CurrentColorPreview = c;
};
var lumSlider = colorChooser.GetWidget<SliderWidget>("LUM_SLIDER"); var colorChooser = Game.LoadWidget(orderManager.world, "COLOR_CHOOSER", new WidgetArgs()
lumSlider.SetOffset(orderManager.LocalClient.ColorRamp.L / 255f); {
{ "onSelect", onSelect },
var rangeSlider = colorChooser.GetWidget<SliderWidget>("RANGE_SLIDER"); { "onChange", onChange },
rangeSlider.SetOffset(orderManager.LocalClient.ColorRamp.R / 255f); { "initialRamp", orderManager.LocalClient.ColorRamp }
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<Widget>() {colorChooser.GetWidget("BUTTON_OK")}, () => {
UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset());
UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset());
return true;
}); });
Console.WriteLine(colorChooser.Id);
CncDropDownButtonWidget.ShowDropPanel(color, colorChooser, new List<Widget>() { colorChooser.GetWidget("SAVE_BUTTON") }, () => true);
return true; return true;
} }
@@ -600,4 +582,51 @@ namespace OpenRA.Mods.Cnc.Widgets
orderManager.IssueOrder(Order.Command("ready")); 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<ColorRamp> onChange,
[ObjectCreator.Param] Action<ColorRamp> onSelect,
[ObjectCreator.Param] WorldRenderer worldRenderer)
{
var panel = widget.GetWidget("COLOR_CHOOSER");
var hueSlider = panel.GetWidget<SliderWidget>("HUE_SLIDER");
hueSlider.SetOffset(initialRamp.H / 255f);
var satSlider = panel.GetWidget<SliderWidget>("SAT_SLIDER");
satSlider.SetOffset(initialRamp.S / 255f);
var lumSlider = panel.GetWidget<SliderWidget>("LUM_SLIDER");
lumSlider.SetOffset(initialRamp.L / 255f);
var rangeSlider = panel.GetWidget<SliderWidget>("RANGE_SLIDER");
rangeSlider.SetOffset(initialRamp.R / 255f);
panel.GetWidget<CncMenuButtonWidget>("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();
}
}
} }

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA
public void WorldLoaded(World world) public void WorldLoaded(World world)
{ {
Game.LoadWidget(world, Info.Widget, new WidgetArgs()); Widget.RootWidget.AddChild(Game.LoadWidget(world, Info.Widget, new WidgetArgs()));
} }
} }
} }

View File

@@ -377,17 +377,18 @@ Container@SERVER_LOBBY:
Text:Start Game Text:Start Game
Background@COLOR_CHOOSER: Background@COLOR_CHOOSER:
Id:COLOR_CHOOSER Id:COLOR_CHOOSER
Delegate:CncColorPickerLogic
Background:panel-black Background:panel-black
Width:315 Width:315
Height:120 Height:120
Children: Children:
CncMenuButton@BUTTON_OK: CncMenuButton@SAVE_BUTTON:
Id:BUTTON_OK Id:SAVE_BUTTON
X:210 X:210
Y:80 Y:80
Width:90 Width:90
Height:25 Height:25
Text:Ok Text:Save
Bold:True Bold:True
ShpImage@FACT: ShpImage@FACT:
Id:FACT Id:FACT