diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs
index 57f22e7a05..6a940a54f1 100644
--- a/src/Android/Avalonia.Android/AndroidPlatform.cs
+++ b/src/Android/Avalonia.Android/AndroidPlatform.cs
@@ -33,8 +33,16 @@ namespace Avalonia.Android
{
public static readonly AndroidPlatform Instance = new AndroidPlatform();
public static AndroidPlatformOptions Options { get; private set; }
- public Size DoubleClickSize => new Size(4, 4);
- public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(200);
+
+ ///
+ public Size TouchDoubleClickSize => new Size(4, 4);
+
+ ///
+ public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(200);
+
+ public Size DoubleClickSize => TouchDoubleClickSize;
+
+ public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(500);
public static void Initialize(Type appType, AndroidPlatformOptions options)
{
diff --git a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs
index ada63f5326..5d8b166b5a 100644
--- a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs
+++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs
@@ -64,5 +64,9 @@ namespace Avalonia.DesignerSupport.Remote
public Size DoubleClickSize { get; } = new Size(2, 2);
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
+
+ public Size TouchDoubleClickSize => new Size(16, 16);
+
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
}
}
diff --git a/src/Avalonia.Headless/HeadlessPlatformStubs.cs b/src/Avalonia.Headless/HeadlessPlatformStubs.cs
index ce4c31e27e..605659d464 100644
--- a/src/Avalonia.Headless/HeadlessPlatformStubs.cs
+++ b/src/Avalonia.Headless/HeadlessPlatformStubs.cs
@@ -67,6 +67,10 @@ namespace Avalonia.Headless
{
public Size DoubleClickSize { get; } = new Size(2, 2);
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
+
+ public Size TouchDoubleClickSize => new Size(16,16);
+
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
}
class HeadlessSystemDialogsStub : ISystemDialogImpl
diff --git a/src/Avalonia.Input/TouchDevice.cs b/src/Avalonia.Input/TouchDevice.cs
index af8851a82b..0069aa7961 100644
--- a/src/Avalonia.Input/TouchDevice.cs
+++ b/src/Avalonia.Input/TouchDevice.cs
@@ -58,20 +58,17 @@ namespace Avalonia.Input
}
else
{
- var settings = AvaloniaLocator.Current.GetService();
- if (settings == null)
- {
- throw new Exception("IPlatformSettings can not be null.");
- }
+ var settings = AvaloniaLocator.Current.GetRequiredService();
+
if (!_lastClickRect.Contains(args.Position)
- || ev.Timestamp - _lastClickTime > settings.DoubleClickTime.TotalMilliseconds)
+ || ev.Timestamp - _lastClickTime > settings.TouchDoubleClickTime.TotalMilliseconds)
{
_clickCount = 0;
}
++_clickCount;
_lastClickTime = ev.Timestamp;
_lastClickRect = new Rect(args.Position, new Size())
- .Inflate(new Thickness(16, 16));
+ .Inflate(new Thickness(settings.TouchDoubleClickSize.Width / 2, settings.TouchDoubleClickSize.Height / 2));
}
target.RaiseEvent(new PointerPressedEventArgs(target, pointer,
diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs
index 522db1b334..5fa50f0e7f 100644
--- a/src/Avalonia.Native/AvaloniaNativePlatform.cs
+++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs
@@ -26,9 +26,15 @@ namespace Avalonia.Native
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(500); //TODO
+ ///
+ public Size TouchDoubleClickSize => new Size(16, 16);
+
+ ///
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
+
public static AvaloniaNativePlatform Initialize(IntPtr factory, AvaloniaNativePlatformOptions options)
{
- var result = new AvaloniaNativePlatform(MicroComRuntime.CreateProxyFor(factory, true));
+ var result = new AvaloniaNativePlatform(MicroComRuntime.CreateProxyFor(factory, true));
result.DoInitialize(options);
return result;
@@ -55,14 +61,14 @@ namespace Avalonia.Native
return Initialize(CreateAvaloniaNative(), options);
}
- public void SetupApplicationMenuExporter ()
+ public void SetupApplicationMenuExporter()
{
var exporter = new AvaloniaNativeMenuExporter(_factory);
}
- public void SetupApplicationName ()
+ public void SetupApplicationName()
{
- if(!string.IsNullOrWhiteSpace(Application.Current.Name))
+ if (!string.IsNullOrWhiteSpace(Application.Current.Name))
{
_factory.MacOptions.SetApplicationTitle(Application.Current.Name);
}
@@ -80,13 +86,13 @@ namespace Avalonia.Native
GCHandle.FromIntPtr(handle).Free();
}
}
-
+
void DoInitialize(AvaloniaNativePlatformOptions options)
{
_options = options;
-
+
var applicationPlatform = new AvaloniaNativeApplicationPlatform();
-
+
_factory.Initialize(new GCHandleDeallocator(), applicationPlatform);
if (_factory.MacOptions != null)
{
@@ -118,7 +124,7 @@ namespace Avalonia.Native
hotkeys.MoveCursorToTheStartOfLineWithSelection.Add(new KeyGesture(Key.Left, hotkeys.CommandModifiers | hotkeys.SelectionModifiers));
hotkeys.MoveCursorToTheEndOfLine.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers));
hotkeys.MoveCursorToTheEndOfLineWithSelection.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers | hotkeys.SelectionModifiers));
-
+
if (_options.UseGpu)
{
try
@@ -133,7 +139,7 @@ namespace Avalonia.Native
}
}
- public ITrayIconImpl CreateTrayIcon ()
+ public ITrayIconImpl CreateTrayIcon()
{
return new TrayIconImpl(_factory);
}
@@ -159,8 +165,8 @@ namespace Avalonia.Native
ShowInDock = true;
}
- public bool ShowInDock
- {
+ public bool ShowInDock
+ {
get => _showInDock;
set
{
diff --git a/src/Avalonia.Visuals/ApiCompatBaseline.txt b/src/Avalonia.Visuals/ApiCompatBaseline.txt
index ad9a5fd71a..dcb3246a63 100644
--- a/src/Avalonia.Visuals/ApiCompatBaseline.txt
+++ b/src/Avalonia.Visuals/ApiCompatBaseline.txt
@@ -79,4 +79,8 @@ InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Platform.IWr
InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Platform.IWriteableBitmapImpl Avalonia.Platform.IPlatformRenderInterface.LoadWriteableBitmap(System.String)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Platform.IWriteableBitmapImpl Avalonia.Platform.IPlatformRenderInterface.LoadWriteableBitmapToHeight(System.IO.Stream, System.Int32, Avalonia.Visuals.Media.Imaging.BitmapInterpolationMode)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Platform.IWriteableBitmapImpl Avalonia.Platform.IPlatformRenderInterface.LoadWriteableBitmapToWidth(System.IO.Stream, System.Int32, Avalonia.Visuals.Media.Imaging.BitmapInterpolationMode)' is present in the implementation but not in the contract.
-Total Issues: 79
+InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Size Avalonia.Platform.IPlatformSettings.TouchDoubleClickSize' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'public System.TimeSpan Avalonia.Platform.IPlatformSettings.TouchDoubleClickTime' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'public Avalonia.Size Avalonia.Platform.IPlatformSettings.TouchDoubleClickSize.get()' is present in the implementation but not in the contract.
+InterfacesShouldHaveSameMembers : Interface member 'public System.TimeSpan Avalonia.Platform.IPlatformSettings.TouchDoubleClickTime.get()' is present in the implementation but not in the contract.
+Total Issues: 84
diff --git a/src/Avalonia.Visuals/Platform/IPlatformSettings.cs b/src/Avalonia.Visuals/Platform/IPlatformSettings.cs
index bcb00df5d6..e4b28e6575 100644
--- a/src/Avalonia.Visuals/Platform/IPlatformSettings.cs
+++ b/src/Avalonia.Visuals/Platform/IPlatformSettings.cs
@@ -7,5 +7,15 @@ namespace Avalonia.Platform
Size DoubleClickSize { get; }
TimeSpan DoubleClickTime { get; }
+
+ ///
+ /// Determines the size of the area within that you should click twice in order for a double click to be counted.
+ ///
+ Size TouchDoubleClickSize { get; }
+
+ ///
+ /// Determines the time span that what will be used to determine the double-click.
+ ///
+ TimeSpan TouchDoubleClickTime { get; }
}
}
diff --git a/src/Avalonia.X11/Stubs.cs b/src/Avalonia.X11/Stubs.cs
index ec694ba9a8..f73512f1e8 100644
--- a/src/Avalonia.X11/Stubs.cs
+++ b/src/Avalonia.X11/Stubs.cs
@@ -1,10 +1,4 @@
using System;
-using System.IO;
-using System.Threading.Tasks;
-using Avalonia.Controls;
-using Avalonia.Controls.Platform;
-using Avalonia.Input;
-using Avalonia.Input.Platform;
using Avalonia.Platform;
namespace Avalonia.X11
@@ -13,5 +7,11 @@ namespace Avalonia.X11
{
public Size DoubleClickSize { get; } = new Size(2, 2);
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
+
+ ///
+ public Size TouchDoubleClickSize => new Size(16, 16);
+
+ ///
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
}
}
diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs
index a18f91d301..ec3f29c806 100644
--- a/src/Avalonia.X11/X11Platform.cs
+++ b/src/Avalonia.X11/X11Platform.cs
@@ -68,6 +68,7 @@ namespace Avalonia.X11
//TODO: log
if (options.UseDBusMenu)
DBusHelper.TryInitialize();
+
AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind().ToConstant(this)
.Bind().ToConstant(new X11PlatformThreading(this))
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Stubs.cs b/src/Linux/Avalonia.LinuxFramebuffer/Stubs.cs
index 642be28c69..dd60d5f09d 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/Stubs.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/Stubs.cs
@@ -18,5 +18,9 @@ namespace Avalonia.LinuxFramebuffer
{
public Size DoubleClickSize { get; } = new Size(4, 4);
public TimeSpan DoubleClickTime { get; } = new TimeSpan(0, 0, 0, 0, 500);
+
+ public Size TouchDoubleClickSize => new Size(16,16);
+
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
}
}
diff --git a/src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs b/src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs
index f30a36b8c9..979e66a785 100644
--- a/src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs
+++ b/src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs
@@ -51,6 +51,9 @@ namespace Avalonia.Web.Blazor
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
+ public Size TouchDoubleClickSize => new Size(16, 16);
+
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
public void RunLoop(CancellationToken cancellationToken)
{
throw new NotSupportedException();
diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs
index 2947493c41..5cfbab40e4 100644
--- a/src/Windows/Avalonia.Win32/Win32Platform.cs
+++ b/src/Windows/Avalonia.Win32/Win32Platform.cs
@@ -134,6 +134,11 @@ namespace Avalonia.Win32
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime());
+ ///
+ public Size TouchDoubleClickSize => new Size(16,16);
+
+ ///
+ public TimeSpan TouchDoubleClickTime => DoubleClickTime;
public static void Initialize()
{
Initialize(new Win32PlatformOptions());
diff --git a/src/iOS/Avalonia.iOS/Platform.cs b/src/iOS/Avalonia.iOS/Platform.cs
index 2cac5e6bcf..88f60ace1f 100644
--- a/src/iOS/Avalonia.iOS/Platform.cs
+++ b/src/iOS/Avalonia.iOS/Platform.cs
@@ -1,11 +1,9 @@
using System;
-using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.OpenGL;
using Avalonia.Platform;
using Avalonia.Rendering;
-using Avalonia.Shared.PlatformSupport;
namespace Avalonia.iOS
{
@@ -15,10 +13,17 @@ namespace Avalonia.iOS
public static DisplayLinkTimer Timer;
class PlatformSettings : IPlatformSettings
{
- public Size DoubleClickSize { get; } = new Size(10, 10);
- public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
+ ///
+ public Size TouchDoubleClickSize => new Size(10, 10);
+
+ ///
+ public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(500);
+
+ public Size DoubleClickSize => new Size(4, 4);
+
+ public TimeSpan DoubleClickTime => TouchDoubleClickTime;
}
-
+
public static void Register()
{
GlFeature ??= new EaglFeature();
diff --git a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs
index 7f6d711ccf..80c5a45c1a 100644
--- a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs
+++ b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs
@@ -209,7 +209,7 @@ namespace Avalonia.Input.UnitTests
var unitTestApp = UnitTestApplication.Start(
new TestServices(inputManager: new InputManager()));
var iSettingsMock = new Mock();
- iSettingsMock.Setup(x => x.DoubleClickTime).Returns(doubleClickTime);
+ iSettingsMock.Setup(x => x.TouchDoubleClickTime).Returns(doubleClickTime);
AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind().ToConstant(iSettingsMock.Object);
return unitTestApp;