public override void MouseDragged(NSEvent ev) { _callbacks.OnDragged().MatchWith( data => { var pasteBoardItem = new NSPasteboardItem(); pasteBoardItem.SetStringForType("fuse-drag-n-drop", "public.data"); var draggingItem = new NSDraggingItem(pasteBoardItem); var imgCache = BitmapImageRepForCachingDisplayInRect(Bounds); CacheDisplay(Bounds, imgCache); var img = new NSImage(imgCache.Size); img.LockFocus(); imgCache.DrawInRect(Bounds, Bounds, NSCompositingOperation.Copy, 0.5f, true, new NSDictionary()); img.UnlockFocus(); draggingItem.SetDraggingFrame(new CGRect(Bounds.Location, img.Size), img); BeginDraggingSession(new[] { draggingItem }, ev, new DragSource(this, _space, _callbacks, data)); }, () => { BeginDraggingSession(new NSDraggingItem[0], ev, new DragSource(this, _space, _callbacks, null)); }); }
public void StartDnD(string svgpath, int xView, int yView) { Debug.Assert(File.Exists(svgpath)); NSDraggingItem di; var url_pdf = NSUrl.FromFilename(svgpath); di = new NSDraggingItem(url_pdf); di.SetDraggingFrame(new CGRect(xView, yView, 26, 26), new NSImage(Consts.AppDir_Resources + "cursor.png")); NSEvent evt = NSApplication.SharedApplication.CurrentEvent; var session = App.AppWnd._nsview.BeginDraggingSession(new[] { di }, evt, this); session.AnimatesToStartingPositionsOnCancelOrFail = true; session.DraggingFormation = NSDraggingFormation.None; }
public void StartDnD(string svgpath, string dragimgpath, int xView, int yView, Action completed) { Debug.Assert(File.Exists(svgpath)); Debug.Assert(File.Exists(dragimgpath)); _completed = completed; NSDraggingItem di; var url_pdf = NSUrl.FromFilename(svgpath); di = new NSDraggingItem(url_pdf); var img = new NSImage(dragimgpath); di.SetDraggingFrame(new CGRect(xView, yView, img.Size.Width * 2, img.Size.Height * 2), img); // *2 wtf NSEvent evt = NSApplication.SharedApplication.CurrentEvent; var session = App.AppWnd._nsview.BeginDraggingSession(new[] { di }, evt, this); session.AnimatesToStartingPositionsOnCancelOrFail = true; session.DraggingFormation = NSDraggingFormation.None; }
internal static async Task <NSDraggingItem[]> CreateNativeDragDropData( DataPackageView data, Point startPoint) { NSDraggingItem draggingItem; var items = new List <NSDraggingItem>(); double maxFrameDimension = 300.0; // May be adjusted var defaultFrameRect = new CoreGraphics.CGRect(startPoint.X, startPoint.Y, 100, 30); /* Note that NSDraggingItems are required by the BeginDraggingSession methods. * Therefore, that is what is constructed here instead of pasteboard items. * * For several types such as NSString or NSImage, they implement the INSPasteboardWriting interface and * can therefore be used to directly construct an NSDraggingItem. * However, for other types (such as HTML) the full pasteboard item must be constructed first defining * both its type and string content. * * The dragging frame is used to represent the visual of the item being dragged. This could be a * preview of the image or sample text. At minimum, macOS requires the DraggingFrame property of the * NSDraggingItem to be set with a CGRect or the app will crash. It is however better to set both * the frame bounds and content at the same time with .SetDraggingFrame(). For caveats see: * https://developer.apple.com/documentation/appkit/nsdraggingitem/1528746-setdraggingframe * * Because Uno does not currently support the DragUI, this code only generates a real drag visual * for images where a visual is already defined. For other types such as text, no visual will be * generated. In the future, when DragUI and its corresponding image is supported, this can change. * */ if (data?.Contains(StandardDataFormats.Bitmap) ?? false) { NSImage?image = null; using (var stream = (await(await data.GetBitmapAsync()).OpenReadAsync()).AsStream()) { if (stream != null) { using (var ms = new MemoryStream()) { await stream.CopyToAsync(ms); ms.Flush(); ms.Position = 0; image = NSImage.FromStream(ms); } } } if (image != null) { draggingItem = new NSDraggingItem(image); // For an NSImage, we will use the image itself as the dragging visual. // The visual should be no larger than the max dimension setting and is therefore scaled. NSBitmapImageRep rep = new NSBitmapImageRep(image.CGImage); int width = (int)rep.PixelsWide; int height = (int)rep.PixelsHigh; double scale = maxFrameDimension / Math.Max(width, height); // Dragging frame must be set draggingItem.SetDraggingFrame( new CoreGraphics.CGRect(startPoint.X, startPoint.Y, width * scale, height * scale), image); items.Add(draggingItem); } } if (data?.Contains(StandardDataFormats.Html) ?? false) { var html = await data.GetHtmlFormatAsync(); if (!string.IsNullOrEmpty(html)) { var pasteboardItem = new NSPasteboardItem(); pasteboardItem.SetStringForType(html, NSPasteboard.NSPasteboardTypeHTML); draggingItem = new NSDraggingItem(pasteboardItem); draggingItem.DraggingFrame = defaultFrameRect; // Must be set items.Add(draggingItem); } } if (data?.Contains(StandardDataFormats.Rtf) ?? false) { var rtf = await data.GetRtfAsync(); if (!string.IsNullOrEmpty(rtf)) { // Use `NSPasteboardTypeRTF` instead of `NSPasteboardTypeRTFD` for max compatibility var pasteboardItem = new NSPasteboardItem(); pasteboardItem.SetStringForType(rtf, NSPasteboard.NSPasteboardTypeRTF); draggingItem = new NSDraggingItem(pasteboardItem); draggingItem.DraggingFrame = defaultFrameRect; // Must be set items.Add(draggingItem); } } if (data?.Contains(StandardDataFormats.StorageItems) ?? false) { var storageItems = await data.GetStorageItemsAsync(); if (storageItems.Count > 0) { // Not currently supported } } if (data?.Contains(StandardDataFormats.Text) ?? false) { var text = await data.GetTextAsync(); if (!string.IsNullOrEmpty(text)) { draggingItem = new NSDraggingItem((NSString)text); draggingItem.DraggingFrame = defaultFrameRect; // Must be set items.Add(draggingItem); } } if (data != null) { var uri = DataPackage.CombineUri( data.Contains(StandardDataFormats.WebLink) ? (await data.GetWebLinkAsync()).ToString() : null, data.Contains(StandardDataFormats.ApplicationLink) ? (await data.GetApplicationLinkAsync()).ToString() : null, data.Contains(StandardDataFormats.Uri) ? (await data.GetUriAsync()).ToString() : null); if (string.IsNullOrEmpty(uri) == false) { draggingItem = new NSDraggingItem(new NSUrl(uri)); draggingItem.DraggingFrame = defaultFrameRect; // Must be set items.Add(draggingItem); } } return(items.ToArray()); }