From 00a286f0e8bba92869eeec96abe1a2094f19dbae Mon Sep 17 00:00:00 2001 From: Takoooooo Date: Mon, 27 Dec 2021 14:15:30 +0200 Subject: [PATCH 1/5] Add separate platform settings for touch. --- .../Avalonia.Android/AndroidPlatform.cs | 8 ++--- src/Avalonia.Input/TouchDevice.cs | 6 ++-- src/Avalonia.Native/AvaloniaNativePlatform.cs | 29 +++++++++++-------- .../Platform/ITouchPlatformSettings.cs | 11 +++++++ src/Avalonia.X11/Stubs.cs | 12 ++++---- src/Avalonia.X11/X11Platform.cs | 4 ++- src/Windows/Avalonia.Win32/Win32Platform.cs | 6 ++-- src/iOS/Avalonia.iOS/Platform.cs | 8 ++--- 8 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index 57f22e7a05..a9ba1086d5 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -29,12 +29,12 @@ namespace Avalonia namespace Avalonia.Android { - class AndroidPlatform : IPlatformSettings + class AndroidPlatform : ITouchPlatformSettings { 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 static void Initialize(Type appType, AndroidPlatformOptions options) { @@ -45,7 +45,7 @@ namespace Avalonia.Android .Bind().ToTransient() .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToSingleton() - .Bind().ToConstant(Instance) + .Bind().ToConstant(Instance) .Bind().ToConstant(new AndroidThreadingInterface()) .Bind().ToTransient() .Bind().ToSingleton() diff --git a/src/Avalonia.Input/TouchDevice.cs b/src/Avalonia.Input/TouchDevice.cs index af8851a82b..4970d4db32 100644 --- a/src/Avalonia.Input/TouchDevice.cs +++ b/src/Avalonia.Input/TouchDevice.cs @@ -58,20 +58,20 @@ namespace Avalonia.Input } else { - var settings = AvaloniaLocator.Current.GetService(); + var settings = AvaloniaLocator.Current.GetService(); if (settings == null) { throw new Exception("IPlatformSettings can not be null."); } 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..680f64f537 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -11,7 +11,7 @@ using Avalonia.Rendering; namespace Avalonia.Native { - class AvaloniaNativePlatform : IPlatformSettings, IWindowingPlatform + class AvaloniaNativePlatform : IPlatformSettings, ITouchPlatformSettings, IWindowingPlatform { private readonly IAvaloniaNativeFactory _factory; private AvaloniaNativePlatformOptions _options; @@ -26,9 +26,13 @@ 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 +59,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 +84,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) { @@ -102,6 +106,7 @@ namespace Avalonia.Native .Bind().ToSingleton() .Bind().ToConstant(KeyboardDevice) .Bind().ToConstant(this) + .Bind().ToConstant(this) .Bind().ToConstant(this) .Bind().ToConstant(new ClipboardImpl(_factory.CreateClipboard())) .Bind().ToConstant(new RenderLoop()) @@ -118,7 +123,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 +138,7 @@ namespace Avalonia.Native } } - public ITrayIconImpl CreateTrayIcon () + public ITrayIconImpl CreateTrayIcon() { return new TrayIconImpl(_factory); } @@ -159,8 +164,8 @@ namespace Avalonia.Native ShowInDock = true; } - public bool ShowInDock - { + public bool ShowInDock + { get => _showInDock; set { diff --git a/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs b/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs new file mode 100644 index 0000000000..bda0dc3c33 --- /dev/null +++ b/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs @@ -0,0 +1,11 @@ +using System; + +namespace Avalonia.Platform +{ + public interface ITouchPlatformSettings + { + Size TouchDoubleClickSize { get; } + + TimeSpan TouchDoubleClickTime { get; } + } +} diff --git a/src/Avalonia.X11/Stubs.cs b/src/Avalonia.X11/Stubs.cs index ec694ba9a8..ca1c037592 100644 --- a/src/Avalonia.X11/Stubs.cs +++ b/src/Avalonia.X11/Stubs.cs @@ -1,17 +1,15 @@ 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 { - class PlatformSettingsStub : IPlatformSettings + class PlatformSettingsStub : IPlatformSettings, ITouchPlatformSettings { 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..e0d84e0a2e 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(); + var platformSettingStub = new PlatformSettingsStub(); AvaloniaLocator.CurrentMutable.BindToSelf(this) .Bind().ToConstant(this) .Bind().ToConstant(new X11PlatformThreading(this)) @@ -77,7 +78,8 @@ namespace Avalonia.X11 .Bind().ToFunc(() => KeyboardDevice) .Bind().ToConstant(new X11CursorFactory(Display)) .Bind().ToConstant(new X11Clipboard(this)) - .Bind().ToConstant(new PlatformSettingsStub()) + .Bind().ToConstant(platformSettingStub) + .Bind().ToConstant(platformSettingStub) .Bind().ToConstant(new X11IconLoader(Info)) .Bind().ToConstant(new GtkSystemDialog()) .Bind().ToConstant(new LinuxMountedVolumeInfoProvider()) diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 2947493c41..08d98d3ac1 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -101,7 +101,7 @@ namespace Avalonia namespace Avalonia.Win32 { - public class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl + public class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, ITouchPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl { private static readonly Win32Platform s_instance = new Win32Platform(); private static Thread _uiThread; @@ -133,7 +133,8 @@ namespace Avalonia.Win32 UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK)); 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()); @@ -146,6 +147,7 @@ namespace Avalonia.Win32 .Bind().ToSingleton() .Bind().ToConstant(CursorFactory.Instance) .Bind().ToConstant(WindowsKeyboardDevice.Instance) + .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(new RenderLoop()) diff --git a/src/iOS/Avalonia.iOS/Platform.cs b/src/iOS/Avalonia.iOS/Platform.cs index 2cac5e6bcf..fd5330b663 100644 --- a/src/iOS/Avalonia.iOS/Platform.cs +++ b/src/iOS/Avalonia.iOS/Platform.cs @@ -13,10 +13,10 @@ namespace Avalonia.iOS { public static EaglFeature GlFeature; public static DisplayLinkTimer Timer; - class PlatformSettings : IPlatformSettings + class PlatformSettings : ITouchPlatformSettings { - 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 static void Register() @@ -30,7 +30,7 @@ namespace Avalonia.iOS .Bind().ToConstant(new CursorFactoryStub()) .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToConstant(new ClipboardImpl()) - .Bind().ToConstant(new PlatformSettings()) + .Bind().ToConstant(new PlatformSettings()) .Bind().ToConstant(new PlatformIconLoaderStub()) .Bind().ToSingleton() .Bind().ToSingleton() From 9af9a3f0813bd59c744e8a1e908c8a14e184761d Mon Sep 17 00:00:00 2001 From: Takoooooo Date: Mon, 27 Dec 2021 14:53:15 +0200 Subject: [PATCH 2/5] fix tests --- src/Avalonia.Input/TouchDevice.cs | 2 +- tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Input/TouchDevice.cs b/src/Avalonia.Input/TouchDevice.cs index 4970d4db32..a3881c42e7 100644 --- a/src/Avalonia.Input/TouchDevice.cs +++ b/src/Avalonia.Input/TouchDevice.cs @@ -61,7 +61,7 @@ namespace Avalonia.Input var settings = AvaloniaLocator.Current.GetService(); if (settings == null) { - throw new Exception("IPlatformSettings can not be null."); + throw new Exception("ITouchPlatformSettings can not be null."); } if (!_lastClickRect.Contains(args.Position) || ev.Timestamp - _lastClickTime > settings.TouchDoubleClickTime.TotalMilliseconds) diff --git a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs index 7f6d711ccf..14b7df7260 100644 --- a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs +++ b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs @@ -208,10 +208,10 @@ namespace Avalonia.Input.UnitTests { var unitTestApp = UnitTestApplication.Start( new TestServices(inputManager: new InputManager())); - var iSettingsMock = new Mock(); - iSettingsMock.Setup(x => x.DoubleClickTime).Returns(doubleClickTime); + var iSettingsMock = new Mock(); + iSettingsMock.Setup(x => x.TouchDoubleClickTime).Returns(doubleClickTime); AvaloniaLocator.CurrentMutable.BindToSelf(this) - .Bind().ToConstant(iSettingsMock.Object); + .Bind().ToConstant(iSettingsMock.Object); return unitTestApp; } From bf731fdcfc56c4289c9efe6d2307884196e9a270 Mon Sep 17 00:00:00 2001 From: Takoooooo Date: Tue, 28 Dec 2021 13:25:05 +0200 Subject: [PATCH 3/5] add comments --- src/Android/Avalonia.Android/AndroidPlatform.cs | 4 ++++ src/Avalonia.Native/AvaloniaNativePlatform.cs | 2 ++ src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs | 6 ++++++ src/Avalonia.X11/Stubs.cs | 2 ++ src/Windows/Avalonia.Win32/Win32Platform.cs | 4 ++++ src/iOS/Avalonia.iOS/Platform.cs | 3 +++ 6 files changed, 21 insertions(+) diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index a9ba1086d5..3bf01a0f15 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -33,7 +33,11 @@ namespace Avalonia.Android { public static readonly AndroidPlatform Instance = new AndroidPlatform(); public static AndroidPlatformOptions Options { get; private set; } + + /// public Size TouchDoubleClickSize => new Size(4, 4); + + /// public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(200); public static void Initialize(Type appType, AndroidPlatformOptions options) diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index 680f64f537..f2d7f741fc 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -26,8 +26,10 @@ 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) diff --git a/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs b/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs index bda0dc3c33..bf65870d1b 100644 --- a/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs +++ b/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs @@ -4,8 +4,14 @@ namespace Avalonia.Platform { public interface ITouchPlatformSettings { + /// + /// 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 ca1c037592..e98153e5a9 100644 --- a/src/Avalonia.X11/Stubs.cs +++ b/src/Avalonia.X11/Stubs.cs @@ -8,8 +8,10 @@ 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/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 08d98d3ac1..d1196bbc8d 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -133,7 +133,11 @@ namespace Avalonia.Win32 UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK)); public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime()); + + /// public Size TouchDoubleClickSize => new Size(16,16); + + /// public TimeSpan TouchDoubleClickTime => DoubleClickTime; public static void Initialize() { diff --git a/src/iOS/Avalonia.iOS/Platform.cs b/src/iOS/Avalonia.iOS/Platform.cs index fd5330b663..fa0db4518f 100644 --- a/src/iOS/Avalonia.iOS/Platform.cs +++ b/src/iOS/Avalonia.iOS/Platform.cs @@ -15,7 +15,10 @@ namespace Avalonia.iOS public static DisplayLinkTimer Timer; class PlatformSettings : ITouchPlatformSettings { + /// public Size TouchDoubleClickSize => new Size(10, 10); + + /// public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(500); } From f9671bd4cc7e03431c50c9181705e4097517375b Mon Sep 17 00:00:00 2001 From: Takoooooo Date: Tue, 28 Dec 2021 14:31:03 +0200 Subject: [PATCH 4/5] use getrequiredservice --- src/Avalonia.Input/TouchDevice.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Input/TouchDevice.cs b/src/Avalonia.Input/TouchDevice.cs index a3881c42e7..84974302eb 100644 --- a/src/Avalonia.Input/TouchDevice.cs +++ b/src/Avalonia.Input/TouchDevice.cs @@ -58,11 +58,8 @@ namespace Avalonia.Input } else { - var settings = AvaloniaLocator.Current.GetService(); - if (settings == null) - { - throw new Exception("ITouchPlatformSettings can not be null."); - } + var settings = AvaloniaLocator.Current.GetRequiredService(); + if (!_lastClickRect.Contains(args.Position) || ev.Timestamp - _lastClickTime > settings.TouchDoubleClickTime.TotalMilliseconds) { From 21cc80932a9997a4da618a3be103f3a3e0851be8 Mon Sep 17 00:00:00 2001 From: Takoooooo Date: Tue, 28 Dec 2021 22:19:33 +0200 Subject: [PATCH 5/5] use IPlatformSettings instead of creating a separate interface. --- src/Android/Avalonia.Android/AndroidPlatform.cs | 12 ++++++++---- .../Remote/PreviewerWindowingPlatform.cs | 4 ++++ src/Avalonia.Headless/HeadlessPlatformStubs.cs | 4 ++++ src/Avalonia.Input/TouchDevice.cs | 2 +- src/Avalonia.Native/AvaloniaNativePlatform.cs | 7 +++---- src/Avalonia.Visuals/ApiCompatBaseline.txt | 6 +++++- .../Platform/IPlatformSettings.cs | 10 ++++++++++ .../Platform/ITouchPlatformSettings.cs | 17 ----------------- src/Avalonia.X11/Stubs.cs | 6 +++--- src/Avalonia.X11/X11Platform.cs | 5 ++--- src/Linux/Avalonia.LinuxFramebuffer/Stubs.cs | 4 ++++ .../Avalonia.Web.Blazor/WindowingPlatform.cs | 3 +++ src/Windows/Avalonia.Win32/Win32Platform.cs | 7 +++---- src/iOS/Avalonia.iOS/Platform.cs | 16 +++++++++------- .../TouchDeviceTests.cs | 4 ++-- 15 files changed, 61 insertions(+), 46 deletions(-) delete mode 100644 src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index 3bf01a0f15..6a940a54f1 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -29,17 +29,21 @@ namespace Avalonia namespace Avalonia.Android { - class AndroidPlatform : ITouchPlatformSettings + class AndroidPlatform : IPlatformSettings { public static readonly AndroidPlatform Instance = new AndroidPlatform(); public static AndroidPlatformOptions Options { get; private set; } - /// + /// 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) { Options = options; @@ -49,7 +53,7 @@ namespace Avalonia.Android .Bind().ToTransient() .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToSingleton() - .Bind().ToConstant(Instance) + .Bind().ToConstant(Instance) .Bind().ToConstant(new AndroidThreadingInterface()) .Bind().ToTransient() .Bind().ToSingleton() 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 84974302eb..0069aa7961 100644 --- a/src/Avalonia.Input/TouchDevice.cs +++ b/src/Avalonia.Input/TouchDevice.cs @@ -58,7 +58,7 @@ namespace Avalonia.Input } else { - var settings = AvaloniaLocator.Current.GetRequiredService(); + var settings = AvaloniaLocator.Current.GetRequiredService(); if (!_lastClickRect.Contains(args.Position) || ev.Timestamp - _lastClickTime > settings.TouchDoubleClickTime.TotalMilliseconds) diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index f2d7f741fc..5fa50f0e7f 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -11,7 +11,7 @@ using Avalonia.Rendering; namespace Avalonia.Native { - class AvaloniaNativePlatform : IPlatformSettings, ITouchPlatformSettings, IWindowingPlatform + class AvaloniaNativePlatform : IPlatformSettings, IWindowingPlatform { private readonly IAvaloniaNativeFactory _factory; private AvaloniaNativePlatformOptions _options; @@ -26,10 +26,10 @@ 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) @@ -108,7 +108,6 @@ namespace Avalonia.Native .Bind().ToSingleton() .Bind().ToConstant(KeyboardDevice) .Bind().ToConstant(this) - .Bind().ToConstant(this) .Bind().ToConstant(this) .Bind().ToConstant(new ClipboardImpl(_factory.CreateClipboard())) .Bind().ToConstant(new RenderLoop()) 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.Visuals/Platform/ITouchPlatformSettings.cs b/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs deleted file mode 100644 index bf65870d1b..0000000000 --- a/src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Avalonia.Platform -{ - public interface ITouchPlatformSettings - { - /// - /// 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 e98153e5a9..f73512f1e8 100644 --- a/src/Avalonia.X11/Stubs.cs +++ b/src/Avalonia.X11/Stubs.cs @@ -3,15 +3,15 @@ using Avalonia.Platform; namespace Avalonia.X11 { - class PlatformSettingsStub : IPlatformSettings, ITouchPlatformSettings + class PlatformSettingsStub : IPlatformSettings { 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 e0d84e0a2e..ec3f29c806 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -68,7 +68,7 @@ namespace Avalonia.X11 //TODO: log if (options.UseDBusMenu) DBusHelper.TryInitialize(); - var platformSettingStub = new PlatformSettingsStub(); + AvaloniaLocator.CurrentMutable.BindToSelf(this) .Bind().ToConstant(this) .Bind().ToConstant(new X11PlatformThreading(this)) @@ -78,8 +78,7 @@ namespace Avalonia.X11 .Bind().ToFunc(() => KeyboardDevice) .Bind().ToConstant(new X11CursorFactory(Display)) .Bind().ToConstant(new X11Clipboard(this)) - .Bind().ToConstant(platformSettingStub) - .Bind().ToConstant(platformSettingStub) + .Bind().ToConstant(new PlatformSettingsStub()) .Bind().ToConstant(new X11IconLoader(Info)) .Bind().ToConstant(new GtkSystemDialog()) .Bind().ToConstant(new LinuxMountedVolumeInfoProvider()) 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 d1196bbc8d..5cfbab40e4 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -101,7 +101,7 @@ namespace Avalonia namespace Avalonia.Win32 { - public class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, ITouchPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl + public class Win32Platform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl { private static readonly Win32Platform s_instance = new Win32Platform(); private static Thread _uiThread; @@ -134,10 +134,10 @@ 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() { @@ -151,7 +151,6 @@ namespace Avalonia.Win32 .Bind().ToSingleton() .Bind().ToConstant(CursorFactory.Instance) .Bind().ToConstant(WindowsKeyboardDevice.Instance) - .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(new RenderLoop()) diff --git a/src/iOS/Avalonia.iOS/Platform.cs b/src/iOS/Avalonia.iOS/Platform.cs index fa0db4518f..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 { @@ -13,15 +11,19 @@ namespace Avalonia.iOS { public static EaglFeature GlFeature; public static DisplayLinkTimer Timer; - class PlatformSettings : ITouchPlatformSettings + class PlatformSettings : IPlatformSettings { - /// + /// 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(); @@ -33,7 +35,7 @@ namespace Avalonia.iOS .Bind().ToConstant(new CursorFactoryStub()) .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToConstant(new ClipboardImpl()) - .Bind().ToConstant(new PlatformSettings()) + .Bind().ToConstant(new PlatformSettings()) .Bind().ToConstant(new PlatformIconLoaderStub()) .Bind().ToSingleton() .Bind().ToSingleton() diff --git a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs index 14b7df7260..80c5a45c1a 100644 --- a/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs +++ b/tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs @@ -208,10 +208,10 @@ namespace Avalonia.Input.UnitTests { var unitTestApp = UnitTestApplication.Start( new TestServices(inputManager: new InputManager())); - var iSettingsMock = new Mock(); + var iSettingsMock = new Mock(); iSettingsMock.Setup(x => x.TouchDoubleClickTime).Returns(doubleClickTime); AvaloniaLocator.CurrentMutable.BindToSelf(this) - .Bind().ToConstant(iSettingsMock.Object); + .Bind().ToConstant(iSettingsMock.Object); return unitTestApp; }