Browse Source

Merge pull request #1012 from AvaloniaUI/mouse-device-nolocator

Removed IMouseDevice from service locator
pull/950/merge
Nikita Tsukanov 9 years ago
committed by GitHub
parent
commit
e0cabbbf8f
  1. 1
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 2
      src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs
  3. 3
      src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
  4. 7
      src/Avalonia.Controls/Platform/ITopLevelImpl.cs
  5. 4
      src/Avalonia.Controls/Primitives/Popup.cs
  6. 3
      src/Avalonia.Controls/ToolTip.cs
  7. 3
      src/Avalonia.Controls/TopLevel.cs
  8. 3
      src/Avalonia.Diagnostics/DevTools.xaml.cs
  9. 5
      src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs
  10. 3
      src/Avalonia.HtmlRenderer/HtmlControl.cs
  11. 7
      src/Avalonia.Input/IInputDevice.cs
  12. 8
      src/Avalonia.Input/IInputRoot.cs
  13. 1
      src/Avalonia.Input/InputManager.cs
  14. 12
      src/Avalonia.Input/KeyboardDevice.cs
  15. 31
      src/Avalonia.Input/MouseDevice.cs
  16. 1
      src/Gtk/Avalonia.Gtk/GtkPlatform.cs
  17. 3
      src/Gtk/Avalonia.Gtk/TopLevelImpl.cs
  18. 1
      src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
  19. 1
      src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs
  20. 1
      src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs
  21. 1
      src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
  22. 1
      src/Windows/Avalonia.Win32/Win32Platform.cs
  23. 2
      src/Windows/Avalonia.Win32/WindowImpl.cs
  24. 2
      src/iOS/Avalonia.iOS/TopLevelImpl.cs
  25. 1
      src/iOS/Avalonia.iOS/iOSPlatform.cs

1
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -51,7 +51,6 @@ namespace Avalonia.Android
.Bind<IClipboard>().ToTransient<ClipboardImpl>()
.Bind<IStandardCursorFactory>().ToTransient<CursorFactory>()
.Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>()
.Bind<IMouseDevice>().ToSingleton<AndroidMouseDevice>()
.Bind<IPlatformSettings>().ToConstant(Instance)
.Bind<IRendererFactory>().ToConstant(ImmediateRenderer.Factory)
.Bind<IPlatformThreadingInterface>().ToConstant(new AndroidThreadingInterface())

2
src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs

@ -4,6 +4,8 @@ namespace Avalonia.Android.Platform.Input
{
public class AndroidMouseDevice : MouseDevice
{
public static AndroidMouseDevice Instance { get; } = new AndroidMouseDevice();
public AndroidMouseDevice()
{

3
src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

@ -10,6 +10,7 @@ using Avalonia.Platform;
using System;
using System.Collections.Generic;
using System.Reactive.Disposables;
using Avalonia.Android.Platform.Input;
using Avalonia.Controls;
using Avalonia.Controls.Platform.Surfaces;
@ -65,6 +66,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform
}
}
public IMouseDevice MouseDevice => AndroidMouseDevice.Instance;
public Action Closed { get; set; }
public Action<RawInputEventArgs> Input { get; set; }

7
src/Avalonia.Controls/Platform/ITopLevelImpl.cs

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using Avalonia.Input;
using Avalonia.Input.Raw;
using JetBrains.Annotations;
namespace Avalonia.Platform
{
@ -93,5 +94,11 @@ namespace Avalonia.Platform
/// Gets or sets a method called when the underlying implementation is destroyed.
/// </summary>
Action Closed { get; set; }
/// <summary>
/// Gets a mouse device associated with toplevel
/// </summary>
[CanBeNull]
IMouseDevice MouseDevice { get; }
}
}

4
src/Avalonia.Controls/Primitives/Popup.cs

