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)
{
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();

View File

@@ -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;
@@ -288,19 +285,6 @@ namespace OpenRA.Mods.Cnc.Widgets
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()
{
if (MapUid == orderManager.LobbyInfo.GlobalSettings.Map) return;
@@ -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<SliderWidget>("HUE_SLIDER");
hueSlider.SetOffset(orderManager.LocalClient.ColorRamp.H / 255f);
Action<ColorRamp> onSelect = c =>
{
Game.Settings.Player.ColorRamp = c;
Game.Settings.Save();
orderManager.IssueOrder(Order.Command("color {0}".F(c)));
};
var satSlider = colorChooser.GetWidget<SliderWidget>("SAT_SLIDER");
satSlider.SetOffset(orderManager.LocalClient.ColorRamp.S / 255f);
Action<ColorRamp> onChange = c =>
{
CurrentColorPreview = c;
};
var lumSlider = colorChooser.GetWidget<SliderWidget>("LUM_SLIDER");
lumSlider.SetOffset(orderManager.LocalClient.ColorRamp.L / 255f);
var rangeSlider = colorChooser.GetWidget<SliderWidget>("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<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;
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<Widget>() { 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<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)
{
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
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