Browse Source

Merge branch 'master' into fixes-line-measure

pull/1678/head
Vsevolod Pilipenko 8 years ago
committed by GitHub
parent
commit
449023485d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.Controls/Platform/InProcessDragSource.cs
  2. 24
      src/Avalonia.Input/DragDropDevice.cs
  3. 5
      src/Avalonia.Input/DragEventArgs.cs
  4. 4
      src/Avalonia.Input/Raw/RawDragEvent.cs
  5. 3
      src/OSX/Avalonia.MonoMac/TopLevelImpl.cs
  6. 6
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  7. 9
      src/Windows/Avalonia.Win32/OleDragSource.cs
  8. 43
      src/Windows/Avalonia.Win32/OleDropTarget.cs

2
src/Avalonia.Controls/Platform/InProcessDragSource.cs

@ -60,7 +60,7 @@ namespace Avalonia.Platform
{ {
_lastPosition = pt; _lastPosition = pt;
RawDragEvent rawEvent = new RawDragEvent(_dragDrop, type, root, pt, _draggedData, _allowedEffects); RawDragEvent rawEvent = new RawDragEvent(_dragDrop, type, root, pt, _draggedData, _allowedEffects, modifiers);
var tl = root.GetSelfAndVisualAncestors().OfType<TopLevel>().FirstOrDefault(); var tl = root.GetSelfAndVisualAncestors().OfType<TopLevel>().FirstOrDefault();
tl.PlatformImpl?.Input(rawEvent); tl.PlatformImpl?.Input(rawEvent);

24
src/Avalonia.Input/DragDropDevice.cs

@ -19,11 +19,11 @@ namespace Avalonia.Input
return null; return null;
} }
private DragDropEffects RaiseDragEvent(Interactive target, IInputElement inputRoot, Point point, RoutedEvent<DragEventArgs> routedEvent, DragDropEffects operation, IDataObject data) private DragDropEffects RaiseDragEvent(Interactive target, IInputElement inputRoot, Point point, RoutedEvent<DragEventArgs> routedEvent, DragDropEffects operation, IDataObject data, InputModifiers modifiers)
{ {
if (target == null) if (target == null)
return DragDropEffects.None; return DragDropEffects.None;
var args = new DragEventArgs(routedEvent, data, target, inputRoot.TranslatePoint(point, target)) var args = new DragEventArgs(routedEvent, data, target, inputRoot.TranslatePoint(point, target), modifiers)
{ {
RoutedEvent = routedEvent, RoutedEvent = routedEvent,
DragEffects = operation DragEffects = operation
@ -32,24 +32,24 @@ namespace Avalonia.Input
return args.DragEffects; return args.DragEffects;
} }
private DragDropEffects DragEnter(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects) private DragDropEffects DragEnter(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects, InputModifiers modifiers)
{ {
_lastTarget = GetTarget(inputRoot, point); _lastTarget = GetTarget(inputRoot, point);
return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data); return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers);
} }
private DragDropEffects DragOver(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects) private DragDropEffects DragOver(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects, InputModifiers modifiers)
{ {
var target = GetTarget(inputRoot, point); var target = GetTarget(inputRoot, point);
if (target == _lastTarget) if (target == _lastTarget)
return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data); return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers);
try try
{ {
if (_lastTarget != null) if (_lastTarget != null)
_lastTarget.RaiseEvent(new RoutedEventArgs(DragDrop.DragLeaveEvent)); _lastTarget.RaiseEvent(new RoutedEventArgs(DragDrop.DragLeaveEvent));
return RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data); return RaiseDragEvent(target, inputRoot, point, DragDrop.DragEnterEvent, effects, data, modifiers);
} }
finally finally
{ {
@ -71,11 +71,11 @@ namespace Avalonia.Input
} }
} }
private DragDropEffects Drop(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects) private DragDropEffects Drop(IInputElement inputRoot, Point point, IDataObject data, DragDropEffects effects, InputModifiers modifiers)
{ {
try try
{ {
return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data); return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers);
} }
finally finally
{ {
@ -94,16 +94,16 @@ namespace Avalonia.Input
switch (e.Type) switch (e.Type)
{ {
case RawDragEventType.DragEnter: case RawDragEventType.DragEnter:
e.Effects = DragEnter(e.InputRoot, e.Location, e.Data, e.Effects); e.Effects = DragEnter(e.InputRoot, e.Location, e.Data, e.Effects, e.Modifiers);
break; break;
case RawDragEventType.DragOver: case RawDragEventType.DragOver:
e.Effects = DragOver(e.InputRoot, e.Location, e.Data, e.Effects); e.Effects = DragOver(e.InputRoot, e.Location, e.Data, e.Effects, e.Modifiers);
break; break;
case RawDragEventType.DragLeave: case RawDragEventType.DragLeave:
DragLeave(e.InputRoot); DragLeave(e.InputRoot);
break; break;
case RawDragEventType.Drop: case RawDragEventType.Drop:
e.Effects = Drop(e.InputRoot, e.Location, e.Data, e.Effects); e.Effects = Drop(e.InputRoot, e.Location, e.Data, e.Effects, e.Modifiers);
break; break;
} }
} }