@ -340,11 +340,11 @@ namespace Avalonia.Controls.Primitives
switch (mode)
{
case PlacementMode.Pointer:
if (MouseDevice.Instance != null)
if(PopupRoot != null)
{
// Scales the Horizontal and Vertical offset to screen co-ordinates.
var screenOffset = new Point(HorizontalOffset * (PopupRoot as ILayoutRoot).LayoutScaling, VerticalOffset * (PopupRoot as ILayoutRoot).LayoutScaling);
return MouseDevice.Instance.Position + screenOffset;
return ((IInputRoot)PopupRoot).MouseDevice.Position + screenOffset;
}
return default(Point);

3
src/Avalonia.Controls/ToolTip.cs

@ -109,8 +109,7 @@ namespace Avalonia.Controls
{
throw new AvaloniaInternalException("Previous ToolTip not disposed.");
}
var cp = MouseDevice.Instance?.GetPosition(control);
var cp = (control.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(control);
var position = control.PointToScreen(cp ?? new Point(0, 0)) + new Vector(0, 22);
s_popup = new PopupRoot();

3
src/Avalonia.Controls/TopLevel.cs

@ -163,6 +163,9 @@ namespace Avalonia.Controls
set { SetValue(PointerOverElementProperty, value); }
}
/// <inheritdoc/>
IMouseDevice IInputRoot.MouseDevice => PlatformImpl?.MouseDevice;
/// <summary>
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>

3
src/Avalonia.Diagnostics/DevTools.xaml.cs

@ -106,7 +106,8 @@ namespace Avalonia.Diagnostics
if ((e.Modifiers) == modifiers)
{
var point = MouseDevice.Instance.GetPosition(Root);
var point = (Root.VisualRoot as IInputRoot)?.MouseDevice?.GetPosition(Root) ?? default(Point);
var control = Root.GetVisualsAt(point, x => (!(x is AdornerLayer) && x.IsVisible))
.FirstOrDefault();

5
src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs

@ -10,9 +10,11 @@
// - Sun Tsu,
// "The Art of War"
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Html;
using Avalonia.Input;
using Avalonia.VisualTree;
using TheArtOfDev.HtmlRenderer.Adapters;
using TheArtOfDev.HtmlRenderer.Adapters.Entities;
using TheArtOfDev.HtmlRenderer.Core.Utils;
@ -54,7 +56,8 @@ namespace TheArtOfDev.HtmlRenderer.Avalonia.Adapters
{
get
{
return Util.Convert(MouseDevice.Instance.GetPosition(_control));
var pos = (_control.GetVisualRoot() as IInputRoot)?.MouseDevice?.Position ?? default(Point);
return Util.Convert(pos);
}
}

3
src/Avalonia.HtmlRenderer/HtmlControl.cs

@ -17,6 +17,7 @@ using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.Threading;
using Avalonia.VisualTree;
using TheArtOfDev.HtmlRenderer.Core;
using TheArtOfDev.HtmlRenderer.Core.Entities;
using TheArtOfDev.HtmlRenderer.Avalonia;
@ -512,7 +513,7 @@ namespace Avalonia.Controls.Html
protected virtual void InvokeMouseMove()
{
_htmlContainer.HandleMouseMove(this, MouseDevice.Instance?.GetPosition(this) ?? default(Point));
_htmlContainer.HandleMouseMove(this, (this.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(this) ?? default(Point));
}
/// <summary>

7
src/Avalonia.Input/IInputDevice.cs

@ -1,9 +1,16 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Avalonia.Input.Raw;
namespace Avalonia.Input
{
public interface IInputDevice
{
/// <summary>
/// Processes raw event. Is called after preprocessing by InputManager
/// </summary>
/// <param name="ev"></param>
void ProcessRawEvent(RawInputEventArgs ev);
}
}

8
src/Avalonia.Input/IInputRoot.cs

@ -1,6 +1,8 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using JetBrains.Annotations;
namespace Avalonia.Input
{
/// <summary>
@ -27,5 +29,11 @@ namespace Avalonia.Input
/// Gets or sets a value indicating whether access keys are shown in the window.
/// </summary>
bool ShowAccessKeys { get; set; }
/// <summary>
/// Gets associated mouse device
/// </summary>
[CanBeNull]
IMouseDevice MouseDevice { get; }
}
}

1
src/Avalonia.Input/InputManager.cs

@ -35,6 +35,7 @@ namespace Avalonia.Input
public void ProcessInput(RawInputEventArgs e)
{
_preProcess.OnNext(e);
e.Device?.ProcessRawEvent(e);
_process.OnNext(e);
_postProcess.OnNext(e);
}

12
src/Avalonia.Input/KeyboardDevice.cs

@ -16,14 +16,6 @@ namespace Avalonia.Input
{
private IInputElement _focusedElement;
public KeyboardDevice()
{
InputManager.Process
.OfType<RawInputEventArgs>()
.Where(e => e.Device == this && !e.Handled)
.Subscribe(ProcessRawEvent);
}
public event PropertyChangedEventHandler PropertyChanged;
public static IKeyboardDevice Instance => AvaloniaLocator.Current.GetService<IKeyboardDevice>();
@ -77,8 +69,10 @@ namespace Avalonia.Input
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void ProcessRawEvent(RawInputEventArgs e)
public void ProcessRawEvent(RawInputEventArgs e)
{
if(e.Handled)
return;
IInputElement element = FocusedElement;
if (element != null)

31
src/Avalonia.Input/MouseDevice.cs

@ -20,23 +20,7 @@ namespace Avalonia.Input
private int _clickCount;
private Rect _lastClickRect;
private uint _lastClickTime;
/// <summary>
/// Intializes a new instance of <see cref="MouseDevice"/>.
/// </summary>
public MouseDevice()
{
InputManager.Process
.OfType<RawMouseEventArgs>()
.Where(e => e.Device == this && !e.Handled)
.Subscribe(ProcessRawEvent);
}
/// <summary>
/// Gets the current mouse device instance.
/// </summary>
public static IMouseDevice Instance => AvaloniaLocator.Current.GetService<IMouseDevice>();
/// <summary>
/// Gets the control that is currently capturing by the mouse, if any.
/// </summary>
@ -50,12 +34,7 @@ namespace Avalonia.Input
get;
protected set;
}
/// <summary>
/// Gets the application's input manager.
/// </summary>
public IInputManager InputManager => AvaloniaLocator.Current.GetService<IInputManager>();
/// <summary>
/// Gets the mouse position, in screen coordinates.
/// </summary>
@ -102,6 +81,12 @@ namespace Avalonia.Input
return root.PointToClient(Position) - p;
}
public void ProcessRawEvent(RawInputEventArgs e)
{
if (!e.Handled && e is RawMouseEventArgs margs)
ProcessRawEvent(margs);
}
private void ProcessRawEvent(RawMouseEventArgs e)
{
Contract.Requires<ArgumentNullException>(e != null);

1
src/Gtk/Avalonia.Gtk/GtkPlatform.cs

@ -51,7 +51,6 @@ namespace Avalonia.Gtk
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<IStandardCursorFactory>().ToConstant(CursorFactory.Instance)
.Bind<IKeyboardDevice>().ToConstant(GtkKeyboardDevice.Instance)
.Bind<IMouseDevice>().ToConstant(GtkMouseDevice.Instance)
.Bind<IPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.Bind<IRendererFactory>().ToConstant(s_instance)

3
src/Gtk/Avalonia.Gtk/TopLevelImpl.cs

@ -75,6 +75,8 @@ namespace Avalonia.Gtk
}
}
public IMouseDevice MouseDevice => GtkMouseDevice.Instance;
public Avalonia.Controls.WindowState WindowState
{
get
@ -114,6 +116,7 @@ namespace Avalonia.Gtk
public Action Closed { get; set; }
public Action Deactivated { get; set; }
public Action<RawInputEventArgs> Input { get; set; }

1
src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs

@ -34,7 +34,6 @@ namespace Avalonia.Gtk3
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<IStandardCursorFactory>().ToConstant(new CursorFactory())
.Bind<IKeyboardDevice>().ToConstant(Keyboard)
.Bind<IMouseDevice>().ToConstant(Mouse)
.Bind<IPlatformSettings>().ToConstant(Instance)
.Bind<IPlatformThreadingInterface>().ToConstant(Instance)
.Bind<ISystemDialogImpl>().ToSingleton<SystemDialog>()

1
src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs

@ -233,6 +233,7 @@ namespace Avalonia.Gtk3
}
}
public IMouseDevice MouseDevice => Gtk3Platform.Mouse;
public double Scaling => (double) 1 / (Native.GtkWidgetGetScaleFactor?.Invoke(GtkWidget) ?? 1);

