diff --git a/OpenRA.Game/GameRules/Settings.cs b/OpenRA.Game/GameRules/Settings.cs index 0cb1e94455..74f9f70cde 100755 --- a/OpenRA.Game/GameRules/Settings.cs +++ b/OpenRA.Game/GameRules/Settings.cs @@ -69,6 +69,7 @@ namespace OpenRA.GameRules // Behaviour settings public bool ViewportEdgeScroll = true; public bool InverseDragScroll = false; + public float ViewportEdgeScrollStep = 0.1f; // 0.1f equals 10 - Gecko // Internal game settings public int Timestep = 40; diff --git a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs index cb6f53f290..8a893c8267 100644 --- a/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/SettingsMenuDelegate.cs @@ -53,6 +53,14 @@ namespace OpenRA.Widgets.Delegates Game.Settings.Game.ViewportEdgeScroll ^= true; return true; }; + + // Added scroll sensitivity - Gecko + var edgeScrollSlider = general.GetWidget("EDGE_SCROLL_AMOUNT"); + if (edgeScrollSlider != null) // Backwards compatible - Gecko + { + edgeScrollSlider.OnChange += x => { x += 0.1f; Game.Settings.Game.ViewportEdgeScrollStep = x; }; + edgeScrollSlider.GetOffset = () => { return Game.Settings.Game.ViewportEdgeScrollStep - 0.1f; }; + } var inverseScroll = general.GetWidget("INVERSE_SCROLL"); inverseScroll.Checked = () => Game.Settings.Game.InverseDragScroll; diff --git a/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs b/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs index 64dd0a5a42..36d8f8ddd5 100755 --- a/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs +++ b/OpenRA.Game/Widgets/ViewportScrollControllerWidget.cs @@ -1,172 +1,174 @@ -#region Copyright & License Information -/* - * Copyright 2007-2010 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 LICENSE. - */ -#endregion - +#region Copyright & License Information +/* + * Copyright 2007-2010 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 LICENSE. + */ +#endregion + using System; using OpenRA.Graphics; -namespace OpenRA.Widgets -{ - [Flags] - public enum ScrollDirection - { - None = 0, - Up = 1, - Left = 2, - Down = 4, - Right = 8 - } - - class ViewportScrollControllerWidget : Widget - { - public int EdgeScrollThreshold = 15; - - ScrollDirection Keyboard; +namespace OpenRA.Widgets +{ + [Flags] + public enum ScrollDirection + { + None = 0, + Up = 1, + Left = 2, + Down = 4, + Right = 8 + } + + class ViewportScrollControllerWidget : Widget + { + public int EdgeScrollThreshold = 15; + + ScrollDirection Keyboard; ScrollDirection Edge; - public ViewportScrollControllerWidget() : base() { } - protected ViewportScrollControllerWidget(ViewportScrollControllerWidget widget) : base(widget) {} - public override void DrawInner( World world ) {} - - public override bool HandleInputInner(MouseInput mi) - { - if (mi.Event == MouseInputEvent.Move && - (mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right))) + public ViewportScrollControllerWidget() : base() { } + protected ViewportScrollControllerWidget(ViewportScrollControllerWidget widget) : base(widget) {} + public override void DrawInner( World world ) {} + + public override bool HandleInputInner(MouseInput mi) + { + if (mi.Event == MouseInputEvent.Move && + (mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right))) { int InverseScroll = Game.Settings.Game.InverseDragScroll ? -1 : 1; - Game.viewport.Scroll((Viewport.LastMousePos - mi.Location) * InverseScroll); - return true; - } - return false; - } - - public override string GetCursor(int2 pos) - { - if (!Game.Settings.Game.ViewportEdgeScroll) - return null; - - if (Edge.Includes(ScrollDirection.Up) && Edge.Includes(ScrollDirection.Left)){ - ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); - if(BlockedDirections.Includes(ScrollDirection.Up) && BlockedDirections.Includes(ScrollDirection.Left)) - return "scroll-tl-blocked"; - else - return "scroll-tl"; - } - if (Edge.Includes(ScrollDirection.Up) && Edge.Includes(ScrollDirection.Right)){ - ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); - if (BlockedDirections.Includes(ScrollDirection.Up) && BlockedDirections.Includes(ScrollDirection.Right)) - return "scroll-tr-blocked"; - else - return "scroll-tr"; - } - if (Edge.Includes(ScrollDirection.Down) && Edge.Includes(ScrollDirection.Left)){ - ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); - if (BlockedDirections.Includes(ScrollDirection.Down) && BlockedDirections.Includes(ScrollDirection.Left)) - return "scroll-bl-blocked"; - else - return "scroll-bl"; - } - if (Edge.Includes(ScrollDirection.Down) && Edge.Includes(ScrollDirection.Right)){ - ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); - if (BlockedDirections.Includes(ScrollDirection.Down) && BlockedDirections.Includes(ScrollDirection.Right)) - return "scroll-br-blocked"; - else - return "scroll-br"; - } - - if (Edge.Includes(ScrollDirection.Up)) - if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Up)) - return "scroll-t-blocked"; - else - return "scroll-t"; - if (Edge.Includes(ScrollDirection.Down)) - if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Down)) - return "scroll-b-blocked"; - else - return "scroll-b"; - if (Edge.Includes(ScrollDirection.Left)) - if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Left)) - return "scroll-l-blocked"; - else - return "scroll-l"; - if (Edge.Includes(ScrollDirection.Right)) - if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Right)) - return "scroll-r-blocked"; - else - return "scroll-r"; - - return null; - } - - public override bool LoseFocus (MouseInput mi) - { - Keyboard = ScrollDirection.None; - return base.LoseFocus(mi); - } - - public override bool HandleKeyPressInner(KeyInput e) - { - switch (e.KeyName) - { - case "up": Keyboard = Keyboard.Set(ScrollDirection.Up, (e.Event == KeyInputEvent.Down)); return true; - case "down": Keyboard = Keyboard.Set(ScrollDirection.Down, (e.Event == KeyInputEvent.Down)); return true; - case "left": Keyboard = Keyboard.Set(ScrollDirection.Left, (e.Event == KeyInputEvent.Down)); return true; - case "right": Keyboard = Keyboard.Set(ScrollDirection.Right, (e.Event == KeyInputEvent.Down)); return true; - } - return false; - } - - public override void Tick(World world) - { - Edge = ScrollDirection.None; - if (Game.Settings.Game.ViewportEdgeScroll && Game.HasInputFocus) - { - // Check for edge-scroll - if (Viewport.LastMousePos.X < EdgeScrollThreshold) - Edge = Edge.Set(ScrollDirection.Left, true); - if (Viewport.LastMousePos.Y < EdgeScrollThreshold) - Edge = Edge.Set(ScrollDirection.Up, true); - if (Viewport.LastMousePos.X >= Game.viewport.Width - EdgeScrollThreshold) - Edge = Edge.Set(ScrollDirection.Right, true); - if (Viewport.LastMousePos.Y >= Game.viewport.Height - EdgeScrollThreshold) - Edge = Edge.Set(ScrollDirection.Down, true); - } - - if(Keyboard != ScrollDirection.None || Edge != ScrollDirection.None) - { - var scroll = new float2(0,0); - if (Keyboard.Includes(ScrollDirection.Up) || Edge.Includes(ScrollDirection.Up)) - scroll += new float2(0, -10); - if (Keyboard.Includes(ScrollDirection.Right) || Edge.Includes(ScrollDirection.Right)) - scroll += new float2(10, 0); - if (Keyboard.Includes(ScrollDirection.Down) || Edge.Includes(ScrollDirection.Down)) - scroll += new float2(0, 10); - if (Keyboard.Includes(ScrollDirection.Left) || Edge.Includes(ScrollDirection.Left)) - scroll += new float2(-10, 0); - - Game.viewport.Scroll(scroll); - } - } - - public override Widget Clone() { return new ViewportScrollControllerWidget(this); } - } - - public static class ViewportExts - { - public static bool Includes(this ScrollDirection d, ScrollDirection s) - { - return (d & s) == s; - } - - public static ScrollDirection Set(this ScrollDirection d, ScrollDirection s, bool val) - { - return (d.Includes(s) != val) ? d ^ s : d; - } - } + Game.viewport.Scroll((Viewport.LastMousePos - mi.Location) * InverseScroll); + return true; + } + return false; + } + + public override string GetCursor(int2 pos) + { + if (!Game.Settings.Game.ViewportEdgeScroll) + return null; + + if (Edge.Includes(ScrollDirection.Up) && Edge.Includes(ScrollDirection.Left)){ + ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); + if(BlockedDirections.Includes(ScrollDirection.Up) && BlockedDirections.Includes(ScrollDirection.Left)) + return "scroll-tl-blocked"; + else + return "scroll-tl"; + } + if (Edge.Includes(ScrollDirection.Up) && Edge.Includes(ScrollDirection.Right)){ + ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); + if (BlockedDirections.Includes(ScrollDirection.Up) && BlockedDirections.Includes(ScrollDirection.Right)) + return "scroll-tr-blocked"; + else + return "scroll-tr"; + } + if (Edge.Includes(ScrollDirection.Down) && Edge.Includes(ScrollDirection.Left)){ + ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); + if (BlockedDirections.Includes(ScrollDirection.Down) && BlockedDirections.Includes(ScrollDirection.Left)) + return "scroll-bl-blocked"; + else + return "scroll-bl"; + } + if (Edge.Includes(ScrollDirection.Down) && Edge.Includes(ScrollDirection.Right)){ + ScrollDirection BlockedDirections = Game.viewport.GetBlockedDirections(); + if (BlockedDirections.Includes(ScrollDirection.Down) && BlockedDirections.Includes(ScrollDirection.Right)) + return "scroll-br-blocked"; + else + return "scroll-br"; + } + + if (Edge.Includes(ScrollDirection.Up)) + if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Up)) + return "scroll-t-blocked"; + else + return "scroll-t"; + if (Edge.Includes(ScrollDirection.Down)) + if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Down)) + return "scroll-b-blocked"; + else + return "scroll-b"; + if (Edge.Includes(ScrollDirection.Left)) + if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Left)) + return "scroll-l-blocked"; + else + return "scroll-l"; + if (Edge.Includes(ScrollDirection.Right)) + if (Game.viewport.GetBlockedDirections().Includes(ScrollDirection.Right)) + return "scroll-r-blocked"; + else + return "scroll-r"; + + return null; + } + + public override bool LoseFocus (MouseInput mi) + { + Keyboard = ScrollDirection.None; + return base.LoseFocus(mi); + } + + public override bool HandleKeyPressInner(KeyInput e) + { + switch (e.KeyName) + { + case "up": Keyboard = Keyboard.Set(ScrollDirection.Up, (e.Event == KeyInputEvent.Down)); return true; + case "down": Keyboard = Keyboard.Set(ScrollDirection.Down, (e.Event == KeyInputEvent.Down)); return true; + case "left": Keyboard = Keyboard.Set(ScrollDirection.Left, (e.Event == KeyInputEvent.Down)); return true; + case "right": Keyboard = Keyboard.Set(ScrollDirection.Right, (e.Event == KeyInputEvent.Down)); return true; + } + return false; + } + + public override void Tick(World world) + { + Edge = ScrollDirection.None; + if (Game.Settings.Game.ViewportEdgeScroll && Game.HasInputFocus) + { + // Check for edge-scroll + if (Viewport.LastMousePos.X < EdgeScrollThreshold) + Edge = Edge.Set(ScrollDirection.Left, true); + if (Viewport.LastMousePos.Y < EdgeScrollThreshold) + Edge = Edge.Set(ScrollDirection.Up, true); + if (Viewport.LastMousePos.X >= Game.viewport.Width - EdgeScrollThreshold) + Edge = Edge.Set(ScrollDirection.Right, true); + if (Viewport.LastMousePos.Y >= Game.viewport.Height - EdgeScrollThreshold) + Edge = Edge.Set(ScrollDirection.Down, true); + } + + if(Keyboard != ScrollDirection.None || Edge != ScrollDirection.None) + { + var scroll = new float2(0, 0); + + // Modified to use the ViewportEdgeScrollStep setting - Gecko + if (Keyboard.Includes(ScrollDirection.Up) || Edge.Includes(ScrollDirection.Up)) + scroll += new float2(0, -(Game.Settings.Game.ViewportEdgeScrollStep * 100)); + if (Keyboard.Includes(ScrollDirection.Right) || Edge.Includes(ScrollDirection.Right)) + scroll += new float2((Game.Settings.Game.ViewportEdgeScrollStep * 100), 0); + if (Keyboard.Includes(ScrollDirection.Down) || Edge.Includes(ScrollDirection.Down)) + scroll += new float2(0, (Game.Settings.Game.ViewportEdgeScrollStep * 100)); + if (Keyboard.Includes(ScrollDirection.Left) || Edge.Includes(ScrollDirection.Left)) + scroll += new float2(-(Game.Settings.Game.ViewportEdgeScrollStep * 100), 0); + + Game.viewport.Scroll(scroll); + } + } + + public override Widget Clone() { return new ViewportScrollControllerWidget(this); } + } + + public static class ViewportExts + { + public static bool Includes(this ScrollDirection d, ScrollDirection s) + { + return (d & s) == s; + } + + public static ScrollDirection Set(this ScrollDirection d, ScrollDirection s, bool val) + { + return (d.Includes(s) != val) ? d ^ s : d; + } + } } \ No newline at end of file diff --git a/mods/cnc/chrome/settings.yaml b/mods/cnc/chrome/settings.yaml index 2b9759ab58..72027a4571 100644 --- a/mods/cnc/chrome/settings.yaml +++ b/mods/cnc/chrome/settings.yaml @@ -90,6 +90,18 @@ Background@SETTINGS_MENU: Width:200 Height:20 Text: Enable Edge Scrolling + Label@EDGE_SCROLL_AMOUNT_LABEL: + Id:EDGE_SCROLL_AMOUNT_LABEL + X:0 + Y:70 + Text: Scroll Speed + Slider@EDGE_SCROLL_AMOUNT: + Id:EDGE_SCROLL_AMOUNT + X:130 + Y:60 + Width:250 + Height:20 + Ticks:100 Checkbox@INVERSE_SCROLL: Id:INVERSE_SCROLL X:0 diff --git a/mods/ra/chrome/settings.yaml b/mods/ra/chrome/settings.yaml index cd9c3555f8..c625fccf52 100644 --- a/mods/ra/chrome/settings.yaml +++ b/mods/ra/chrome/settings.yaml @@ -91,6 +91,18 @@ Background@SETTINGS_MENU: Width:200 Height:20 Text: Enable Edge Scrolling + Label@EDGE_SCROLL_AMOUNT_LABEL: + Id:EDGE_SCROLL_AMOUNT_LABEL + X:0 + Y:70 + Text: Scroll Speed + Slider@EDGE_SCROLL_AMOUNT: + Id:EDGE_SCROLL_AMOUNT + X:130 + Y:60 + Width:250 + Height:20 + Ticks:100 Checkbox@INVERSE_SCROLL: Id:INVERSE_SCROLL X:0