diff --git a/OpenRA.Game/Widgets/SliderWidget.cs b/OpenRA.Game/Widgets/SliderWidget.cs index 3e1e2cf60b..56045e1b8b 100755 --- a/OpenRA.Game/Widgets/SliderWidget.cs +++ b/OpenRA.Game/Widgets/SliderWidget.cs @@ -17,160 +17,78 @@ namespace OpenRA.Widgets public class SliderWidget : Widget { public Func IsDisabled = () => false; - public event Action OnChange; - public Func GetOffset; + public event Action OnChange = _ => {}; public int Ticks = 0; public int TrackHeight = 5; - - // TODO: Changing this breaks the semantics of Get/SetOffset - // This is bogus public float2 Range = new float2(0f, 1f); - - float Offset = 0; + public float Value = 0; - int2 lastMouseLocation; protected bool isMoving = false; - public SliderWidget() - : base() - { - GetOffset = () => - { - var Big = Math.Max(Range.X, Range.Y); - var Little = Math.Min(Range.X, Range.Y); - var Spread = Big - Little; - - return Spread * Offset + Little; - }; - OnChange = x => Offset = x.Clamp(0f, 1f); - } + public SliderWidget() : base() {} public SliderWidget(SliderWidget other) : base(other) { OnChange = other.OnChange; - GetOffset = other.GetOffset; Ticks = other.Ticks; Range = other.Range; - Offset = GetOffset(); TrackHeight = other.TrackHeight; - lastMouseLocation = other.lastMouseLocation; isMoving = other.isMoving; } - public void SetOffset(float newOffset) + void UpdateValue(float newValue) { - var Big = Math.Max(Range.X, Range.Y); - var Little = Math.Min(Range.X, Range.Y); - var Spread = Big - Little; - - Offset = ((newOffset - Little) / Spread).Clamp(0f, 1f); + Value = newValue.Clamp(Range.X, Range.Y); + OnChange(Value); } public override bool HandleMouseInput(MouseInput mi) { - if (mi.Button != MouseButton.Left) - return false; - - if (mi.Event == MouseInputEvent.Down && !TakeFocus(mi)) - return false; + if (mi.Button != MouseButton.Left) return false; + if (IsDisabled()) return false; + if (mi.Event == MouseInputEvent.Down && !TakeFocus(mi)) return false; + if (!Focused) return false; - if (!Focused) - return false; - - switch (mi.Event) + switch( mi.Event ) { - case MouseInputEvent.Up: - { - if (Focused) - { - isMoving = false; - base.LoseFocus(mi); - } - } - break; + case MouseInputEvent.Up: + isMoving = false; + LoseFocus(mi); + break; - case MouseInputEvent.Down: - { - if (thumbRect.Contains(mi.Location)) - { - isMoving = true; - lastMouseLocation = mi.Location; - } - else if (Ticks != 0) - { - var pos = Offset; + case MouseInputEvent.Down: + isMoving = true; + /* todo: handle snapping to ticks properly again */ + /* todo: handle nudge via clicking outside the thumb */ + UpdateValue(ValueFromPx(mi.Location.X - RenderBounds.Left)); + break; - // Offset slightly the direction we want to move so we don't get stuck on a tick - var delta = 0.001; - var targetTick = (float)((mi.Location.X > thumbRect.Right) ? Math.Ceiling((pos + delta) * (Ticks - 1)) - : Math.Floor((pos - delta) * (Ticks - 1))); - OnChange(targetTick / (Ticks - 1)); - - if (thumbRect.Contains(mi.Location)) - { - isMoving = true; - lastMouseLocation = mi.Location; - } - return true; - } - else // No ticks; move to the mouse position - { - var thumb = thumbRect; - var center = thumb.X + thumb.Width / 2; - var newOffset = OffsetBy((mi.Location.X - center) * 1f / (RenderBounds.Width - thumb.Width)); - if (newOffset != Offset) - { - OnChange(newOffset); - - if (thumbRect.Contains(mi.Location)) - { - isMoving = true; - lastMouseLocation = mi.Location; - } - return true; - } - } - } - break; - - case MouseInputEvent.Move: - { - if ((mi.Location.X != lastMouseLocation.X) && isMoving) - { - var newOffset = OffsetBy((mi.Location.X - lastMouseLocation.X) * 1f / (RenderBounds.Width - thumbRect.Width)); - if (newOffset != Offset) - { - lastMouseLocation = mi.Location; - OnChange(newOffset); - } - } - } - break; + case MouseInputEvent.Move: + if (isMoving) + UpdateValue(ValueFromPx(mi.Location.X - RenderBounds.Left)); + break; } - return thumbRect.Contains(mi.Location); + return ThumbRect.Contains(mi.Location); } - float OffsetBy(float amount) - { - var centerPos = Offset + amount; - if (centerPos < 0) centerPos = 0; - if (centerPos > 1) centerPos = 1; - return centerPos; - } + float ValueFromPx(int x) { return Range.X + (Range.Y - Range.X) * (1f * x / RenderBounds.Width); } + int PxFromValue(float x) { return (int)(RenderBounds.Width * (x - Range.X) / (Range.Y - Range.X)); } public override Widget Clone() { return new SliderWidget(this); } - protected Rectangle thumbRect + Rectangle ThumbRect { get { - var width = RenderBounds.Height; - var height = RenderBounds.Height; - var origin = (int)((RenderBounds.X + width / 2) + Offset * (RenderBounds.Width - width) - width / 2f); - return new Rectangle(origin, RenderBounds.Y, width, height); + var thumbPos = PxFromValue(Value); + var rb = RenderBounds; + var width = rb.Height; + var height = rb.Height; + var origin = (int)(rb.X + thumbPos - width/2f); + return new Rectangle(origin, rb.Y, width, height); } } @@ -179,16 +97,17 @@ namespace OpenRA.Widgets if (!IsVisible()) return; - var tr = thumbRect; - var trackWidth = RenderBounds.Width - tr.Width; - var trackOrigin = RenderBounds.X + tr.Width / 2; - var trackRect = new Rectangle(trackOrigin - 1, RenderBounds.Y + (RenderBounds.Height - TrackHeight) / 2, trackWidth + 2, TrackHeight); + var tr = ThumbRect; + var rb = RenderBounds; + var trackWidth = rb.Width; + var trackOrigin = rb.X; + var trackRect = new Rectangle(trackOrigin - 1, rb.Y + (rb.Height - TrackHeight) / 2, trackWidth + 2, TrackHeight); // Tickmarks (hacked until we have real art) for (int i = 0; i < Ticks; i++) { var tickRect = new Rectangle(trackOrigin - 1 + (int)(i * trackWidth * 1f / (Ticks - 1)), - RenderBounds.Y + RenderBounds.Height / 2, 2, RenderBounds.Height / 2); + rb.Y + rb.Height / 2, 2, rb.Height / 2); WidgetUtils.DrawPanel("slider-tick", tickRect); } diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncColorPickerLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncColorPickerLogic.cs index d7798c5f01..e7dad2e6ed 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncColorPickerLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncColorPickerLogic.cs @@ -33,9 +33,9 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic Action sliderChanged = () => { - ramp = new ColorRamp((byte)(255*hueSlider.GetOffset()), - (byte)(255*satSlider.GetOffset()), - (byte)(255*lumSlider.GetOffset()), + ramp = new ColorRamp((byte)(255*hueSlider.Value), + (byte)(255*satSlider.Value), + (byte)(255*lumSlider.Value), 10); onChange(ramp); }; @@ -46,9 +46,9 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic Action updateSliders = () => { - hueSlider.SetOffset(ramp.H / 255f); - satSlider.SetOffset(ramp.S / 255f); - lumSlider.SetOffset(ramp.L / 255f); + hueSlider.Value = ramp.H / 255f; + satSlider.Value = ramp.S / 255f; + lumSlider.Value = ramp.L / 255f; }; panel.GetWidget("SAVE_BUTTON").OnClick = () => onSelect(ramp); diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncMusicPlayerLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncMusicPlayerLogic.cs index d3ab33fe81..61caf9ce10 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncMusicPlayerLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncMusicPlayerLogic.cs @@ -104,9 +104,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic panel.GetWidget("TITLE_LABEL").GetText = () => (currentSong == null) ? "" : currentSong.Title; var musicSlider = panel.GetWidget("MUSIC_SLIDER"); - musicSlider.OnChange += x => { Sound.MusicVolume = x; }; - musicSlider.GetOffset = () => { return Sound.MusicVolume; }; - musicSlider.SetOffset(Sound.MusicVolume); + musicSlider.OnChange += x => Sound.MusicVolume = x; + musicSlider.Value = Sound.MusicVolume; } void BuildMusicTable(Widget list) diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs index 096ef517f4..ed82e435f5 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs @@ -96,13 +96,11 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic // Audio var soundSlider = generalPane.GetWidget("SOUND_SLIDER"); soundSlider.OnChange += x => { soundSettings.SoundVolume = x; Sound.SoundVolume = x;}; - soundSlider.GetOffset = () => { return soundSettings.SoundVolume; }; - soundSlider.SetOffset(soundSettings.SoundVolume); + soundSlider.Value = soundSettings.SoundVolume; var musicSlider = generalPane.GetWidget("MUSIC_SLIDER"); musicSlider.OnChange += x => { soundSettings.MusicVolume = x; Sound.MusicVolume = x; }; - musicSlider.GetOffset = () => { return soundSettings.MusicVolume; }; - musicSlider.SetOffset(soundSettings.MusicVolume); + musicSlider.Value = soundSettings.MusicVolume; var shellmapMusicCheckbox = generalPane.GetWidget("SHELLMAP_MUSIC"); shellmapMusicCheckbox.IsChecked = () => gameSettings.ShellmapMusic; @@ -120,8 +118,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic inputPane.GetWidget("CLASSICORDERS_CHECKBOX").IsDisabled = () => true; var scrollSlider = inputPane.GetWidget("SCROLLSPEED_SLIDER"); + scrollSlider.Value = gameSettings.ViewportEdgeScrollStep; scrollSlider.OnChange += x => gameSettings.ViewportEdgeScrollStep = x; - scrollSlider.SetOffset(gameSettings.ViewportEdgeScrollStep); var edgescrollCheckbox = inputPane.GetWidget("EDGESCROLL_CHECKBOX"); edgescrollCheckbox.IsChecked = () => gameSettings.ViewportEdgeScroll; diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index d31d5c8fc7..39a0f78cba 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -289,27 +289,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var colorChooser = Game.modData.WidgetLoader.LoadWidget( new WidgetArgs() { {"worldRenderer", worldRenderer} }, null, "COLOR_CHOOSER" ); var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); - hueSlider.SetOffset(orderManager.LocalClient.ColorRamp.H / 255f); + hueSlider.Value = orderManager.LocalClient.ColorRamp.H / 255f; var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - satSlider.SetOffset(orderManager.LocalClient.ColorRamp.S / 255f); + satSlider.Value = orderManager.LocalClient.ColorRamp.S / 255f; var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - lumSlider.SetOffset(orderManager.LocalClient.ColorRamp.L / 255f); + lumSlider.Value = orderManager.LocalClient.ColorRamp.L / 255f; var rangeSlider = colorChooser.GetWidget("RANGE_SLIDER"); - rangeSlider.SetOffset(orderManager.LocalClient.ColorRamp.R / 255f); + rangeSlider.Value = orderManager.LocalClient.ColorRamp.R / 255f; - 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()); + hueSlider.OnChange += _ => UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); + satSlider.OnChange += _ => UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); + lumSlider.OnChange += _ => UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); + rangeSlider.OnChange += _ => UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); + UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); colorChooser.GetWidget("BUTTON_OK").OnClick = () => { - UpdateColorPreview(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); - UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset(), rangeSlider.GetOffset()); + UpdateColorPreview(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); + UpdatePlayerColor(hueSlider.Value, satSlider.Value, lumSlider.Value, rangeSlider.Value); color.RemovePanel(); }; diff --git a/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs index 997998d17e..bc77ab1b4e 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs @@ -51,9 +51,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic edgescrollCheckbox.OnClick = () => Game.Settings.Game.ViewportEdgeScroll ^= true; var edgeScrollSlider = general.GetWidget("EDGE_SCROLL_AMOUNT"); - edgeScrollSlider.SetOffset(Game.Settings.Game.ViewportEdgeScrollStep); - edgeScrollSlider.OnChange += _ => { Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); }; - Game.Settings.Game.ViewportEdgeScrollStep = edgeScrollSlider.GetOffset(); + edgeScrollSlider.Value = Game.Settings.Game.ViewportEdgeScrollStep; + edgeScrollSlider.OnChange += x => Game.Settings.Game.ViewportEdgeScrollStep = x; var inversescroll = general.GetWidget("INVERSE_SCROLL"); inversescroll.IsChecked = () => Game.Settings.Game.MouseScroll == MouseScrollType.Inverted; @@ -68,13 +67,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic var soundslider = audio.GetWidget("SOUND_VOLUME"); soundslider.OnChange += x => Sound.SoundVolume = x; - soundslider.GetOffset = () => Sound.SoundVolume; - soundslider.SetOffset(Sound.SoundVolume); + soundslider.Value = Sound.SoundVolume; var musicslider = audio.GetWidget("MUSIC_VOLUME"); musicslider.OnChange += x => Sound.MusicVolume = x; - musicslider.GetOffset = () => Sound.MusicVolume; - musicslider.SetOffset(Sound.MusicVolume); + musicslider.Value = Sound.MusicVolume; // Display var display = bg.GetWidget("DISPLAY_PANE");