5
src/Avalonia.Input/DragEventArgs.cs

@ -13,6 +13,8 @@ namespace Avalonia.Input
public IDataObject Data { get; private set; } public IDataObject Data { get; private set; }
public InputModifiers Modifiers { get; private set; }
public Point GetPosition(IVisual relativeTo) public Point GetPosition(IVisual relativeTo)
{ {
var point = new Point(0, 0); var point = new Point(0, 0);
@ -29,12 +31,13 @@ namespace Avalonia.Input
return point; return point;
} }
public DragEventArgs(RoutedEvent<DragEventArgs> routedEvent, IDataObject data, Interactive target, Point targetLocation) public DragEventArgs(RoutedEvent<DragEventArgs> routedEvent, IDataObject data, Interactive target, Point targetLocation, InputModifiers modifiers)
: base(routedEvent) : base(routedEvent)
{ {
this.Data = data; this.Data = data;
this._target = target; this._target = target;
this._targetLocation = targetLocation; this._targetLocation = targetLocation;
this.Modifiers = modifiers;
} }
} }

4
src/Avalonia.Input/Raw/RawDragEvent.cs

@ -11,9 +11,10 @@ namespace Avalonia.Input.Raw
public IDataObject Data { get; } public IDataObject Data { get; }
public DragDropEffects Effects { get; set; } public DragDropEffects Effects { get; set; }
public RawDragEventType Type { get; } public RawDragEventType Type { get; }
public InputModifiers Modifiers { get; }
public RawDragEvent(IDragDropDevice inputDevice, RawDragEventType type, public RawDragEvent(IDragDropDevice inputDevice, RawDragEventType type,
IInputElement inputRoot, Point location, IDataObject data, DragDropEffects effects) IInputElement inputRoot, Point location, IDataObject data, DragDropEffects effects, InputModifiers modifiers)
:base(inputDevice, 0) :base(inputDevice, 0)
{ {
Type = type; Type = type;
@ -21,6 +22,7 @@ namespace Avalonia.Input.Raw
Location = location; Location = location;
Data = data; Data = data;
Effects = effects; Effects = effects;
Modifiers = modifiers;
} }
} }
} }

3
src/OSX/Avalonia.MonoMac/TopLevelImpl.cs

@ -164,8 +164,9 @@ namespace Avalonia.MonoMac
var dragOp = DraggingInfo.ConvertDragOperation(sender.DraggingSourceOperationMask); var dragOp = DraggingInfo.ConvertDragOperation(sender.DraggingSourceOperationMask);
DraggingInfo info = new DraggingInfo(sender); DraggingInfo info = new DraggingInfo(sender);
var pt = TranslateLocalPoint(info.Location); var pt = TranslateLocalPoint(info.Location);
var args = new RawDragEvent(dragDevice, type, root, pt, info, dragOp); var args = new RawDragEvent(dragDevice, type, root, pt, info, dragOp, GetModifiers(NSEvent.CurrentModifierFlags));
input(args); input(args);
return DraggingInfo.ConvertDragOperation(args.Effects); return DraggingInfo.ConvertDragOperation(args.Effects);
} }

