using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace Test_Merge { public partial class Settings : Form { private string _grandPrixUrl = ""; private string _selectedConfigFile; private List _driverList = new List(); private F1TVEmulator Emulator = null; private ConfigurationTool Config = null; private bool CreatingZone = false; private Point ZoneP1; private Point ZoneP2; private bool CreatingWindow = false; private Point WindowP1; private Point WindowP2; List WindowsToAdd = new List(); public string GrandPrixUrl { get => _grandPrixUrl; private set => _grandPrixUrl = value; } public List DriverList { get => _driverList; private set => _driverList = value; } public string SelectedConfigFile { get => _selectedConfigFile; private set => _selectedConfigFile = value; } //For the responsive content Size oldSize = new Size(); Size oldGpbxPreviewSize = new Size(); Size oldGpbxWindowPreviewSize = new Size(); Size oldPbxPreviewSize = new Size(); Size oldPbxWindowPreviewSize = new Size(); public Settings() { InitializeComponent(); Load(); } private void Load() { RefreshUI(); oldSize = this.Size; oldGpbxPreviewSize = gpbxPreview.Size; oldGpbxWindowPreviewSize = gpbxWindowPreview.Size; oldPbxPreviewSize = pbxPreview.Size; oldPbxWindowPreviewSize = pbxWindowPreview.Size; } private void RefreshUI() { lsbDrivers.DataSource = null; lsbDrivers.DataSource = DriverList; if (Directory.Exists(ConfigurationTool.CONFIGS_FOLDER_NAME)) { lsbPresets.DataSource = null; lsbPresets.DataSource = Directory.GetFiles(ConfigurationTool.CONFIGS_FOLDER_NAME); } if (CreatingZone) { if (ZoneP1 == new Point(-1, -1)) { lblZonePointsRemaning.Text = "2 points Remaining"; } else { lblZonePointsRemaning.Text = "1 point Remaining"; } } else { lblZonePointsRemaning.Text = ""; } if (CreatingWindow) { if (WindowP1 == new Point(-1, -1)) { lblWindowPointsRemaining.Text = "2 points Remaining"; } else { lblWindowPointsRemaining.Text = "1 point Remaining"; } lblWindowPointsRemaining.Text = ConfigurationTool.NUMBER_OF_ZONES - WindowsToAdd.Count() + " Windows remaining"; } else { lblWindowPointsRemaining.Text = ""; lblWindowsRemaining.Text = ""; } if (Config != null) { pbxPreview.Image = Config.MainZone.Draw(); if (Config.MainZone.Zones.Count > 0) pbxWindowPreview.Image = Config.MainZone.Zones[0].Draw(); } } private void CreateNewZone(Point p1, Point p2) { Rectangle dimensions = CreateAbsoluteRectangle(p1, p2); Config = new ConfigurationTool((Bitmap)pbxPreview.Image, dimensions); RefreshUI(); } private void CreateWindows(List dimensions) { if (Config != null) { Config.AddWindows(dimensions); } } private void tbxGpUrl_TextChanged(object sender, EventArgs e) { GrandPrixUrl = tbxGpUrl.Text; } private void btnAddDriver_Click(object sender, EventArgs e) { string newDriver = tbxDriverName.Text; DriverList.Add(newDriver); tbxDriverName.Text = ""; RefreshUI(); } private void btnRemoveDriver_Click(object sender, EventArgs e) { if (lsbDrivers.SelectedIndex >= 0) { DriverList.RemoveAt(lsbDrivers.SelectedIndex); } RefreshUI(); } private void SwitchZoneCreation() { if (CreatingZone) { CreatingZone = false; lblZonePointsRemaning.Text = ""; } else { CreatingZone = true; if (Config != null) Config.ResetMainZone(); if (CreatingWindow) SwitchWindowCreation(); if (Emulator != null && Emulator.Ready) { Config = null; pbxPreview.Image = Emulator.Screenshot(); } ZoneP1 = new Point(-1, -1); ZoneP2 = new Point(-1, -1); lblZonePointsRemaning.Text = "2 Points left"; } RefreshUI(); } private void SwitchWindowCreation() { if (CreatingWindow) { CreatingWindow = false; } else { CreatingWindow = true; if (Config != null) Config.ResetWindows(); if (CreatingZone) SwitchZoneCreation(); WindowP1 = new Point(-1, -1); WindowP2 = new Point(-1, -1); WindowsToAdd = new List(); } RefreshUI(); } private void btnCreatZone_Click(object sender, EventArgs e) { SwitchZoneCreation(); } private void btnCreateWindow_Click(object sender, EventArgs e) { SwitchWindowCreation(); } private void pbxMain_MouseClick(object sender, MouseEventArgs e) { if (CreatingZone && pbxPreview.Image != null) { //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); Point coordinates = e.Location; float xOffset = (float)pbxPreview.Image.Width / (float)pbxPreview.Width; float yOffset = (float)pbxPreview.Image.Height / (float)pbxPreview.Height; Point newPoint = new Point(Convert.ToInt32((float)coordinates.X * xOffset), Convert.ToInt32((float)coordinates.Y * yOffset)); //MessageBox.Show("Coordinates" + Environment.NewLine + "Old : " + coordinates.ToString() + Environment.NewLine + "New : " + newPoint.ToString()); if (ZoneP1 == new Point(-1, -1)) { ZoneP1 = newPoint; } else { ZoneP2 = newPoint; CreateNewZone(ZoneP1, ZoneP2); SwitchZoneCreation(); } RefreshUI(); } } private void pbxMain_Click(object sender, EventArgs e) { //Not the right one to use visibly } private void pbxDriverZone_MouseClick(object sender, MouseEventArgs e) { if (CreatingWindow && pbxWindowPreview.Image != null) { Point coordinates = e.Location; float xOffset = (float)pbxWindowPreview.Image.Width / (float)pbxWindowPreview.Width; float yOffset = (float)pbxWindowPreview.Image.Height / (float)pbxWindowPreview.Height; Point newPoint = new Point(Convert.ToInt32((float)coordinates.X * xOffset), Convert.ToInt32((float)coordinates.Y * yOffset)); if (WindowP1 == new Point(-1, -1)) { WindowP1 = newPoint; } else { WindowP2 = newPoint; WindowsToAdd.Add(CreateAbsoluteRectangle(WindowP1, WindowP2)); if (WindowsToAdd.Count < ConfigurationTool.NUMBER_OF_ZONES) { WindowP1 = new Point(-1, -1); WindowP2 = new Point(-1, -1); } else { WindowP1 = new Point(WindowP1.X, 0); WindowP2 = new Point(WindowP2.X, pbxWindowPreview.Image.Height); CreateWindows(WindowsToAdd); SwitchWindowCreation(); } } RefreshUI(); } } private void pbxDriverZone_Click(object sender, EventArgs e) { //Not the right one to use visibly } private Rectangle CreateAbsoluteRectangle(Point p1, Point p2) { Point newP1 = new Point(); Point newP2 = new Point(); if (p1.X < p2.X) { newP1.X = p1.X; newP2.X = p2.X; } else { newP1.X = p2.X; newP2.X = p1.X; } if (p1.Y < p2.Y) { newP1.Y = p1.Y; newP2.Y = p2.Y; } else { newP1.Y = p2.Y; newP2.Y = p1.Y; } return new Rectangle(newP1.X, newP1.Y, newP2.X - newP1.X, newP2.Y - newP1.Y); } private async void btnRefresh_Click(object sender, EventArgs e) { btnRefresh.Enabled = false; if (Emulator == null || Emulator.GrandPrixUrl != tbxGpUrl.Text) { Emulator = new F1TVEmulator(tbxGpUrl.Text); } if (!Emulator.Ready) { Task start = Task.Run(() => Emulator.Start()); int errorCode = await start; if (errorCode != 0) { string message; switch (errorCode) { case 101: message = "Error " + errorCode + " Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again"; break; case 102: message = "Error " + errorCode + " Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update"; break; case 103: message = "Error " + errorCode + " The url is not a valid url"; break; case 104: message = "Error " + errorCode + " The url is not a valid url"; break; case 105: message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; break; case 106: message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; break; default: message = "Could not start the emulator Error " + errorCode; break; } MessageBox.Show(message); } else { pbxPreview.Image = Emulator.Screenshot(); } } else { pbxPreview.Image = Emulator.Screenshot(); } btnRefresh.Enabled = true; } private void Settings_FormClosing(object sender, FormClosingEventArgs e) { if (Emulator != null) { Emulator.Stop(); } Emulator = null; GC.Collect(); } private void btnResetDriver_Click(object sender, EventArgs e) { if (Emulator != null) { Emulator.ResetDriver(); } } private void btnSavePreset_Click(object sender, EventArgs e) { string presetName = tbxPresetName.Text; if (Config != null) { Config.SaveToJson(DriverList, presetName); } RefreshUI(); } private void lsbPresets_SelectedIndexChanged(object sender, EventArgs e) { //Nothing } private void btnLoadPreset_Click(object sender, EventArgs e) { //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); if (lsbPresets.SelectedIndex >= 0 && pbxPreview.Image != null) { try { string fileName = lsbPresets.Items[lsbPresets.SelectedIndex].ToString(); Reader reader = new Reader(fileName, (Bitmap)pbxPreview.Image, false); //MainZones #0 is the big main zone containing driver zones Config = new ConfigurationTool((Bitmap)pbxPreview.Image, reader.MainZones[0].Bounds); Config.MainZone = reader.MainZones[0]; DriverList = reader.Drivers; SelectedConfigFile = fileName; } catch (Exception ex) { MessageBox.Show("Could not load the settings error :" + ex); } RefreshUI(); } } private void Settings_Resize(object sender, EventArgs e) { int xDiff = this.Width - oldSize.Width; int yDiff = this.Height - oldSize.Height; gpbxPreview.Size = new Size(oldGpbxPreviewSize.Width + xDiff,oldGpbxPreviewSize.Height + yDiff); gpbxWindowPreview.Size = new Size(oldGpbxWindowPreviewSize.Width + xDiff,oldGpbxWindowPreviewSize.Height); pbxPreview.Size = new Size(oldPbxPreviewSize.Width + xDiff,oldPbxPreviewSize.Height + yDiff); pbxWindowPreview.Size = new Size(oldPbxWindowPreviewSize.Width + xDiff,oldPbxWindowPreviewSize.Height); } private void btnDeletePreset_Click(object sender, EventArgs e) { int selectedIndex = lsbPresets.SelectedIndex; if (selectedIndex >= 0) { string fileName = lsbPresets.Items[selectedIndex].ToString(); if (File.Exists(fileName)) { File.Delete(fileName); RefreshUI(); } else { MessageBox.Show("Could not delete the preset because it does not exists"); } } } private void removeBorders(object sender,PaintEventArgs e) { GroupBox gpbx = (GroupBox)sender; using (Pen pen = new Pen(gpbx.BackColor,50)) { e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); } using (var brush = new SolidBrush(gpbx.ForeColor)) { var textPosition = new Point(5, 0); // Adjust the X and Y values as needed e.Graphics.DrawString(gpbx.Text, gpbx.Font, brush, textPosition); } } } }