1
src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs

@ -56,6 +56,7 @@ namespace Avalonia.LinuxFramebuffer
}
public Size ClientSize => _fb.PixelSize;
public IMouseDevice MouseDevice => LinuxFramebufferPlatform.MouseDevice;
public double Scaling => 1;
public IEnumerable<object> Surfaces => new object[] {_fb};
public Action<RawInputEventArgs> Input { get; set; }

1
src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs

@ -33,7 +33,6 @@ namespace Avalonia.LinuxFramebuffer
AvaloniaLocator.CurrentMutable
.Bind<IStandardCursorFactory>().ToTransient<CursorFactoryStub>()
.Bind<IKeyboardDevice>().ToConstant(KeyboardDevice)
.Bind<IMouseDevice>().ToConstant(MouseDevice)
.Bind<IPlatformSettings>().ToSingleton<PlatformSettings>()
.Bind<IRendererFactory>().ToConstant(ImmediateRenderer.Factory)
.Bind<IPlatformThreadingInterface>().ToConstant(PlatformThreadingInterface.Instance)

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

@ -66,7 +66,6 @@ namespace Avalonia.Win32
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<IStandardCursorFactory>().ToConstant(CursorFactory.Instance)
.Bind<IKeyboardDevice>().ToConstant(WindowsKeyboardDevice.Instance)
.Bind<IMouseDevice>().ToConstant(WindowsMouseDevice.Instance)
.Bind<IPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.Bind<IRenderLoop>().ToConstant(new RenderLoop(60))

