Wire up the settings panel

This commit is contained in:
Paul Chote
2011-05-14 22:25:56 +12:00
parent ce901427bc
commit cb565e5d3c
8 changed files with 366 additions and 97 deletions

View File

@@ -81,17 +81,19 @@ namespace OpenRA.GameRules
public string LastServer = "localhost:1234"; public string LastServer = "localhost:1234";
} }
public enum MouseScrollType { Disabled, Standard, Inverted }
public class GameSettings public class GameSettings
{ {
public string[] Mods = { "ra" }; public string[] Mods = { "ra" };
public bool MatchTimer = true; public bool MatchTimer = true;
public bool ShellmapMusic = true;
// Chat settings // Chat settings
public bool TeamChatToggle = false; public bool TeamChatToggle = false;
// Behaviour settings // Behaviour settings
public bool ViewportEdgeScroll = true; public bool ViewportEdgeScroll = true;
public bool InverseDragScroll = false; public MouseScrollType MouseScroll = MouseScrollType.Standard;
public float ViewportEdgeScrollStep = 10f; public float ViewportEdgeScrollStep = 10f;
// Internal game settings // Internal game settings

View File

@@ -20,6 +20,9 @@ namespace OpenRA.Widgets
public Func<float> GetOffset; public Func<float> GetOffset;
public int Ticks = 0; public int Ticks = 0;
public int TrackHeight = 5; public int TrackHeight = 5;
// TODO: Changing this breaks the semantics of Get/SetOffset
// This is bogus
public float2 Range = new float2(0f, 1f); public float2 Range = new float2(0f, 1f);
private float Offset = 0; private float Offset = 0;

View File

@@ -37,11 +37,15 @@ namespace OpenRA.Widgets
// TODO: ViewportScrollController doesn't support delegate methods for mouse input // TODO: ViewportScrollController doesn't support delegate methods for mouse input
public override bool HandleMouseInput(MouseInput mi) public override bool HandleMouseInput(MouseInput mi)
{ {
var scrolltype = Game.Settings.Game.MouseScroll;
if (scrolltype == OpenRA.GameRules.MouseScrollType.Disabled)
return false;
if (mi.Event == MouseInputEvent.Move && if (mi.Event == MouseInputEvent.Move &&
(mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right))) (mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right)))
{ {
int InverseScroll = Game.Settings.Game.InverseDragScroll ? -1 : 1; var d = scrolltype == OpenRA.GameRules.MouseScrollType.Inverted ? -1 : 1;
Game.viewport.Scroll((Viewport.LastMousePos - mi.Location) * InverseScroll); Game.viewport.Scroll((Viewport.LastMousePos - mi.Location) * d);
return true; return true;
} }
return false; return false;

View File

@@ -127,6 +127,7 @@ namespace OpenRA.Mods.Cnc.Widgets
hideButtons = true; hideButtons = true;
Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs() Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
{ {
{ "world", world },
{ "onExit", () => hideButtons = false }, { "onExit", () => hideButtons = false },
}); });
}; };

View File

@@ -123,6 +123,7 @@ namespace OpenRA.Mods.Cnc.Widgets
Menu = MenuType.None; Menu = MenuType.None;
Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs() Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
{ {
{ "world", world },
{ "onExit", () => Menu = MenuType.Settings }, { "onExit", () => Menu = MenuType.Settings },
}); });
}; };

View File

