Color selector as a drop panel.

This commit is contained in:
Paul Chote
2010-11-28 12:58:18 +13:00
parent 0b9a984b7a
commit ce5ca9dbca
4 changed files with 160 additions and 158 deletions

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Widgets
public override Widget Clone() { return new DropDownButtonWidget(this); } public override Widget Clone() { return new DropDownButtonWidget(this); }
public override int UsableWidth { get { return Bounds.Width - Bounds.Height; } } /* space for button */ 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 var fullscreenMask = new ContainerWidget
{ {
@@ -123,8 +123,36 @@ namespace OpenRA.Widgets
ClickThrough = false, ClickThrough = false,
Visible = true Visible = true
}; };
Widget.RootWidget.AddChild(fullscreenMask); 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 var dropDown = new ScrollPanelWidget
{ {
Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100), 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, 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; var y = 0;
List<LabelWidget> items = new List<LabelWidget>(); List<LabelWidget> items = new List<LabelWidget>();
List<Widget> dismissAfter = new List<Widget>();
foreach (var t in ts) foreach (var t in ts)
{ {
var ww = ft(t, dropDown.Bounds.Width); var ww = ft(t, dropDown.Bounds.Width);
var origMouseUp = ww.OnMouseUp; dismissAfter.Add(ww);
ww.OnMouseUp = mi => { var result = origMouseUp(mi); HideDropDown(); return result; };
ww.ClickThrough = false; ww.ClickThrough = false;
ww.IsVisible = () => true; ww.IsVisible = () => true;
ww.Bounds = new Rectangle(1, y, ww.Bounds.Width, ww.Bounds.Height); ww.Bounds = new Rectangle(1, y, ww.Bounds.Width, ww.Bounds.Height);
@@ -175,6 +188,7 @@ namespace OpenRA.Widgets
dropDown.ContentHeight = y; dropDown.ContentHeight = y;
dropDown.Bounds.Height = y + 2; dropDown.Bounds.Height = y + 2;
ShowDropPanel(w,dropDown, dismissAfter, () => true);
} }
} }
} }

View File

@@ -41,6 +41,8 @@ namespace OpenRA
public Widget LoadWidget( Dictionary<string, object> args, Widget parent, MiniYamlNode node) public Widget LoadWidget( Dictionary<string, object> args, Widget parent, MiniYamlNode node)
{ {
var widget = NewWidget(node.Key, args); var widget = NewWidget(node.Key, args);
if (parent != null)
parent.AddChild( widget ); parent.AddChild( widget );
foreach (var child in node.Value.Nodes) foreach (var child in node.Value.Nodes)

View File

@@ -140,25 +140,6 @@ namespace OpenRA.Widgets.Delegates
chatLabel.Text = (teamChat) ? "Team:" : "Chat:"; chatLabel.Text = (teamChat) ? "Team:" : "Chat:";
return true; 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) void UpdatePlayerColor(float hf, float sf, float lf, float r)
@@ -216,7 +197,7 @@ namespace OpenRA.Widgets.Delegates
return orderManager.LobbyInfo.ClientInSlot( slot ); 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>> var dropDownOptions = new List<Pair<string, Action>>
{ {
@@ -242,12 +223,13 @@ namespace OpenRA.Widgets.Delegates
Text = " {0}".F(ac.First), Text = " {0}".F(ac.First),
OnMouseUp = mi => { ac.Second(); return true; }, 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) if (Map.Players[s.MapPlayer].LockRace)
return; return false;
var dropDownOptions = new List<Pair<string, Action>>(); var dropDownOptions = new List<Pair<string, Action>>();
foreach (var c in CountryNames) foreach (var c in CountryNames)
@@ -276,9 +258,10 @@ namespace OpenRA.Widgets.Delegates
}); });
return ret; return ret;
}); });
return true;
} }
void ShowTeamDropDown(ButtonWidget team) bool ShowTeamDropDown(ButtonWidget team)
{ {
var dropDownOptions = new List<Pair<string, Action>>(); var dropDownOptions = new List<Pair<string, Action>>();
for (int i = 0; i <= Map.PlayerCount; i++) for (int i = 0; i <= Map.PlayerCount; i++)
@@ -296,6 +279,39 @@ namespace OpenRA.Widgets.Delegates
Text = " {0}".F(ac.First), Text = " {0}".F(ac.First),
OnMouseUp = mi => { ac.Second(); return true; }, 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() void UpdatePlayerList()
@@ -322,7 +338,7 @@ namespace OpenRA.Widgets.Delegates
var btn = template.GetWidget<ButtonWidget>("JOIN"); var btn = template.GetWidget<ButtonWidget>("JOIN");
btn.GetText = () => "Spectate in this slot"; btn.GetText = () => "Spectate in this slot";
name.GetText = () => s.Closed ? "Closed" : "Open"; name.GetText = () => s.Closed ? "Closed" : "Open";
name.OnMouseDown = _ => { ShowDropDown(s, name, false); return true; }; name.OnMouseDown = _ => ShowSlotDropDown(s, name, false);
} }
else else
@@ -330,7 +346,7 @@ namespace OpenRA.Widgets.Delegates
template = EmptySlotTemplateHost.Clone(); template = EmptySlotTemplateHost.Clone();
var name = template.GetWidget<ButtonWidget>("NAME"); var name = template.GetWidget<ButtonWidget>("NAME");
name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : "Bot: " + s.Bot; 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 else
@@ -376,34 +392,13 @@ namespace OpenRA.Widgets.Delegates
name.OnLoseFocus = () => name.OnEnterKey(); name.OnLoseFocus = () => name.OnEnterKey();
var color = template.GetWidget<ButtonWidget>("COLOR"); var color = template.GetWidget<ButtonWidget>("COLOR");
color.OnMouseUp = mi => color.OnMouseUp = _ => ShowColorDropDown(s, color);
{
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;
};
var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK"); var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK");
colorBlock.GetColor = () => c.Color1; colorBlock.GetColor = () => c.Color1;
var faction = template.GetWidget<ButtonWidget>("FACTION"); var faction = template.GetWidget<ButtonWidget>("FACTION");
faction.OnMouseDown = _ => {ShowRaceDropDown(s, faction); return true;}; faction.OnMouseDown = _ => ShowRaceDropDown(s, faction);
var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME"); var factionname = faction.GetWidget<LabelWidget>("FACTIONNAME");
factionname.GetText = () => CountryNames[c.Country]; factionname.GetText = () => CountryNames[c.Country];
@@ -412,7 +407,7 @@ namespace OpenRA.Widgets.Delegates
factionflag.GetImageCollection = () => "flags"; factionflag.GetImageCollection = () => "flags";
var team = template.GetWidget<ButtonWidget>("TEAM"); var team = template.GetWidget<ButtonWidget>("TEAM");
team.OnMouseDown = _ => {ShowTeamDropDown(team); return true;}; team.OnMouseDown = _ => ShowTeamDropDown(team);
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");

