Browse Source

Add separate platform settings for touch.

pull/7274/head
Takoooooo 5 years ago
parent
commit
00a286f0e8
  1. 8
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 6
      src/Avalonia.Input/TouchDevice.cs
  3. 29
      src/Avalonia.Native/AvaloniaNativePlatform.cs
  4. 11
      src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs
  5. 12
      src/Avalonia.X11/Stubs.cs
  6. 4
      src/Avalonia.X11/X11Platform.cs
  7. 6
      src/Windows/Avalonia.Win32/Win32Platform.cs
  8. 8
      src/iOS/Avalonia.iOS/Platform.cs

8
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -29,12 +29,12 @@ namespace Avalonia
namespace Avalonia.Android namespace Avalonia.Android
{ {
class AndroidPlatform : IPlatformSettings class AndroidPlatform : ITouchPlatformSettings
{ {
public static readonly AndroidPlatform Instance = new AndroidPlatform(); public static readonly AndroidPlatform Instance = new AndroidPlatform();
public static AndroidPlatformOptions Options { get; private set; } public static AndroidPlatformOptions Options { get; private set; }
public Size DoubleClickSize => new Size(4, 4); public Size TouchDoubleClickSize => new Size(4, 4);
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(200); public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(200);
public static void Initialize(Type appType, AndroidPlatformOptions options) public static void Initialize(Type appType, AndroidPlatformOptions options)
{ {
@ -45,7 +45,7 @@ namespace Avalonia.Android
.Bind<ICursorFactory>().ToTransient<CursorFactory>() .Bind<ICursorFactory>().ToTransient<CursorFactory>()
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub()) .Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub())
.Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>() .Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>()
.Bind<IPlatformSettings>().ToConstant(Instance) .Bind<ITouchPlatformSettings>().ToConstant(Instance)
.Bind<IPlatformThreadingInterface>().ToConstant(new AndroidThreadingInterface()) .Bind<IPlatformThreadingInterface>().ToConstant(new AndroidThreadingInterface())
.Bind<ISystemDialogImpl>().ToTransient<SystemDialogImpl>() .Bind<ISystemDialogImpl>().ToTransient<SystemDialogImpl>()
.Bind<IPlatformIconLoader>().ToSingleton<PlatformIconLoaderStub>() .Bind<IPlatformIconLoader>().ToSingleton<PlatformIconLoaderStub>()

6
src/Avalonia.Input/TouchDevice.cs

@ -58,20 +58,20 @@ namespace Avalonia.Input
} }
else else
{ {
var settings = AvaloniaLocator.Current.GetService<IPlatformSettings>(); var settings = AvaloniaLocator.Current.GetService<ITouchPlatformSettings>();
if (settings == null) if (settings == null)
{ {
throw new Exception("IPlatformSettings can not be null."); throw new Exception("IPlatformSettings can not be null.");
} }
if (!_lastClickRect.Contains(args.Position) if (!_lastClickRect.Contains(args.Position)
|| ev.Timestamp - _lastClickTime > settings.DoubleClickTime.TotalMilliseconds) || ev.Timestamp - _lastClickTime > settings.TouchDoubleClickTime.TotalMilliseconds)
{ {
_clickCount = 0; _clickCount = 0;
} }
++_clickCount; ++_clickCount;
_lastClickTime = ev.Timestamp; _lastClickTime = ev.Timestamp;
_lastClickRect = new Rect(args.Position, new Size()) _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, target.RaiseEvent(new PointerPressedEventArgs(target, pointer,

29
src/Avalonia.Native/AvaloniaNativePlatform.cs

@ -11,7 +11,7 @@ using Avalonia.Rendering;
namespace Avalonia.Native namespace Avalonia.Native
{ {
class AvaloniaNativePlatform : IPlatformSettings, IWindowingPlatform class AvaloniaNativePlatform : IPlatformSettings, ITouchPlatformSettings, IWindowingPlatform
{ {
private readonly IAvaloniaNativeFactory _factory; private readonly IAvaloniaNativeFactory _factory;
private AvaloniaNativePlatformOptions _options; private AvaloniaNativePlatformOptions _options;
@ -26,9 +26,13 @@ namespace Avalonia.Native
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(500); //TODO 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) public static AvaloniaNativePlatform Initialize(IntPtr factory, AvaloniaNativePlatformOptions options)
{ {
var result = new AvaloniaNativePlatform(MicroComRuntime.CreateProxyFor<IAvaloniaNativeFactory>(factory, true)); var result = new AvaloniaNativePlatform(MicroComRuntime.CreateProxyFor<IAvaloniaNativeFactory>(factory, true));
result.DoInitialize(options); result.DoInitialize(options);
return result; return result;
@ -55,14 +59,14 @@ namespace Avalonia.Native
return Initialize(CreateAvaloniaNative(), options); return Initialize(CreateAvaloniaNative(), options);
} }
public void SetupApplicationMenuExporter () public void SetupApplicationMenuExporter()
{ {
var exporter = new AvaloniaNativeMenuExporter(_factory); 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); _factory.MacOptions.SetApplicationTitle(Application.Current.Name);
} }
@ -80,13 +84,13 @@ namespace Avalonia.Native
GCHandle.FromIntPtr(handle).Free(); GCHandle.FromIntPtr(handle).Free();
} }
} }
void DoInitialize(AvaloniaNativePlatformOptions options) void DoInitialize(AvaloniaNativePlatformOptions options)
{ {
_options = options; _options = options;
var applicationPlatform = new AvaloniaNativeApplicationPlatform(); var applicationPlatform = new AvaloniaNativeApplicationPlatform();
_factory.Initialize(new GCHandleDeallocator(), applicationPlatform); _factory.Initialize(new GCHandleDeallocator(), applicationPlatform);
if (_factory.MacOptions != null) if (_factory.MacOptions != null)
{ {
@ -102,6 +106,7 @@ namespace Avalonia.Native
.Bind<IPlatformIconLoader>().ToSingleton<IconLoader>() .Bind<IPlatformIconLoader>().ToSingleton<IconLoader>()
.Bind<IKeyboardDevice>().ToConstant(KeyboardDevice) .Bind<IKeyboardDevice>().ToConstant(KeyboardDevice)
.Bind<IPlatformSettings>().ToConstant(this) .Bind<IPlatformSettings>().ToConstant(this)
.Bind<ITouchPlatformSettings>().ToConstant(this)
.Bind<IWindowingPlatform>().ToConstant(this) .Bind<IWindowingPlatform>().ToConstant(this)
.Bind<IClipboard>().ToConstant(new ClipboardImpl(_factory.CreateClipboard())) .Bind<IClipboard>().ToConstant(new ClipboardImpl(_factory.CreateClipboard()))
.Bind<IRenderLoop>().ToConstant(new RenderLoop()) .Bind<IRenderLoop>().ToConstant(new RenderLoop())
@ -118,7 +123,7 @@ namespace Avalonia.Native
hotkeys.MoveCursorToTheStartOfLineWithSelection.Add(new KeyGesture(Key.Left, hotkeys.CommandModifiers | hotkeys.SelectionModifiers)); hotkeys.MoveCursorToTheStartOfLineWithSelection.Add(new KeyGesture(Key.Left, hotkeys.CommandModifiers | hotkeys.SelectionModifiers));
hotkeys.MoveCursorToTheEndOfLine.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers)); hotkeys.MoveCursorToTheEndOfLine.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers));
hotkeys.MoveCursorToTheEndOfLineWithSelection.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers | hotkeys.SelectionModifiers)); hotkeys.MoveCursorToTheEndOfLineWithSelection.Add(new KeyGesture(Key.Right, hotkeys.CommandModifiers | hotkeys.SelectionModifiers));
if (_options.UseGpu) if (_options.UseGpu)
{ {
try try
@ -133,7 +138,7 @@ namespace Avalonia.Native
} }
} }
public ITrayIconImpl CreateTrayIcon () public ITrayIconImpl CreateTrayIcon()
{ {
return new TrayIconImpl(_factory); return new TrayIconImpl(_factory);
} }
@ -159,8 +164,8 @@ namespace Avalonia.Native
ShowInDock = true; ShowInDock = true;
} }
public bool ShowInDock public bool ShowInDock
{ {
get => _showInDock; get => _showInDock;
set set
{ {

11
src/Avalonia.Visuals/Platform/ITouchPlatformSettings.cs

@ -0,0 +1,11 @@
using System;
namespace Avalonia.Platform
{
public interface ITouchPlatformSettings
{
Size TouchDoubleClickSize { get; }
TimeSpan TouchDoubleClickTime { get; }
}
}

12
src/Avalonia.X11/Stubs.cs

@ -1,17 +1,15 @@
using System; 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; using Avalonia.Platform;
namespace Avalonia.X11 namespace Avalonia.X11
{ {
class PlatformSettingsStub : IPlatformSettings class PlatformSettingsStub : IPlatformSettings, ITouchPlatformSettings
{ {
public Size DoubleClickSize { get; } = new Size(2, 2); public Size DoubleClickSize { get; } = new Size(2, 2);
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500); public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500);
public Size TouchDoubleClickSize => new Size(16, 16);
public TimeSpan TouchDoubleClickTime => DoubleClickTime;
} }
} }

4
src/Avalonia.X11/X11Platform.cs

@ -68,6 +68,7 @@ namespace Avalonia.X11
//TODO: log //TODO: log
if (options.UseDBusMenu) if (options.UseDBusMenu)
DBusHelper.TryInitialize(); DBusHelper.TryInitialize();
var platformSettingStub = new PlatformSettingsStub();
AvaloniaLocator.CurrentMutable.BindToSelf(this) AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind<IWindowingPlatform>().ToConstant(this) .Bind<IWindowingPlatform>().ToConstant(this)
.Bind<IPlatformThreadingInterface>().ToConstant(new X11PlatformThreading(this)) .Bind<IPlatformThreadingInterface>().ToConstant(new X11PlatformThreading(this))
@ -77,7 +78,8 @@ namespace Avalonia.X11
.Bind<IKeyboardDevice>().ToFunc(() => KeyboardDevice) .Bind<IKeyboardDevice>().ToFunc(() => KeyboardDevice)
.Bind<ICursorFactory>().ToConstant(new X11CursorFactory(Display)) .Bind<ICursorFactory>().ToConstant(new X11CursorFactory(Display))
.Bind<IClipboard>().ToConstant(new X11Clipboard(this)) .Bind<IClipboard>().ToConstant(new X11Clipboard(this))
.Bind<IPlatformSettings>().ToConstant(new PlatformSettingsStub()) .Bind<ITouchPlatformSettings>().ToConstant(platformSettingStub)
.Bind<IPlatformSettings>().ToConstant(platformSettingStub)
.Bind<IPlatformIconLoader>().ToConstant(new X11IconLoader(Info)) .Bind<IPlatformIconLoader>().ToConstant(new X11IconLoader(Info))
.Bind<ISystemDialogImpl>().ToConstant(new GtkSystemDialog()) .Bind<ISystemDialogImpl>().ToConstant(new GtkSystemDialog())
.Bind<IMountedVolumeInfoProvider>().ToConstant(new LinuxMountedVolumeInfoProvider()) .Bind<IMountedVolumeInfoProvider>().ToConstant(new LinuxMountedVolumeInfoProvider())

6
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -101,7 +101,7 @@ namespace Avalonia
namespace Avalonia.Win32 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 readonly Win32Platform s_instance = new Win32Platform();
private static Thread _uiThread; private static Thread _uiThread;
@ -133,7 +133,8 @@ namespace Avalonia.Win32
UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK)); UnmanagedMethods.GetSystemMetrics(UnmanagedMethods.SystemMetric.SM_CYDOUBLECLK));
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime()); public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(UnmanagedMethods.GetDoubleClickTime());
public Size TouchDoubleClickSize => new Size(16,16);
public TimeSpan TouchDoubleClickTime => DoubleClickTime;
public static void Initialize() public static void Initialize()
{ {
Initialize(new Win32PlatformOptions()); Initialize(new Win32PlatformOptions());
@ -146,6 +147,7 @@ namespace Avalonia.Win32
.Bind<IClipboard>().ToSingleton<ClipboardImpl>() .Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<ICursorFactory>().ToConstant(CursorFactory.Instance) .Bind<ICursorFactory>().ToConstant(CursorFactory.Instance)
.Bind<IKeyboardDevice>().ToConstant(WindowsKeyboardDevice.Instance) .Bind<IKeyboardDevice>().ToConstant(WindowsKeyboardDevice.Instance)
.Bind<ITouchPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformSettings>().ToConstant(s_instance) .Bind<IPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance) .Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.Bind<IRenderLoop>().ToConstant(new RenderLoop()) .Bind<IRenderLoop>().ToConstant(new RenderLoop())

8
src/iOS/Avalonia.iOS/Platform.cs

@ -13,10 +13,10 @@ namespace Avalonia.iOS
{ {
public static EaglFeature GlFeature; public static EaglFeature GlFeature;
public static DisplayLinkTimer Timer; public static DisplayLinkTimer Timer;
class PlatformSettings : IPlatformSettings class PlatformSettings : ITouchPlatformSettings
{ {
public Size DoubleClickSize { get; } = new Size(10, 10); public Size TouchDoubleClickSize => new Size(10, 10);
public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500); public TimeSpan TouchDoubleClickTime => TimeSpan.FromMilliseconds(500);
} }
public static void Register() public static void Register()
@ -30,7 +30,7 @@ namespace Avalonia.iOS
.Bind<ICursorFactory>().ToConstant(new CursorFactoryStub()) .Bind<ICursorFactory>().ToConstant(new CursorFactoryStub())
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub()) .Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub())
.Bind<IClipboard>().ToConstant(new ClipboardImpl()) .Bind<IClipboard>().ToConstant(new ClipboardImpl())
.Bind<IPlatformSettings>().ToConstant(new PlatformSettings()) .Bind<ITouchPlatformSettings>().ToConstant(new PlatformSettings())
.Bind<IPlatformIconLoader>().ToConstant(new PlatformIconLoaderStub()) .Bind<IPlatformIconLoader>().ToConstant(new PlatformIconLoaderStub())
.Bind<PlatformHotkeyConfiguration>().ToSingleton<PlatformHotkeyConfiguration>() .Bind<PlatformHotkeyConfiguration>().ToSingleton<PlatformHotkeyConfiguration>()
.Bind<IRenderLoop>().ToSingleton<RenderLoop>() .Bind<IRenderLoop>().ToSingleton<RenderLoop>()

Loading…
Cancel
Save