multi direction arrow key movement

8 direction movement rather than 4
This commit is contained in:
David Ruhmann 2015-08-19 11:39:05 -05:00
parent e16cbcbdbb
commit 3d578e1d08
2 changed files with 55 additions and 62 deletions

View file

@ -27,6 +27,7 @@ You should have received a copy of the GNU General Public License
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Input = System.Windows.Input;
namespace ShareX.ScreenCaptureLib
{
@ -149,85 +150,48 @@ public void Update()
private void surface_KeyDown(object sender, KeyEventArgs e)
{
int speed;
if (e.Control)
{
speed = MaxMoveSpeed;
}
else
{
speed = MinMoveSpeed;
}
ProcessKeyDown(sender, e, true);
}
private void ProcessKeyDown(object sender, KeyEventArgs e, bool first = false)
{
int speed = e.Control ? MaxMoveSpeed : MinMoveSpeed;
switch (e.KeyCode)
{
case Keys.Left:
if (!areaManager.IsCurrentAreaValid || areaManager.IsCreating)
if (Input.Keyboard.IsKeyDown(Input.Key.Right)) return;
AdjustPosition(-speed, 0, e);
if (first)
{
Cursor.Position = new Point(Cursor.Position.X - speed, Cursor.Position.Y);
}
else
{
if (e.Shift)
{
MoveCurrentArea(-speed, 0);
}
else
{
ResizeCurrentArea(-speed, 0, IsBottomRightResizing);
}
NextKeyDown(sender, e, Keys.Up);
NextKeyDown(sender, e, Keys.Down);
}
break;
case Keys.Right:
if (!areaManager.IsCurrentAreaValid || areaManager.IsCreating)
if (Input.Keyboard.IsKeyDown(Input.Key.Left)) return;
AdjustPosition(speed, 0, e);
if (first)
{
Cursor.Position = new Point(Cursor.Position.X + speed, Cursor.Position.Y);
}
else
{
if (e.Shift)
{
MoveCurrentArea(speed, 0);
}
else
{
ResizeCurrentArea(speed, 0, IsBottomRightResizing);
}
NextKeyDown(sender, e, Keys.Down);
NextKeyDown(sender, e, Keys.Up);
}
break;
case Keys.Up:
if (!areaManager.IsCurrentAreaValid || areaManager.IsCreating)
if (Input.Keyboard.IsKeyDown(Input.Key.Down)) return;
AdjustPosition(0, -speed, e);
if (first)
{
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y - speed);
}
else
{
if (e.Shift)
{
MoveCurrentArea(0, -speed);
}
else
{
ResizeCurrentArea(0, -speed, IsBottomRightResizing);
}
NextKeyDown(sender, e, Keys.Right);
NextKeyDown(sender, e, Keys.Left);
}
break;
case Keys.Down:
if (!areaManager.IsCurrentAreaValid || areaManager.IsCreating)
if (Input.Keyboard.IsKeyDown(Input.Key.Up)) return;
AdjustPosition(0, speed, e);
if (first)
{
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + speed);
}
else
{
if (e.Shift)
{
MoveCurrentArea(0, speed);
}
else
{
ResizeCurrentArea(0, speed, IsBottomRightResizing);
}
NextKeyDown(sender, e, Keys.Left);
NextKeyDown(sender, e, Keys.Right);
}
break;
case Keys.Tab:
@ -236,6 +200,33 @@ private void surface_KeyDown(object sender, KeyEventArgs e)
}
}
private void NextKeyDown(object sender, KeyEventArgs e, Keys k)
{
if (Input.Keyboard.IsKeyDown(Input.KeyInterop.KeyFromVirtualKey((int)k)))
{
ProcessKeyDown(sender, new KeyEventArgs(k | e.Modifiers));
}
}
private void AdjustPosition(int x, int y, KeyEventArgs e)
{
if (!areaManager.IsCurrentAreaValid || areaManager.IsCreating)
{
Cursor.Position = new Point(Cursor.Position.X + x, Cursor.Position.Y + y);
}
else
{
if (e.Shift)
{
MoveCurrentArea(x, y);
}
else
{
ResizeCurrentArea(x, y, IsBottomRightResizing);
}
}
}
public bool IsCursorOnNode()
{
return Visible && nodes.Any(node => node.IsMouseHover);

View file

@ -42,12 +42,14 @@
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="Enums.cs" />