示例#1
0
        private async void Paste(Avalonia.Point dominoPoint, PointerReleasedEventArgs e)
        {
            bool pasteFailed = true;

            try
            {
                if (!(CurrentProject is ICopyPasteable))
                {
                    await Errorhandler.RaiseMessage(_("Copy/Paste is not supported in this project."), _("Paste"), Errorhandler.MessageType.Warning);
                }
                // find closest domino
                int domino = FindDominoAtPosition(dominoPoint, int.MaxValue).idx;
                if (PossiblePastePositions.Contains(domino))
                {
                    PasteFilter paste = new PasteFilter(CurrentProject as ICopyPasteable, startindex, toCopy.ToArray(), domino);
                    paste.Apply();
                    undoStack.Push(paste);
                    pasteFailed = false;
                    if (e.KeyModifiers != KeyModifiers.Control)
                    {
                        SelectionTool.Select(paste.paste_target, true);
                    }
                }
            }
            catch (InvalidOperationException ex)
            {
                await Errorhandler.RaiseMessage(ex.Message, _("Error"), Errorhandler.MessageType.Error);
            }
            finally
            {
                FinalizePaste(e.KeyModifiers != KeyModifiers.Control && !pasteFailed);
            }
        }
示例#2
0
 public override void DrawLine(Pen pen, Point point0, Point point1)
 {
     this.target.DrawLine(
         point0.ToSharpDX(),
         point1.ToSharpDX(),
         pen.Brush.ToSharpDX(this.target));
 }
示例#3
0
        public MouseEventArgs Convert(PointerEventArgs pea)
        {
            PointerPoint pp = pea.GetCurrentPoint(this);

            Avalonia.Point point = pea.GetPosition(this);
            int            key   = Key(pp.Properties.PointerUpdateKind);

            return(new MouseEventArgs(key, 1, (int)(point.X * this.PlatformImpl.DesktopScaling), (int)(point.Y * this.PlatformImpl.DesktopScaling), 0));
        }
示例#4
0
 public override void DrawText(FormattedText formattedText, Point origin)
 {
     this.target.DrawText(
         formattedText.Text ?? string.Empty,
         ((Direct2D1FormattedText)formattedText.PlatformImpl).DirectWriteTextLayout,
         new RectangleF((float)origin.X, (float)origin.Y, float.PositiveInfinity, float.PositiveInfinity),
         formattedText.Foreground.ToSharpDX(this.target),
         DrawTextOptions.None);
 }
示例#5
0
 internal void Canvas_MouseMove(Avalonia.Point dominoPoint, PointerEventArgs e)
 {
     if (iscopying)
     {
         DrawPasteOverlay(dominoPoint, e);
     }
     else
     {
         SelectedTool?.MouseMove(dominoPoint, e);
     }
 }
示例#6
0
 internal void Canvas_MouseUp(Avalonia.Point dominoPoint, PointerReleasedEventArgs e)
 {
     if (iscopying)
     {
         Paste(dominoPoint, e);
         if (e.InitialPressMouseButton == MouseButton.Right)
         {
             FinalizePaste(true);
         }
     }
     else
     {
         SelectedTool?.MouseUp(dominoPoint, e);
         UpdateUIElements();
     }
 }
示例#7
0
        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();
        }
 protected override void OnPointerMoved(PointerEventArgs e)
 {
     base.OnPointerMoved(e);
     if (!AllowScroll)
     {
         return;
     }
     if (_captured)
     {
         Avalonia.Point delta = e.GetPosition(this) - _startPos;
         double         value = _startValue - delta.Y * ScrollStep;
         if (ClipValueToMinMax)
         {
             value = Avalonia.Utilities.MathUtilities.Clamp(value, Minimum, Maximum);
         }
         this.Value = value;
         Debug.WriteLine("UpDown OnPointerMoved {0} -> {1} -> {2}", delta, value, this.Value);
     }
 }
示例#9
0
        public EditingDominoVM FindDominoAtPosition(Avalonia.Point pos, int tolerance = 0)
        {
            double          min_dist = int.MaxValue;
            EditingDominoVM result   = null;

            foreach (var shape in Dominoes)
            {
                if (shape.domino.IsInside(new Core.Point(pos.X, pos.Y), expanded: DisplaySettingsTool.Expanded))
                {
                    return(shape);
                }
                var    rect = shape.domino.GetContainer();
                double dist = Math.Pow((rect.x + rect.width / 2) - pos.X, 2) + Math.Pow(rect.y + rect.height / 2 - pos.Y, 2);
                if (min_dist > dist && dist < tolerance)
                {
                    min_dist = dist;
                    result   = shape;
                }
            }
            return(result);
        }
示例#10
0
 internal void Canvas_MouseWheel(Avalonia.Point dominoPoint, PointerWheelEventArgs e)
 {
     SelectedTool?.MouseWheel(dominoPoint, e);
 }
示例#11
0
 internal void Canvas_MouseDown(Avalonia.Point dominoPoint, PointerPressedEventArgs e)
 {
     SelectedTool?.MouseDown(dominoPoint, e);
 }
 public override void DrawText(FormattedText formattedText, Point origin)
 {
     this.target.DrawText(
         formattedText.Text ?? string.Empty,
         ((Direct2D1FormattedText)formattedText.PlatformImpl).DirectWriteTextLayout,
         new RectangleF((float)origin.X, (float)origin.Y, float.PositiveInfinity, float.PositiveInfinity),
         formattedText.Foreground.ToSharpDX(this.target),
         DrawTextOptions.None);
 }
 public override void DrawLine(Pen pen, Point point0, Point point1)
 {
     this.target.DrawLine(
         point0.ToSharpDX(),
         point1.ToSharpDX(),
         pen.Brush.ToSharpDX(this.target));
 }
示例#14
0
 public static System.Drawing.PointF ToDrawingPointF(this Avalonia.Point pnt)
 {
     return(new System.Drawing.PointF((float)pnt.X, (float)pnt.Y));
 }