2
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -133,6 +133,8 @@ namespace Avalonia.Win32
}
}
public IMouseDevice MouseDevice => WindowsMouseDevice.Instance;
public WindowState WindowState
{
get

2
src/iOS/Avalonia.iOS/TopLevelImpl.cs

@ -61,6 +61,8 @@ namespace Avalonia.iOS
public Size ClientSize => Bounds.Size.ToAvalonia();
public IMouseDevice MouseDevice => iOSPlatform.MouseDevice;
public override void Draw(CGRect rect)
{
Paint?.Invoke(new Rect(rect.X, rect.Y, rect.Width, rect.Height));

1
src/iOS/Avalonia.iOS/iOSPlatform.cs

@ -57,7 +57,6 @@ namespace Avalonia.iOS
//.Bind<ISystemDialogImpl>().ToTransient<SystemDialogImpl>()
.Bind<IStandardCursorFactory>().ToTransient<CursorFactory>()
.Bind<IKeyboardDevice>().ToConstant(KeyboardDevice)
.Bind<IMouseDevice>().ToConstant(MouseDevice)
.Bind<IRendererFactory>().ToConstant(ImmediateRenderer.Factory)
.Bind<IPlatformSettings>().ToSingleton<PlatformSettings>()
.Bind<IPlatformThreadingInterface>().ToConstant(PlatformThreadingInterface.Instance)

Loading…
Cancel
Save