View File

@@ -336,89 +336,80 @@ Background@SERVER_LOBBY:
Text: Lock Teams Text: Lock Teams
Background@COLOR_CHOOSER: Background@COLOR_CHOOSER:
Id:COLOR_CHOOSER Id:COLOR_CHOOSER
Width:500 Background:dialog2
Height:195 Width:310
X:(WINDOW_RIGHT - WIDTH)/2 - PARENT_LEFT Height:120
Y:100
Visible:false Visible:false
Children: Children:
Button@BUTTON_OK: Button@BUTTON_OK:
Id:BUTTON_OK Id:BUTTON_OK
X:PARENT_RIGHT - 180 X:210
Y:PARENT_BOTTOM - 45 Y:85
Width:160 Width:90
Height:25 Height:25
Text:Ok Text:Ok
Bold:True Bold:True
ShpImage@MCV:
Id:MCV
X:PARENT_RIGHT - 90
Y:20
Image:mcv
Frame:8
Palette:colorpicker
ShpImage@FACT: ShpImage@FACT:
Id:FACT Id:FACT
X:PARENT_RIGHT - 100 X:220
Y:70 Y:10
Image:fact Image:fact
Palette:colorpicker Palette:colorpicker
Label@HUE_LABEL: Label@HUE_LABEL:
X:0 X:0
Y:30 Y:5
Width:110 Width:40
Height:20 Height:20
Align: Right Align: Right
Text: Hue: Text: Hue:
Slider@HUE: Slider@HUE:
Id:HUE_SLIDER Id:HUE_SLIDER
X:120 X:43
Y:30 Y:10
Width:260 Width:160
Height:20 Height:20
Ticks:5 Ticks:5
Label@SAT_LABEL: Label@SAT_LABEL:
X:0 X:0
Y:60 Y:30
Width:110 Width:40
Height:20 Height:20
Align: Right Align: Right
Text: Saturation: Text: Sat:
Slider@SAT: Slider@SAT:
Id:SAT_SLIDER Id:SAT_SLIDER
X:120 X:43
Y:60 Y:35
Width:260 Width:160
Height:20 Height:20
Ticks:5 Ticks:5
Label@LUM_LABEL: Label@LUM_LABEL:
X:0 X:0
Y:90 Y:55
Width:110 Width:40
Height:20 Height:20
Align: Right Align: Right
Text: Brightness: Text: Lum:
Slider@LUM: Slider@LUM:
Id:LUM_SLIDER Id:LUM_SLIDER
X:120 X:43
Id:LUM_SLIDER Y:60
Y:90 Width:160
Width:260
Height:20 Height:20
Ticks:5 Ticks:5
Range:0.2,1 Range:0.2,1
Label@RANGE_LABEL: Label@RANGE_LABEL:
X:0 X:0
Y:120 Y:80
Width:110 Width:40
Height:20 Height:20
Align: Right Align: Right
Text: Range: Text: Ran:
Slider@RANGE: Slider@RANGE:
Id:RANGE_SLIDER Id:RANGE_SLIDER
X:120 X:43
Y:120 Y:85
Width:260 Width:160
Height:20 Height:20
Ticks:5 Ticks:5
Range:0,0.25 Range:0,0.25