@@ -9,9 +9,12 @@
#endregion #endregion
using System; using System;
using OpenRA.FileFormats;
using OpenRA.FileFormats.Graphics; using OpenRA.FileFormats.Graphics;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.Widgets; using OpenRA.Widgets;
using System.Collections.Generic;
using System.Drawing;
namespace OpenRA.Mods.Cnc.Widgets namespace OpenRA.Mods.Cnc.Widgets
{ {
@@ -23,29 +26,262 @@ namespace OpenRA.Mods.Cnc.Widgets
Input Input
} }
PanelType Settings = PanelType.General; PanelType Settings = PanelType.General;
ColorRamp playerColor;
Modifiers groupAddModifier;
MouseScrollType mouseScroll;
WindowMode windowMode;
CncColorPickerPaletteModifier playerPalettePreview;
World world;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public CncSettingsLogic([ObjectCreator.Param] Widget widget, public CncSettingsLogic([ObjectCreator.Param] Widget widget,
[ObjectCreator.Param] Action onExit) [ObjectCreator.Param] World world,
[ObjectCreator.Param] Action onExit)
{ {
this.world = world;
var panel = widget.GetWidget("SETTINGS_PANEL"); var panel = widget.GetWidget("SETTINGS_PANEL");
// General pane
var generalButton = panel.GetWidget<CncMenuButtonWidget>("GENERAL_BUTTON");
generalButton.OnClick = () => Settings = PanelType.General;
generalButton.IsDisabled = () => Settings == PanelType.General;
panel.GetWidget<CncMenuButtonWidget>("SAVE_BUTTON").OnClick = () => { var generalPane = panel.GetWidget("GENERAL_CONTROLS");
Widget.CloseWindow(); generalPane.IsVisible = () => Settings == PanelType.General;
onExit();
};
panel.GetWidget("GENERAL_CONTROLS").IsVisible = () => Settings == PanelType.General; // Player profile
panel.GetWidget("INPUT_CONTROLS").IsVisible = () => Settings == PanelType.Input; var nameTextfield = generalPane.GetWidget<TextFieldWidget>("NAME_TEXTFIELD");
nameTextfield.Text = Game.Settings.Player.Name;
playerColor = Game.Settings.Player.ColorRamp;
playerPalettePreview = world.WorldActor.Trait<CncColorPickerPaletteModifier>();
playerPalettePreview.Ramp = playerColor;
var colorDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("COLOR_DROPDOWN");
colorDropdown.OnMouseUp = _ => ShowColorPicker(colorDropdown);
colorDropdown.GetWidget<ColorBlockWidget>("COLORBLOCK").GetColor = () => playerColor.GetColor(0);
// Debug
var perftext = Game.Settings.Debug.PerfText;
var perftextCheckbox = generalPane.GetWidget<CncCheckboxWidget>("PERFTEXT_CHECKBOX");
perftextCheckbox.IsChecked = () => perftext;
perftextCheckbox.OnClick = () => perftext ^= true;
var perfgraph = Game.Settings.Debug.PerfGraph;
var perfgraphCheckbox = generalPane.GetWidget<CncCheckboxWidget>("PERFGRAPH_CHECKBOX");
perfgraphCheckbox.IsChecked = () => perfgraph;
perfgraphCheckbox.OnClick = () => perfgraph ^= true;
var matchtimer = Game.Settings.Game.MatchTimer;
var matchtimerCheckbox = generalPane.GetWidget<CncCheckboxWidget>("MATCHTIME_CHECKBOX");
matchtimerCheckbox.IsChecked = () => matchtimer;
matchtimerCheckbox.OnClick = () => matchtimer ^= true;
var checkunsynced = Game.Settings.Debug.SanityCheckUnsyncedCode;
var checkunsyncedCheckbox = generalPane.GetWidget<CncCheckboxWidget>("CHECKUNSYNCED_CHECKBOX");
checkunsyncedCheckbox.IsChecked = () => checkunsynced;
checkunsyncedCheckbox.OnClick = () => checkunsynced ^= true;
// Video
windowMode = Game.Settings.Graphics.Mode;
var windowModeDropdown = generalPane.GetWidget<CncDropDownButtonWidget>("MODE_DROPDOWN");
windowModeDropdown.OnMouseUp = _ => ShowWindowModeDropdown(windowModeDropdown);
windowModeDropdown.GetText = () => windowMode == WindowMode.Windowed ? "Windowed" : windowMode == WindowMode.Fullscreen ? "Fullscreen" : "Pseudo-Fullscreen";
generalPane.GetWidget("WINDOW_RESOLUTION").IsVisible = () => windowMode == WindowMode.Windowed;
var windowWidth = generalPane.GetWidget<CncTextFieldWidget>("WINDOW_WIDTH");
windowWidth.Text = Game.Settings.Graphics.WindowedSize.X.ToString();
var windowHeight = generalPane.GetWidget<CncTextFieldWidget>("WINDOW_HEIGHT");
windowHeight.Text = Game.Settings.Graphics.WindowedSize.Y.ToString();
// Audio
var soundVolume = Game.Settings.Sound.SoundVolume;
var soundSlider = generalPane.GetWidget<SliderWidget>("SOUND_SLIDER");
soundSlider.OnChange += x => { soundVolume = x; Sound.SoundVolume = x;};
soundSlider.GetOffset = () => { return soundVolume; };
soundSlider.SetOffset(soundVolume);
var musicVolume = Game.Settings.Sound.MusicVolume;
var musicSlider = generalPane.GetWidget<SliderWidget>("MUSIC_SLIDER");
musicSlider.OnChange += x => { musicVolume = x; Sound.MusicVolume = x; };
musicSlider.GetOffset = () => { return musicVolume; };
musicSlider.SetOffset(musicVolume);
var shellmapMusic = Game.Settings.Game.ShellmapMusic;
var shellmapMusicCheckbox = generalPane.GetWidget<CncCheckboxWidget>("SHELLMAP_MUSIC");
shellmapMusicCheckbox.IsChecked = () => shellmapMusic;
shellmapMusicCheckbox.OnClick = () => shellmapMusic ^= true;
// Input pane
var inputPane = panel.GetWidget("INPUT_CONTROLS");
inputPane.IsVisible = () => Settings == PanelType.Input;
var inputButton = panel.GetWidget<CncMenuButtonWidget>("INPUT_BUTTON"); var inputButton = panel.GetWidget<CncMenuButtonWidget>("INPUT_BUTTON");
inputButton.OnClick = () => Settings = PanelType.Input; inputButton.OnClick = () => Settings = PanelType.Input;
inputButton.IsDisabled = () => Settings == PanelType.Input; inputButton.IsDisabled = () => Settings == PanelType.Input;
var generalButton = panel.GetWidget<CncMenuButtonWidget>("GENERAL_BUTTON"); inputPane.GetWidget<CncCheckboxWidget>("CLASSICORDERS_CHECKBOX").IsDisabled = () => true;
generalButton.OnClick = () => Settings = PanelType.General;
generalButton.IsDisabled = () => Settings == PanelType.General; var scrollStrength = Game.Settings.Game.ViewportEdgeScrollStep;
var scrollSlider = inputPane.GetWidget<SliderWidget>("SCROLLSPEED_SLIDER");
scrollSlider.OnChange += x => scrollStrength = scrollSlider.GetOffset();
scrollSlider.SetOffset(scrollStrength);
var edgescroll = Game.Settings.Game.ViewportEdgeScroll;
var edgescrollCheckbox = inputPane.GetWidget<CncCheckboxWidget>("EDGESCROLL_CHECKBOX");
edgescrollCheckbox.IsChecked = () => edgescroll;
edgescrollCheckbox.OnClick = () => edgescroll ^= true;
mouseScroll = Game.Settings.Game.MouseScroll;
var mouseScrollDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("MOUSE_SCROLL");
mouseScrollDropdown.OnMouseUp = _ => ShowMouseScrollDropdown(mouseScrollDropdown);
mouseScrollDropdown.GetText = () => mouseScroll.ToString();
var teamchat = Game.Settings.Game.TeamChatToggle;
var teamchatCheckbox = inputPane.GetWidget<CncCheckboxWidget>("TEAMCHAT_CHECKBOX");
teamchatCheckbox.IsChecked = () => teamchat;
teamchatCheckbox.OnClick = () => teamchat ^= true;
groupAddModifier = Game.Settings.Keyboard.ControlGroupModifier;
var groupModifierDropdown = inputPane.GetWidget<CncDropDownButtonWidget>("GROUPADD_MODIFIER");
groupModifierDropdown.OnMouseUp = _ => ShowGroupModifierDropdown(groupModifierDropdown);
groupModifierDropdown.GetText = () => groupAddModifier.ToString();
panel.GetWidget<CncMenuButtonWidget>("CANCEL_BUTTON").OnClick = () =>
{
Widget.CloseWindow();
onExit();
};
panel.GetWidget<CncMenuButtonWidget>("SAVE_BUTTON").OnClick = () =>
{
var s = Game.Settings;
s.Player.Name = nameTextfield.Text;
s.Player.ColorRamp = playerColor;
s.Debug.PerfText = perftext;
s.Debug.PerfGraph = perfgraph;
s.Game.MatchTimer = matchtimer;
s.Debug.SanityCheckUnsyncedCode = checkunsynced;
s.Graphics.Mode = windowMode;
int x = s.Graphics.WindowedSize.X, y = s.Graphics.WindowedSize.Y;
int.TryParse(windowWidth.Text, out x);
int.TryParse(windowHeight.Text, out y);
s.Graphics.WindowedSize = new int2(x,y);
s.Sound.SoundVolume = soundVolume;
Sound.SoundVolume = soundVolume;
s.Sound.MusicVolume = musicVolume;
Sound.MusicVolume = musicVolume;
s.Game.ShellmapMusic = shellmapMusic;
s.Game.ViewportEdgeScrollStep = scrollStrength;
s.Game.ViewportEdgeScroll = edgescroll;
s.Game.MouseScroll = mouseScroll;
s.Game.TeamChatToggle = teamchat;
s.Keyboard.ControlGroupModifier = groupAddModifier;
s.Save();
Widget.CloseWindow();
onExit();
};
}
bool ShowColorPicker(Widget colorDropdown)
{
Action<ColorRamp> onSelect = c =>
{
playerColor = c;
};
Action<ColorRamp> onChange = c =>
{
playerPalettePreview.Ramp = c;
};
var colorChooser = Game.LoadWidget(world, "COLOR_CHOOSER", null, new WidgetArgs()
{
{ "onSelect", onSelect },
{ "onChange", onChange },
{ "initialRamp", playerColor }
});
CncDropDownButtonWidget.ShowDropPanel(colorDropdown, colorChooser, new List<Widget>() { colorChooser.GetWidget("SAVE_BUTTON") }, () => true);
return true;
}
bool ShowGroupModifierDropdown(Widget dropdown)
{
var dropDownOptions = new List<Pair<string, Action>>()
{
Pair.New("Ctrl", new Action(() => groupAddModifier = Modifiers.Ctrl)),
Pair.New("Alt", new Action(() => groupAddModifier = Modifiers.Alt)),
Pair.New("Shift", new Action(() => groupAddModifier = Modifiers.Shift)),
// TODO: Display this as Cmd on osx once we have platform detection
Pair.New("Meta", new Action(() => groupAddModifier = Modifiers.Meta)),
};
CncDropDownButtonWidget.ShowDropDown(dropdown,
dropDownOptions,
(ac, w) => new LabelWidget
{
Bounds = new Rectangle(0, 0, w, 24),
Text = ac.First,
Align = LabelWidget.TextAlign.Center,
OnMouseUp = mi => { ac.Second(); return true; },
});
return true;
}
bool ShowWindowModeDropdown(Widget dropdown)
{
var dropDownOptions = new List<Pair<string, Action>>()
{
Pair.New("Pseudo-Fullscreen", new Action(() => windowMode = WindowMode.PseudoFullscreen)),
Pair.New("Fullscreen", new Action(() => windowMode = WindowMode.Fullscreen)),
Pair.New("Windowed", new Action(() => windowMode = WindowMode.Windowed)),
};
CncDropDownButtonWidget.ShowDropDown(dropdown,
dropDownOptions,
(ac, w) => new LabelWidget
{
Bounds = new Rectangle(0, 0, w, 24),
Text = ac.First,
Align = LabelWidget.TextAlign.Center,
OnMouseUp = mi => { ac.Second(); return true; },
});
return true;
}
bool ShowMouseScrollDropdown(Widget dropdown)
{
var dropDownOptions = new List<Pair<string, Action>>()
{
Pair.New("Disabled", new Action(() => mouseScroll = MouseScrollType.Disabled)),
Pair.New("Standard", new Action(() => mouseScroll = MouseScrollType.Standard)),
Pair.New("Inverted", new Action(() => mouseScroll = MouseScrollType.Inverted)),
};
CncDropDownButtonWidget.ShowDropDown(dropdown,
dropDownOptions,
(ac, w) => new LabelWidget
{
Bounds = new Rectangle(0, 0, w, 24),
Text = ac.First,
Align = LabelWidget.TextAlign.Center,
OnMouseUp = mi => { ac.Second(); return true; },
});
return true;
} }
} }
} }

