using System; using System.Collections.Generic; using System.ComponentModel; using Xamarin.Forms; using TheGameExtreme.model.@event; using TheGameExtreme.viewmodel; using SkiaSharp; using System.IO; using System.Reflection; using SkiaSharp.Views.Forms; using TouchTracking; using Xamarin.Essentials; namespace TheGameExtreme.view { // Learn more about making custom code visible in the Xamarin.Forms previewer // by visiting https://aka.ms/xamarinforms-previewer [DesignTimeVisible(false)] public partial class MainPage : ContentPage { private bool isFirst = true; private Main viewmodel; private List stacks = new List(); Button button; List playersNames; TouchManipulationBitmap textPaint; List textCollection = new List(); List stackCollection = new List(); Dictionary textDictionary = new Dictionary(); public MainPage(List playersNames) { this.playersNames = playersNames; InitializeComponent(); NavigationPage.SetHasNavigationBar(this, false); InflateStack(); //button.Text = "Retry"; //button.Clicked += retry; viewmodel = new Main(playersNames); //viewmodel.BindingChanged += OnBindingChanged; viewmodel.AlertChanged += OnAlertChanged; pseudo.SetBinding(Label.TextProperty, new Binding("Pseudo", source: viewmodel)); InflateHand(); } private void OnAlertChanged(object sender, EventArgs args) { if (viewmodel.Alert != null) { DisplayAlert("", viewmodel.Alert, "OK"); viewmodel.Alert = null; } } public void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args) { SKCanvas canvas = args.Surface.Canvas; canvas.Clear(); foreach (TouchManipulationBitmap textPaint in stackCollection) { textPaint.Paint(canvas); } foreach (TouchManipulationBitmap textPaint in textCollection) { textPaint.Paint(canvas); } } public void OnTouchEffectAction(object sender, TouchActionEventArgs args) { // Convert Xamarin.Forms point to pixels TouchTrackingPoint pt = args.Location; SKPoint point = new SKPoint((float)(canvasView.CanvasSize.Width * pt.X / canvasView.Width), (float)(canvasView.CanvasSize.Height * pt.Y / canvasView.Height)); switch (args.Type) { case TouchActionType.Pressed: for (int i = textCollection.Count - 1; i >= 0; i--) { TouchManipulationBitmap textPaint = textCollection[i]; if (textPaint.HitTest(point)) { // Move bitmap to end of collection textCollection.Remove(textPaint); textCollection.Add(textPaint); // Do the touch processing textDictionary.Add(args.Id, textPaint); textPaint.ProcessTouchEvent(args.Id, args.Type, point, stackCollection); canvasView.InvalidateSurface(); break; } } break; case TouchActionType.Moved: if (textDictionary.ContainsKey(args.Id)) { TouchManipulationBitmap bitmap = textDictionary[args.Id]; bitmap.ProcessTouchEvent(args.Id, args.Type, point, stackCollection); canvasView.InvalidateSurface(); } break; case TouchActionType.Released: case TouchActionType.Cancelled: if (textDictionary.ContainsKey(args.Id)) { TouchManipulationBitmap bitmap = textDictionary[args.Id]; bitmap.ProcessTouchEvent(args.Id, args.Type, point, stackCollection); textDictionary.Remove(args.Id); canvasView.InvalidateSurface(); } break; } } //public void OnTouchModePickerSelectedIndexChanged(object sender, EventArgs args) //{ // if (textPaint != null) // { // Picker picker = (Picker)sender; // textPaint.TouchManager.Mode = (TouchManipulationMode)picker.SelectedItem; // } //} private void InflateStack() { stackCollection.Clear(); SKPoint position = new SKPoint(150, (float)((DeviceDisplay.MainDisplayInfo.Height * 0.1) + (DeviceDisplay.MainDisplayInfo.Height * 0.9) * 0.01)); for (int i = 0; i < 5; i++) { SKPaint textPaint = new SKPaint(); float textWidth = textPaint.MeasureText("1"); textPaint.TextSize = 0.05f * (float)DeviceDisplay.MainDisplayInfo.Width * textPaint.TextSize / textWidth; stackCollection.Add(new TouchManipulationBitmap(textPaint, "1") { Matrix = SKMatrix.MakeTranslation(position.X, position.Y + textPaint.TextSize), InitialPoint = position }); position.X += textPaint.MeasureText("1") + (float)(DeviceDisplay.MainDisplayInfo.Width * 0.15); } } private void InflateHand() { textCollection.Clear(); SKPoint position = new SKPoint(100, (float)((DeviceDisplay.MainDisplayInfo.Height * 0.9) - (DeviceDisplay.MainDisplayInfo.Height * 0.9) * 0.2)); for (int i = 0; i < viewmodel.CurrentHand.Count; i++) { SKPaint textPaint = new SKPaint(); float textWidth = textPaint.MeasureText(viewmodel.CurrentHand[i].Value.ToString()); textPaint.TextSize = 0.05f * (float)DeviceDisplay.MainDisplayInfo.Width * textPaint.TextSize / textWidth; textCollection.Add(new TouchManipulationBitmap(textPaint, viewmodel.CurrentHand[i].Value.ToString()) { Matrix = SKMatrix.MakeTranslation(position.X, position.Y - textPaint.TextSize), InitialPoint = position }); position.X += textPaint.MeasureText(viewmodel.CurrentHand[i].Value.ToString()) + 50; } } private void OnBindingChanged(object sender, TopRangeChangedEventArgs args) { //switch (args.NumStackChanged) //{ // case 0: // pile0.Text = args.NewTopRangeCard.Value.ToString(); // break; // case 1: // pile1.Text = args.NewTopRangeCard.Value.ToString(); // break; // case 2: // pile2.Text = args.NewTopRangeCard.Value.ToString(); // break; // case 3: // pile3.Text = args.NewTopRangeCard.Value.ToString(); // break; //} //for (int i = 0; i < Hand.Children.Count; i++) //{ // Button b = Hand.Children[i] as Button; // if (String.Equals(b.Text,args.NewTopRangeCard.Value.ToString())) // { // Hand.Children.RemoveAt(i); // break; // } //} } private void played(object sender, EventArgs args) { int numStack = 0; bool hasFind = false; stacks.ForEach(checkbox => { //if (checkbox.IsChecked) //{ // hasFind = true; // if (viewmodel.played(numStack, Convert.ToInt32((sender as Button).Text))) // { // botPanel.Children.Add(button); // } //} numStack += 1; }); if (!hasFind) { viewmodel.Alert = "Aucune pile selectionné! Veuillez séléctionner une pile."; return; } } private void retry(object sender, EventArgs args) { viewmodel = new Main(playersNames); viewmodel.BindingChanged += OnBindingChanged; pseudo.SetBinding(Label.TextProperty, new Binding("Pseudo", source: viewmodel)); InflateStack(); InflateHand(); gameOption.Children.Clear(); gameOption.Children.Add(button); } private void EndTurn(object sender, EventArgs args) { if (viewmodel.endTurn()) { button = (Button)gameOption.Children[0]; gameOption.Children.Clear(); Button retryButton = new Button(); retryButton.Text = "Retry"; retryButton.Clicked += retry; gameOption.Children.Add(retryButton); } else { InflateHand(); } } private async void PlayToHome(object sender, EventArgs args) { await Navigation.PopToRootAsync(); } } }