Browse Source

Merge branch 'master' into fixes-line-measure

Vsevolod Pilipenko 7 years ago
parent
commit
449023485d

+ 1 - 1
src/Avalonia.Controls/Platform/InProcessDragSource.cs

@@ -60,7 +60,7 @@ namespace Avalonia.Platform
         {
             _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();
             tl.PlatformImpl?.Input(rawEvent);
 

+ 12 - 12
src/Avalonia.Input/DragDropDevice.cs

@@ -19,11 +19,11 @@ namespace Avalonia.Input
             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)
                 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,
                 DragEffects = operation
@@ -32,24 +32,24 @@ namespace Avalonia.Input
             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);
-            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);
 
             if (target == _lastTarget)
-                return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data);
+                return RaiseDragEvent(target, inputRoot, point, DragDrop.DragOverEvent, effects, data, modifiers);
             
             try
             {
                 if (_lastTarget != null)
                     _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
             {
@@ -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
             {
-                return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data);
+                return RaiseDragEvent(_lastTarget, inputRoot, point, DragDrop.DropEvent, effects, data, modifiers);
             }
             finally 
             {
@@ -94,16 +94,16 @@ namespace Avalonia.Input
             switch (e.Type)
             {
                 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;
                 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;
                 case RawDragEventType.DragLeave:
                     DragLeave(e.InputRoot);
                     break;
                 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;
             }
         }

+ 4 - 1
src/Avalonia.Input/DragEventArgs.cs

@@ -13,6 +13,8 @@ namespace Avalonia.Input
 
         public IDataObject Data { get; private set; }
 
+        public InputModifiers Modifiers { get; private set; }
+
         public Point GetPosition(IVisual relativeTo)
         {
             var point = new Point(0, 0);
@@ -29,12 +31,13 @@ namespace Avalonia.Input
             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)
         {
             this.Data = data;
             this._target = target;
             this._targetLocation = targetLocation;
+            this.Modifiers = modifiers;
         }
 
     }

+ 3 - 1
src/Avalonia.Input/Raw/RawDragEvent.cs

@@ -11,9 +11,10 @@ namespace Avalonia.Input.Raw
         public IDataObject Data { get; }
         public DragDropEffects Effects { get; set; }
         public RawDragEventType Type { get; }
+        public InputModifiers Modifiers { get; }
 
         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)
         {
             Type = type;
@@ -21,6 +22,7 @@ namespace Avalonia.Input.Raw
             Location = location;
             Data = data;
             Effects = effects;
+            Modifiers = modifiers;
         }
     }
 }

+ 2 - 1
src/OSX/Avalonia.MonoMac/TopLevelImpl.cs

@@ -164,8 +164,9 @@ namespace Avalonia.MonoMac
                 
                 var dragOp = DraggingInfo.ConvertDragOperation(sender.DraggingSourceOperationMask);
                 DraggingInfo info = new DraggingInfo(sender);
+                
                 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);
                 return DraggingInfo.ConvertDragOperation(args.Effects);
             }

+ 3 - 3
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

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

+ 5 - 4
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_CANCEL = 0x00040101;
 
-        private const int KEYSTATE_LEFTMB = 1;
-        private const int KEYSTATE_MIDDLEMB = 16;
-        private const int KEYSTATE_RIGHTMB = 2;
-        private static readonly int[] MOUSE_BUTTONS = new int[] { KEYSTATE_LEFTMB, KEYSTATE_MIDDLEMB, KEYSTATE_RIGHTMB };
+        private static readonly int[] MOUSE_BUTTONS = new int[] {
+            (int)UnmanagedMethods.ModifierKeys.MK_LBUTTON,
+            (int)UnmanagedMethods.ModifierKeys.MK_MBUTTON,
+            (int)UnmanagedMethods.ModifierKeys.MK_RBUTTON
+        };
 
         public int QueryContinueDrag(int fEscapePressed, int grfKeyState)
         {

+ 34 - 9
src/Windows/Avalonia.Win32/OleDropTarget.cs

@@ -45,6 +45,26 @@ namespace Avalonia.Win32
             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)
         {
             var dispatch = _tl?.Input;
@@ -56,13 +76,15 @@ namespace Avalonia.Win32
             _currentDrag = pDataObj as IDataObject;
             if (_currentDrag == null)
                 _currentDrag = new OleDataObject(pDataObj);
+
             var args = new RawDragEvent(
                 _dragDevice,
                 RawDragEventType.DragEnter, 
                 _target, 
                 GetDragLocation(pt), 
                 _currentDrag, 
-                ConvertDropEffect(pdwEffect)
+                ConvertDropEffect(pdwEffect),
+                ConvertKeyState(grfKeyState)
             );
             dispatch(args);
             pdwEffect = ConvertDropEffect(args.Effects);
@@ -85,7 +107,8 @@ namespace Avalonia.Win32
                 _target, 
                 GetDragLocation(pt), 
                 _currentDrag, 
-                ConvertDropEffect(pdwEffect)
+                ConvertDropEffect(pdwEffect),
+                ConvertKeyState(grfKeyState)
             );
             dispatch(args);
             pdwEffect = ConvertDropEffect(args.Effects);
@@ -98,12 +121,13 @@ namespace Avalonia.Win32
             try
             {
                 _tl?.Input(new RawDragEvent(
-                    _dragDevice,  
-                    RawDragEventType.DragLeave, 
-                    _target, 
-                    default(Point), 
-                    null, 
-                    DragDropEffects.None
+                    _dragDevice,
+                    RawDragEventType.DragLeave,
+                    _target,
+                    default(Point),
+                    null,
+                    DragDropEffects.None,
+                    InputModifiers.None
                 ));
                 return UnmanagedMethods.HRESULT.S_OK;
             }
@@ -134,7 +158,8 @@ namespace Avalonia.Win32
                     _target, 
                     GetDragLocation(pt), 
                     _currentDrag, 
-                    ConvertDropEffect(pdwEffect)
+                    ConvertDropEffect(pdwEffect),
+                    ConvertKeyState(grfKeyState)
                 );
                 dispatch(args);
                 pdwEffect = ConvertDropEffect(args.Effects);