using System; using System.Collections.Generic; using SkiaSharp; using TheGameExtreme.viewmodel; using TouchTracking; using Xamarin.Essentials; namespace TheGameExtreme.view { /** * Classe permettant de gérer un objet dessiné dans un canvas */ public class TouchManipulationCard { public SKPoint InitialPoint { get; set; } SKPaint textPaint; Dictionary touchDictionary = new Dictionary(); public CardVM Value; public string display; private float width = 0.01f * (float)DeviceDisplay.MainDisplayInfo.Width; private float height = 0.01f * (float)DeviceDisplay.MainDisplayInfo.Width * 3f; /** * Objet dessiné * Carte qui est dessiné par le textPaint */ public TouchManipulationCard(SKPaint textPaint, CardVM value) { this.textPaint = textPaint; Value = value; display = Value.ToString(); if (!display.Contains(",") && !display.Contains(".") && !display.Contains("/")) { if (decimal.Parse(display) < 0 && decimal.Parse(display) > -10) { display = "-0" + Math.Abs(decimal.Parse(display)).ToString(); } else if (decimal.Parse(display) >= 0 && decimal.Parse(display) < 10) { display = "0" + display; } } Matrix = SKMatrix.MakeIdentity(); Mode = TouchManipulationMode.PanOnly; } public TouchManipulationMode Mode { set; get; } public SKMatrix Matrix { set; get; } public SKMatrix InitialMatrix { set; get; } /** * Fonction permettant de dessiner l'objet que contient l'instance dans un canvas donné avec une couleur donnée * Canvas où l'on souhaite dessiner l'objet contenu dans l'instance * Couleur qui sera prise par l'objet */ public void Paint(SKCanvas canvas, SKColor color) { canvas.Save(); SKMatrix matrix = Matrix; canvas.Concat(ref matrix); textPaint.Color = color; textPaint.StrokeWidth = 5; textPaint.Style = SKPaintStyle.Stroke; SKRect textBounds = new SKRect(); textPaint.MeasureText(display, ref textBounds); SKRoundRect card = new SKRoundRect(textBounds, 1f, 1f); card.Inflate(width, height); canvas.DrawRoundRect(card, textPaint); canvas.DrawText(display, 0, 0, textPaint); canvas.Restore(); } /** * Fonction permettant de changer la couleur de l'objet contenu dans l'instance * Nouvelle couleur que l'on souhaite attribué à l'objet contenu dans l'instance */ public void ChangeColor(SKColor color) { textPaint.Color = color; } /** * Fonction permettant de savoir si le point qu'on lui passe est dans la zone où l'objet est dessiné * Point que l'on souhaite tester * Booléen qui indique si le point donné est dans la zone où l'objet en instance est dessiné */ public bool HitTest(SKPoint location) { // Invert the matrix SKMatrix inverseMatrix; if (Matrix.TryInvert(out inverseMatrix)) { // Transform the point using the inverted matrix SKPoint transformedPoint = inverseMatrix.MapPoint(location); // Check if it's in the untransformed bitmap rectangle SKRect rect = new SKRect(-70, -110, textPaint.MeasureText(display) + 35, textPaint.TextSize); return rect.Contains(transformedPoint); } return false; } /** * Evénement qui permet de gérer le Drag and Drop. * Il permet de traiter le clic, le mouvement, le relachement du clic et la fin de traitement d'un objet. * Index de la position que l'on souhaite traiter * Type d'évenement lancé * Nouveau point que l'on souhaite traiter */ public void ProcessTouchEvent(long id, TouchActionType type, SKPoint location) { switch (type) { case TouchActionType.Pressed: touchDictionary.Add(id, new TouchManipulationInfo { PreviousPoint = location, NewPoint = location }); break; case TouchActionType.Moved: TouchManipulationInfo info = touchDictionary[id]; info.NewPoint = location; Manipulate(); info.PreviousPoint = info.NewPoint; break; case TouchActionType.Released: case TouchActionType.Cancelled: touchDictionary.Remove(id); break; } } /** * Fonction permettant de traiter un déplacement de l'objet en instance */ private void Manipulate() { TouchManipulationInfo[] infos = new TouchManipulationInfo[touchDictionary.Count]; touchDictionary.Values.CopyTo(infos, 0); if (Mode == TouchManipulationMode.PanOnly) { Matrix = SKMatrix.MakeTranslation(infos[0].NewPoint.X, infos[0].NewPoint.Y); } } } }