Files
PDModdingCommunity_PD-Loader/source-code/source/plugins/Launcher/ui.h
T

1465 lines
60 KiB
C++

#pragma once
#include "framework.h"
#include <msclr\marshal_cppstd.h>
#include <cstdlib>
#include "TabPadding.h"
#include <GL\freeglut.h>
#include <GL\GL.h>
#include "SkinnedMessageBox.h"
#include "PluginConfig.h"
#include "GPUModel.h"
#include "WineVer.h"
#include "composition.h"
#include "registry.h"
#include <filesystem>
namespace Launcher {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;
using namespace System::Globalization;
using namespace msclr::interop;
HWND hWnd;
/// <summary>
/// Summary for ui
/// </summary>
public ref class ui : public System::Windows::Forms::Form
{
public:
ui(void)
{
SetLanguage();
InitializeComponent();
hWnd = (HWND)Control::Handle.ToPointer();
// if components.ini has no section name, add one
if (!IsLineInFile("[components]", COMPONENTS_FILE))
{
PrependFile("[components]\n", COMPONENTS_FILE);
}
// if playerdata.ini has no section name, add one
if (!IsLineInFile("[playerdata]", PLAYERDATA_FILE))
{
PrependFile("[playerdata]\n", PLAYERDATA_FILE);
}
// if keyconfig.ini has no section name, add one
if (!IsLineInFile("[keyconfig]", KEYCONFIG_FILE))
{
PrependFile("[keyconfig]\n", KEYCONFIG_FILE);
}
// trick Optimus into switching to the NVIDIA GPU
if (cuInit != NULL) cuInit(0);
int argc = 1;
char* argv[1] = { (char*)"" };
glutInit(&argc, argv);
addOptions();
updateStyle();
}
void addOptions() {
this->panel_ScreenRes->SuspendLayout();
// populate options (patches) from array in framework
// (easier than manually setting everything up)
int screenresY = 3;
for (ConfigOptionBase* option : screenResolutionArray)
{
option->hasChanged = ResolutionConfigChanged;
screenresY += option->AddToPanel(panel_ScreenRes, 12, screenresY, toolTip1);
}
((ComboBox^)ComboBox::FromHandle(DisplayModeDropdown->mainControlHandle))->SelectedIndexChanged += gcnew System::EventHandler(this, &ui::DisplayTypeChangedHandler);
DisplayTypeChangedHandler(this, gcnew EventArgs); // run handler now
this->panel_ScreenRes->ResumeLayout(false);
this->panel_ScreenRes->PerformLayout();
this->checkBox_nofsopt->Checked = !getFullscreenOptimizations();
this->checkBox_nofsopt->CheckedChanged += gcnew System::EventHandler(this, &ui::checkBox_nofsopt_CheckedChanged);
this->panel_IntRes->SuspendLayout();
// populate options (patches) from array in framework
// (easier than manually setting everything up)
int intresY = 3;
for (ConfigOptionBase* option : internalResolutionArray)
{
option->hasChanged = ResolutionConfigChanged;
intresY += option->AddToPanel(panel_IntRes, 12, intresY, toolTip1);
}
((CheckBox^)CheckBox::FromHandle(InternalResolutionCheckbox->mainControlHandle))->CheckedChanged += gcnew System::EventHandler(this, &ui::InternalResEnabledChangedHandler);
InternalResEnabledChangedHandler(this, gcnew EventArgs); // run handler now
this->panel_IntRes->ResumeLayout(false);
this->panel_IntRes->PerformLayout();
this->panel_Details->SuspendLayout();
// populate details (patches) from array in framework
// (easier than manually setting everything up)
int detailsY = 3;
for (ConfigOptionBase* option : graphicsArray)
{
option->hasChanged = OptionsConfigChanged;
detailsY += option->AddToPanel(panel_Details, 12, detailsY, toolTip1);
}
trackBar_LagCompensation->Value = GetIniInt(GRAPHICS_SECTION, L"lag_compensation", 0, CONFIG_FILE);
this->panel_Details->ResumeLayout(false);
this->panel_Details->PerformLayout();
this->panel_Patches->SuspendLayout();
this->panel_Patches2->SuspendLayout();
// populate options (patches) from array in framework
// (easier than manually setting everything up)
int optionsY = 33;
for (ConfigOptionBase* option : optionsArray)
{
option->hasChanged = OptionsConfigChanged;
optionsY += option->AddToPanel(panel_Patches, 12, optionsY, toolTip1);
}
int options2Y = 3;
for (ConfigOptionBase* option : options2Array)
{
option->hasChanged = OptionsConfigChanged;
options2Y += option->AddToPanel(panel_Patches2, 12, options2Y, toolTip1);
}
Button^ keycfg_button = gcnew Button();
keycfg_button->Left = 12;
keycfg_button->Top = 3;
keycfg_button->Width = 200;
Form^ RootForm = panel_Patches->FindForm();
float ScaleWidth = 1.0f;
float ScaleHeight = 1.0f;
if (RootForm)
{
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
}
keycfg_button->Scale(ScaleWidth, ScaleHeight);
keycfg_button->Text = gcnew String("Keyboard/Controller Configuration");
keycfg_button->Click += gcnew EventHandler(this, &ui::keycfg_button_Click);
panel_Patches->Controls->Add(keycfg_button);
this->panel_Patches->ResumeLayout(false);
this->panel_Patches2->ResumeLayout(false);
this->panel_Patches->PerformLayout();
this->panel_Patches2->PerformLayout();
this->panel_Playerdata->SuspendLayout();
// populate playerdata options from array in framework
// (easier than manually setting everything up)
int playerdataY = 3;
for (ConfigOptionBase* option : playerdataArray)
{
option->hasChanged = PlayerdataConfigChanged;
playerdataY += option->AddToPanel(panel_Playerdata, 12, playerdataY, toolTip1);
}
this->panel_Playerdata->ResumeLayout(false);
this->panel_Playerdata->PerformLayout();
this->panel_Components->SuspendLayout();
// populate components from array in framework
// (easier than manually setting everything up)
int componentsY = 3;
for (ConfigOptionBase* component : componentsArray)
{
component->hasChanged = ComponentsConfigChanged;
componentsY += component->AddToPanel(panel_Components, 12, componentsY, toolTip1);
}
this->panel_Components->ResumeLayout(false);
this->panel_Components->PerformLayout();
AllPlugins = LoadPlugins();
AllPluginOpts = GetPluginOptions(&AllPlugins);
this->panel_Plugins->SuspendLayout();
int pluginsY = 3;
for (ConfigOptionBase* option : AllPluginOpts)
{
option->hasChanged = new bool(false);
pluginsY += option->AddToPanel(panel_Plugins, 12, pluginsY, toolTip1);
}
this->panel_Plugins->ResumeLayout(false);
this->panel_Plugins->PerformLayout();
AllCustomPatches = LoadCustom();
AllCustomOpts = GetPluginOptions(&AllCustomPatches);
this->panel_Custom->SuspendLayout();
int customY = 3;
for (ConfigOptionBase* custom : AllCustomOpts)
{
custom->hasChanged = new bool(false);
customY += custom->AddToPanel(panel_Custom, 12, customY, toolTip1);
}
this->panel_Custom->ResumeLayout(false);
this->panel_Custom->PerformLayout();
updateLagCompMsec();
scanModpacks();
int window = glutCreateWindow("glut"); // a context must be created to use glGetString
glutHideWindow();
String^ vendor = gcnew String((char*)glGetString(GL_VENDOR));
vendor = vendor->Replace(" Corporation", ""); // this is useless.. remove it to help ensure the GPU type line fits
String^ renderer = gcnew String((char*)glGetString(GL_RENDERER));
String^ version = gcnew String((char*)glGetString(GL_VERSION));
String^ gpuModel = gcnew String(GPUModel::getGpuName().c_str());
String^ wineVersion = gcnew String(WineVer::getWineVer().c_str());
glutDestroyWindow(window); // destroy the window so it doesn't remain on screen
if (glutMainLoopEventDynamic != NULL) glutMainLoopEventDynamic(); // freeglut needs this
if (wineVersion != "")
{
this->labelGPU->Text = "Wine " + wineVersion + " (remember to disable movies!)\n";
}
else this->labelGPU->Text = i18n::GetStringFallback("GPU_INFO_NAME") + "\n";
this->labelGPU->Text += i18n::GetStringFallback(vendor + " " + renderer + "\n");
this->labelGPU->Text += i18n::GetStringFallback("OpenGL: " + version + "\n");
int linkStart = this->labelGPU->Text->Length;
bool showGpuDialog = false;
if (vendor->Contains("AMD") || vendor->Contains("ATI")) // check OpenGL to get actual GPU being used for vendor check (to get accurate results for iGPU)
{
bool hasNovidia = false;
for (PluginInfo i : AllPlugins)
{
if (i.name == L"Novidia")
hasNovidia = true;
}
if (hasNovidia)
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_AMD_NOVIDIA_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_AMD_NOVIDIA_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_AMD_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_AMD_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
}
}
else if (!vendor->Contains("NVIDIA"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_UNSUPPORTED_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_UNSUPPORTED_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
}
else if (gpuModel->StartsWith("GA")) // unconfirmed??
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_GA_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_GA_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("TU"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_TU_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_TU_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("GM") || gpuModel->StartsWith("GP") || gpuModel->StartsWith("GV"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_GM_NEWER_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_GM_NEWER_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Teal;
}
else if (gpuModel->StartsWith("GK"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_GK_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_GK_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::LightBlue;
}
else if (gpuModel->StartsWith("GF"))
{
if (version[0] < '4')
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_GF_DRIVER_OLD_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_GF_DRIVER_OLD_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
else
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_GF_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_GF_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Teal;
}
}
else if (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith("Unk") && !gpuModel->StartsWith("Oth"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_TOO_NEW_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_TOO_NEW_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
}
else if (gpuModel->StartsWith("G") || gpuModel->StartsWith("NV") || gpuModel->StartsWith("NB") || gpuModel->StartsWith("N10") || gpuModel->StartsWith("MCP"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_OLD_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_OLD_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
else //if (gpuModel->Length == 0 || gpuModel->StartsWith("Unk") || gpuModel->StartsWith("Oth"))
{
this->labelGPU->Text += i18n::GetStringFallback("GPU_UNKNOWN_NAME");
GPUIssueText = i18n::GetStringFallback("GPU_UNKNOWN_HINT");
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
int linkEnd = this->labelGPU->Text->Length - linkStart;
this->labelGPU->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::LinkLabelLinkClickedGPUIssueHandler);
this->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd);
if (showGpuDialog && !nNoGPUDialog)
SkinnedMessageBox::Show(this, GPUIssueText + "\n\n"+ i18n::GetStringFallback("SHOW_GPU_DIALOG_HINT"), "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~ui()
{
if (components)
{
delete components;
}
}
void OnPaintBackground(PaintEventArgs e) override
{
}
/*property System::Windows::Forms::CreateParams^ CreateParams
{
virtual System::Windows::Forms::CreateParams^ get() override
{
System::Windows::Forms::CreateParams^ params = Form::CreateParams;
params->ExStyle |= 0x00200000L;
return params;
}
}*/
void updateLagCompMsec()
{
if (this->groupBox_Lag->Tag == nullptr) {
this->groupBox_Lag->Tag = this->groupBox_Lag->Text;
}
this->groupBox_Lag->Text = this->groupBox_Lag->Tag + "(" + this->trackBar_LagCompensation->Value + " msec)";
}
void updateStyle()
{
int nDarkLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L"dark_launcher", FALSE, CONFIG_FILE);
int nAcrylicLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L"acrylic_blur", FALSE, CONFIG_FILE);
//bool useAcrylic = nAcrylicLauncher && setBlur(hWnd, AccentState::ACCENT_ENABLE_ACRYLICBLURBEHIND);
Color colourBg, colourBg2, colourFg;
System::Windows::Forms::FlatStyle cbxStyle;
if (nDarkLauncher)
{
setDarkTheme(hWnd);
colourFg = Color::White;
colourBg = Color::FromArgb(255, 32, 32, 32); // tabControl
colourBg2 = Color::FromArgb(255, 25, 25, 25);
cbxStyle = System::Windows::Forms::FlatStyle::Flat;
}
else
{
setDarkTheme(hWnd, false);
colourFg = Color::FromArgb(255, 64, 64, 64);
colourBg = Color::White; // tabControl
colourBg2 = Color::FromArgb(255, 242, 242, 242);
cbxStyle = System::Windows::Forms::FlatStyle::System;
}
/*if (useAcrylic)
{
this->button_Discord->BackColor = colourBg2;
this->button_github->BackColor = colourBg2;
this->button_Wiki->BackColor = colourBg2;
colourBg2 = Color::FromArgb(255, 0, 255);
}
else
{
setBlur(hWnd, AccentState::ACCENT_DISABLED);*/
this->button_Discord->BackColor = Color::Transparent;
this->button_github->BackColor = Color::Transparent;
this->button_Wiki->BackColor = Color::Transparent;
//}
this->tabPage_Resolution->BackColor = colourBg;
this->tabPage_Resolution->ForeColor = colourFg;
this->tabPage_Patches->BackColor = colourBg;
this->tabPage_Patches->ForeColor = colourFg;
this->tabPage_Playerdata->BackColor = colourBg;
this->tabPage_Playerdata->ForeColor = colourFg;
this->tabPage_Plugins->BackColor = colourBg;
this->tabPage_Plugins->ForeColor = colourFg;
this->tabPage_Components->BackColor = colourBg;
this->tabPage_Components->ForeColor = colourFg;
this->tabPage_Modpacks->BackColor = colourBg;
this->tabPage_Modpacks->ForeColor = colourFg;
this->creditsTextBox->BackColor = colourBg;
this->creditsTextBox->ForeColor = colourFg;
this->tabPage_Update->BackColor = colourBg;
this->tabPage_Update->ForeColor = colourFg;
this->tabControl->BackColor = colourBg;
this->tabControl->ForeColor = colourFg;
this->BackColor = colourBg2;
this->button_Launch->BackColor = colourBg;
this->button_Launch->ForeColor = colourFg;
this->button_Apply->BackColor = colourBg;
this->button_Apply->ForeColor = colourFg;
this->labelGPU->ForeColor = colourFg;
this->groupBox_Details->ForeColor = colourFg;
this->groupBox_InternalRes->ForeColor = colourFg;
this->groupBox_Lag->ForeColor = colourFg;
this->groupBox_ScreenRes->ForeColor = colourFg;
/*for (int i = 0; i < this->panel_ScreenRes->Controls->Count; i++) this->panel_ScreenRes->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_IntRes->Controls->Count; i++) this->panel_IntRes->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Details->Controls->Count; i++) this->panel_Details->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Patches->Controls->Count; i++) this->panel_Patches->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Custom->Controls->Count; i++) this->panel_Custom->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Playerdata->Controls->Count; i++) this->panel_Playerdata->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Components->Controls->Count; i++) this->panel_Components->Controls[i]->BackColor = colourBg;
for (int i = 0; i < this->panel_Plugins->Controls->Count; i++) this->panel_Plugins->Controls[i]->BackColor = colourBg;*/
SetBackCol(this->panel_ScreenRes, colourBg, cbxStyle);
SetBackCol(this->panel_IntRes, colourBg, cbxStyle);
SetBackCol(this->panel_Details, colourBg, cbxStyle);
SetBackCol(this->panel_Patches, colourBg, cbxStyle);
SetBackCol(this->panel_Custom, colourBg, cbxStyle);
SetBackCol(this->panel_Playerdata, colourBg, cbxStyle);
SetBackCol(this->panel_Components, colourBg, cbxStyle);
SetBackCol(this->panel_Plugins, colourBg, cbxStyle);
tabPage_Modpacks->Enabled = false;
}
void updateLanguage() {
int language = GetPrivateProfileIntW(LAUNCHER_SECTION, L"launcher_language", FALSE, CONFIG_FILE);
if (nLanguage == language)
return;
nLanguage = language;
SetLanguage();
this->Controls->Clear();
this->InitializeComponent();
this->addOptions();
}
void SetLanguage() {
if (nLanguage == 0) {
Thread::CurrentThread->CurrentUICulture = gcnew CultureInfo(GetUserDefaultLCID());
} else if (nLanguage <= languages.size() - 1) {
Thread::CurrentThread->CurrentUICulture = CultureInfo::CreateSpecificCulture(gcnew String(languages[nLanguage]));
}
}
private:
private: System::Windows::Forms::Button^ button_Launch;
private: System::Windows::Forms::GroupBox^ groupBox_ScreenRes;
private: System::Windows::Forms::TabControl^ tabControl;
private: System::Windows::Forms::TabPage^ tabPage_Resolution;
private: System::Windows::Forms::GroupBox^ groupBox_InternalRes;
private: System::Windows::Forms::TabPage^ tabPage_Components;
private: System::Windows::Forms::Panel^ panel_Components;
private: System::Windows::Forms::TabPage^ tabPage_Patches;
private: System::Windows::Forms::Panel^ panel_Patches;
private: System::Windows::Forms::TabPage^ tabPage_Plugins;
private: System::Windows::Forms::Panel^ panel_Plugins;
private: System::Windows::Forms::Button^ button_Discord;
private: System::Windows::Forms::Button^ button_github;
private: System::Windows::Forms::TabPage^ tabPage_Playerdata;
private: System::Windows::Forms::Panel^ panel_Playerdata;
private: System::Windows::Forms::ToolTip^ toolTip1;
private: System::Windows::Forms::Panel^ panel_ScreenRes;
private: System::Windows::Forms::Panel^ panel_IntRes;
private: System::Windows::Forms::LinkLabel^ labelGPU;
private: System::Windows::Forms::TabPage^ tabPage_Credits;
private: System::Windows::Forms::TextBox^ creditsTextBox;
private: System::Windows::Forms::GroupBox^ groupBox_Details;
private: System::Windows::Forms::Panel^ panel_Details;
private: System::Windows::Forms::Panel^ panel_Custom;
private: System::Windows::Forms::Button^ button_Apply;
private: System::Windows::Forms::GroupBox^ groupBox_Lag;
private: System::Windows::Forms::TrackBar^ trackBar_LagCompensation;
private: System::Windows::Forms::Button^ button_Wiki;
private: System::Windows::Forms::TabPage^ tabPage_Update;
private: System::Windows::Forms::Label^ label_Update_2;
private: System::Windows::Forms::Label^ label_Update_1;
private: System::Windows::Forms::Button^ button_Clean_installation;
private: System::Windows::Forms::Button^ button_Instructions;
private: System::Windows::Forms::Button^ button_Unstable_builds;
private: System::Windows::Forms::Button^ button_Releases_page;
private: System::Windows::Forms::LinkLabel^ linkLabel_Changelog;
private: System::Windows::Forms::LinkLabel^ linkLabel_Official_Discord;
private: System::Windows::Forms::LinkLabel^ linkLabel_Help;
private: System::Windows::Forms::LinkLabel^ linkLabel_Repo;
private: System::Windows::Forms::CheckBox^ checkBox_nofsopt;
private: System::Windows::Forms::TabPage^ tabPage_Modpacks;
private: System::Windows::Forms::CheckBox^ checkBox_ModPatches;
private: System::Windows::Forms::Button^ button_ModDelete;
private: System::Windows::Forms::Button^ button_ModClone;
private: System::Windows::Forms::Button^ button_ModSetActive;
private: System::Windows::Forms::ListBox^ listBox_Mods;
private: System::Windows::Forms::Button^ button_ModFiles;
private: System::Windows::Forms::Button^ button_ModRescan;
private: System::Windows::Forms::Button^ button_ModRename;
private: System::Windows::Forms::LinkLabel^ linkLabel_Console;
private: System::Windows::Forms::Panel^ panel_Patches2;
private: System::ComponentModel::IContainer^ components;
private:
/// <summary>
/// Required designer variable.
/// </summary>
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->components = (gcnew System::ComponentModel::Container());
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ui::typeid));
this->button_Launch = (gcnew System::Windows::Forms::Button());
this->groupBox_ScreenRes = (gcnew System::Windows::Forms::GroupBox());
this->panel_ScreenRes = (gcnew System::Windows::Forms::Panel());
this->checkBox_nofsopt = (gcnew System::Windows::Forms::CheckBox());
this->tabControl = (gcnew System::Windows::Forms::TabControl());
this->tabPage_Resolution = (gcnew System::Windows::Forms::TabPage());
this->groupBox_Lag = (gcnew System::Windows::Forms::GroupBox());
this->trackBar_LagCompensation = (gcnew System::Windows::Forms::TrackBar());
this->groupBox_Details = (gcnew System::Windows::Forms::GroupBox());
this->panel_Details = (gcnew System::Windows::Forms::Panel());
this->labelGPU = (gcnew System::Windows::Forms::LinkLabel());
this->groupBox_InternalRes = (gcnew System::Windows::Forms::GroupBox());
this->panel_IntRes = (gcnew System::Windows::Forms::Panel());
this->tabPage_Patches = (gcnew System::Windows::Forms::TabPage());
this->panel_Patches = (gcnew System::Windows::Forms::Panel());
this->tabPage_Playerdata = (gcnew System::Windows::Forms::TabPage());
this->panel_Playerdata = (gcnew System::Windows::Forms::Panel());
this->tabPage_Components = (gcnew System::Windows::Forms::TabPage());
this->linkLabel_Console = (gcnew System::Windows::Forms::LinkLabel());
this->panel_Components = (gcnew System::Windows::Forms::Panel());
this->tabPage_Plugins = (gcnew System::Windows::Forms::TabPage());
this->panel_Custom = (gcnew System::Windows::Forms::Panel());
this->panel_Plugins = (gcnew System::Windows::Forms::Panel());
this->tabPage_Modpacks = (gcnew System::Windows::Forms::TabPage());
this->button_ModRename = (gcnew System::Windows::Forms::Button());
this->button_ModRescan = (gcnew System::Windows::Forms::Button());
this->button_ModFiles = (gcnew System::Windows::Forms::Button());
this->checkBox_ModPatches = (gcnew System::Windows::Forms::CheckBox());
this->button_ModDelete = (gcnew System::Windows::Forms::Button());
this->button_ModClone = (gcnew System::Windows::Forms::Button());
this->button_ModSetActive = (gcnew System::Windows::Forms::Button());
this->listBox_Mods = (gcnew System::Windows::Forms::ListBox());
this->tabPage_Credits = (gcnew System::Windows::Forms::TabPage());
this->creditsTextBox = (gcnew System::Windows::Forms::TextBox());
this->tabPage_Update = (gcnew System::Windows::Forms::TabPage());
this->linkLabel_Repo = (gcnew System::Windows::Forms::LinkLabel());
this->linkLabel_Help = (gcnew System::Windows::Forms::LinkLabel());
this->linkLabel_Official_Discord = (gcnew System::Windows::Forms::LinkLabel());
this->linkLabel_Changelog = (gcnew System::Windows::Forms::LinkLabel());
this->button_Clean_installation = (gcnew System::Windows::Forms::Button());
this->button_Instructions = (gcnew System::Windows::Forms::Button());
this->button_Unstable_builds = (gcnew System::Windows::Forms::Button());
this->button_Releases_page = (gcnew System::Windows::Forms::Button());
this->label_Update_2 = (gcnew System::Windows::Forms::Label());
this->label_Update_1 = (gcnew System::Windows::Forms::Label());
this->button_Discord = (gcnew System::Windows::Forms::Button());
this->button_github = (gcnew System::Windows::Forms::Button());
this->toolTip1 = (gcnew System::Windows::Forms::ToolTip(this->components));
this->button_Apply = (gcnew System::Windows::Forms::Button());
this->button_Wiki = (gcnew System::Windows::Forms::Button());
this->panel_Patches2 = (gcnew System::Windows::Forms::Panel());
this->groupBox_ScreenRes->SuspendLayout();
this->panel_ScreenRes->SuspendLayout();
this->tabControl->SuspendLayout();
this->tabPage_Resolution->SuspendLayout();
this->groupBox_Lag->SuspendLayout();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->trackBar_LagCompensation))->BeginInit();
this->groupBox_Details->SuspendLayout();
this->groupBox_InternalRes->SuspendLayout();
this->tabPage_Patches->SuspendLayout();
this->tabPage_Playerdata->SuspendLayout();
this->tabPage_Components->SuspendLayout();
this->tabPage_Plugins->SuspendLayout();
this->tabPage_Modpacks->SuspendLayout();
this->tabPage_Credits->SuspendLayout();
this->tabPage_Update->SuspendLayout();
this->SuspendLayout();
//
// button_Launch
//
this->button_Launch->BackColor = System::Drawing::Color::White;
this->button_Launch->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
resources->ApplyResources(this->button_Launch, L"button_Launch");
this->button_Launch->Name = L"button_Launch";
this->button_Launch->UseVisualStyleBackColor = false;
this->button_Launch->Click += gcnew System::EventHandler(this, &ui::Button_Launch_Click);
//
// groupBox_ScreenRes
//
this->groupBox_ScreenRes->Controls->Add(this->panel_ScreenRes);
this->groupBox_ScreenRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
resources->ApplyResources(this->groupBox_ScreenRes, L"groupBox_ScreenRes");
this->groupBox_ScreenRes->Name = L"groupBox_ScreenRes";
this->groupBox_ScreenRes->TabStop = false;
//
// panel_ScreenRes
//
resources->ApplyResources(this->panel_ScreenRes, L"panel_ScreenRes");
this->panel_ScreenRes->Controls->Add(this->checkBox_nofsopt);
this->panel_ScreenRes->Name = L"panel_ScreenRes";
//
// checkBox_nofsopt
//
resources->ApplyResources(this->checkBox_nofsopt, L"checkBox_nofsopt");
this->checkBox_nofsopt->Name = L"checkBox_nofsopt";
this->toolTip1->SetToolTip(this->checkBox_nofsopt, resources->GetString(L"checkBox_nofsopt.ToolTip"));
this->checkBox_nofsopt->UseVisualStyleBackColor = true;
//
// tabControl
//
this->tabControl->Controls->Add(this->tabPage_Resolution);
this->tabControl->Controls->Add(this->tabPage_Patches);
this->tabControl->Controls->Add(this->tabPage_Playerdata);
this->tabControl->Controls->Add(this->tabPage_Components);
this->tabControl->Controls->Add(this->tabPage_Plugins);
this->tabControl->Controls->Add(this->tabPage_Modpacks);
this->tabControl->Controls->Add(this->tabPage_Credits);
this->tabControl->Controls->Add(this->tabPage_Update);
resources->ApplyResources(this->tabControl, L"tabControl");
this->tabControl->Name = L"tabControl";
this->tabControl->SelectedIndex = 0;
//
// tabPage_Resolution
//
this->tabPage_Resolution->BackColor = System::Drawing::Color::White;
resources->ApplyResources(this->tabPage_Resolution, L"tabPage_Resolution");
this->tabPage_Resolution->Controls->Add(this->groupBox_Lag);
this->tabPage_Resolution->Controls->Add(this->groupBox_Details);
this->tabPage_Resolution->Controls->Add(this->labelGPU);
this->tabPage_Resolution->Controls->Add(this->groupBox_InternalRes);
this->tabPage_Resolution->Controls->Add(this->groupBox_ScreenRes);
this->tabPage_Resolution->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
this->tabPage_Resolution->Name = L"tabPage_Resolution";
//
// groupBox_Lag
//
this->groupBox_Lag->Controls->Add(this->trackBar_LagCompensation);
this->groupBox_Lag->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
resources->ApplyResources(this->groupBox_Lag, L"groupBox_Lag");
this->groupBox_Lag->Name = L"groupBox_Lag";
this->groupBox_Lag->TabStop = false;
//
// trackBar_LagCompensation
//
this->trackBar_LagCompensation->LargeChange = 1;
resources->ApplyResources(this->trackBar_LagCompensation, L"trackBar_LagCompensation");
this->trackBar_LagCompensation->Maximum = 500;
this->trackBar_LagCompensation->Name = L"trackBar_LagCompensation";
this->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None;
this->trackBar_LagCompensation->ValueChanged += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_ValueChanged);
//
// groupBox_Details
//
this->groupBox_Details->Controls->Add(this->panel_Details);
this->groupBox_Details->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
resources->ApplyResources(this->groupBox_Details, L"groupBox_Details");
this->groupBox_Details->Name = L"groupBox_Details";
this->groupBox_Details->TabStop = false;
//
// panel_Details
//
resources->ApplyResources(this->panel_Details, L"panel_Details");
this->panel_Details->Name = L"panel_Details";
//
// labelGPU
//
resources->ApplyResources(this->labelGPU, L"labelGPU");
this->labelGPU->BackColor = System::Drawing::Color::Transparent;
this->labelGPU->ForeColor = System::Drawing::Color::Black;
this->labelGPU->Name = L"labelGPU";
//
// groupBox_InternalRes
//
this->groupBox_InternalRes->Controls->Add(this->panel_IntRes);
this->groupBox_InternalRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
resources->ApplyResources(this->groupBox_InternalRes, L"groupBox_InternalRes");
this->groupBox_InternalRes->Name = L"groupBox_InternalRes";
this->groupBox_InternalRes->TabStop = false;
//
// panel_IntRes
//
resources->ApplyResources(this->panel_IntRes, L"panel_IntRes");
this->panel_IntRes->Name = L"panel_IntRes";
//
// tabPage_Patches
//
this->tabPage_Patches->BackColor = System::Drawing::Color::White;
this->tabPage_Patches->Controls->Add(this->panel_Patches2);
this->tabPage_Patches->Controls->Add(this->panel_Patches);
this->tabPage_Patches->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)));
resources->ApplyResources(this->tabPage_Patches, L"tabPage_Patches");
this->tabPage_Patches->Name = L"tabPage_Patches";
//
// panel_Patches
//
resources->ApplyResources(this->panel_Patches, L"panel_Patches");
this->panel_Patches->Name = L"panel_Patches";
//
// tabPage_Playerdata
//
this->tabPage_Playerdata->BackColor = System::Drawing::Color::White;
this->tabPage_Playerdata->Controls->Add(this->panel_Playerdata);
this->tabPage_Playerdata->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
resources->ApplyResources(this->tabPage_Playerdata, L"tabPage_Playerdata");
this->tabPage_Playerdata->Name = L"tabPage_Playerdata";
//
// panel_Playerdata
//
resources->ApplyResources(this->panel_Playerdata, L"panel_Playerdata");
this->panel_Playerdata->Name = L"panel_Playerdata";
//
// tabPage_Components
//
this->tabPage_Components->BackColor = System::Drawing::Color::White;
this->tabPage_Components->Controls->Add(this->linkLabel_Console);
this->tabPage_Components->Controls->Add(this->panel_Components);
this->tabPage_Components->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
resources->ApplyResources(this->tabPage_Components, L"tabPage_Components");
this->tabPage_Components->Name = L"tabPage_Components";
//
// linkLabel_Console
//
resources->ApplyResources(this->linkLabel_Console, L"linkLabel_Console");
this->linkLabel_Console->Name = L"linkLabel_Console";
this->linkLabel_Console->TabStop = true;
this->linkLabel_Console->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Console_LinkClicked);
//
// panel_Components
//
resources->ApplyResources(this->panel_Components, L"panel_Components");
this->panel_Components->Name = L"panel_Components";
//
// tabPage_Plugins
//
this->tabPage_Plugins->BackColor = System::Drawing::Color::White;
this->tabPage_Plugins->Controls->Add(this->panel_Custom);
this->tabPage_Plugins->Controls->Add(this->panel_Plugins);
this->tabPage_Plugins->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)));
resources->ApplyResources(this->tabPage_Plugins, L"tabPage_Plugins");
this->tabPage_Plugins->Name = L"tabPage_Plugins";
//
// panel_Custom
//
resources->ApplyResources(this->panel_Custom, L"panel_Custom");
this->panel_Custom->Name = L"panel_Custom";
//
// panel_Plugins
//
resources->ApplyResources(this->panel_Plugins, L"panel_Plugins");
this->panel_Plugins->Name = L"panel_Plugins";
//
// tabPage_Modpacks
//
this->tabPage_Modpacks->Controls->Add(this->button_ModRename);
this->tabPage_Modpacks->Controls->Add(this->button_ModRescan);
this->tabPage_Modpacks->Controls->Add(this->button_ModFiles);
this->tabPage_Modpacks->Controls->Add(this->checkBox_ModPatches);
this->tabPage_Modpacks->Controls->Add(this->button_ModDelete);
this->tabPage_Modpacks->Controls->Add(this->button_ModClone);
this->tabPage_Modpacks->Controls->Add(this->button_ModSetActive);
this->tabPage_Modpacks->Controls->Add(this->listBox_Mods);
resources->ApplyResources(this->tabPage_Modpacks, L"tabPage_Modpacks");
this->tabPage_Modpacks->Name = L"tabPage_Modpacks";
this->tabPage_Modpacks->UseVisualStyleBackColor = true;
this->tabPage_Modpacks->Enter += gcnew System::EventHandler(this, &ui::tabPage_Modpacks_Enter);
//
// button_ModRename
//
resources->ApplyResources(this->button_ModRename, L"button_ModRename");
this->button_ModRename->Name = L"button_ModRename";
this->button_ModRename->UseVisualStyleBackColor = true;
this->button_ModRename->Click += gcnew System::EventHandler(this, &ui::button_ModRename_Click);
//
// button_ModRescan
//
resources->ApplyResources(this->button_ModRescan, L"button_ModRescan");
this->button_ModRescan->Name = L"button_ModRescan";
this->button_ModRescan->UseVisualStyleBackColor = true;
this->button_ModRescan->Click += gcnew System::EventHandler(this, &ui::button_ModRescan_Click);
//
// button_ModFiles
//
resources->ApplyResources(this->button_ModFiles, L"button_ModFiles");
this->button_ModFiles->Name = L"button_ModFiles";
this->button_ModFiles->UseVisualStyleBackColor = true;
this->button_ModFiles->Click += gcnew System::EventHandler(this, &ui::button_ModFiles_Click);
//
// checkBox_ModPatches
//
resources->ApplyResources(this->checkBox_ModPatches, L"checkBox_ModPatches");
this->checkBox_ModPatches->Checked = true;
this->checkBox_ModPatches->CheckState = System::Windows::Forms::CheckState::Checked;
this->checkBox_ModPatches->Name = L"checkBox_ModPatches";
this->checkBox_ModPatches->UseVisualStyleBackColor = true;
//
// button_ModDelete
//
resources->ApplyResources(this->button_ModDelete, L"button_ModDelete");
this->button_ModDelete->Name = L"button_ModDelete";
this->button_ModDelete->UseVisualStyleBackColor = true;
this->button_ModDelete->Click += gcnew System::EventHandler(this, &ui::button_ModDelete_Click);
//
// button_ModClone
//
resources->ApplyResources(this->button_ModClone, L"button_ModClone");
this->button_ModClone->Name = L"button_ModClone";
this->button_ModClone->UseVisualStyleBackColor = true;
this->button_ModClone->Click += gcnew System::EventHandler(this, &ui::button_ModClone_Click);
//
// button_ModSetActive
//
resources->ApplyResources(this->button_ModSetActive, L"button_ModSetActive");
this->button_ModSetActive->Name = L"button_ModSetActive";
this->button_ModSetActive->UseVisualStyleBackColor = true;
this->button_ModSetActive->Click += gcnew System::EventHandler(this, &ui::button_ModSetActive_Click);
//
// listBox_Mods
//
this->listBox_Mods->FormattingEnabled = true;
resources->ApplyResources(this->listBox_Mods, L"listBox_Mods");
this->listBox_Mods->Name = L"listBox_Mods";
this->listBox_Mods->SelectedValueChanged += gcnew System::EventHandler(this, &ui::listBox_Mods_SelectedValueChanged);
//
// tabPage_Credits
//
this->tabPage_Credits->Controls->Add(this->creditsTextBox);
resources->ApplyResources(this->tabPage_Credits, L"tabPage_Credits");
this->tabPage_Credits->Name = L"tabPage_Credits";
this->tabPage_Credits->UseVisualStyleBackColor = true;
//
// creditsTextBox
//
this->creditsTextBox->BackColor = System::Drawing::Color::White;
this->creditsTextBox->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)));
resources->ApplyResources(this->creditsTextBox, L"creditsTextBox");
this->creditsTextBox->Name = L"creditsTextBox";
this->creditsTextBox->ReadOnly = true;
//
// tabPage_Update
//
this->tabPage_Update->Controls->Add(this->linkLabel_Repo);
this->tabPage_Update->Controls->Add(this->linkLabel_Help);
this->tabPage_Update->Controls->Add(this->linkLabel_Official_Discord);
this->tabPage_Update->Controls->Add(this->linkLabel_Changelog);
this->tabPage_Update->Controls->Add(this->button_Clean_installation);
this->tabPage_Update->Controls->Add(this->button_Instructions);
this->tabPage_Update->Controls->Add(this->button_Unstable_builds);
this->tabPage_Update->Controls->Add(this->button_Releases_page);
this->tabPage_Update->Controls->Add(this->label_Update_2);
this->tabPage_Update->Controls->Add(this->label_Update_1);
resources->ApplyResources(this->tabPage_Update, L"tabPage_Update");
this->tabPage_Update->Name = L"tabPage_Update";
this->tabPage_Update->UseVisualStyleBackColor = true;
//
// linkLabel_Repo
//
resources->ApplyResources(this->linkLabel_Repo, L"linkLabel_Repo");
this->linkLabel_Repo->Name = L"linkLabel_Repo";
this->linkLabel_Repo->TabStop = true;
this->linkLabel_Repo->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Repo_LinkClicked);
//
// linkLabel_Help
//
resources->ApplyResources(this->linkLabel_Help, L"linkLabel_Help");
this->linkLabel_Help->Name = L"linkLabel_Help";
this->linkLabel_Help->TabStop = true;
this->linkLabel_Help->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Help_LinkClicked);
//
// linkLabel_Official_Discord
//
resources->ApplyResources(this->linkLabel_Official_Discord, L"linkLabel_Official_Discord");
this->linkLabel_Official_Discord->Name = L"linkLabel_Official_Discord";
this->linkLabel_Official_Discord->TabStop = true;
this->linkLabel_Official_Discord->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Official_Discord_LinkClicked);
//
// linkLabel_Changelog
//
resources->ApplyResources(this->linkLabel_Changelog, L"linkLabel_Changelog");
this->linkLabel_Changelog->Name = L"linkLabel_Changelog";
this->linkLabel_Changelog->TabStop = true;
this->linkLabel_Changelog->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Changelog_LinkClicked);
//
// button_Clean_installation
//
resources->ApplyResources(this->button_Clean_installation, L"button_Clean_installation");
this->button_Clean_installation->Name = L"button_Clean_installation";
this->button_Clean_installation->UseVisualStyleBackColor = true;
this->button_Clean_installation->Click += gcnew System::EventHandler(this, &ui::button_Clean_installation_Click);
//
// button_Instructions
//
resources->ApplyResources(this->button_Instructions, L"button_Instructions");
this->button_Instructions->Name = L"button_Instructions";
this->button_Instructions->UseVisualStyleBackColor = true;
this->button_Instructions->Click += gcnew System::EventHandler(this, &ui::button_Instructions_Click);
//
// button_Unstable_builds
//
resources->ApplyResources(this->button_Unstable_builds, L"button_Unstable_builds");
this->button_Unstable_builds->Name = L"button_Unstable_builds";
this->button_Unstable_builds->UseVisualStyleBackColor = true;
this->button_Unstable_builds->Click += gcnew System::EventHandler(this, &ui::button_Unstable_builds_Click);
//
// button_Releases_page
//
resources->ApplyResources(this->button_Releases_page, L"button_Releases_page");
this->button_Releases_page->Name = L"button_Releases_page";
this->button_Releases_page->UseVisualStyleBackColor = true;
this->button_Releases_page->Click += gcnew System::EventHandler(this, &ui::button_Releases_page_Click);
//
// label_Update_2
//
resources->ApplyResources(this->label_Update_2, L"label_Update_2");
this->label_Update_2->Name = L"label_Update_2";
//
// label_Update_1
//
resources->ApplyResources(this->label_Update_1, L"label_Update_1");
this->label_Update_1->Name = L"label_Update_1";
//
// button_Discord
//
this->button_Discord->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
static_cast<System::Int32>(static_cast<System::Byte>(242)));
this->button_Discord->Cursor = System::Windows::Forms::Cursors::Hand;
this->button_Discord->FlatAppearance->BorderSize = 0;
resources->ApplyResources(this->button_Discord, L"button_Discord");
this->button_Discord->Name = L"button_Discord";
this->button_Discord->UseVisualStyleBackColor = false;
this->button_Discord->Click += gcnew System::EventHandler(this, &ui::button_Discord_Click);
//
// button_github
//
this->button_github->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
static_cast<System::Int32>(static_cast<System::Byte>(242)));
this->button_github->Cursor = System::Windows::Forms::Cursors::Hand;
this->button_github->FlatAppearance->BorderSize = 0;
resources->ApplyResources(this->button_github, L"button_github");
this->button_github->Name = L"button_github";
this->button_github->UseVisualStyleBackColor = false;
this->button_github->Click += gcnew System::EventHandler(this, &ui::button_github_Click);
//
// button_Apply
//
this->button_Apply->BackColor = System::Drawing::Color::White;
this->button_Apply->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
resources->ApplyResources(this->button_Apply, L"button_Apply");
this->button_Apply->Name = L"button_Apply";
this->button_Apply->UseVisualStyleBackColor = false;
this->button_Apply->Click += gcnew System::EventHandler(this, &ui::button_Apply_Click);
//
// button_Wiki
//
this->button_Wiki->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
static_cast<System::Int32>(static_cast<System::Byte>(242)));
resources->ApplyResources(this->button_Wiki, L"button_Wiki");
this->button_Wiki->Cursor = System::Windows::Forms::Cursors::Hand;
this->button_Wiki->FlatAppearance->BorderSize = 0;
this->button_Wiki->Name = L"button_Wiki";
this->button_Wiki->UseVisualStyleBackColor = false;
this->button_Wiki->Click += gcnew System::EventHandler(this, &ui::button_Wiki_Click);
//
// panel_Patches2
//
resources->ApplyResources(this->panel_Patches2, L"panel_Patches2");
this->panel_Patches2->Name = L"panel_Patches2";
//
// ui
//
this->AcceptButton = this->button_Launch;
resources->ApplyResources(this, L"$this");
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Dpi;
this->BackColor = System::Drawing::Color::Magenta;
this->Controls->Add(this->button_Wiki);
this->Controls->Add(this->button_Apply);
this->Controls->Add(this->tabControl);
this->Controls->Add(this->button_Launch);
this->Controls->Add(this->button_github);
this->Controls->Add(this->button_Discord);
this->DoubleBuffered = true;
this->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
static_cast<System::Int32>(static_cast<System::Byte>(64)));
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;
this->HelpButton = true;
this->KeyPreview = true;
this->MaximizeBox = false;
this->Name = L"ui";
this->TransparencyKey = System::Drawing::Color::Magenta;
this->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &ui::Ui_FormClosing);
this->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &ui::Ui_FormClosed);
this->groupBox_ScreenRes->ResumeLayout(false);
this->panel_ScreenRes->ResumeLayout(false);
this->panel_ScreenRes->PerformLayout();
this->tabControl->ResumeLayout(false);
this->tabPage_Resolution->ResumeLayout(false);
this->tabPage_Resolution->PerformLayout();
this->groupBox_Lag->ResumeLayout(false);
this->groupBox_Lag->PerformLayout();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->trackBar_LagCompensation))->EndInit();
this->groupBox_Details->ResumeLayout(false);
this->groupBox_InternalRes->ResumeLayout(false);
this->tabPage_Patches->ResumeLayout(false);
this->tabPage_Playerdata->ResumeLayout(false);
this->tabPage_Components->ResumeLayout(false);
this->tabPage_Components->PerformLayout();
this->tabPage_Plugins->ResumeLayout(false);
this->tabPage_Modpacks->ResumeLayout(false);
this->tabPage_Modpacks->PerformLayout();
this->tabPage_Credits->ResumeLayout(false);
this->tabPage_Credits->PerformLayout();
this->tabPage_Update->ResumeLayout(false);
this->tabPage_Update->PerformLayout();
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void scanModpacks() {
button_ModSetActive->Enabled = false;
button_ModClone->Enabled = false;
button_ModDelete->Enabled = false;
button_ModFiles->Enabled = false;
button_ModRename->Enabled = false;
listBox_Mods->Items->Clear();
listBox_Mods->Items->Add("(base)");
try {
for (std::filesystem::path p : std::filesystem::directory_iterator("./modpacks"))
{
if (std::filesystem::exists(p.string() + "/ram") && std::filesystem::exists(p.string() + "/mdata") &&
std::filesystem::exists(p.string() + "/plugins") && std::filesystem::exists(p.string() + "/patches"))
{
listBox_Mods->Items->Add(gcnew String(p.filename().c_str()));
}
}
}
catch (const std::filesystem::filesystem_error& e) {
std::cout << "[Launcher] File system error " << e.what() << " " << e.path1() << " " << e.path2() << " " << e.code() << std::endl;
}
}
private: System::Void SaveSettings() {
if (*ResolutionConfigChanged)
{
for (ConfigOptionBase* option : screenResolutionArray)
{
option->SaveOption();
}
for (ConfigOptionBase* option : internalResolutionArray)
{
option->SaveOption();
}
/*if (getFullscreenOptimizations() == this->checkBox_nofsopt->Checked)*/ setFullscreenOptimizations(!this->checkBox_nofsopt->Checked);
this->checkBox_nofsopt->Checked = !getFullscreenOptimizations();
*ResolutionConfigChanged = false;
}
if (*OptionsConfigChanged)
{
for (ConfigOptionBase* option : optionsArray)
{
option->SaveOption();
}
for (ConfigOptionBase* option : options2Array)
{
option->SaveOption();
}
for (ConfigOptionBase* option : graphicsArray)
{
option->SaveOption();
}
*OptionsConfigChanged = false;
}
if (*PlayerdataConfigChanged)
{
for (ConfigOptionBase* option : playerdataArray)
{
option->SaveOption();
}
*PlayerdataConfigChanged = false;
}
if (*ComponentsConfigChanged)
{
for (ConfigOptionBase* component : componentsArray)
{
component->SaveOption();
}
*ComponentsConfigChanged = false;
}
if (*LagCompensationConfigChanged)
{
SetIniInt(GRAPHICS_SECTION, L"lag_compensation", trackBar_LagCompensation->Value, CONFIG_FILE);
*LagCompensationConfigChanged = false;
}
for (ConfigOptionBase* option : AllPluginOpts)
{
if (*(option->hasChanged))
{
option->SaveOption();
}
*(option->hasChanged) = false;
}
for (ConfigOptionBase* option : AllCustomOpts)
{
if (*(option->hasChanged))
{
option->SaveOption();
}
*(option->hasChanged) = false;
}
}
private: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
}
private: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) {
//SkinnedMessageBox::Show(this, "It looks like the executable has been tampered with, or the version of the game is not 7.10.\n\nPlease use the \"patches\" folder instead of modifying the executable directly (or disable verification).", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
SaveSettings();
if(GetPrivateProfileIntW(LAUNCHER_SECTION, L"use_divahook_bat", FALSE, CONFIG_FILE))
{
DIVA_EXECUTABLE = NULL;
wstring DIVA_EXECUTABLE_LAUNCH_STRING = L"cmd.exe /C \"";
DIVA_EXECUTABLE_LAUNCH_STRING.append(DIVA_DIRPATH);
DIVA_EXECUTABLE_LAUNCH_STRING.append(L"\\divahook.bat\"");
DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());
}
else
{
// read the command line here so it'll be up to date even if the user changed it
WCHAR stringBuf[256];
GetPrivateProfileStringW(LAUNCHER_SECTION, L"command_line", L"", stringBuf, 256, CONFIG_FILE);
DIVA_EXECUTABLE_LAUNCH_STRING += L" " + wstring(stringBuf);
DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());
}
STARTUPINFOW si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcessW(DIVA_EXECUTABLE, DIVA_EXECUTABLE_LAUNCH, NULL, NULL, false, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
// this->Close won't work in here since it will prompt the user to save the settings
TerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);
}
private: System::Void InternalResEnabledChangedHandler(System::Object^ sender, System::EventArgs^ e) {
if (((CheckBox^)CheckBox::FromHandle(InternalResolutionCheckbox->mainControlHandle))->Checked)
{
((Control^)Control::FromHandle(InternalResolutionOption->mainControlHandle))->Enabled = true;
}
else
{
((Control^)Control::FromHandle(InternalResolutionOption->mainControlHandle))->Enabled = false;
}
}
private: System::Void DisplayTypeChangedHandler(System::Object^ sender, System::EventArgs^ e) {
int idx = ((ComboBox^)ComboBox::FromHandle(DisplayModeDropdown->mainControlHandle))->SelectedIndex;
if (idx == 2) // fullscreen
{
for (ConfigOptionBase* option : screenResolutionArray)
{
if (option != DisplayModeDropdown && option != DisplayResolutionOption)
{
((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = true;
}
}
}
else
{
for (ConfigOptionBase* option : screenResolutionArray)
{
if (option != DisplayModeDropdown && option != DisplayResolutionOption)
{
((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = false;
}
}
}
}
private: System::Void Ui_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
if (!AnyConfigChanged())
return;
switch (SkinnedMessageBox::Show(this, i18n::GetStringFallback("CONFIRM_SAVE_SETTINGS"), "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Question))
{
case System::Windows::Forms::DialogResult::Yes:
SaveSettings();
break;
case System::Windows::Forms::DialogResult::No:
break;
case System::Windows::Forms::DialogResult::Cancel:
e->Cancel = true;
break;
}
}
private: System::Void Ui_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
// Prevents abnormal termination messages, remember that the game is still technically running and must be killed!
TerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);
}
private: System::Void button_Discord_Click(System::Object^ sender, System::EventArgs^ e) {
switch (SkinnedMessageBox::Show(this, i18n::GetStringFallback("CONFIRM_DISCORD_OR_GUIDE"), "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Information))
{
case System::Windows::Forms::DialogResult::Yes:
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
break;
case System::Windows::Forms::DialogResult::No:
System::Diagnostics::Process::Start("https://discord.gg/cvBVGDZ");
break;
}
}
private: System::Void button_github_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader");
}
private: System::Void button_Apply_Click(System::Object^ sender, System::EventArgs^ e) {
SaveSettings();
updateLanguage();
updateStyle();
}
private: System::Void Ui_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) {
if (e->KeyCode == Keys::Escape) this->Close();
}
private: bool* ResolutionConfigChanged = new bool(false);
bool* OptionsConfigChanged = new bool(false);
bool* PlayerdataConfigChanged = new bool(false);
bool* ComponentsConfigChanged = new bool(false);
bool* LagCompensationConfigChanged = new bool(false);
private: bool AnyConfigChanged() {
if (*ResolutionConfigChanged || *OptionsConfigChanged || *PlayerdataConfigChanged || *ComponentsConfigChanged || *LagCompensationConfigChanged)
return true; // fast case
for (ConfigOptionBase* option : AllPluginOpts)
{
if (*(option->hasChanged)) return true; // slow case for iterating over individual plugins
}
return false;
}
private: String^ GPUIssueText;
private: System::Void LinkLabelLinkClickedGPUIssueHandler(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
SkinnedMessageBox::Show(this, GPUIssueText, "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
}
private: System::Void trackBar_LagCompensation_ValueChanged(System::Object^ sender, System::EventArgs^ e) {
*LagCompensationConfigChanged = true;
updateLagCompMsec();
}
private: System::Void tabPage_Resolution_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button_Wiki_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
}
private: System::Void trackBar_LagCompensation_Scroll(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button_Releases_page_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/releases");
}
private: System::Void button_Instructions_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki/2%29+Installation");
}
private: System::Void button_Unstable_builds_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://ci.appveyor.com/project/nastys/pd-loader/build/artifacts");
}
private: System::Void button_Clean_installation_Click(System::Object^ sender, System::EventArgs^ e) {
SkinnedMessageBox::Show(this, i18n::GetStringFallback("HOWTO_CLEAN_INSTALL_HINT"), i18n::GetStringFallback("HOWTO_CLEAN_INSTALL"), MessageBoxButtons::OK, MessageBoxIcon::Information);
}
private: System::Void linkLabel_Changelog_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki/Changelog");
}
private: System::Void linkLabel_Official_Discord_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
System::Diagnostics::Process::Start("https://discord.gg/cvBVGDZ");
}
private: System::Void linkLabel_Help_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
}
private: System::Void linkLabel_Repo_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader");
}
private: System::Void checkBox_nofsopt_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {
*ResolutionConfigChanged = true;
}
private: System::Void keycfg_button_Click(System::Object^ sender, System::EventArgs^ e)
{
System::Diagnostics::Process::Start("\"" + System::Environment::GetEnvironmentVariable("WINDIR") + "\\write.exe\"", "plugins\\keyconfig.ini");
}
private: System::Void linkLabel_Console_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
HWND consoleHandle = GetConsoleWindow();
ShowWindow(consoleHandle, SW_SHOW);
linkLabel_Console->Visible = false;
}
private: System::Void listBox_Mods_SelectedValueChanged(System::Object^ sender, System::EventArgs^ e) {
button_ModSetActive->Enabled = true;
button_ModClone->Enabled = true;
button_ModDelete->Enabled = true;
button_ModFiles->Enabled = true;
button_ModRename->Enabled = true;
}
private: System::Void button_ModRescan_Click(System::Object^ sender, System::EventArgs^ e) {
scanModpacks();
}
private: System::Void button_ModSetActive_Click(System::Object^ sender, System::EventArgs^ e) {
LPCWSTR mpname;
if (listBox_Mods->SelectedIndex == 0) mpname = L"";
else
{
auto str = listBox_Mods->GetItemText(listBox_Mods->SelectedItem);
IntPtr strptr = System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str);
mpname = (LPCWSTR)strptr.ToPointer();
}
WritePrivateProfileStringW(L"Mods", L"Modpack", mpname, CONFIG_FILE);
}
private: System::Void button_ModFiles_Click(System::Object^ sender, System::EventArgs^ e) {
auto mpstr = listBox_Mods->SelectedItem->ToString();
if(mpstr == "(base)") System::Diagnostics::Process::Start(".");
else System::Diagnostics::Process::Start("modpacks\\"+mpstr);
}
private: System::Void button_ModClone_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button_ModDelete_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button_ModRename_Click(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void tabPage_Modpacks_Enter(System::Object^ sender, System::EventArgs^ e) {
scanModpacks();
wchar_t* mpstr = NULL;
mpstr = (wchar_t*)malloc(256);
memset(mpstr, 0, 256);
GetPrivateProfileStringW(L"Mods", L"Modpack", L"", mpstr, 256, CONFIG_FILE);
listBox_Mods->SelectedIndex = listBox_Mods->FindString(gcnew String(mpstr));
free(mpstr);
}
};
}