Color selector as a drop panel.
This commit is contained in:
@@ -115,7 +115,7 @@ namespace OpenRA.Widgets
|
||||
public override Widget Clone() { return new DropDownButtonWidget(this); }
|
||||
public override int UsableWidth { get { return Bounds.Width - Bounds.Height; } } /* space for button */
|
||||
|
||||
public static void ShowDropDown<T>(Widget w, IEnumerable<T> ts, Func<T, int, LabelWidget> ft)
|
||||
public static void ShowDropPanel(Widget w, Widget panel, IEnumerable<Widget> dismissAfter, Func<bool> onDismiss)
|
||||
{
|
||||
var fullscreenMask = new ContainerWidget
|
||||
{
|
||||
@@ -123,8 +123,36 @@ namespace OpenRA.Widgets
|
||||
ClickThrough = false,
|
||||
Visible = true
|
||||
};
|
||||
|
||||
Widget.RootWidget.AddChild(fullscreenMask);
|
||||
|
||||
Action HideDropDown = () =>
|
||||
{
|
||||
Widget.RootWidget.Children.Remove(fullscreenMask);
|
||||
Widget.RootWidget.Children.Remove(panel);
|
||||
};
|
||||
|
||||
fullscreenMask.OnMouseDown = mi =>
|
||||
{
|
||||
if (onDismiss()) HideDropDown();
|
||||
return false;
|
||||
};
|
||||
|
||||
var oldBounds = panel.Bounds;
|
||||
panel.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, oldBounds.Width, oldBounds.Height);
|
||||
panel.ClickThrough = false;
|
||||
panel.Visible = true;
|
||||
panel.OnMouseUp = mi => true;
|
||||
|
||||
foreach (var ww in dismissAfter)
|
||||
{
|
||||
var origMouseUp = ww.OnMouseUp;
|
||||
ww.OnMouseUp = mi => { var result = origMouseUp(mi); if (onDismiss()) HideDropDown(); return result; };
|
||||
}
|
||||
Widget.RootWidget.AddChild(panel);
|
||||
}
|
||||
|
||||
public static void ShowDropDown<T>(Widget w, IEnumerable<T> ts, Func<T, int, LabelWidget> ft)
|
||||
{
|
||||
var dropDown = new ScrollPanelWidget
|
||||
{
|
||||
Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100),
|
||||
@@ -133,28 +161,13 @@ namespace OpenRA.Widgets
|
||||
OnMouseUp = mi => true,
|
||||
};
|
||||
|
||||
Widget.RootWidget.AddChild(dropDown);
|
||||
|
||||
Action HideDropDown = () =>
|
||||
{
|
||||
Widget.RootWidget.Children.Remove(fullscreenMask);
|
||||
Widget.RootWidget.Children.Remove(dropDown);
|
||||
};
|
||||
|
||||
fullscreenMask.OnMouseDown = mi =>
|
||||
{
|
||||
HideDropDown();
|
||||
return false;
|
||||
};
|
||||
|
||||
var y = 0;
|
||||
List<LabelWidget> items = new List<LabelWidget>();
|
||||
|
||||
List<Widget> dismissAfter = new List<Widget>();
|
||||
foreach (var t in ts)
|
||||
{
|
||||
var ww = ft(t, dropDown.Bounds.Width);
|
||||
var origMouseUp = ww.OnMouseUp;
|
||||
ww.OnMouseUp = mi => { var result = origMouseUp(mi); HideDropDown(); return result; };
|
||||
dismissAfter.Add(ww);
|
||||
ww.ClickThrough = false;
|
||||
ww.IsVisible = () => true;
|
||||
ww.Bounds = new Rectangle(1, y, ww.Bounds.Width, ww.Bounds.Height);
|
||||
@@ -175,6 +188,7 @@ namespace OpenRA.Widgets
|
||||
|
||||
dropDown.ContentHeight = y;
|
||||
dropDown.Bounds.Height = y + 2;
|
||||
ShowDropPanel(w,dropDown, dismissAfter, () => true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,9 @@ namespace OpenRA
|
||||
public Widget LoadWidget( Dictionary<string, object> args, Widget parent, MiniYamlNode node)
|
||||
{
|
||||
var widget = NewWidget(node.Key, args);
|
||||
parent.AddChild( widget );
|
||||
|
||||
if (parent != null)
|
||||
parent.AddChild( widget );
|
||||
|
||||
foreach (var child in node.Value.Nodes)
|
||||
if (child.Key != "Children")
|
||||
|
||||
@@ -140,25 +140,6 @@ namespace OpenRA.Widgets.Delegates
|
||||
chatLabel.Text = (teamChat) ? "Team:" : "Chat:";
|
||||
return true;
|
||||
};
|
||||
|
||||
var colorChooser = lobby.GetWidget("COLOR_CHOOSER");
|
||||
var hueSlider = colorChooser.GetWidget<SliderWidget>("HUE_SLIDER");
|
||||
var satSlider = colorChooser.GetWidget<SliderWidget>("SAT_SLIDER");
|
||||
var lumSlider = colorChooser.GetWidget<SliderWidget>("LUM_SLIDER");
|
||||
var rangeSlider = colorChooser.GetWidget<SliderWidget>("RANGE_SLIDER");
|
||||
|
||||
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());
|
||||
|
||||
colorChooser.GetWidget<ButtonWidget>("BUTTON_OK").OnMouseUp = mi =>
|
||||
{
|
||||
colorChooser.IsVisible = () => false;
|
||||
UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset());
|
||||
UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset());
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
void UpdatePlayerColor(float hf, float sf, float lf, float r)
|
||||
@@ -216,7 +197,7 @@ namespace OpenRA.Widgets.Delegates
|
||||
return orderManager.LobbyInfo.ClientInSlot( slot );
|
||||
}
|
||||
|
||||
void ShowDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions)
|
||||
bool ShowSlotDropDown(Session.Slot slot, ButtonWidget name, bool showBotOptions)
|
||||
{
|
||||
var dropDownOptions = new List<Pair<string, Action>>
|
||||
{
|
||||
@@ -242,12 +223,13 @@ namespace OpenRA.Widgets.Delegates
|
||||
Text = " {0}".F(ac.First),
|
||||
OnMouseUp = mi => { ac.Second(); return true; },
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
void ShowRaceDropDown(Session.Slot s, ButtonWidget race)
|
||||
bool ShowRaceDropDown(Session.Slot s, ButtonWidget race)
|
||||
{
|
||||
if (Map.Players[s.MapPlayer].LockRace)
|
||||
return;
|
||||
return false;
|
||||
|
||||
var dropDownOptions = new List<Pair<string, Action>>();
|
||||
foreach (var c in CountryNames)
|
||||
@@ -276,9 +258,10 @@ namespace OpenRA.Widgets.Delegates
|
||||
});
|
||||
return ret;
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
void ShowTeamDropDown(ButtonWidget team)
|
||||
bool ShowTeamDropDown(ButtonWidget team)
|
||||
{
|
||||
var dropDownOptions = new List<Pair<string, Action>>();
|
||||
for (int i = 0; i <= Map.PlayerCount; i++)
|
||||
@@ -296,6 +279,39 @@ namespace OpenRA.Widgets.Delegates
|
||||
Text = " {0}".F(ac.First),
|
||||
OnMouseUp = mi => { ac.Second(); return true; },
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ShowColorDropDown(Session.Slot s, ButtonWidget color)
|
||||
{
|
||||
if (Map.Players[s.MapPlayer].LockColor)
|
||||
return false;
|
||||
|
||||
var colorChooser = Game.modData.WidgetLoader.LoadWidget( new Dictionary<string,object>(), null, "COLOR_CHOOSER" );
|
||||
var hueSlider = colorChooser.GetWidget<SliderWidget>("HUE_SLIDER");
|
||||
hueSlider.SetOffset(orderManager.LocalClient.Color1.GetHue()/360f);
|
||||
|
||||
var satSlider = colorChooser.GetWidget<SliderWidget>("SAT_SLIDER");
|
||||
satSlider.SetOffset(orderManager.LocalClient.Color1.GetSaturation());
|
||||
|
||||
var lumSlider = colorChooser.GetWidget<SliderWidget>("LUM_SLIDER");
|
||||
lumSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness());
|
||||
|
||||
var rangeSlider = colorChooser.GetWidget<SliderWidget>("RANGE_SLIDER");
|
||||
rangeSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness() == 0 ? 0 : orderManager.LocalClient.Color2.GetBrightness()/orderManager.LocalClient.Color1.GetBrightness());
|
||||
|
||||
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());
|
||||
|
||||
DropDownButtonWidget.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;
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
void UpdatePlayerList()
|
||||
@@ -322,7 +338,7 @@ namespace OpenRA.Widgets.Delegates
|
||||
var btn = template.GetWidget<ButtonWidget>("JOIN");
|
||||
btn.GetText = () => "Spectate in this slot";
|
||||
name.GetText = () => s.Closed ? "Closed" : "Open";
|
||||
name.OnMouseDown = _ => { ShowDropDown(s, name, false); return true; };
|
||||
name.OnMouseDown = _ => ShowSlotDropDown(s, name, false);
|
||||
|
||||
}
|
||||
else
|
||||
@@ -330,7 +346,7 @@ namespace OpenRA.Widgets.Delegates
|
||||
template = EmptySlotTemplateHost.Clone();
|
||||
var name = template.GetWidget<ButtonWidget>("NAME");
|
||||
name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : "Bot: " + s.Bot;
|
||||
name.OnMouseDown = _ => { ShowDropDown(s, name, Map.Players[ s.MapPlayer ].AllowBots); return true; };
|
||||
name.OnMouseDown = _ => ShowSlotDropDown(s, name, Map.Players[ s.MapPlayer ].AllowBots);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -376,34 +392,13 @@ namespace OpenRA.Widgets.Delegates
|
||||
name.OnLoseFocus = () => name.OnEnterKey();
|
||||
|
||||
var color = template.GetWidget<ButtonWidget>("COLOR");
|
||||
color.OnMouseUp = mi =>
|
||||
{
|
||||
if (Map.Players[s.MapPlayer].LockColor)
|
||||
return false;
|
||||
|
||||
var colorChooser = Widget.RootWidget.GetWidget("SERVER_LOBBY").GetWidget("COLOR_CHOOSER");
|
||||
var hueSlider = colorChooser.GetWidget<SliderWidget>("HUE_SLIDER");
|
||||
hueSlider.SetOffset(orderManager.LocalClient.Color1.GetHue()/360f);
|
||||
|
||||
var satSlider = colorChooser.GetWidget<SliderWidget>("SAT_SLIDER");
|
||||
satSlider.SetOffset(orderManager.LocalClient.Color1.GetSaturation());
|
||||
|
||||
var lumSlider = colorChooser.GetWidget<SliderWidget>("LUM_SLIDER");
|
||||
lumSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness());
|
||||
|
||||
var rangeSlider = colorChooser.GetWidget<SliderWidget>("RANGE_SLIDER");
|
||||
rangeSlider.SetOffset(orderManager.LocalClient.Color1.GetBrightness() == 0 ? 0 : orderManager.LocalClient.Color2.GetBrightness()/orderManager.LocalClient.Color1.GetBrightness());
|
||||
|
||||
UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset());
|
||||
colorChooser.IsVisible = () => true;
|
||||
return true;
|
||||
};
|
||||
|
||||
color.OnMouseUp = _ => ShowColorDropDown(s, color);
|
||||
|
||||
var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK");
|
||||
colorBlock.GetColor = () => c.Color1;
|
||||
|
||||
var faction = template.GetWidget<ButtonWidget>("FACTION");
|
||||
faction.OnMouseDown = _ => {ShowRaceDropDown(s, faction); return true;};
|
||||
faction.OnMouseDown = _ => ShowRaceDropDown(s, faction);
|
||||
|
||||
var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME");
|
||||
factionname.GetText = () => CountryNames[c.Country];
|
||||
@@ -412,7 +407,7 @@ namespace OpenRA.Widgets.Delegates
|
||||
factionflag.GetImageCollection = () => "flags";
|
||||
|
||||
var team = template.GetWidget<ButtonWidget>("TEAM");
|
||||
team.OnMouseDown = _ => {ShowTeamDropDown(team); return true;};
|
||||
team.OnMouseDown = _ => ShowTeamDropDown(team);
|
||||
team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString();
|
||||
|
||||
var status = template.GetWidget<CheckboxWidget>("STATUS");
|
||||
|
||||
@@ -334,94 +334,85 @@ Background@SERVER_LOBBY:
|
||||
Width: 80
|
||||
Height: 20
|
||||
Text: Lock Teams
|
||||
Background@COLOR_CHOOSER:
|
||||
Id:COLOR_CHOOSER
|
||||
Width:500
|
||||
Height:195
|
||||
X:(WINDOW_RIGHT - WIDTH)/2 - PARENT_LEFT
|
||||
Y:100
|
||||
Visible:false
|
||||
Children:
|
||||
Button@BUTTON_OK:
|
||||
Id:BUTTON_OK
|
||||
X:PARENT_RIGHT - 180
|
||||
Y:PARENT_BOTTOM - 45
|
||||
Width:160
|
||||
Height:25
|
||||
Text:Ok
|
||||
Bold:True
|
||||
ShpImage@MCV:
|
||||
Id:MCV
|
||||
X:PARENT_RIGHT - 90
|
||||
Y:20
|
||||
Image:mcv
|
||||
Frame:8
|
||||
Palette:colorpicker
|
||||
ShpImage@FACT:
|
||||
Id:FACT
|
||||
X:PARENT_RIGHT - 100
|
||||
Y:70
|
||||
Image:fact
|
||||
Palette:colorpicker
|
||||
Label@HUE_LABEL:
|
||||
X:0
|
||||
Y:30
|
||||
Width:110
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Hue:
|
||||
Slider@HUE:
|
||||
Id:HUE_SLIDER
|
||||
X:120
|
||||
Y:30
|
||||
Width:260
|
||||
Height:20
|
||||
Ticks:5
|
||||
Label@SAT_LABEL:
|
||||
X:0
|
||||
Y:60
|
||||
Width:110
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Saturation:
|
||||
Slider@SAT:
|
||||
Id:SAT_SLIDER
|
||||
X:120
|
||||
Y:60
|
||||
Width:260
|
||||
Height:20
|
||||
Ticks:5
|
||||
Label@LUM_LABEL:
|
||||
X:0
|
||||
Y:90
|
||||
Width:110
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Brightness:
|
||||
Slider@LUM:
|
||||
Id:LUM_SLIDER
|
||||
X:120
|
||||
Id:LUM_SLIDER
|
||||
Y:90
|
||||
Width:260
|
||||
Height:20
|
||||
Ticks:5
|
||||
Range:0.2,1
|
||||
Label@RANGE_LABEL:
|
||||
X:0
|
||||
Y:120
|
||||
Width:110
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Range:
|
||||
Slider@RANGE:
|
||||
Id:RANGE_SLIDER
|
||||
X:120
|
||||
Y:120
|
||||
Width:260
|
||||
Height:20
|
||||
Ticks:5
|
||||
Range:0,0.25
|
||||
Background@COLOR_CHOOSER:
|
||||
Id:COLOR_CHOOSER
|
||||
Background:dialog2
|
||||
Width:310
|
||||
Height:120
|
||||
Visible:false
|
||||
Children:
|
||||
Button@BUTTON_OK:
|
||||
Id:BUTTON_OK
|
||||
X:210
|
||||
Y:85
|
||||
Width:90
|
||||
Height:25
|
||||
Text:Ok
|
||||
Bold:True
|
||||
ShpImage@FACT:
|
||||
Id:FACT
|
||||
X:220
|
||||
Y:10
|
||||
Image:fact
|
||||
Palette:colorpicker
|
||||
Label@HUE_LABEL:
|
||||
X:0
|
||||
Y:5
|
||||
Width:40
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Hue:
|
||||
Slider@HUE:
|
||||
Id:HUE_SLIDER
|
||||
X:43
|
||||
Y:10
|
||||
Width:160
|
||||
Height:20
|
||||
Ticks:5
|
||||
Label@SAT_LABEL:
|
||||
X:0
|
||||
Y:30
|
||||
Width:40
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Sat:
|
||||
Slider@SAT:
|
||||
Id:SAT_SLIDER
|
||||
X:43
|
||||
Y:35
|
||||
Width:160
|
||||
Height:20
|
||||
Ticks:5
|
||||
Label@LUM_LABEL:
|
||||
X:0
|
||||
Y:55
|
||||
Width:40
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Lum:
|
||||
Slider@LUM:
|
||||
Id:LUM_SLIDER
|
||||
X:43
|
||||
Y:60
|
||||
Width:160
|
||||
Height:20
|
||||
Ticks:5
|
||||
Range:0.2,1
|
||||
Label@RANGE_LABEL:
|
||||
X:0
|
||||
Y:80
|
||||
Width:40
|
||||
Height:20
|
||||
Align: Right
|
||||
Text: Ran:
|
||||
Slider@RANGE:
|
||||
Id:RANGE_SLIDER
|
||||
X:43
|
||||
Y:85
|
||||
Width:160
|
||||
Height:20
|
||||
Ticks:5
|
||||
Range:0,0.25
|
||||
Background@MAP_CHOOSER:
|
||||
Id:MAP_CHOOSER
|
||||
X:(WINDOW_RIGHT - WIDTH)/2
|
||||
|
||||
Reference in New Issue
Block a user