Switch-Toolbox/Toolbox/GUI/Settings.cs
2019-12-02 18:18:09 -05:00

709 lines
27 KiB
C#

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 Toolbox.Library;
using Toolbox.Library.Forms;
namespace Toolbox
{
public partial class Settings : STForm
{
private bool IsStartup = false;
public Settings()
{
CanResize = false;
IsStartup = true;
InitializeComponent();
stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor;
Text = "Settings";
foreach (Runtime.ViewportShading shading in Enum.GetValues(typeof(Runtime.ViewportShading)))
{
shadingComboBox.Items.Add(shading.ToString());
}
foreach (Runtime.CameraMovement shading in Enum.GetValues(typeof(Runtime.CameraMovement)))
{
camMoveComboBox.Items.Add(shading.ToString());
}
foreach (FormThemes.Preset themes in Enum.GetValues(typeof(FormThemes.Preset)))
{
formThemeCB.Items.Add(themes);
}
foreach (TEX_FORMAT format in Enum.GetValues(typeof(TEX_FORMAT)))
{
preferredTexFormatCB.Items.Add(format);
}
uvChannelRB.Checked = true;
uvChannelRB.Visible = false;
uvChannelRB2.Visible = false;
uvChannelRB3.Visible = false;
normalsLineUD.Value = (decimal)Runtime.normalsLineLength;
normalPointsCB.Checked = Runtime.renderNormalsPoints;
vtxColorCB.Checked = Runtime.renderVertColor;
gridColorPB.BackColor = Runtime.gridSettings.color;
gridCellCountUD.Value = Runtime.gridSettings.CellAmount;
gridCellSizeUD.Value = (decimal)Runtime.gridSettings.CellSize;
bgGradientTop.BackColor = Runtime.backgroundGradientTop;
bgGradientBottom.BackColor = Runtime.backgroundGradientBottom;
preferredTexFormatCB.SelectedItem = Runtime.PreferredTexFormat;
formThemeCB.SelectedItem = FormThemes.ActivePreset;
chkBoxNormalMap.Checked = Runtime.useNormalMap;
chkBoxDisplayModels.Checked = Runtime.RenderModels;
chkBoxDisplayWireframe.Checked = Runtime.RenderModelWireframe;
chkBoxSpecular.Checked = Runtime.renderSpecular;
chkBoxStereoscopy.Checked = Runtime.stereoscopy;
chkBoxDisplayPolyCount.Checked = Runtime.DisplayPolyCount;
camNearNumUD.Value = (decimal)Runtime.CameraNear;
camFarNumUD.Value = (decimal)Runtime.CameraFar;
previewScaleUD.Value = (decimal)Runtime.previewScale;
yazoCompressionLevelUD.Value = Runtime.Yaz0CompressionLevel;
enableVersionCheckCHK.Checked = Runtime.EnableVersionCheck;
chkBoxEnablePBR.Checked = Runtime.EnablePBR;
chkBoxMdiMaximized.Checked = Runtime.MaximizeMdiWindow;
chkBoxDisplayBones.Checked = Runtime.renderBones;
boneSizeUD.Value = (decimal)Runtime.bonePointSize;
cameraMaxSpeedUD.Value = (decimal)Runtime.MaxCameraSpeed;
boneXRayChk.Checked = Runtime.boneXrayDisplay;
mk8DPathTB.Text = Runtime.Mk8dGamePath;
mk8PathTB.Text = Runtime.Mk8GamePath;
SMOPathTB.Text = Runtime.SmoGamePath;
botwGamePathTB.Text = Runtime.BotwGamePath;
tpGamePathTB.Text = Runtime.TpGamePath;
modelLoadArchive.Checked = Runtime.ObjectEditor.OpenModelsOnOpen;
specularCubemapPathTB.Text = System.IO.Path.GetFileName(Runtime.PBR.SpecularCubeMapPath);
diffuseCubemapPathTB.Text = System.IO.Path.GetFileName(Runtime.PBR.DiffuseCubeMapPath);
chkUseSkyobx.Checked = Runtime.PBR.UseSkybox;
chkDiffyseSkybox.Checked = Runtime.PBR.UseDiffuseSkyTexture;
chkDiffyseSkybox.Enabled = chkUseSkyobx.Checked;
chkBotwFileTable.Checked = Runtime.ResourceTables.BotwTable;
chkTpFileTable.Checked = Runtime.ResourceTables.TpTable;
chkFrameCamera.Checked = Runtime.FrameCamera;
chkAlwaysCompressOnSave.Checked = Runtime.AlwaysCompressOnSave;
displayBoundingBoxeChk.Checked = Runtime.renderBoundingBoxes;
mk8DPathTB.ReadOnly = true;
mk8PathTB.ReadOnly = true;
SMOPathTB.ReadOnly = true;
GLSLVerLabel.Text = $"Open GL Version: {Runtime.GLSLVersion}";
openGLVerLabel.Text = $"GLSL Version: {Runtime.openGLVersion}";
shadingComboBox.SelectedIndex = (int)Runtime.viewportShading;
camMoveComboBox.SelectedIndex = (int)Runtime.cameraMovement;
IsStartup = false;
}
private void shadingComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
Runtime.viewportShading = (Runtime.ViewportShading)shadingComboBox.SelectedIndex;
if (Runtime.viewportShading == Runtime.ViewportShading.UVCoords ||
Runtime.viewportShading == Runtime.ViewportShading.UVTestPattern)
{
uvChannelRB.Visible = true;
uvChannelRB2.Visible = true;
uvChannelRB3.Visible = true;
}
else
{
uvChannelRB.Visible = false;
uvChannelRB2.Visible = false;
uvChannelRB3.Visible = false;
}
UpdateViewportSettings();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
Runtime.useNormalMap = chkBoxNormalMap.Checked;
UpdateViewportSettings();
}
private void chkBoxDisplayModels_CheckedChanged(object sender, EventArgs e)
{
Runtime.RenderModels = chkBoxDisplayModels.Checked;
UpdateViewportSettings();
}
private void chkBoxDisplayWireframe_CheckedChanged(object sender, EventArgs e)
{
Runtime.RenderModelWireframe = chkBoxDisplayWireframe.Checked;
UpdateViewportSettings();
}
private void camMoveComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
Runtime.cameraMovement = (Runtime.CameraMovement)camMoveComboBox.SelectedIndex;
UpdateViewportSettings(true);
}
private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
{
Runtime.stereoscopy = chkBoxStereoscopy.Checked;
UpdateViewportSettings(true);
}
private void camNearNumUD_ValueChanged(object sender, EventArgs e)
{
Runtime.CameraNear = (float)camNearNumUD.Value;
UpdateViewportSettings(true);
}
private void camFarNumUD_ValueChanged(object sender, EventArgs e)
{
Runtime.CameraFar = (float)camFarNumUD.Value;
UpdateViewportSettings(true);
}
private void btnSave_Click(object sender, EventArgs e)
{
UpdateViewportSettings(true);
Config.Save();
this.Close();
}
private void chkBoxDisplayPolyCount_CheckedChanged(object sender, EventArgs e)
{
Runtime.DisplayPolyCount = chkBoxDisplayPolyCount.Checked;
}
private void Settings_Load(object sender, EventArgs e)
{
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
Runtime.previewScale = (float)previewScaleUD.Value;
UpdateViewportSettings();
}
private void yazoCompressionLevelUD_ValueChanged(object sender, EventArgs e)
{
Runtime.Yaz0CompressionLevel = (int)yazoCompressionLevelUD.Value;
}
private void checkBox1_CheckedChanged_2(object sender, EventArgs e)
{
Runtime.EnableVersionCheck = enableVersionCheckCHK.Checked;
}
private void chkBoxEnablePBR_CheckedChanged(object sender, EventArgs e)
{
Runtime.EnablePBR = chkBoxEnablePBR.Checked;
UpdateViewportSettings();
}
private void UpdateViewportSettings(bool UpdateRuntimeValues = false)
{
if (IsStartup)
return;
Viewport viewport = LibraryGUI.GetActiveViewport();
if (viewport == null)
return;
if (UpdateRuntimeValues) //Update only if necessary since it can be slow
viewport.LoadViewportRuntimeValues();
viewport.UpdateViewport();
}
private void formThemeCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (formThemeCB.SelectedIndex >= 0 && !IsStartup)
{
var result = MessageBox.Show("Changing themes will require to restart the program. Do you want to restart now?", "Toolbox Settings", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
FormThemes.ActivePreset = (FormThemes.Preset)formThemeCB.SelectedItem;
if (result == DialogResult.Yes)
{
Config.Save();
this.Close();
Application.Restart();
Environment.Exit(0);
}
}
}
private void chkBoxMdiMaximized_CheckedChanged_3(object sender, EventArgs e)
{
Runtime.MaximizeMdiWindow = chkBoxMdiMaximized.Checked;
}
private void preferredTexFormatCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (preferredTexFormatCB.SelectedIndex >= 0)
{
Runtime.PreferredTexFormat = (TEX_FORMAT)preferredTexFormatCB.SelectedItem;
}
}
private void bgGradientTop_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.backgroundGradientTop = dlg.Color;
bgGradientTop.BackColor = Runtime.backgroundGradientTop;
UpdateViewportSettings();
}
private void bgGradientBottom_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.backgroundGradientBottom = dlg.Color;
bgGradientBottom.BackColor = Runtime.backgroundGradientBottom;
UpdateViewportSettings();
}
#region Grid Settings
private void girdCellSizeUD_ValueChanged(object sender, EventArgs e)
{
Runtime.gridSettings.CellSize = (float)gridCellSizeUD.Value;
UpdateViewportGrid();
}
private void gridCellCountUD_ValueChanged(object sender, EventArgs e)
{
Runtime.gridSettings.CellAmount = (uint)gridCellCountUD.Value;
UpdateViewportGrid();
}
private void gridColorPB_Click(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
if (dlg.ShowDialog() == DialogResult.OK)
Runtime.gridSettings.color = dlg.Color;
gridColorPB.BackColor = Runtime.gridSettings.color;
UpdateViewportGrid();
}
private void UpdateViewportGrid()
{
if (IsStartup)
return;
Viewport viewport = LibraryGUI.GetActiveViewport();
if (viewport == null)
return;
viewport.UpdateGrid();
}
#endregion
private void vtxColorCB_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderVertColor = vtxColorCB.Checked;
UpdateViewportSettings();
}
private void normalPointsCB_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderNormalsPoints = normalPointsCB.Checked;
UpdateViewportSettings();
}
private void normalsLineUD_ValueChanged(object sender, EventArgs e)
{
Runtime.normalsLineLength = (float)normalsLineUD.Value;
UpdateViewportSettings();
}
private void chkBoxDisplayBones_CheckedChanged(object sender, EventArgs e)
{
Runtime.renderBones = chkBoxDisplayBones.Checked;
UpdateViewportSettings();
}
private void boneSizeUD_ValueChanged(object sender, EventArgs e)
{
Runtime.bonePointSize = (float)boneSizeUD.Value;
UpdateViewportSettings();
}
private void redChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderR) {
Runtime.renderR = false;
redChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
redChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else {
Runtime.renderR = true;
redChannelBtn.BackColor = Color.FromArgb(192, 0, 0);
redChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void greenChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderG)
{
Runtime.renderG = false;
greenChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
greenChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderG = true;
greenChannelBtn.BackColor = Color.FromArgb(0, 192, 0);
greenChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void blueChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderB)
{
Runtime.renderB = false;
blueChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
blueChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderB = true;
blueChannelBtn.BackColor = Color.FromArgb(0, 0, 192);
blueChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void alphaChannelBtn_Click(object sender, EventArgs e) {
if (Runtime.renderAlpha)
{
Runtime.renderAlpha = false;
alphaChannelBtn.BackColor = FormThemes.BaseTheme.DisabledBorderColor;
alphaChannelBtn.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
}
else
{
Runtime.renderAlpha = true;
alphaChannelBtn.BackColor = Color.Silver;
alphaChannelBtn.ForeColor = FormThemes.BaseTheme.FormForeColor;
}
UpdateViewportSettings();
}
private void cameraMaxSpeedUD_ValueChanged(object sender, EventArgs e) {
Runtime.MaxCameraSpeed = (float)cameraMaxSpeedUD.Value;
}
private void boneXRayChk_CheckedChanged(object sender, EventArgs e) {
Runtime.boneXrayDisplay = boneXRayChk.Checked;
UpdateViewportSettings();
}
private void mk8PathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK) {
mk8PathTB.Text = sfd.SelectedPath;
Runtime.Mk8GamePath = mk8PathTB.Text;
}
}
private void mk8DPathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
mk8DPathTB.Text = sfd.SelectedPath;
Runtime.Mk8dGamePath = mk8DPathTB.Text;
}
}
private void SMOPathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
SMOPathTB.Text = sfd.SelectedPath;
Runtime.SmoGamePath = SMOPathTB.Text;
}
}
private void tpGamePathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
tpGamePathTB.Text = sfd.SelectedPath;
Runtime.TpGamePath = tpGamePathTB.Text;
}
}
private void botwGamePathTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidBotwDirectory(sfd.SelectedPath))
throw new Exception("Invalid path choosen. Make sure you have atleast an RSTB file in the path! |System/Resource/ResourceSizeTable.product.srsizetable|");
botwGamePathTB.Text = sfd.SelectedPath;
Runtime.BotwGamePath = botwGamePathTB.Text;
}
}
private void displayBoundingBoxeChk_CheckedChanged(object sender, EventArgs e) {
Runtime.renderBoundingBoxes = displayBoundingBoxeChk.Checked;
}
private void modelLoadArchive_CheckedChanged(object sender, EventArgs e) {
Runtime.ObjectEditor.OpenModelsOnOpen = modelLoadArchive.Checked;
}
private void cubemapPathTB_Click(object sender, EventArgs e) {
OpenFileDialog sfd = new OpenFileDialog();
sfd.Filter = "DDS |*.dds;";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (IsValidCubeMap(sfd.FileName))
{
specularCubemapPathTB.Text = System.IO.Path.GetFileName(sfd.FileName);
Runtime.PBR.SpecularCubeMapPath = sfd.FileName;
RenderTools.ResetSpecularCubeMap();
UpdateViewportSettings();
}
else
MessageBox.Show("Invalid cube map file. Make sure it is a DDS with a cube map.");
}
}
private void diffuseCubemapPathTBB_Click(object sender, EventArgs e) {
OpenFileDialog sfd = new OpenFileDialog();
sfd.Filter = "DDS |*.dds;";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (IsValidCubeMap(sfd.FileName))
{
diffuseCubemapPathTB.Text = System.IO.Path.GetFileName(sfd.FileName);
Runtime.PBR.DiffuseCubeMapPath = sfd.FileName;
RenderTools.ResetDiffuseCubeMap();
UpdateViewportSettings();
}
else
MessageBox.Show("Invalid cube map file. Make sure it is a DDS with a cube map.");
}
}
private bool IsValidCubeMap(string FilePath)
{
try
{
DDS dds = new DDS(FilePath);
if (dds.ArrayCount == 6)
return true;
return false;
}
catch
{
return false;
}
}
private void chkUseSkyobx_CheckedChanged(object sender, EventArgs e) {
Runtime.PBR.UseSkybox = chkUseSkyobx.Checked;
chkDiffyseSkybox.Enabled = chkUseSkyobx.Checked;
UpdateViewportSettings();
}
private void chkDiffyseSkybox_CheckedChanged(object sender, EventArgs e) {
Runtime.PBR.UseDiffuseSkyTexture = chkDiffyseSkybox.Checked;
UpdateViewportSettings();
}
private void clearSettingToolStripMenuItem_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripItem menuItem = sender as ToolStripItem;
if (menuItem != null)
{
// Retrieve the ContextMenuStrip that owns this ToolStripItem
ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
if (owner != null)
{
// Get the control that is displaying this context menu
Control sourceControl = owner.SourceControl;
switch (sourceControl.Name)
{
case "diffuseCubemapPathTB":
diffuseCubemapPathTB.Text = "";
Runtime.PBR.DiffuseCubeMapPath = "";
RenderTools.ResetDiffuseCubeMap();
break;
case "specularCubemapPathTB":
specularCubemapPathTB.Text = "";
Runtime.PBR.SpecularCubeMapPath = "";
RenderTools.ResetSpecularCubeMap();
break;
case "mk8DPathTB":
mk8DPathTB.Text = "";
Runtime.Mk8dGamePath = "";
break;
case "mk8PathTB":
mk8PathTB.Text = "";
Runtime.Mk8GamePath = "";
break;
case "SMOPathTB":
SMOPathTB.Text = "";
Runtime.SmoGamePath = "";
break;
case "tpGamePathTB":
tpGamePathTB.Text = "";
Runtime.TpGamePath = "";
break;
case "botwGamePathTB":
botwGamePathTB.Text = "";
Runtime.BotwGamePath = "";
break;
case "pathPokemonSwShTB":
pathPokemonSwShTB.Text = "";
Runtime.PkSwShGamePath = "";
break;
}
}
}
}
private void specularCubemapPathTB_TextChanged(object sender, EventArgs e)
{
}
private void uvChannelRB_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel1;
UpdateViewportSettings();
}
private void uvChannelRB2_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel2;
UpdateViewportSettings();
}
private void uvChannelRB3_CheckedChanged(object sender, EventArgs e) {
Runtime.uvChannel = Runtime.UVChannel.Channel3;
UpdateViewportSettings();
}
private void chkBotwFileTable_CheckedChanged(object sender, EventArgs e) {
if (!System.IO.Directory.Exists(Runtime.BotwGamePath) || !IsValidBotwDirectory(Runtime.BotwGamePath))
{
FolderSelectDialog sfd = new FolderSelectDialog();
sfd.Title = "Select Modded Game Path!!!";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidBotwDirectory(sfd.SelectedPath))
throw new Exception($"Invalid path choosen. Make sure you have atleast an RSTB file in the path! |{sfd.SelectedPath}/System/Resource/ResourceSizeTable.product.srsizetable|");
botwGamePathTB.Text = sfd.SelectedPath;
Runtime.BotwGamePath = botwGamePathTB.Text;
}
}
Runtime.ResourceTables.BotwTable = chkBotwFileTable.Checked;
}
private bool IsValidBotwDirectory(string GamePath)
{
//This is the only file i care about
string RstbPath = System.IO.Path.Combine($"{GamePath}",
"System", "Resource", "ResourceSizeTable.product.srsizetable");
return System.IO.File.Exists(RstbPath);
}
private bool IsValidTPHDDirectory(string GamePath)
{
//This is the only file i care about
string DecompressedSizeList = System.IO.Path.Combine($"{GamePath}", "DecompressedSizeList.txt");
string FileSizeList = System.IO.Path.Combine($"{GamePath}", "FileSizeList.txt");
return System.IO.File.Exists(DecompressedSizeList) && System.IO.File.Exists(FileSizeList);
}
private void chkTpFileTable_CheckedChanged(object sender, EventArgs e) {
if (!System.IO.Directory.Exists(Runtime.TpGamePath) || !IsValidTPHDDirectory(Runtime.TpGamePath))
{
FolderSelectDialog sfd = new FolderSelectDialog();
sfd.Title = "Select Modded Game Path!!!";
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidTPHDDirectory(sfd.SelectedPath))
throw new Exception($"Invalid path choosen. Make sure you have atleast a FileSizeList.txt and DecompressedSizeList.txt file in the path!");
tpGamePathTB.Text = sfd.SelectedPath;
Runtime.TpGamePath = tpGamePathTB.Text;
}
}
Runtime.ResourceTables.TpTable = chkTpFileTable.Checked;
}
private void chkFrameCamera_CheckedChanged(object sender, EventArgs e) {
Runtime.FrameCamera = chkFrameCamera.Checked;
}
private void chkAlwaysCompressOnSave_CheckedChanged(object sender, EventArgs e) {
Runtime.AlwaysCompressOnSave = chkAlwaysCompressOnSave.Checked;
}
private void pathPokemonSwShTB_TextChanged(object sender, EventArgs e)
{
}
private void pathPokemonSwShTB_Click(object sender, EventArgs e) {
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
if (!IsValidPokemonSwShDirectory(sfd.SelectedPath))
throw new Exception("Invalid path choosen. You need Bin/appli/icon_pokemon atleast for pokemon icons");
pathPokemonSwShTB.Text = sfd.SelectedPath;
Runtime.PkSwShGamePath = pathPokemonSwShTB.Text;
}
}
private bool IsValidPokemonSwShDirectory(string GamePath)
{
//Search for pokemon icons
string RstbPath = System.IO.Path.Combine($"{GamePath}",
"Bin", "appli", "icon_pokemon", "poke_icon_0000_00s_n.bntx");
return System.IO.File.Exists(RstbPath);
}
private void btnReset_Click(object sender, EventArgs e) {
var result = MessageBox.Show("Resetting the settings will require to restart the program. Do you want to restart now?", "Toolbox Settings", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
if (System.IO.File.Exists($"{Runtime.ExecutableDir}\\config.xml"))
System.IO.File.Delete($"{Runtime.ExecutableDir}\\config.xml");
this.Close();
Application.Restart();
Environment.Exit(0);
}
}
}
}