Add user-friendliness
This commit is contained in:
@@ -12,6 +12,12 @@
|
||||
using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
|
||||
float BaseScaleSize = 96;
|
||||
int Col1Width = 110;
|
||||
int Col2Left = 114;
|
||||
int Col2Width = 110;
|
||||
int ControlSpacing = 6;
|
||||
|
||||
// Custom function. Works like GetPrivateProfileIntW but returns bool. Can detect a numeric value or string.
|
||||
bool GetPrivateProfileBoolW(LPCWSTR lpAppName, LPCWSTR lpKeyName, bool default, LPCWSTR lpFileName)
|
||||
{
|
||||
@@ -220,16 +226,24 @@ public:
|
||||
|
||||
cb->Text = gcnew String(_friendlyName);
|
||||
cb->Checked = GetPrivateProfileBoolW(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);
|
||||
cb->Left = left;
|
||||
cb->Left = left + 2;
|
||||
cb->Top = top;
|
||||
cb->AutoSize = true;
|
||||
cb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
cb->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
tooltip->SetToolTip(cb, gcnew String(_description));
|
||||
|
||||
panel->Controls->Add(cb);
|
||||
mainControlHandle = cb->Handle;
|
||||
return 23;
|
||||
|
||||
int ControlHeight = cb->Font->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -271,7 +285,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -280,18 +294,27 @@ public:
|
||||
|
||||
numberbox->Value = (int)GetPrivateProfileIntW(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath); // cast to int because this returns uint and breaks -1
|
||||
// it seems it does read negative values correctly though... but eventually a parser that properly supports negative numbers would be ideal
|
||||
numberbox->Left = left + 104;
|
||||
numberbox->Left = left + Col2Left;
|
||||
numberbox->Top = top;
|
||||
numberbox->Width = 90;
|
||||
numberbox->Width = Col2Width;
|
||||
numberbox->AutoSize = true;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
numberbox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
tooltip->SetToolTip(label, gcnew String(_description));
|
||||
tooltip->SetToolTip(numberbox, gcnew String(_description));
|
||||
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(numberbox);
|
||||
mainControlHandle = numberbox->Handle;
|
||||
return 28;
|
||||
|
||||
int ControlHeight = numberbox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -334,7 +357,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -345,11 +368,18 @@ public:
|
||||
}
|
||||
|
||||
textbox->Text = gcnew String(stringBuf);
|
||||
textbox->Left = left + 104;
|
||||
textbox->Left = left + Col2Left;
|
||||
textbox->Top = top;
|
||||
textbox->Width = 90;
|
||||
textbox->Width = Col2Width;
|
||||
textbox->AutoSize = true;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
textbox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
// disable editing for utf8 mode because the ANSI hack used may not work correctly
|
||||
if (_useUtf8) {
|
||||
textbox->Enabled = false;
|
||||
@@ -361,7 +391,9 @@ public:
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(textbox);
|
||||
mainControlHandle = textbox->Handle;
|
||||
return 28;
|
||||
|
||||
int ControlHeight = textbox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -415,7 +447,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -423,20 +455,29 @@ public:
|
||||
combobox->Items->Add(msclr::interop::marshal_as<System::String^>(choice));
|
||||
}
|
||||
combobox->SelectedIndex = GetPrivateProfileIntW(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);
|
||||
combobox->Left = left + 104;
|
||||
combobox->Left = left + Col2Left;
|
||||
combobox->Top = top;
|
||||
combobox->Width = 90;
|
||||
combobox->Width = Col2Width;
|
||||
combobox->AutoSize = true;
|
||||
combobox->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
combobox->DropDownStyle = ComboBoxStyle::DropDownList;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
combobox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
tooltip->SetToolTip(label, gcnew String(_description));
|
||||
tooltip->SetToolTip(combobox, gcnew String(_description));
|
||||
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(combobox);
|
||||
mainControlHandle = combobox->Handle;
|
||||
return 28;;
|
||||
|
||||
int ControlHeight = combobox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -481,7 +522,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -496,13 +537,20 @@ public:
|
||||
}
|
||||
|
||||
combobox->Text = gcnew String(stringBuf);
|
||||
combobox->Left = left + 104;
|
||||
combobox->Left = left + Col2Left;
|
||||
combobox->Top = top;
|
||||
combobox->Width = 90;
|
||||
combobox->Width = Col2Width;
|
||||
combobox->AutoSize = true;
|
||||
combobox->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
combobox->DropDownStyle = ComboBoxStyle::DropDown;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
combobox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
// disable editing for utf8 mode because the ANSI hack used may not work correctly
|
||||
if (_useUtf8) {
|
||||
label->Enabled = false;
|
||||
@@ -515,7 +563,9 @@ public:
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(combobox);
|
||||
mainControlHandle = combobox->Handle;
|
||||
return 28;;
|
||||
|
||||
int ControlHeight = combobox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -571,7 +621,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -582,13 +632,20 @@ public:
|
||||
tempSysStr = Convert::ToInt32((int)GetPrivateProfileIntW(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath)).ToString();
|
||||
|
||||
combobox->Text = gcnew String(tempSysStr);
|
||||
combobox->Left = left + 104;
|
||||
combobox->Left = left + Col2Left;
|
||||
combobox->Top = top;
|
||||
combobox->Width = 90;
|
||||
combobox->Width = Col2Width;
|
||||
combobox->AutoSize = true;
|
||||
combobox->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
combobox->DropDownStyle = ComboBoxStyle::DropDown;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
combobox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
tooltip->SetToolTip(label, gcnew String(_description));
|
||||
tooltip->SetToolTip(combobox, gcnew String(_description));
|
||||
|
||||
@@ -598,7 +655,9 @@ public:
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(combobox);
|
||||
mainControlHandle = combobox->Handle;
|
||||
return 28;;
|
||||
|
||||
int ControlHeight = combobox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
@@ -643,7 +702,7 @@ public:
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = 100;
|
||||
label->Width = Col1Width;
|
||||
label->AutoSize = true;
|
||||
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
|
||||
@@ -663,13 +722,20 @@ public:
|
||||
combobox->Text = tempSysStr;
|
||||
}
|
||||
|
||||
combobox->Left = left + 104;
|
||||
combobox->Left = left + Col2Left;
|
||||
combobox->Top = top;
|
||||
combobox->Width = 90;
|
||||
combobox->Width = Col2Width;
|
||||
combobox->AutoSize = true;
|
||||
combobox->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
combobox->DropDownStyle = ComboBoxStyle::DropDown;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
float ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
float ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
label->Scale(ScaleWidth, ScaleHeight);
|
||||
combobox->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
tooltip->SetToolTip(label, gcnew String(_description));
|
||||
tooltip->SetToolTip(combobox, gcnew String(_description));
|
||||
|
||||
@@ -679,7 +745,9 @@ public:
|
||||
panel->Controls->Add(label);
|
||||
panel->Controls->Add(combobox);
|
||||
mainControlHandle = combobox->Handle;
|
||||
return 28;;
|
||||
|
||||
int ControlHeight = combobox->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
|
||||
virtual void SaveOption()
|
||||
|
||||
@@ -167,16 +167,22 @@
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ConfigOption.h" />
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="SkinnedMessageBox.h" />
|
||||
<ClInclude Include="TabPadding.h" />
|
||||
<ClInclude Include="ui.h">
|
||||
<FileType>CppForm</FileType>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="SkinnedMessageBox.resx" />
|
||||
<EmbeddedResource Include="ui.resx">
|
||||
<DependentUpon>ui.h</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="PokeSnarf2x.bmp" />
|
||||
<Image Include="PokeSnarf2x.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
@@ -0,0 +1,394 @@
|
||||
#pragma once
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
// Windows Header Files
|
||||
#include <windows.h>
|
||||
|
||||
using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
using namespace System::Drawing;
|
||||
|
||||
// ported from https://stackoverflow.com/a/7785745
|
||||
// original code by user LarsTech https://stackoverflow.com/users/719186/larstech
|
||||
|
||||
static ref class SkinnedMessageBox
|
||||
{
|
||||
private: ref class SkinnedMessageBoxForm : Form
|
||||
{
|
||||
private:
|
||||
void SkinnedMessageBoxForm_Shown(Object^ sender, EventArgs^ e)
|
||||
{
|
||||
Activate();
|
||||
}
|
||||
|
||||
void SkinnedMessageBoxForm_FormClosed(Object^ sender, FormClosedEventArgs^ e)
|
||||
{
|
||||
if (CancelButton && (DialogResult == System::Windows::Forms::DialogResult::None || DialogResult == System::Windows::Forms::DialogResult::Cancel))
|
||||
DialogResult = CancelButton->DialogResult;
|
||||
}
|
||||
|
||||
void InitComponentNew()
|
||||
{
|
||||
this->SuspendLayout();
|
||||
|
||||
this->AutoSize = true;
|
||||
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog;
|
||||
this->Width = 350;
|
||||
this->Height = 140;
|
||||
this->StartPosition = FormStartPosition::CenterScreen;
|
||||
this->MaximizeBox = false;
|
||||
this->MinimizeBox = false;
|
||||
this->ShowInTaskbar = false;
|
||||
this->ShowIcon = false;
|
||||
__try
|
||||
{
|
||||
this->Icon = Application::OpenForms[0]->Icon;
|
||||
}
|
||||
__except (1) { }
|
||||
this->Shown += gcnew EventHandler(this, &SkinnedMessageBoxForm::SkinnedMessageBoxForm_Shown);
|
||||
this->FormClosed += gcnew FormClosedEventHandler(this, &SkinnedMessageBoxForm::SkinnedMessageBoxForm_FormClosed);
|
||||
|
||||
//this->Font = SystemFonts::MessageBoxFont;
|
||||
//this->Font = gcnew Font(SystemFonts::MessageBoxFont->FontFamily, SystemFonts::MessageBoxFont->SizeInPoints);
|
||||
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::None;
|
||||
|
||||
this->ResumeLayout(false);
|
||||
this->PerformLayout();
|
||||
}
|
||||
|
||||
float ScaleWidth = 1.0;
|
||||
float ScaleHeight = 1.0;
|
||||
int btnWidth = 85;
|
||||
int btnHeight = 23;
|
||||
int btnPadding = 12;
|
||||
|
||||
static cli::array<Button^>^ buttonrefs = gcnew cli::array<Button^>{ gcnew Button, gcnew Button, gcnew Button };
|
||||
int numbuttons = 1;
|
||||
|
||||
Button^ AddBtn(String^ text, System::Windows::Forms::DialogResult result, int btnNumber)
|
||||
{
|
||||
Button^ btn = buttonrefs[btnNumber];
|
||||
btn->Text = text;
|
||||
btn->DialogResult = result;
|
||||
btn->Anchor = AnchorStyles::Bottom | AnchorStyles::Right;
|
||||
btn->Width = btnWidth;
|
||||
btn->Height = btnHeight;
|
||||
|
||||
btn->Location = Point(ClientSize.Width - btnWidth * (numbuttons - btnNumber) - btnPadding * (numbuttons - btnNumber), ClientSize.Height - btnHeight - btnPadding);
|
||||
Controls->Add(btn);
|
||||
|
||||
//buttonrefs[btnNumber] = btn;
|
||||
return btn;
|
||||
}
|
||||
|
||||
void SetBackCol(Control^ elem, Color color)
|
||||
{
|
||||
Type^ elemType = elem->GetType();
|
||||
|
||||
if ((elem->HasChildren || elemType == Button::typeid || elemType == ComboBox::typeid) && elemType != NumericUpDown::typeid)
|
||||
{
|
||||
elem->BackColor = color;
|
||||
|
||||
for (int i = 0; i < elem->Controls->Count; i++)
|
||||
{
|
||||
SetBackCol(elem->Controls[i], color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetForeCol(Control^ elem, Color color)
|
||||
{
|
||||
Type^ elemType = elem->GetType();
|
||||
|
||||
if (elemType != NumericUpDown::typeid && elemType != TextBox::typeid)
|
||||
{
|
||||
elem->ForeColor = color;
|
||||
}
|
||||
if (elem->HasChildren && elemType != NumericUpDown::typeid)
|
||||
{
|
||||
for (int i = 0; i < elem->Controls->Count; i++)
|
||||
{
|
||||
SetForeCol(elem->Controls[i], color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetUIStyle(Control^ elem, FlatStyle style)
|
||||
{
|
||||
Type^ elemType = elem->GetType();
|
||||
|
||||
if (elemType == Button::typeid)
|
||||
{
|
||||
((Button^)elem)->FlatStyle = style;
|
||||
}
|
||||
else if (elemType == ComboBox::typeid)
|
||||
{
|
||||
((ComboBox^)elem)->FlatStyle = style;
|
||||
}
|
||||
else if (elemType == CheckBox::typeid)
|
||||
{
|
||||
((CheckBox^)elem)->FlatStyle = style;
|
||||
}
|
||||
|
||||
if (elem->HasChildren && elemType != NumericUpDown::typeid)
|
||||
{
|
||||
for (int i = 0; i < elem->Controls->Count; i++)
|
||||
{
|
||||
SetUIStyle(elem->Controls[i], style);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
SkinnedMessageBoxForm(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)
|
||||
{
|
||||
InitComponentNew();
|
||||
ScaleWidth = Font->SizeInPoints / 8.0f;
|
||||
ScaleHeight = ScaleWidth;
|
||||
btnWidth *= ScaleWidth;
|
||||
btnHeight *= ScaleHeight;
|
||||
btnPadding *= ScaleWidth;
|
||||
|
||||
Width *= ScaleWidth;
|
||||
Height *= ScaleHeight;
|
||||
|
||||
if (owner->Handle != IntPtr::Zero)
|
||||
{
|
||||
Owner = Control::FromHandle(owner->Handle)->FindForm();
|
||||
}
|
||||
else
|
||||
{
|
||||
Owner = ActiveForm;
|
||||
}
|
||||
|
||||
Text = caption;
|
||||
|
||||
System::Windows::Forms::Padding lblMargin = System::Windows::Forms::Padding(14 * ScaleWidth, 0 * ScaleHeight, 14 * ScaleWidth, 45 * ScaleHeight);
|
||||
Point lblLocation = Point(14 * ScaleWidth, 14 * ScaleHeight);
|
||||
Drawing::Size lblMinSize = Drawing::Size(ClientSize.Width - lblLocation.X - lblMargin.Right, 0);
|
||||
Drawing::Size lblMaxSize = Drawing::Size(600 * ScaleWidth, 0 * ScaleHeight);
|
||||
|
||||
Label^ MessageLbl = gcnew Label();
|
||||
MessageLbl->Text = message;
|
||||
MessageLbl->AutoSize = true;
|
||||
MessageLbl->Margin = lblMargin;
|
||||
MessageLbl->Location = lblLocation;
|
||||
MessageLbl->MinimumSize = lblMinSize;
|
||||
MessageLbl->MaximumSize = lblMaxSize;
|
||||
|
||||
Controls->Add(MessageLbl);
|
||||
|
||||
if (buttons == MessageBoxButtons::OK)
|
||||
{
|
||||
numbuttons = 1;
|
||||
Button^ OkBtn = AddBtn("&OK", System::Windows::Forms::DialogResult::OK, 0);
|
||||
CancelButton = OkBtn;
|
||||
//(not sure why, but this matches official .NET behaviour)
|
||||
}
|
||||
else if (buttons == MessageBoxButtons::OKCancel)
|
||||
{
|
||||
numbuttons = 2;
|
||||
AddBtn("&OK", System::Windows::Forms::DialogResult::OK, 0);
|
||||
Button^ CancelBtn = AddBtn("&Cancel", System::Windows::Forms::DialogResult::Cancel, 1);
|
||||
CancelButton = CancelBtn;
|
||||
}
|
||||
else if (buttons == MessageBoxButtons::YesNo)
|
||||
{
|
||||
numbuttons = 2;
|
||||
AddBtn("&Yes", System::Windows::Forms::DialogResult::Yes, 0);
|
||||
Button^ NoBtn = AddBtn("&No", System::Windows::Forms::DialogResult::No, 1);
|
||||
CancelButton = NoBtn;
|
||||
//(official .NET doesn't set cancel button, but this seems pretty clear to me...)
|
||||
}
|
||||
else if (buttons == MessageBoxButtons::RetryCancel)
|
||||
{
|
||||
numbuttons = 2;
|
||||
AddBtn("&Retry", System::Windows::Forms::DialogResult::Retry, 0);
|
||||
Button^ CancelBtn = AddBtn("&Cancel", System::Windows::Forms::DialogResult::Cancel, 1);
|
||||
CancelButton = CancelBtn;
|
||||
}
|
||||
else if (buttons == MessageBoxButtons::YesNoCancel)
|
||||
{
|
||||
numbuttons = 3;
|
||||
AddBtn("&Yes", System::Windows::Forms::DialogResult::Yes, 0);
|
||||
AddBtn("&No", System::Windows::Forms::DialogResult::No, 1);
|
||||
Button^ CancelBtn = AddBtn("&Cancel", System::Windows::Forms::DialogResult::Cancel, 2);
|
||||
CancelButton = CancelBtn;
|
||||
}
|
||||
else if (buttons == MessageBoxButtons::AbortRetryIgnore)
|
||||
{
|
||||
numbuttons = 3;
|
||||
AddBtn("&Abort", System::Windows::Forms::DialogResult::Abort, 0);
|
||||
AddBtn("&Retry", System::Windows::Forms::DialogResult::Retry, 1);
|
||||
AddBtn("&Ignore", System::Windows::Forms::DialogResult::Ignore, 2);
|
||||
//this.CancelButton = IgnoreBtn;
|
||||
//(official .NET doesn't set cancel button)
|
||||
}
|
||||
else
|
||||
{
|
||||
throw gcnew System::ComponentModel::InvalidEnumArgumentException("buttons", (int)buttons, MessageBoxButtons::typeid);
|
||||
}
|
||||
|
||||
if (!CancelButton)
|
||||
ControlBox = false;
|
||||
|
||||
|
||||
if (icon != MessageBoxIcon::None)
|
||||
{
|
||||
int iconsize = 32 * ScaleWidth;
|
||||
int iconpadding = 12 * ScaleWidth;
|
||||
int textpadding = -8 * ScaleWidth;
|
||||
|
||||
PictureBox^ iconPB = gcnew PictureBox();
|
||||
iconPB->Width = iconsize;
|
||||
iconPB->Height = iconsize;
|
||||
iconPB->Top = 10 * ScaleHeight;
|
||||
iconPB->Left = 10 * ScaleWidth;
|
||||
iconPB->AccessibleName = "Icon";
|
||||
|
||||
// there are many duplicated values:
|
||||
// https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.messageboxicon?view=netframework-4.7.2
|
||||
if (icon == MessageBoxIcon::Error) // also Hand and Stop
|
||||
{
|
||||
Drawing::Icon^ erricon = gcnew Drawing::Icon(SystemIcons::Error, iconsize, iconsize);
|
||||
iconPB->Image = erricon->ToBitmap();
|
||||
iconPB->AccessibleDescription = "Error";
|
||||
//this.Icon = SystemIcons.Error;
|
||||
System::Media::SystemSounds::Hand->Play();
|
||||
}
|
||||
else if (icon == MessageBoxIcon::Question)
|
||||
{
|
||||
Drawing::Icon^ qicon = gcnew Drawing::Icon(SystemIcons::Question, iconsize, iconsize);
|
||||
iconPB->Image = qicon->ToBitmap();
|
||||
iconPB->AccessibleDescription = "Question";
|
||||
//this.Icon = SystemIcons.Question;
|
||||
System::Media::SystemSounds::Question->Play();
|
||||
}
|
||||
else if (icon == MessageBoxIcon::Warning) // also Exclamation
|
||||
{
|
||||
Drawing::Icon^ warnicon = gcnew Drawing::Icon(SystemIcons::Warning, iconsize, iconsize);
|
||||
iconPB->Image = warnicon->ToBitmap();
|
||||
//System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(SkinnedMessageBox::typeid));
|
||||
//iconPB->Image = cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"PokeSnarf2x"));
|
||||
iconPB->AccessibleDescription = "Warning";
|
||||
//this.Icon = SystemIcons.Warning;
|
||||
textpadding -= 2 * ScaleWidth; // triangle shape looks worse without this
|
||||
System::Media::SystemSounds::Exclamation->Play();
|
||||
}
|
||||
else if (icon == MessageBoxIcon::Information) // also Asterisk
|
||||
{
|
||||
Drawing::Icon^ infoicon = gcnew Drawing::Icon(SystemIcons::Information, iconsize, iconsize);
|
||||
iconPB->Image = infoicon->ToBitmap();
|
||||
iconPB->AccessibleDescription = "Information";
|
||||
//this.Icon = SystemIcons.Question;
|
||||
System::Media::SystemSounds::Asterisk->Play();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw gcnew System::ComponentModel::InvalidEnumArgumentException("icon", (int)icon, MessageBoxIcon::typeid);
|
||||
}
|
||||
|
||||
MessageLbl->MinimumSize = Drawing::Size(MessageLbl->MinimumSize.Width - (iconsize + iconpadding + textpadding), MessageLbl->MinimumSize.Height);
|
||||
MessageLbl->Left += (iconsize + iconpadding + textpadding);
|
||||
Controls->Add(iconPB);
|
||||
}
|
||||
|
||||
if (defaultbutton == MessageBoxDefaultButton::Button1)
|
||||
{
|
||||
AcceptButton = buttonrefs[0];
|
||||
ActiveControl = buttonrefs[0];
|
||||
}
|
||||
else if (defaultbutton == MessageBoxDefaultButton::Button2)
|
||||
{
|
||||
if (!Controls->Contains(buttonrefs[1])) throw gcnew ArgumentOutOfRangeException("defaultbutton", "defaultbutton cannot be set to a button number that does not exist");
|
||||
AcceptButton = buttonrefs[1];
|
||||
ActiveControl = buttonrefs[1];
|
||||
}
|
||||
else if (defaultbutton == MessageBoxDefaultButton::Button3)
|
||||
{
|
||||
if (!Controls->Contains(buttonrefs[2])) throw gcnew ArgumentOutOfRangeException("defaultbutton", "defaultbutton cannot be set to a button number that does not exist");
|
||||
AcceptButton = buttonrefs[2];
|
||||
ActiveControl = buttonrefs[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw gcnew System::ComponentModel::InvalidEnumArgumentException("defaultbutton", (int)defaultbutton, MessageBoxDefaultButton::typeid);
|
||||
}
|
||||
|
||||
|
||||
// TODO: TEXT ALIGNMENT AND RTL MODE
|
||||
/*
|
||||
// MessageBoxOptions are more like flags than concrete settings.
|
||||
// For ease of use, we assume default value is whatever winforms gives us in current locale -- but we override if any value is set
|
||||
if ((options & MessageBoxOptions.RightAlign) == MessageBoxOptions.RightAlign) MessageLbl.TextAlign = ContentAlignment.TopRight;
|
||||
else if (options != 0) MessageLbl.TextAlign = ContentAlignment.TopLeft;
|
||||
|
||||
// RtlReading should be what actually affects layout, and RightAlign only affects the text label
|
||||
if ((options & MessageBoxOptions.RtlReading) == MessageBoxOptions.RtlReading)
|
||||
{
|
||||
foreach (Control control in this.Controls)
|
||||
{
|
||||
control.Left = this.ClientSize.Width - control.Right;
|
||||
control.RightToLeft = RightToLeft.Yes;
|
||||
}
|
||||
this.RightToLeft = RightToLeft.Yes;
|
||||
this.RightToLeftLayout = true;
|
||||
}
|
||||
else if (options != 0)
|
||||
{
|
||||
foreach (Control control in this.Controls)
|
||||
{
|
||||
control.RightToLeft = RightToLeft.No;
|
||||
}
|
||||
this.RightToLeft = RightToLeft.No;
|
||||
this.RightToLeftLayout = false;
|
||||
}
|
||||
*/
|
||||
|
||||
SetBackCol(this, Color::FromArgb(64, 64, 64));
|
||||
SetForeCol(this, Color::White);
|
||||
SetUIStyle(this, FlatStyle::Flat);
|
||||
}
|
||||
|
||||
SkinnedMessageBoxForm(String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)
|
||||
{
|
||||
SkinnedMessageBoxForm(NativeWindow::FromHandle((IntPtr::Zero)), message, caption, buttons, icon, defaultbutton, options);
|
||||
}
|
||||
};
|
||||
|
||||
public:
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton, MessageBoxOptions options)
|
||||
{
|
||||
// I probably shouldn't do this, but from what I can tell this should be safe enough -- out of thread owner is allowed
|
||||
// and it only seems to appear when debugging (???)
|
||||
Control::CheckForIllegalCrossThreadCalls = false;
|
||||
SkinnedMessageBoxForm^ mb = gcnew SkinnedMessageBoxForm(owner, message, caption, buttons, icon, defaultbutton, options);
|
||||
DialogResult res = mb->ShowDialog();
|
||||
Control::CheckForIllegalCrossThreadCalls = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultbutton)
|
||||
{
|
||||
return Show(owner, message, caption, buttons, icon, defaultbutton, (MessageBoxOptions)0);
|
||||
}
|
||||
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons, MessageBoxIcon icon)
|
||||
{
|
||||
return Show(owner, message, caption, buttons, icon, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);
|
||||
}
|
||||
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message, String^ caption, MessageBoxButtons buttons)
|
||||
{
|
||||
return Show(owner, message, caption, buttons, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);
|
||||
}
|
||||
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message, String^ caption)
|
||||
{
|
||||
return Show(owner, message, caption, MessageBoxButtons::OK, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);
|
||||
}
|
||||
|
||||
static DialogResult Show(IWin32Window^ owner, String^ message)
|
||||
{
|
||||
return Show(owner, message, "", MessageBoxButtons::OK, MessageBoxIcon::None, MessageBoxDefaultButton::Button1, (MessageBoxOptions)0);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="PokeSnarf2x" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>PokeSnarf2x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 229 KiB |
@@ -8,8 +8,13 @@ using namespace System::Windows::Forms;
|
||||
|
||||
[STAThread]
|
||||
int showUI() {
|
||||
if (Environment::OSVersion->Version->Major >= 6)
|
||||
SetProcessDPIAware();
|
||||
SetProcessDPIAware();
|
||||
|
||||
// trick Optimus into switching to the NVIDIA GPU
|
||||
HMODULE nvcudaModule = LoadLibraryW(L"nvcuda.dll");
|
||||
// cuInit actually returns a CUresult, but we don't really care about it
|
||||
void(WINAPI * cuInit)(unsigned int flags) = (void(WINAPI*)(unsigned int flags))GetProcAddress(nvcudaModule, "cuInit");
|
||||
if (cuInit != NULL) cuInit(0);
|
||||
|
||||
Application::EnableVisualStyles();
|
||||
Application::SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 776 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
@@ -1,8 +1,11 @@
|
||||
#pragma once
|
||||
#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"
|
||||
|
||||
namespace Launcher {
|
||||
|
||||
@@ -48,7 +51,7 @@ namespace Launcher {
|
||||
int screenresY = 3;
|
||||
for (ConfigOptionBase* option : screenResolutionArray)
|
||||
{
|
||||
screenresY += option->AddToPanel(panel_ScreenRes, 3, screenresY, toolTip1);
|
||||
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
|
||||
@@ -63,7 +66,7 @@ namespace Launcher {
|
||||
int intresY = 3;
|
||||
for (ConfigOptionBase* option : internalResolutionArray)
|
||||
{
|
||||
intresY += option->AddToPanel(panel_IntRes, 3, intresY, toolTip1);
|
||||
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
|
||||
@@ -78,7 +81,7 @@ namespace Launcher {
|
||||
int optionsY = 3;
|
||||
for (ConfigOptionBase* option : optionsArray)
|
||||
{
|
||||
optionsY += option->AddToPanel(panel_Patches, 3, optionsY, toolTip1);
|
||||
optionsY += option->AddToPanel(panel_Patches, 12, optionsY, toolTip1);
|
||||
}
|
||||
this->panel_Patches->ResumeLayout(false);
|
||||
this->panel_Patches->PerformLayout();
|
||||
@@ -91,7 +94,7 @@ namespace Launcher {
|
||||
int playerdataY = 3;
|
||||
for (ConfigOptionBase* option : playerdataArray)
|
||||
{
|
||||
playerdataY += option->AddToPanel(panel_Playerdata, 3, playerdataY, toolTip1);
|
||||
playerdataY += option->AddToPanel(panel_Playerdata, 12, playerdataY, toolTip1);
|
||||
}
|
||||
this->panel_Playerdata->ResumeLayout(false);
|
||||
this->panel_Playerdata->PerformLayout();
|
||||
@@ -104,10 +107,28 @@ namespace Launcher {
|
||||
int componentsY = 3;
|
||||
for (ConfigOptionBase* component : componentsArray)
|
||||
{
|
||||
componentsY += component->AddToPanel(panel_Components, 3, componentsY, toolTip1);
|
||||
componentsY += component->AddToPanel(panel_Components, 12, componentsY, toolTip1);
|
||||
}
|
||||
this->panel_Components->ResumeLayout(false);
|
||||
this->panel_Components->PerformLayout();
|
||||
|
||||
int argc = 1;
|
||||
char* argv[1] = { (char*)"" };
|
||||
glutInit(&argc, argv);
|
||||
int window = glutCreateWindow("glut");
|
||||
String^ vendor = gcnew String((char*)glGetString(GL_VENDOR));
|
||||
String^ renderer = gcnew String((char*)glGetString(GL_RENDERER));
|
||||
String^ version = gcnew String((char*)glGetString(GL_VERSION));
|
||||
glutDestroyWindow(window);
|
||||
glutMainLoopEvent();
|
||||
/*MessageBox::Show(vendor, "vendor", MessageBoxButtons::OK, MessageBoxIcon::Information);
|
||||
MessageBox::Show(renderer, "renderer", MessageBoxButtons::OK, MessageBoxIcon::Information);
|
||||
MessageBox::Show(version, "version", MessageBoxButtons::OK, MessageBoxIcon::Information);*/
|
||||
this->labelGPU->Text = "Vendor: " + vendor + "\nRenderer: " + renderer + "\nOpenGL: " + version;
|
||||
if (vendor != "NVIDIA Corporation")
|
||||
//MessageBox::Show("Your graphics card is not supported! Only NVIDIA GPUs are currently supported.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
|
||||
SkinnedMessageBox::Show(this, "Your graphics card is not supported! Only NVIDIA GPUs are currently supported.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
|
||||
//if (version[0] < 4) MessageBox::Show("WARNING: Your GPU is too old. The game might not render correctly!", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -122,7 +143,8 @@ namespace Launcher {
|
||||
}
|
||||
}
|
||||
private: System::Windows::Forms::Button^ button_Launch;
|
||||
private: System::Windows::Forms::Button^ button_Exit;
|
||||
private: System::Windows::Forms::Button^ button_Help;
|
||||
|
||||
private: System::Windows::Forms::GroupBox^ groupBox_ScreenRes;
|
||||
private: System::Windows::Forms::TabControl^ tabControl;
|
||||
private: System::Windows::Forms::TabPage^ tabPage_Resolution;
|
||||
@@ -138,7 +160,11 @@ namespace Launcher {
|
||||
private: System::Windows::Forms::ToolTip^ toolTip1;
|
||||
private: System::Windows::Forms::Panel^ panel_ScreenRes;
|
||||
private: System::Windows::Forms::Panel^ panel_IntRes;
|
||||
private: System::ComponentModel::IContainer^ components;
|
||||
private: System::Windows::Forms::Label^ labelGPU;
|
||||
|
||||
|
||||
|
||||
private: System::ComponentModel::IContainer^ components;
|
||||
|
||||
private:
|
||||
/// <summary>
|
||||
@@ -154,13 +180,14 @@ namespace Launcher {
|
||||
void InitializeComponent(void)
|
||||
{
|
||||
this->components = (gcnew System::ComponentModel::Container());
|
||||
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ui::typeid));
|
||||
System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ui::typeid));
|
||||
this->button_Launch = (gcnew System::Windows::Forms::Button());
|
||||
this->button_Exit = (gcnew System::Windows::Forms::Button());
|
||||
this->button_Help = (gcnew System::Windows::Forms::Button());
|
||||
this->groupBox_ScreenRes = (gcnew System::Windows::Forms::GroupBox());
|
||||
this->panel_ScreenRes = (gcnew System::Windows::Forms::Panel());
|
||||
this->tabControl = (gcnew System::Windows::Forms::TabControl());
|
||||
this->tabPage_Resolution = (gcnew System::Windows::Forms::TabPage());
|
||||
this->labelGPU = (gcnew System::Windows::Forms::Label());
|
||||
this->groupBox_InternalRes = (gcnew System::Windows::Forms::GroupBox());
|
||||
this->panel_IntRes = (gcnew System::Windows::Forms::Panel());
|
||||
this->tabPage_Patches = (gcnew System::Windows::Forms::TabPage());
|
||||
@@ -185,42 +212,48 @@ namespace Launcher {
|
||||
//
|
||||
this->button_Launch->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
|
||||
this->button_Launch->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Launch->Location = System::Drawing::Point(18, 267);
|
||||
this->button_Launch->Location = System::Drawing::Point(25, 473);
|
||||
this->button_Launch->Margin = System::Windows::Forms::Padding(4);
|
||||
this->button_Launch->Name = L"button_Launch";
|
||||
this->button_Launch->Size = System::Drawing::Size(75, 23);
|
||||
this->button_Launch->Size = System::Drawing::Size(112, 34);
|
||||
this->button_Launch->TabIndex = 20;
|
||||
this->button_Launch->Text = L"Launch";
|
||||
this->button_Launch->Click += gcnew System::EventHandler(this, &ui::Button_Launch_Click);
|
||||
//
|
||||
// button_Exit
|
||||
// button_Help
|
||||
//
|
||||
this->button_Exit->DialogResult = System::Windows::Forms::DialogResult::Cancel;
|
||||
this->button_Exit->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
|
||||
this->button_Exit->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Exit->Location = System::Drawing::Point(139, 267);
|
||||
this->button_Exit->Name = L"button_Exit";
|
||||
this->button_Exit->Size = System::Drawing::Size(75, 23);
|
||||
this->button_Exit->TabIndex = 21;
|
||||
this->button_Exit->Text = L"Exit";
|
||||
this->button_Exit->Click += gcnew System::EventHandler(this, &ui::Button_Exit_Click);
|
||||
this->button_Help->DialogResult = System::Windows::Forms::DialogResult::Cancel;
|
||||
this->button_Help->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
|
||||
this->button_Help->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Help->Location = System::Drawing::Point(151, 473);
|
||||
this->button_Help->Margin = System::Windows::Forms::Padding(4);
|
||||
this->button_Help->Name = L"button_Help";
|
||||
this->button_Help->Size = System::Drawing::Size(112, 34);
|
||||
this->button_Help->TabIndex = 21;
|
||||
this->button_Help->Text = L"Get help";
|
||||
this->button_Help->Click += gcnew System::EventHandler(this, &ui::Button_Help_Click);
|
||||
//
|
||||
// groupBox_ScreenRes
|
||||
//
|
||||
this->groupBox_ScreenRes->Controls->Add(this->panel_ScreenRes);
|
||||
this->groupBox_ScreenRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_ScreenRes->ForeColor = System::Drawing::Color::White;
|
||||
this->groupBox_ScreenRes->Location = System::Drawing::Point(8, 6);
|
||||
this->groupBox_ScreenRes->Location = System::Drawing::Point(8, 9);
|
||||
this->groupBox_ScreenRes->Margin = System::Windows::Forms::Padding(4);
|
||||
this->groupBox_ScreenRes->Name = L"groupBox_ScreenRes";
|
||||
this->groupBox_ScreenRes->Size = System::Drawing::Size(208, 133);
|
||||
this->groupBox_ScreenRes->Padding = System::Windows::Forms::Padding(4);
|
||||
this->groupBox_ScreenRes->Size = System::Drawing::Size(417, 205);
|
||||
this->groupBox_ScreenRes->TabIndex = 10;
|
||||
this->groupBox_ScreenRes->TabStop = false;
|
||||
this->groupBox_ScreenRes->Text = L"Screen Resolution";
|
||||
//
|
||||
// panel_ScreenRes
|
||||
//
|
||||
this->panel_ScreenRes->Location = System::Drawing::Point(4, 19);
|
||||
this->panel_ScreenRes->AutoScroll = true;
|
||||
this->panel_ScreenRes->Location = System::Drawing::Point(6, 28);
|
||||
this->panel_ScreenRes->Margin = System::Windows::Forms::Padding(4);
|
||||
this->panel_ScreenRes->Name = L"panel_ScreenRes";
|
||||
this->panel_ScreenRes->Size = System::Drawing::Size(200, 108);
|
||||
this->panel_ScreenRes->Size = System::Drawing::Size(403, 169);
|
||||
this->panel_ScreenRes->TabIndex = 0;
|
||||
//
|
||||
// tabControl
|
||||
@@ -231,41 +264,59 @@ namespace Launcher {
|
||||
this->tabControl->Controls->Add(this->tabPage_Playerdata);
|
||||
this->tabControl->Controls->Add(this->tabPage_Components);
|
||||
this->tabControl->Location = System::Drawing::Point(0, 0);
|
||||
this->tabControl->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabControl->Name = L"tabControl";
|
||||
this->tabControl->SelectedIndex = 0;
|
||||
this->tabControl->Size = System::Drawing::Size(233, 261);
|
||||
this->tabControl->Size = System::Drawing::Size(441, 465);
|
||||
this->tabControl->TabIndex = 10;
|
||||
//
|
||||
// tabPage_Resolution
|
||||
//
|
||||
this->tabPage_Resolution->BackColor = 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->BackColor = System::Drawing::Color::Transparent;
|
||||
this->tabPage_Resolution->BackgroundImage = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"tabPage_Resolution.BackgroundImage")));
|
||||
this->tabPage_Resolution->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
|
||||
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->Location = System::Drawing::Point(4, 25);
|
||||
this->tabPage_Resolution->Location = System::Drawing::Point(4, 32);
|
||||
this->tabPage_Resolution->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Resolution->Name = L"tabPage_Resolution";
|
||||
this->tabPage_Resolution->Padding = System::Windows::Forms::Padding(3);
|
||||
this->tabPage_Resolution->Size = System::Drawing::Size(225, 232);
|
||||
this->tabPage_Resolution->Padding = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Resolution->Size = System::Drawing::Size(433, 429);
|
||||
this->tabPage_Resolution->TabIndex = 0;
|
||||
this->tabPage_Resolution->Text = L"Resolution";
|
||||
//
|
||||
// labelGPU
|
||||
//
|
||||
this->labelGPU->AutoSize = true;
|
||||
this->labelGPU->Location = System::Drawing::Point(12, 359);
|
||||
this->labelGPU->MinimumSize = System::Drawing::Size(410, 20);
|
||||
this->labelGPU->Name = L"labelGPU";
|
||||
this->labelGPU->Size = System::Drawing::Size(410, 20);
|
||||
this->labelGPU->TabIndex = 21;
|
||||
this->labelGPU->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
|
||||
//
|
||||
// groupBox_InternalRes
|
||||
//
|
||||
this->groupBox_InternalRes->Controls->Add(this->panel_IntRes);
|
||||
this->groupBox_InternalRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_InternalRes->ForeColor = System::Drawing::Color::White;
|
||||
this->groupBox_InternalRes->Location = System::Drawing::Point(8, 145);
|
||||
this->groupBox_InternalRes->Location = System::Drawing::Point(8, 222);
|
||||
this->groupBox_InternalRes->Margin = System::Windows::Forms::Padding(4);
|
||||
this->groupBox_InternalRes->Name = L"groupBox_InternalRes";
|
||||
this->groupBox_InternalRes->Size = System::Drawing::Size(208, 83);
|
||||
this->groupBox_InternalRes->Padding = System::Windows::Forms::Padding(4);
|
||||
this->groupBox_InternalRes->Size = System::Drawing::Size(417, 124);
|
||||
this->groupBox_InternalRes->TabIndex = 20;
|
||||
this->groupBox_InternalRes->TabStop = false;
|
||||
this->groupBox_InternalRes->Text = L"Internal Resolution";
|
||||
//
|
||||
// panel_IntRes
|
||||
//
|
||||
this->panel_IntRes->Location = System::Drawing::Point(4, 19);
|
||||
this->panel_IntRes->AutoScroll = true;
|
||||
this->panel_IntRes->Location = System::Drawing::Point(6, 28);
|
||||
this->panel_IntRes->Margin = System::Windows::Forms::Padding(4);
|
||||
this->panel_IntRes->Name = L"panel_IntRes";
|
||||
this->panel_IntRes->Size = System::Drawing::Size(200, 58);
|
||||
this->panel_IntRes->Size = System::Drawing::Size(403, 88);
|
||||
this->panel_IntRes->TabIndex = 1;
|
||||
//
|
||||
// tabPage_Patches
|
||||
@@ -273,9 +324,10 @@ namespace Launcher {
|
||||
this->tabPage_Patches->BackColor = 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_Patches->Controls->Add(this->panel_Patches);
|
||||
this->tabPage_Patches->Location = System::Drawing::Point(4, 25);
|
||||
this->tabPage_Patches->Location = System::Drawing::Point(4, 32);
|
||||
this->tabPage_Patches->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Patches->Name = L"tabPage_Patches";
|
||||
this->tabPage_Patches->Size = System::Drawing::Size(225, 232);
|
||||
this->tabPage_Patches->Size = System::Drawing::Size(433, 429);
|
||||
this->tabPage_Patches->TabIndex = 1;
|
||||
this->tabPage_Patches->Text = L"Options";
|
||||
//
|
||||
@@ -283,18 +335,20 @@ namespace Launcher {
|
||||
//
|
||||
this->panel_Patches->AutoScroll = true;
|
||||
this->panel_Patches->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Patches->Margin = System::Windows::Forms::Padding(4);
|
||||
this->panel_Patches->Name = L"panel_Patches";
|
||||
this->panel_Patches->Size = System::Drawing::Size(225, 232);
|
||||
this->panel_Patches->Size = System::Drawing::Size(429, 425);
|
||||
this->panel_Patches->TabIndex = 9;
|
||||
//
|
||||
// tabPage_Playerdata
|
||||
//
|
||||
this->tabPage_Playerdata->BackColor = 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_Playerdata->BackColor = 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_Playerdata->Controls->Add(this->panel_Playerdata);
|
||||
this->tabPage_Playerdata->Location = System::Drawing::Point(4, 25);
|
||||
this->tabPage_Playerdata->Location = System::Drawing::Point(4, 32);
|
||||
this->tabPage_Playerdata->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Playerdata->Name = L"tabPage_Playerdata";
|
||||
this->tabPage_Playerdata->Size = System::Drawing::Size(225, 232);
|
||||
this->tabPage_Playerdata->Size = System::Drawing::Size(433, 429);
|
||||
this->tabPage_Playerdata->TabIndex = 3;
|
||||
this->tabPage_Playerdata->Text = L"Player Data";
|
||||
//
|
||||
@@ -302,19 +356,21 @@ namespace Launcher {
|
||||
//
|
||||
this->panel_Playerdata->AutoScroll = true;
|
||||
this->panel_Playerdata->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Playerdata->Margin = System::Windows::Forms::Padding(4);
|
||||
this->panel_Playerdata->Name = L"panel_Playerdata";
|
||||
this->panel_Playerdata->Size = System::Drawing::Size(225, 232);
|
||||
this->panel_Playerdata->Size = System::Drawing::Size(429, 425);
|
||||
this->panel_Playerdata->TabIndex = 1;
|
||||
//
|
||||
// tabPage_Components
|
||||
//
|
||||
this->tabPage_Components->BackColor = 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_Components->BackColor = 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_Components->Controls->Add(this->panel_Components);
|
||||
this->tabPage_Components->Location = System::Drawing::Point(4, 25);
|
||||
this->tabPage_Components->Location = System::Drawing::Point(4, 32);
|
||||
this->tabPage_Components->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Components->Name = L"tabPage_Components";
|
||||
this->tabPage_Components->Padding = System::Windows::Forms::Padding(3);
|
||||
this->tabPage_Components->Size = System::Drawing::Size(225, 232);
|
||||
this->tabPage_Components->Padding = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Components->Size = System::Drawing::Size(433, 429);
|
||||
this->tabPage_Components->TabIndex = 2;
|
||||
this->tabPage_Components->Text = L"Components";
|
||||
//
|
||||
@@ -322,8 +378,9 @@ namespace Launcher {
|
||||
//
|
||||
this->panel_Components->AutoScroll = true;
|
||||
this->panel_Components->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Components->Margin = System::Windows::Forms::Padding(4);
|
||||
this->panel_Components->Name = L"panel_Components";
|
||||
this->panel_Components->Size = System::Drawing::Size(225, 232);
|
||||
this->panel_Components->Size = System::Drawing::Size(429, 425);
|
||||
this->panel_Components->TabIndex = 0;
|
||||
//
|
||||
// button_Discord
|
||||
@@ -334,9 +391,10 @@ namespace Launcher {
|
||||
this->button_Discord->FlatAppearance->MouseOverBackColor = System::Drawing::Color::Transparent;
|
||||
this->button_Discord->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Discord->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"button_Discord.Image")));
|
||||
this->button_Discord->Location = System::Drawing::Point(239, 12);
|
||||
this->button_Discord->Location = System::Drawing::Point(295, 459);
|
||||
this->button_Discord->Margin = System::Windows::Forms::Padding(4);
|
||||
this->button_Discord->Name = L"button_Discord";
|
||||
this->button_Discord->Size = System::Drawing::Size(42, 42);
|
||||
this->button_Discord->Size = System::Drawing::Size(63, 63);
|
||||
this->button_Discord->TabIndex = 31;
|
||||
this->button_Discord->UseVisualStyleBackColor = false;
|
||||
this->button_Discord->Click += gcnew System::EventHandler(this, &ui::button_Discord_Click);
|
||||
@@ -344,14 +402,16 @@ namespace Launcher {
|
||||
// button_github
|
||||
//
|
||||
this->button_github->BackColor = System::Drawing::Color::Transparent;
|
||||
this->button_github->Cursor = System::Windows::Forms::Cursors::Hand;
|
||||
this->button_github->FlatAppearance->BorderSize = 0;
|
||||
this->button_github->FlatAppearance->MouseDownBackColor = System::Drawing::Color::Transparent;
|
||||
this->button_github->FlatAppearance->MouseOverBackColor = System::Drawing::Color::Transparent;
|
||||
this->button_github->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_github->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"button_github.Image")));
|
||||
this->button_github->Location = System::Drawing::Point(239, 60);
|
||||
this->button_github->Location = System::Drawing::Point(378, 459);
|
||||
this->button_github->Margin = System::Windows::Forms::Padding(4);
|
||||
this->button_github->Name = L"button_github";
|
||||
this->button_github->Size = System::Drawing::Size(42, 42);
|
||||
this->button_github->Size = System::Drawing::Size(63, 63);
|
||||
this->button_github->TabIndex = 32;
|
||||
this->button_github->UseVisualStyleBackColor = false;
|
||||
this->button_github->Click += gcnew System::EventHandler(this, &ui::button_github_Click);
|
||||
@@ -359,24 +419,24 @@ namespace Launcher {
|
||||
// ui
|
||||
//
|
||||
this->AcceptButton = this->button_Launch;
|
||||
this->AutoScaleDimensions = System::Drawing::SizeF(96, 96);
|
||||
this->AutoScaleDimensions = System::Drawing::SizeF(144, 144);
|
||||
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Dpi;
|
||||
this->AutoSize = true;
|
||||
this->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;
|
||||
this->BackColor = 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->BackgroundImage = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"$this.BackgroundImage")));
|
||||
this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
|
||||
this->CancelButton = this->button_Exit;
|
||||
this->ClientSize = System::Drawing::Size(288, 297);
|
||||
this->ClientSize = System::Drawing::Size(440, 514);
|
||||
this->Controls->Add(this->tabControl);
|
||||
this->Controls->Add(this->button_Help);
|
||||
this->Controls->Add(this->button_Launch);
|
||||
this->Controls->Add(this->button_github);
|
||||
this->Controls->Add(this->button_Discord);
|
||||
this->Controls->Add(this->tabControl);
|
||||
this->Controls->Add(this->button_Exit);
|
||||
this->Controls->Add(this->button_Launch);
|
||||
this->DoubleBuffered = true;
|
||||
this->ForeColor = System::Drawing::Color::White;
|
||||
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog;
|
||||
this->Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L"$this.Icon")));
|
||||
this->Margin = System::Windows::Forms::Padding(4);
|
||||
this->MaximizeBox = false;
|
||||
this->MinimizeBox = false;
|
||||
this->Name = L"ui";
|
||||
@@ -388,6 +448,7 @@ namespace Launcher {
|
||||
this->groupBox_ScreenRes->ResumeLayout(false);
|
||||
this->tabControl->ResumeLayout(false);
|
||||
this->tabPage_Resolution->ResumeLayout(false);
|
||||
this->tabPage_Resolution->PerformLayout();
|
||||
this->groupBox_InternalRes->ResumeLayout(false);
|
||||
this->tabPage_Patches->ResumeLayout(false);
|
||||
this->tabPage_Playerdata->ResumeLayout(false);
|
||||
@@ -424,8 +485,8 @@ private: System::Void SaveSettings() {
|
||||
}
|
||||
private: System::Void Ui_Load(System::Object^ sender, System::EventArgs^ e){
|
||||
}
|
||||
private: System::Void Button_Exit_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
this->Close();
|
||||
private: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
System::Diagnostics::Process::Start("https://notabug.org/nastys/PD-Loader/wiki");
|
||||
}
|
||||
private: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
|
||||
|
||||
+19572
-4267
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user