private void FinalizePaste(bool clearall) { if (clearall) { iscopying = false; ClearPastePositions(); } // refresh the preview in case we copied to the source domain AdditionalDrawables.RemoveAll(PasteOverlays); PasteOverlays = new List <CanvasDrawable>(); UpdateUIElements(); }
private void DrawPasteOverlay(Avalonia.Point dominoPoint, PointerEventArgs e) { // display the dominoes to paste as a half-transparent overlay. // reference point: var reference_point = Dominoes[toCopy.Min()].CenterPoint - dominoPoint; if (PasteOverlays.Count == 0) { // create the overlays foreach (int i in toCopy) { var p = new SkiaSharp.SKPath(); var points = Dominoes[i].CanvasPoints; if (points.Length > 1) { p.MoveTo(new SkiaSharp.SKPoint((float)points[0].X - (float)reference_point.X, (float)points[0].Y - (float)reference_point.Y)); foreach (var point in points.Skip(1)) { p.LineTo(new SkiaSharp.SKPoint((float)point.X - (float)reference_point.X, (float)point.Y - (float)reference_point.Y)); } } var color = Dominoes[i].StoneColor.ToSKColor().WithAlpha(128); PasteOverlays.Add(new CanvasDrawable() { BeforeBorders = false, Paint = new SkiaSharp.SKPaint() { Color = color }, Path = p }); } AdditionalDrawables.AddRange(PasteOverlays); } else { // find out difference between current and last reference point var shift = lastreference - reference_point; var transform = SkiaSharp.SKMatrix.CreateTranslation((float)shift.X, (float)shift.Y); System.Diagnostics.Debug.WriteLine(shift); foreach (var stone in PasteOverlays) { stone.Path.Transform(transform); } } lastreference = reference_point; Redraw(); }