6
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -226,6 +226,8 @@ namespace Avalonia.Win32.Interop
MK_SHIFT = 0x0004, MK_SHIFT = 0x0004,
MK_ALT = 0x0020,
MK_XBUTTON1 = 0x0020, MK_XBUTTON1 = 0x0020,
MK_XBUTTON2 = 0x0040 MK_XBUTTON2 = 0x0040
@ -1383,9 +1385,7 @@ namespace Avalonia.Win32.Interop
Link = 4, Link = 4,
Scroll = -2147483648, Scroll = -2147483648,
} }
[ComImport] [ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00000122-0000-0000-C000-000000000046")] [Guid("00000122-0000-0000-C000-000000000046")]

9
src/Windows/Avalonia.Win32/OleDragSource.cs

@ -11,10 +11,11 @@ namespace Avalonia.Win32
private const int DRAGDROP_S_DROP = 0x00040100; private const int DRAGDROP_S_DROP = 0x00040100;
private const int DRAGDROP_S_CANCEL = 0x00040101; private const int DRAGDROP_S_CANCEL = 0x00040101;
private const int KEYSTATE_LEFTMB = 1; private static readonly int[] MOUSE_BUTTONS = new int[] {
private const int KEYSTATE_MIDDLEMB = 16; (int)UnmanagedMethods.ModifierKeys.MK_LBUTTON,
private const int KEYSTATE_RIGHTMB = 2; (int)UnmanagedMethods.ModifierKeys.MK_MBUTTON,
private static readonly int[] MOUSE_BUTTONS = new int[] { KEYSTATE_LEFTMB, KEYSTATE_MIDDLEMB, KEYSTATE_RIGHTMB }; (int)UnmanagedMethods.ModifierKeys.MK_RBUTTON
};
public int QueryContinueDrag(int fEscapePressed, int grfKeyState) public int QueryContinueDrag(int fEscapePressed, int grfKeyState)
{ {

43
src/Windows/Avalonia.Win32/OleDropTarget.cs

@ -45,6 +45,26 @@ namespace Avalonia.Win32
return result; return result;
} }
private static InputModifiers ConvertKeyState(int grfKeyState)
{
InputModifiers modifiers = InputModifiers.None;
var state = (UnmanagedMethods.ModifierKeys)grfKeyState;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_LBUTTON))
modifiers |= InputModifiers.LeftMouseButton;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_MBUTTON))
modifiers |= InputModifiers.MiddleMouseButton;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_RBUTTON))
modifiers |= InputModifiers.RightMouseButton;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_SHIFT))
modifiers |= InputModifiers.Shift;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_CONTROL))
modifiers |= InputModifiers.Control;
if (state.HasFlag(UnmanagedMethods.ModifierKeys.MK_ALT))
modifiers |= InputModifiers.Alt;
return modifiers;
}
UnmanagedMethods.HRESULT IDropTarget.DragEnter(IOleDataObject pDataObj, int grfKeyState, long pt, ref DropEffect pdwEffect) UnmanagedMethods.HRESULT IDropTarget.DragEnter(IOleDataObject pDataObj, int grfKeyState, long pt, ref DropEffect pdwEffect)
{ {
var dispatch = _tl?.Input; var dispatch = _tl?.Input;
@ -56,13 +76,15 @@ namespace Avalonia.Win32
_currentDrag = pDataObj as IDataObject; _currentDrag = pDataObj as IDataObject;
if (_currentDrag == null) if (_currentDrag == null)
_currentDrag = new OleDataObject(pDataObj); _currentDrag = new OleDataObject(pDataObj);
var args = new RawDragEvent( var args = new RawDragEvent(
_dragDevice, _dragDevice,
RawDragEventType.DragEnter, RawDragEventType.DragEnter,
_target, _target,
GetDragLocation(pt), GetDragLocation(pt),
_currentDrag, _currentDrag,
ConvertDropEffect(pdwEffect) ConvertDropEffect(pdwEffect),
ConvertKeyState(grfKeyState)
); );
dispatch(args); dispatch(args);
pdwEffect = ConvertDropEffect(args.Effects); pdwEffect = ConvertDropEffect(args.Effects);
@ -85,7 +107,8 @@ namespace Avalonia.Win32
_target, _target,
GetDragLocation(pt), GetDragLocation(pt),
_currentDrag, _currentDrag,
ConvertDropEffect(pdwEffect) ConvertDropEffect(pdwEffect),
ConvertKeyState(grfKeyState)
); );
dispatch(args); dispatch(args);
pdwEffect = ConvertDropEffect(args.Effects); pdwEffect = ConvertDropEffect(args.Effects);
@ -98,12 +121,13 @@ namespace Avalonia.Win32
try try
{ {
_tl?.Input(new RawDragEvent( _tl?.Input(new RawDragEvent(
_dragDevice, _dragDevice,
RawDragEventType.DragLeave, RawDragEventType.DragLeave,
_target, _target,
default(Point), default(Point),
null, null,
DragDropEffects.None DragDropEffects.None,
InputModifiers.None
)); ));
return UnmanagedMethods.HRESULT.S_OK; return UnmanagedMethods.HRESULT.S_OK;
} }
@ -134,7 +158,8 @@ namespace Avalonia.Win32
_target, _target,
GetDragLocation(pt), GetDragLocation(pt),
_currentDrag, _currentDrag,
ConvertDropEffect(pdwEffect) ConvertDropEffect(pdwEffect),
ConvertKeyState(grfKeyState)
); );
dispatch(args); dispatch(args);
pdwEffect = ConvertDropEffect(args.Effects); pdwEffect = ConvertDropEffect(args.Effects);

Loading…
Cancel
Save