|
|
@@ -1,4 +1,5 @@
|
|
|
using System;
|
|
|
+using System.Collections.Generic;
|
|
|
using System.Data;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
@@ -24,6 +25,7 @@ namespace Avalonia.MonoMac
|
|
|
public class DragSource : NSDraggingSource, IPlatformDragSource
|
|
|
{
|
|
|
private const string NSPasteboardTypeString = "public.utf8-plain-text";
|
|
|
+ private const string NSPasteboardTypeFileUrl = "public.file-url";
|
|
|
|
|
|
private readonly Subject<DragDropEffects> _result = new Subject<DragDropEffects>();
|
|
|
private readonly IInputManager _inputManager;
|
|
|
@@ -39,7 +41,7 @@ namespace Avalonia.MonoMac
|
|
|
private string DataFormatToUTI(string s)
|
|
|
{
|
|
|
if (s == DataFormats.FileNames)
|
|
|
- throw new NotImplementedException();
|
|
|
+ return NSPasteboardTypeFileUrl;
|
|
|
if (s == DataFormats.Text)
|
|
|
return NSPasteboardTypeString;
|
|
|
return s;
|
|
|
@@ -47,7 +49,6 @@ namespace Avalonia.MonoMac
|
|
|
|
|
|
private NSDraggingItem CreateDraggingItem(string format, object data)
|
|
|
{
|
|
|
-
|
|
|
var pasteboardItem = new NSPasteboardItem();
|
|
|
NSData nsData;
|
|
|
if(data is string s)
|
|
|
@@ -72,6 +73,19 @@ namespace Avalonia.MonoMac
|
|
|
|
|
|
return new NSDraggingItem(writing);
|
|
|
}
|
|
|
+
|
|
|
+ public IEnumerable<NSDraggingItem> CreateDraggingItems(string format, object data)
|
|
|
+ {
|
|
|
+ if (format == DataFormats.FileNames && data is IEnumerable<string> files)
|
|
|
+ {
|
|
|
+ foreach (var file in files)
|
|
|
+ yield return CreateDraggingItem(format, file);
|
|
|
+
|
|
|
+ yield break;
|
|
|
+ }
|
|
|
+
|
|
|
+ yield return CreateDraggingItem(format, data);
|
|
|
+ }
|
|
|
|
|
|
|
|
|
public async Task<DragDropEffects> DoDragDrop(IDataObject data, DragDropEffects allowedEffects)
|
|
|
@@ -87,7 +101,7 @@ namespace Avalonia.MonoMac
|
|
|
var ev = NSEvent.MouseEvent(NSEventType.LeftMouseDown, pt, 0, 0, 0, null, 0, 0, 0);
|
|
|
|
|
|
_allowedEffects = allowedEffects;
|
|
|
- var items = data.GetDataFormats().Select(fmt => CreateDraggingItem(fmt, data.Get(fmt))).ToArray();
|
|
|
+ var items = data.GetDataFormats().SelectMany(fmt => CreateDraggingItems(fmt, data.Get(fmt))).ToArray();
|
|
|
view.BeginDraggingSession(items ,ev, this);
|
|
|
|
|
|
return await _result;
|