View File

@@ -57,7 +57,11 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset();
} }
general.GetWidget<CheckboxWidget>("INVERSE_SCROLL").Bind(Game.Settings.Game, "InverseDragScroll"); var inversescroll = general.GetWidget<CheckboxWidget>("INVERSE_SCROLL");
inversescroll.IsChecked = () => Game.Settings.Game.MouseScroll == MouseScrollType.Inverted;
inversescroll.OnChange += c => Game.Settings.Game.MouseScroll = (Game.Settings.Game.MouseScroll == MouseScrollType.Inverted) ? MouseScrollType.Standard : MouseScrollType.Inverted;
general.GetWidget<CheckboxWidget>("TEAMCHAT_TOGGLE").Bind(Game.Settings.Game, "TeamChatToggle"); general.GetWidget<CheckboxWidget>("TEAMCHAT_TOGGLE").Bind(Game.Settings.Game, "TeamChatToggle");

View File

@@ -61,7 +61,7 @@ Container@SETTINGS_PANEL:
Text:Debug Text:Debug
Align:Center Align:Center
CncCheckbox@PERFINFO_CHECKBOX: CncCheckbox@PERFINFO_CHECKBOX:
Id:PERFINFO_CHECKBOX Id:PERFTEXT_CHECKBOX
X:15 X:15
Y:120 Y:120
Width:300 Width:300
@@ -76,14 +76,14 @@ Container@SETTINGS_PANEL:
Height:20 Height:20
Font:Regular Font:Regular
Text:Show Performance Graph Text:Show Performance Graph
CncCheckbox@GAMETIME_CHECKBOX: CncCheckbox@MATCHTIME_CHECKBOX:
Id:GAMETIME_CHECKBOX Id:MATCHTIME_CHECKBOX
X:15 X:15
Y:180 Y:180
Width:300 Width:300
Height:20 Height:20
Font:Regular Font:Regular
Text:Show Game Time Counter Text:Show Match Timer
CncCheckbox@CHECKUNSYNCED_CHECKBOX: CncCheckbox@CHECKUNSYNCED_CHECKBOX:
Id:CHECKUNSYNCED_CHECKBOX Id:CHECKUNSYNCED_CHECKBOX
X:15 X:15
@@ -114,36 +114,39 @@ Container@SETTINGS_PANEL:
Height:25 Height:25
Font:Regular Font:Regular
Text:Windowed Text:Windowed
Label@At: Container@WINDOWRES:
Text:@ Id:WINDOW_RESOLUTION
Font:Bold Children:
X:575 Label@At:
Y:39 Text:@
Height:25 Font:Bold
Width:25 X:575
Align:Center Y:39
CncTextField@SCREEN_WIDTH: Height:25
Id:SCREEN_WIDTH Width:25
X:600 Align:Center
Y:40 CncTextField@SCREEN_WIDTH:
Width:45 Id:WINDOW_WIDTH
Height:25 X:600
MaxLength:5 Y:40
Label@X: Width:45
Text:x Height:25
Font:Bold MaxLength:5
X:645 Label@X:
Y:39 Text:x
Height:25 Font:Bold
Width:25 X:645
Align:Center Y:39
CncTextField@SCREEN_HEIGHT: Height:25
Id:SCREEN_HEIGHT Width:25
X:670 Align:Center
Y:40 CncTextField@SCREEN_HEIGHT:
Width:45 Id:WINDOW_HEIGHT
Height:25 X:670
MaxLength:5 Y:40
Width:45
Height:25
MaxLength:5
Label@VIDEO_DESC: Label@VIDEO_DESC:
X:375 X:375
Y:65 Y:65
@@ -194,7 +197,7 @@ Container@SETTINGS_PANEL:
Width:200 Width:200
Height:20 Height:20
Font:Regular Font:Regular
Text:Disable Shellmap Music Text:Shellmap Music
Background@INPUT_CONTROLS: Background@INPUT_CONTROLS:
Id:INPUT_CONTROLS Id:INPUT_CONTROLS
Width:740 Width:740
@@ -209,8 +212,8 @@ Container@SETTINGS_PANEL:
X:15 X:15
Y:20 Y:20
Width:340 Width:340
CncCheckbox@CLASSIC_ORDERS: CncCheckbox@CLASSICORDERS_CHECKBOX:
Id:CLASSIC_ORDERS Id:CLASSICORDERS_CHECKBOX
X:15 X:15
Y:35 Y:35
Width:250 Width:250
@@ -230,16 +233,16 @@ Container@SETTINGS_PANEL:
Width:95 Width:95
Height:25 Height:25
Text:Scroll Speed: Text:Scroll Speed:
CncSlider@SCROLL_SPEED: CncSlider@SCROLLSPEED_SLIDER:
Id:SCROLL_SPEED Id:SCROLLSPEED_SLIDER
X:100 X:100
Y:120 Y:120
Width:240 Width:240
Height:20 Height:20
Ticks:5 Ticks:5
Range:10,50 Range:10,50
CncCheckbox@EDGE_SCROLL: CncCheckbox@EDGESCROLL_CHECKBOX:
Id:EDGE_SCROLL Id:EDGESCROLL_CHECKBOX
X:15 X:15
Y:150 Y:150
Width:130 Width:130
@@ -262,22 +265,22 @@ Container@SETTINGS_PANEL:
Height:25 Height:25
Font:Regular Font:Regular
Text:Enabled Text:Enabled
Label@MULTITOUCH_SCROLL_LABEL: # Label@MULTITOUCH_SCROLL_LABEL:
X:15 # X:15
Y:210 # Y:210
Width:160 # Width:160
Height:20 # Height:20
Font:Regular # Font:Regular
Text:Multitouch Scrolling: # Text:Multitouch Scrolling:
Align:Right # Align:Right
CncDropDownButton@MULTITOUCH_SCROLL: # CncDropDownButton@MULTITOUCH_SCROLL:
Id:MULTITOUCH_SCROLL # Id:MULTITOUCH_SCROLL
X:180 # X:180
Y:210 # Y:210
Width:100 # Width:100
Height:25 # Height:25
Font:Regular # Font:Regular
Text:Enabled # Text:Enabled
Label@KEYBOARD_TITLE: Label@KEYBOARD_TITLE:
X:375 X:375
Y:20 Y:20
@@ -285,36 +288,51 @@ Container@SETTINGS_PANEL:
Font:Bold Font:Bold
Text:Keyboard Input Text:Keyboard Input
Align:Center Align:Center
CncCheckbox@TEAMCHAT_TOGGLE: CncCheckbox@TEAMCHAT_CHECKBOX:
Id:TEAMCHAT_TOGGLE Id:TEAMCHAT_CHECKBOX
X:375 X:375
Y:35 Y:35
Width:240 Width:240
Height:20 Height:20
Font:Regular Font:Regular
Text:Shift-Enter Toggles Team Chat Text:Shift-Enter Toggles Team Chat
Label@BINDING_LABEL: Label@GROUP_MODIFIER_LABEL:
Font:Bold
X:375 X:375
Y:60 Y:65
Width:200 Width:160
Height:25 Height:20
Align:Center Font:Regular
Text:Action Text:Group Addition Modifier:
Label@KEY_LABEL:
Font:Bold
X:640
Y:60
Width:30
Height:25
Align:Right Align:Right
Text:Key CncDropDownButton@GROUPADD_MODIFIER:
CncScrollPanel@KEYBINDINGS: Id:GROUPADD_MODIFIER
Id:KEYBINDINGS X:540
X:375 Y:65
Y:85 Width:100
Width:350 Height:25
Height:150 Font:Regular
# Label@BINDING_LABEL:
# Font:Bold
# X:375
# Y:60
# Width:200
# Height:25
# Align:Center
# Text:Action
# Label@KEY_LABEL:
# Font:Bold
# X:640
# Y:60
# Width:30
# Height:25
# Align:Right
# Text:Key
# CncScrollPanel@KEYBINDINGS:
# Id:KEYBINDINGS
# X:375
# Y:85
# Width:350
# Height:150
CncMenuButton@GENERAL_BUTTON: CncMenuButton@GENERAL_BUTTON:
Id:GENERAL_BUTTON Id:GENERAL_BUTTON
Y:249 Y:249
@@ -328,13 +346,13 @@ Container@SETTINGS_PANEL:
Width:140 Width:140
Height:35 Height:35
Text:Input Text:Input
CncMenuButton@RESET_BUTTON: CncMenuButton@CANCEL_BUTTON:
Id:RESET_BUTTON Id:CANCEL_BUTTON
X:450 X:450
Y:249 Y:249
Width:140 Width:140
Height:35 Height:35
Text:Reset Text:Cancel
CncMenuButton@SAVE_BUTTON: CncMenuButton@SAVE_BUTTON:
Id:SAVE_BUTTON Id:SAVE_BUTTON
X:600 X:600