public bool OnDrag(AView v, DragEvent e) { DataPackage package = null; CustomLocalStateData localStateData = (e.LocalState as CustomLocalStateData) ?? _currentCustomLocalStateData ?? new CustomLocalStateData(); _currentCustomLocalStateData = localStateData; // TODO MAUI FIX FOR COMPAT //IVisualElementRenderer dragSourceRenderer = localStateData?.SourceNativeView as IVisualElementRenderer; package = localStateData?.DataPackage; var dragSourceElement = _currentCustomLocalStateData?.SourceElement; // ?? dragSourceRenderer?.Element; if (package == null) { package = new DataPackage(); _currentCustomLocalStateData.DataPackage = package; } switch (e.Action) { case DragAction.Ended: { _currentCustomLocalStateData = null; if (dragSourceElement is View vSource) { HandleDropCompleted(vSource); } } break; case DragAction.Started: break; case DragAction.Location: HandleDragOver(package); break; case DragAction.Drop: { HandleDrop(e, _currentCustomLocalStateData); break; } case DragAction.Entered: HandleDragOver(package); break; case DragAction.Exited: HandleDragLeave(package); break; } return(true); }
protected override void Dispose(bool disposing) { if (_isDisposed) { return; } _isDisposed = true; if (disposing) { _currentCustomLocalStateData = null; var control = GetControl(); if (control.IsAlive()) { control.SetOnDragListener(null); } } base.Dispose(disposing); }
public void OnLongPress(MotionEvent e) { if (!HasAnyDragGestures()) { return; } SendEventArgs <DragGestureRecognizer>(rec => { if (!rec.CanDrag) { return; } var element = GetView(); var renderer = AppCompat.Platform.GetRenderer(element); var v = renderer.View; if (v.Handle == IntPtr.Zero) { return; } var args = rec.SendDragStarting(element); if (args.Cancel) { return; } CustomLocalStateData customLocalStateData = new CustomLocalStateData(); customLocalStateData.DataPackage = args.Data; //_dragSource[element] = args.Data; string clipDescription = FastRenderers.AutomationPropertiesProvider.ConcatenateNameAndHelpText(element) ?? String.Empty; ClipData.Item item = null; List <string> mimeTypes = new List <string>(); if (!args.Handled) { if (args.Data.Image != null) { mimeTypes.Add("image/jpeg"); item = ConvertToClipDataItem(args.Data.Image, mimeTypes); } else { string text = clipDescription ?? args.Data.Text; if (Uri.TryCreate(text, UriKind.Absolute, out _)) { item = new ClipData.Item(AUri.Parse(text)); mimeTypes.Add(ClipDescription.MimetypeTextUrilist); } else { item = new ClipData.Item(text); mimeTypes.Add(ClipDescription.MimetypeTextPlain); } } } var dataPackage = args.Data; ClipData.Item userItem = null; if (dataPackage.Image != null) { userItem = ConvertToClipDataItem(dataPackage.Image, mimeTypes); } if (dataPackage.Text != null) { userItem = new ClipData.Item(dataPackage.Text); } if (item == null) { item = userItem; userItem = null; } ClipData data = new ClipData(clipDescription, mimeTypes.ToArray(), item); if (userItem != null) { data.AddItem(userItem); } var dragShadowBuilder = new AView.DragShadowBuilder(v); customLocalStateData.SourceNativeView = v; customLocalStateData.SourceElement = renderer?.Element; if (Forms.IsNougatOrNewer) { v.StartDragAndDrop(data, dragShadowBuilder, customLocalStateData, (int)ADragFlags.Global | (int)ADragFlags.GlobalUriRead); } else #pragma warning disable CS0618 // Type or member is obsolete { v.StartDrag(data, dragShadowBuilder, customLocalStateData, (int)ADragFlags.Global | (int)ADragFlags.GlobalUriRead); } #pragma warning restore CS0618 // Type or member is obsolete }); }
void HandleDrop(DragEvent e, CustomLocalStateData customLocalStateData) { if (customLocalStateData.AcceptedOperation == DataPackageOperation.None) { return; } var datapackage = customLocalStateData.DataPackage; if (e.LocalState == null) { string text = String.Empty; if (e.ClipData?.ItemCount > 0) { var clipData = e.ClipData.GetItemAt(0); var control = GetControl(); if (control?.Context != null) { text = clipData.CoerceToText(control?.Context); } else { text = clipData.Text; } } else { text = e.ClipDescription?.Label; } if (String.IsNullOrWhiteSpace(datapackage.Text)) { datapackage.Text = text; } if (datapackage.Image == null) { datapackage.Image = text; } } var args = new DropEventArgs(datapackage?.View); SendEventArgs <DropGestureRecognizer>(async rec => { if (!rec.AllowDrop) { return; } try { await rec.SendDrop(args); } catch (Exception exc) { Internals.Log.Warning(nameof(DropGestureRecognizer), $"{exc}"); } }); }