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 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);
}
}
}

View File

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

View File

@@ -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");

View File

@@ -334,91 +334,82 @@ Background@SERVER_LOBBY:
Width: 80
Height: 20
Text: Lock Teams
Background@COLOR_CHOOSER:
Background@COLOR_CHOOSER:
Id:COLOR_CHOOSER
Width:500
Height:195
X:(WINDOW_RIGHT - WIDTH)/2 - PARENT_LEFT
Y:100
Background:dialog2
Width:310
Height:120
Visible:false
Children:
Button@BUTTON_OK:
Id:BUTTON_OK
X:PARENT_RIGHT - 180
Y:PARENT_BOTTOM - 45
Width:160
X:210
Y:85
Width:90
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
X:220
Y:10
Image:fact
Palette:colorpicker
Label@HUE_LABEL:
X:0
Y:30
Width:110
Y:5
Width:40
Height:20
Align: Right
Text: Hue:
Slider@HUE:
Id:HUE_SLIDER
X:120
Y:30
Width:260
X:43
Y:10
Width:160
Height:20
Ticks:5
Label@SAT_LABEL:
X:0
Y:60
Width:110
Y:30
Width:40
Height:20
Align: Right
Text: Saturation:
Text: Sat:
Slider@SAT:
Id:SAT_SLIDER
X:120
Y:60
Width:260
X:43
Y:35
Width:160
Height:20
Ticks:5
Label@LUM_LABEL:
X:0
Y:90
Width:110
Y:55
Width:40
Height:20
Align: Right
Text: Brightness:
Text: Lum:
Slider@LUM:
Id:LUM_SLIDER
X:120
Id:LUM_SLIDER
Y:90
Width:260
X:43
Y:60
Width:160
Height:20
Ticks:5
Range:0.2,1
Label@RANGE_LABEL:
X:0
Y:120
Width:110
Y:80
Width:40
Height:20
Align: Right
Text: Range:
Text: Ran:
Slider@RANGE:
Id:RANGE_SLIDER
X:120
Y:120
Width:260
X:43
Y:85
Width:160
Height:20
Ticks:5
Range:0,0.25