From 42d8722cbc9a415a9f1600b393ab51a768fbeb97 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 17 May 2011 20:44:48 +1200 Subject: [PATCH] Merge DropDownButtons --- OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Widgets/ButtonWidget.cs | 93 ------------- OpenRA.Game/Widgets/DropDownButtonWidget.cs | 147 ++++++++++++++++++++ OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj | 1 - OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs | 20 +-- OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs | 62 --------- OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs | 16 +-- mods/cnc/chrome/lobby.yaml | 8 +- mods/cnc/chrome/preferences.yaml | 10 +- 9 files changed, 175 insertions(+), 183 deletions(-) create mode 100644 OpenRA.Game/Widgets/DropDownButtonWidget.cs delete mode 100644 OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index e63198e24f..38fc796f80 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -184,6 +184,7 @@ + diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index 673a5948d8..2cf024a73c 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -122,97 +122,4 @@ namespace OpenRA.Widgets WidgetUtils.DrawPanel(state, rect); } } - - public class DropDownButtonWidget : ButtonWidget - { - public DropDownButtonWidget() - : base() - { - } - - protected DropDownButtonWidget(DropDownButtonWidget widget) - : base(widget) - { - } - - public override void DrawInner() - { - base.DrawInner(); - var stateOffset = (Depressed) ? new int2(VisualHeight, VisualHeight) : new int2(0, 0); - - var image = ChromeProvider.GetImage("scrollbar", "down_arrow"); - var rb = RenderBounds; - - WidgetUtils.DrawRGBA( image, - stateOffset + new float2( rb.Right - rb.Height + 4, - rb.Top + (rb.Height - image.bounds.Height) / 2 )); - - WidgetUtils.FillRectWithColor(new Rectangle(stateOffset.X + rb.Right - rb.Height, - stateOffset.Y + rb.Top + 3, 1, rb.Height - 6), - Color.White); - } - - public override Widget Clone() { return new DropDownButtonWidget(this); } - public override int UsableWidth { get { return Bounds.Width - Bounds.Height; } } /* space for button */ - - public static void ShowDropPanel(Widget w, Widget panel, IEnumerable dismissAfter, Func onDismiss) - { - // Mask to prevent any clicks from being sent to other widgets - var fullscreenMask = new ContainerWidget(); - fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); - Widget.RootWidget.AddChild(fullscreenMask); - - Action HideDropDown = () => - { - Widget.RootWidget.RemoveChild(fullscreenMask); - Widget.RootWidget.RemoveChild(panel); - }; - - HideDropDown += () => Game.BeforeGameStart -= HideDropDown; - Game.BeforeGameStart += HideDropDown; - - fullscreenMask.OnMouseDown = mi => - { - if (onDismiss()) HideDropDown(); - return true; - }; - fullscreenMask.OnMouseUp = mi => true; - - var oldBounds = panel.Bounds; - panel.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, oldBounds.Width, oldBounds.Height); - 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(Widget w, IEnumerable ts, Func ft) - { - var dropDown = new ScrollPanelWidget(); - dropDown.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100); - dropDown.ItemSpacing = 1; - - List items = new List(); - List dismissAfter = new List(); - foreach (var t in ts) - { - var ww = ft(t, dropDown.Bounds.Width - dropDown.ScrollbarWidth); - dismissAfter.Add(ww); - ww.OnMouseMove = mi => items.Do(lw => - { - lw.Background = null; ww.Background = "dialog2"; - }); - - dropDown.AddChild(ww); - items.Add(ww); - } - - dropDown.Bounds.Height = Math.Min(150, dropDown.ContentHeight); - ShowDropPanel(w, dropDown, dismissAfter, () => true); - } - } } \ No newline at end of file diff --git a/OpenRA.Game/Widgets/DropDownButtonWidget.cs b/OpenRA.Game/Widgets/DropDownButtonWidget.cs new file mode 100644 index 0000000000..a343615e87 --- /dev/null +++ b/OpenRA.Game/Widgets/DropDownButtonWidget.cs @@ -0,0 +1,147 @@ +#region Copyright & License Information +/* + * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Drawing; +using OpenRA.Graphics; + +namespace OpenRA.Widgets +{ + public class DropDownButtonWidget : ButtonWidget + { + Widget panel; + Widget fullscreenMask; + + public DropDownButtonWidget() + : base() + { + } + + protected DropDownButtonWidget(DropDownButtonWidget widget) + : base(widget) + { + } + + public override void DrawInner() + { + base.DrawInner(); + var stateOffset = (Depressed) ? new int2(VisualHeight, VisualHeight) : new int2(0, 0); + + var image = ChromeProvider.GetImage("scrollbar", "down_arrow"); + var rb = RenderBounds; + + WidgetUtils.DrawRGBA( image, + stateOffset + new float2( rb.Right - rb.Height + 4, + rb.Top + (rb.Height - image.bounds.Height) / 2 )); + + WidgetUtils.FillRectWithColor(new Rectangle(stateOffset.X + rb.Right - rb.Height, + stateOffset.Y + rb.Top + 3, 1, rb.Height - 6), + Color.White); + } + + public override Widget Clone() { return new DropDownButtonWidget(this); } + + // This is crap + public override int UsableWidth { get { return Bounds.Width - Bounds.Height; } } /* space for button */ + + public void RemovePanel() + { + Widget.RootWidget.RemoveChild(fullscreenMask); + Widget.RootWidget.RemoveChild(panel); + Game.BeforeGameStart -= RemovePanel; + panel = fullscreenMask = null; + } + + public void AttachPanel(Widget p) + { + if (panel != null) + throw new InvalidOperationException("Attempted to attach a panel to an open dropdown"); + panel = p; + + // Mask to prevent any clicks from being sent to other widgets + fullscreenMask = new ContainerWidget(); + fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); + Widget.RootWidget.AddChild(fullscreenMask); + Game.BeforeGameStart += RemovePanel; + + fullscreenMask.OnMouseDown = mi => + { + RemovePanel(); + return true; + }; + fullscreenMask.OnMouseUp = mi => true; + + var oldBounds = panel.Bounds; + panel.Bounds = new Rectangle(RenderOrigin.X, RenderOrigin.Y + Bounds.Height, oldBounds.Width, oldBounds.Height); + Widget.RootWidget.AddChild(panel); + } + + [Obsolete] public static void ShowDropPanel(Widget w, Widget panel, IEnumerable dismissAfter, Func onDismiss) + { + // Mask to prevent any clicks from being sent to other widgets + var fullscreenMask = new ContainerWidget(); + fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); + Widget.RootWidget.AddChild(fullscreenMask); + + Action HideDropDown = () => + { + Widget.RootWidget.RemoveChild(fullscreenMask); + Widget.RootWidget.RemoveChild(panel); + }; + + HideDropDown += () => Game.BeforeGameStart -= HideDropDown; + Game.BeforeGameStart += HideDropDown; + + fullscreenMask.OnMouseDown = mi => + { + if (onDismiss()) HideDropDown(); + return true; + }; + fullscreenMask.OnMouseUp = mi => true; + + var oldBounds = panel.Bounds; + panel.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, oldBounds.Width, oldBounds.Height); + 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); + } + + [Obsolete] public static void ShowDropDown(Widget w, IEnumerable ts, Func ft) + { + var dropDown = new ScrollPanelWidget(); + dropDown.Bounds = new Rectangle(w.RenderOrigin.X, w.RenderOrigin.Y + w.Bounds.Height, w.Bounds.Width, 100); + dropDown.ItemSpacing = 1; + + List items = new List(); + List dismissAfter = new List(); + foreach (var t in ts) + { + var ww = ft(t, dropDown.Bounds.Width - dropDown.ScrollbarWidth); + dismissAfter.Add(ww); + ww.OnMouseMove = mi => items.Do(lw => + { + lw.Background = null; ww.Background = "dialog2"; + }); + + dropDown.AddChild(ww); + items.Add(ww); + } + + dropDown.Bounds.Height = Math.Min(150, dropDown.ContentHeight); + ShowDropPanel(w, dropDown, dismissAfter, () => true); + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index a17d788e57..d8bb64f394 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -72,7 +72,6 @@ - diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index e149944352..14b8f82459 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -324,7 +324,7 @@ namespace OpenRA.Mods.Cnc.Widgets } } - bool ShowSlotDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot, bool showBotOptions) + bool ShowSlotDropDown(DropDownButtonWidget dropdown, Session.Slot slot, bool showBotOptions) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Widget.LoadWidget("LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -360,7 +360,7 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowRaceDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot) + bool ShowRaceDropDown(DropDownButtonWidget dropdown, Session.Slot slot) { if (Map.Players[slot.MapPlayer].LockRace) return false; @@ -394,7 +394,7 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowTeamDropDown(CncDropDownButtonWidget dropdown, Session.Slot slot) + bool ShowTeamDropDown(DropDownButtonWidget dropdown, Session.Slot slot) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Widget.LoadWidget("TEAM_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -422,7 +422,7 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowColorDropDown(Session.Slot s, CncDropDownButtonWidget color) + bool ShowColorDropDown(DropDownButtonWidget color, Session.Slot s) { if (Map.Players[s.MapPlayer].LockColor) return true; @@ -470,7 +470,7 @@ namespace OpenRA.Mods.Cnc.Widgets if (slot.Spectator) { template = EmptySlotTemplateHost.Clone(); - var name = template.GetWidget("NAME"); + var name = template.GetWidget("NAME"); name.GetText = () => s.Closed ? "Closed" : "Open"; name.OnMouseDown = _ => ShowSlotDropDown(name, s, false); var btn = template.GetWidget("JOIN"); @@ -479,7 +479,7 @@ namespace OpenRA.Mods.Cnc.Widgets else { template = EmptySlotTemplateHost.Clone(); - var name = template.GetWidget("NAME"); + var name = template.GetWidget("NAME"); name.GetText = () => s.Closed ? "Closed" : (s.Bot == null) ? "Open" : s.Bot; name.OnMouseDown = _ => ShowSlotDropDown(name, s, Map.Players[ s.MapPlayer ].AllowBots); } @@ -530,13 +530,13 @@ namespace OpenRA.Mods.Cnc.Widgets }; name.OnLoseFocus = () => name.OnEnterKey(); - var color = template.GetWidget("COLOR"); - color.OnMouseDown = _ => ShowColorDropDown(s, color); + var color = template.GetWidget("COLOR"); + color.OnMouseDown = _ => ShowColorDropDown(color, s); var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => c.ColorRamp.GetColor(0); - var faction = template.GetWidget("FACTION"); + var faction = template.GetWidget("FACTION"); faction.OnMouseDown = _ => ShowRaceDropDown(faction, s); var factionname = faction.GetWidget("FACTIONNAME"); @@ -545,7 +545,7 @@ namespace OpenRA.Mods.Cnc.Widgets factionflag.GetImageName = () => c.Country; factionflag.GetImageCollection = () => "flags"; - var team = template.GetWidget("TEAM"); + var team = template.GetWidget("TEAM"); team.OnMouseDown = _ => ShowTeamDropDown(team, s); team.GetText = () => (c.Team == 0) ? "-" : c.Team.ToString(); diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs deleted file mode 100644 index 724b0955f5..0000000000 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.Drawing; -using OpenRA.Graphics; -using OpenRA.Widgets; -using System.Reflection; - -namespace OpenRA.Mods.Cnc.Widgets -{ - public class CncDropDownButtonWidget : DropDownButtonWidget - { - public CncDropDownButtonWidget() : base() { } - protected CncDropDownButtonWidget(CncDropDownButtonWidget other) : base(other) { } - public override Widget Clone() { return new CncDropDownButtonWidget(this); } - - Widget panel; - Widget fullscreenMask; - - public void RemovePanel() - { - Widget.RootWidget.RemoveChild(fullscreenMask); - Widget.RootWidget.RemoveChild(panel); - Game.BeforeGameStart -= RemovePanel; - panel = fullscreenMask = null; - } - - public void AttachPanel(Widget p) - { - if (panel != null) - throw new InvalidOperationException("Attempted to attach a panel to an open dropdown"); - panel = p; - - // Mask to prevent any clicks from being sent to other widgets - fullscreenMask = new ContainerWidget(); - fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); - Widget.RootWidget.AddChild(fullscreenMask); - Game.BeforeGameStart += RemovePanel; - - fullscreenMask.OnMouseDown = mi => - { - RemovePanel(); - return true; - }; - fullscreenMask.OnMouseUp = mi => true; - - var oldBounds = panel.Bounds; - panel.Bounds = new Rectangle(RenderOrigin.X, RenderOrigin.Y + Bounds.Height, oldBounds.Width, oldBounds.Height); - Widget.RootWidget.AddChild(panel); - } - } -} - diff --git a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs index e83da2891b..ec848ff938 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncSettingsLogic.cs @@ -58,7 +58,7 @@ namespace OpenRA.Mods.Cnc.Widgets playerPalettePreview = world.WorldActor.Trait(); playerPalettePreview.Ramp = playerColor; - var colorDropdown = generalPane.GetWidget("COLOR_DROPDOWN"); + var colorDropdown = generalPane.GetWidget("COLOR_DROPDOWN"); colorDropdown.OnMouseDown = _ => ShowColorPicker(colorDropdown); colorDropdown.GetWidget("COLORBLOCK").GetColor = () => playerColor.GetColor(0); @@ -85,7 +85,7 @@ namespace OpenRA.Mods.Cnc.Widgets // Video windowMode = Game.Settings.Graphics.Mode; - var windowModeDropdown = generalPane.GetWidget("MODE_DROPDOWN"); + var windowModeDropdown = generalPane.GetWidget("MODE_DROPDOWN"); windowModeDropdown.OnMouseDown = _ => ShowWindowModeDropdown(windowModeDropdown); windowModeDropdown.GetText = () => windowMode == WindowMode.Windowed ? "Windowed" : windowMode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen"; @@ -136,7 +136,7 @@ namespace OpenRA.Mods.Cnc.Widgets edgescrollCheckbox.OnClick = () => edgescroll ^= true; mouseScroll = Game.Settings.Game.MouseScroll; - var mouseScrollDropdown = inputPane.GetWidget("MOUSE_SCROLL"); + var mouseScrollDropdown = inputPane.GetWidget("MOUSE_SCROLL"); mouseScrollDropdown.OnMouseDown = _ => ShowMouseScrollDropdown(mouseScrollDropdown); mouseScrollDropdown.GetText = () => mouseScroll.ToString(); @@ -146,7 +146,7 @@ namespace OpenRA.Mods.Cnc.Widgets teamchatCheckbox.OnClick = () => teamchat ^= true; groupAddModifier = Game.Settings.Keyboard.ControlGroupModifier; - var groupModifierDropdown = inputPane.GetWidget("GROUPADD_MODIFIER"); + var groupModifierDropdown = inputPane.GetWidget("GROUPADD_MODIFIER"); groupModifierDropdown.OnMouseDown = _ => ShowGroupModifierDropdown(groupModifierDropdown); groupModifierDropdown.GetText = () => groupAddModifier.ToString(); @@ -194,7 +194,7 @@ namespace OpenRA.Mods.Cnc.Widgets }; } - bool ShowColorPicker(CncDropDownButtonWidget color) + bool ShowColorPicker(DropDownButtonWidget color) { Action onSelect = c => { @@ -218,7 +218,7 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowGroupModifierDropdown(CncDropDownButtonWidget dropdown) + bool ShowGroupModifierDropdown(DropDownButtonWidget dropdown) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -248,7 +248,7 @@ namespace OpenRA.Mods.Cnc.Widgets return true; } - bool ShowWindowModeDropdown(CncDropDownButtonWidget dropdown) + bool ShowWindowModeDropdown(DropDownButtonWidget dropdown) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() @@ -278,7 +278,7 @@ namespace OpenRA.Mods.Cnc.Widgets } - bool ShowMouseScrollDropdown(CncDropDownButtonWidget dropdown) + bool ShowMouseScrollDropdown(DropDownButtonWidget dropdown) { var substitutions = new Dictionary() {{ "DROPDOWN_WIDTH", dropdown.Bounds.Width }}; var panel = (ScrollPanelWidget)Game.LoadWidget(world, "LABEL_DROPDOWN_TEMPLATE", null, new WidgetArgs() diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index b7be6d890f..5ac11a8c9e 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -67,7 +67,7 @@ Container@SERVER_LOBBY: Width:150 Height:25 MaxLength:16 - CncDropDownButton@COLOR: + DropDownButton@COLOR: Id:COLOR Width:80 Height:25 @@ -80,7 +80,7 @@ Container@SERVER_LOBBY: Y:6 Width:PARENT_RIGHT-35 Height:PARENT_BOTTOM-12 - CncDropDownButton@FACTION: + DropDownButton@FACTION: Id:FACTION Width:130 Height:25 @@ -100,7 +100,7 @@ Container@SERVER_LOBBY: Height:25 X:40 Y:0 - CncDropDownButton@TEAM: + DropDownButton@TEAM: Id:TEAM Text:Team Width:48 @@ -234,7 +234,7 @@ Container@SERVER_LOBBY: Height:25 Visible:false Children: - CncDropDownButton@NAME: + DropDownButton@NAME: Id:NAME Text:Name Width:150 diff --git a/mods/cnc/chrome/preferences.yaml b/mods/cnc/chrome/preferences.yaml index 806f829ef7..0b5f83f620 100644 --- a/mods/cnc/chrome/preferences.yaml +++ b/mods/cnc/chrome/preferences.yaml @@ -40,7 +40,7 @@ Container@SETTINGS_PANEL: Width:205 Height:25 MaxLength:16 - CncDropDownButton@COLOR: + DropDownButton@COLOR: Id:COLOR_DROPDOWN X:275 Y:40 @@ -106,7 +106,7 @@ Container@SETTINGS_PANEL: Height:25 Align:Right Text:Mode: - CncDropDownButton@MODE_DROPDOWN: + DropDownButton@MODE_DROPDOWN: Id:MODE_DROPDOWN X:425 Y:40 @@ -256,7 +256,7 @@ Container@SETTINGS_PANEL: Font:Regular Text:Middle-Mouse Scrolling: Align:Right - CncDropDownButton@MOUSE_SCROLL: + DropDownButton@MOUSE_SCROLL: Id:MOUSE_SCROLL X:180 Y:180 @@ -272,7 +272,7 @@ Container@SETTINGS_PANEL: # Font:Regular # Text:Multitouch Scrolling: # Align:Right -# CncDropDownButton@MULTITOUCH_SCROLL: +# DropDownButton@MULTITOUCH_SCROLL: # Id:MULTITOUCH_SCROLL # X:180 # Y:210 @@ -303,7 +303,7 @@ Container@SETTINGS_PANEL: Font:Regular Text:Group Addition Modifier: Align:Right - CncDropDownButton@GROUPADD_MODIFIER: + DropDownButton@GROUPADD_MODIFIER: Id:GROUPADD_MODIFIER X:540 Y:65