Browse Source

Add separate platform settings for touch.

pull/7274/head
Takoooooo 4 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
{
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<ICursorFactory>().ToTransient<CursorFactory>()
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub())
.Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>()
.Bind<IPlatformSettings>().ToConstant(Instance)
.Bind<ITouchPlatformSettings>().ToConstant(Instance)
.Bind<IPlatformThreadingInterface>().ToConstant(new AndroidThreadingInterface())
.Bind<ISystemDialogImpl>().ToTransient<SystemDialogImpl>()
.Bind<IPlatformIconLoader>().ToSingleton<PlatformIconLoaderStub>()

6
src/Avalonia.Input/TouchDevice.cs

@ -58,20 +58,20 @@ namespace Avalonia.Input
}
else
{
var settings = AvaloniaLocator.Current.GetService<IPlatformSettings>();
var settings = AvaloniaLocator.Current.GetService<ITouchPlatformSettings>();
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,

29
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<IAvaloniaNativeFactory>(factory, true));
var result = new AvaloniaNativePlatform(MicroComRuntime.CreateProxyFor<IAvaloniaNativeFactory>(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<IPlatformIconLoader>().ToSingleton<IconLoader>()
.Bind<IKeyboardDevice>().ToConstant(KeyboardDevice)
.Bind<IPlatformSettings>().ToConstant(this)
.Bind<ITouchPlatformSettings>().ToConstant(this)
.Bind<IWindowingPlatform>().ToConstant(this)
.Bind<IClipboard>().ToConstant(new ClipboardImpl(_factory.CreateClipboard()))
.Bind<IRenderLoop>().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
{

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.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;
}
}

4
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<IWindowingPlatform>().ToConstant(this)
.Bind<IPlatformThreadingInterface>().ToConstant(new X11PlatformThreading(this))
@ -77,7 +78,8 @@ namespace Avalonia.X11
.Bind<IKeyboardDevice>().ToFunc(() => KeyboardDevice)
.Bind<ICursorFactory>().ToConstant(new X11CursorFactory(Display))
.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<ISystemDialogImpl>().ToConstant(new GtkSystemDialog())
.Bind<IMountedVolumeInfoProvider>().ToConstant(new LinuxMountedVolumeInfoProvider())

6
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<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<ICursorFactory>().ToConstant(CursorFactory.Instance)
.Bind<IKeyboardDevice>().ToConstant(WindowsKeyboardDevice.Instance)
.Bind<ITouchPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.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 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<ICursorFactory>().ToConstant(new CursorFactoryStub())
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub())
.Bind<IClipboard>().ToConstant(new ClipboardImpl())
.Bind<IPlatformSettings>().ToConstant(new PlatformSettings())
.Bind<ITouchPlatformSettings>().ToConstant(new PlatformSettings())
.Bind<IPlatformIconLoader>().ToConstant(new PlatformIconLoaderStub())
.Bind<PlatformHotkeyConfiguration>().ToSingleton<PlatformHotkeyConfiguration>()
.Bind<IRenderLoop>().ToSingleton<RenderLoop>()

Loading…
Cancel
Save