138 lines
3.5 KiB
C#
138 lines
3.5 KiB
C#
using System.Reflection;
|
|
using Sandbox.Game;
|
|
using VRage;
|
|
|
|
namespace PluginLoader.GUI;
|
|
|
|
public class SplashScreen : Form
|
|
{
|
|
private const float barWidth = 0.98f; // 98% of width
|
|
private const float barHeight = 0.06f; // 6% of height
|
|
private readonly RectangleF bar;
|
|
private readonly PictureBox gifBox;
|
|
|
|
private readonly bool invalid;
|
|
private readonly Label lbl;
|
|
|
|
private float barValue = float.NaN;
|
|
|
|
public SplashScreen()
|
|
{
|
|
Image gif;
|
|
if (Application.OpenForms.Count == 0 || !TryLoadImage(out gif))
|
|
{
|
|
invalid = true;
|
|
return;
|
|
}
|
|
|
|
var defaultSplash = Application.OpenForms[0];
|
|
Size = defaultSplash.Size;
|
|
ClientSize = defaultSplash.ClientSize;
|
|
MyVRage.Platform.Windows.HideSplashScreen();
|
|
|
|
Name = "SplashScreenPluginLoader";
|
|
TopMost = true;
|
|
FormBorderStyle = FormBorderStyle.None;
|
|
|
|
var barSize = new SizeF(Size.Width * barWidth, Size.Height * barHeight);
|
|
var padding = (1 - barWidth) * Size.Width * 0.5f;
|
|
var barStart = new PointF(padding, Size.Height - barSize.Height - padding);
|
|
bar = new(barStart, barSize);
|
|
|
|
var lblFont = new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold);
|
|
lbl = new()
|
|
{
|
|
Name = "PluginLoaderInfo",
|
|
Font = lblFont,
|
|
BackColor = Color.Black,
|
|
ForeColor = Color.White,
|
|
MaximumSize = Size,
|
|
Size = new(Size.Width, lblFont.Height),
|
|
TextAlign = ContentAlignment.MiddleCenter,
|
|
Location = new(0, (int)(barStart.Y - lblFont.Height - 1))
|
|
};
|
|
Controls.Add(lbl);
|
|
|
|
gifBox = new()
|
|
{
|
|
Name = "PluginLoaderAnimation",
|
|
Image = gif,
|
|
Size = Size,
|
|
AutoSize = false,
|
|
SizeMode = PictureBoxSizeMode.StretchImage
|
|
};
|
|
Controls.Add(gifBox);
|
|
|
|
gifBox.Paint += OnPictureBoxDraw;
|
|
|
|
CenterToScreen();
|
|
Show();
|
|
ForceUpdate();
|
|
}
|
|
|
|
public object GameInfo { get; private set; }
|
|
|
|
private bool TryLoadImage(out Image img)
|
|
{
|
|
try
|
|
{
|
|
var myAssembly = Assembly.GetExecutingAssembly();
|
|
var myStream = myAssembly.GetManifestResourceStream("PluginLoader.splash.gif");
|
|
img = new Bitmap(myStream);
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
img = null;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void SetText(string msg)
|
|
{
|
|
if (invalid)
|
|
return;
|
|
|
|
lbl.Text = msg;
|
|
barValue = float.NaN;
|
|
gifBox.Invalidate();
|
|
ForceUpdate();
|
|
}
|
|
|
|
public void SetBarValue(float percent = float.NaN)
|
|
{
|
|
if (invalid)
|
|
return;
|
|
|
|
barValue = percent;
|
|
gifBox.Invalidate();
|
|
ForceUpdate();
|
|
}
|
|
|
|
private void ForceUpdate()
|
|
{
|
|
Application.DoEvents();
|
|
}
|
|
|
|
private void OnPictureBoxDraw(object sender, PaintEventArgs e)
|
|
{
|
|
if (!float.IsNaN(barValue))
|
|
{
|
|
var graphics = e.Graphics;
|
|
graphics.FillRectangle(Brushes.DarkSlateGray, bar);
|
|
graphics.FillRectangle(Brushes.White, new RectangleF(bar.Location, new(bar.Width * barValue, bar.Height)));
|
|
}
|
|
}
|
|
|
|
public void Delete()
|
|
{
|
|
if (invalid)
|
|
return;
|
|
|
|
gifBox.Paint -= OnPictureBoxDraw;
|
|
Close();
|
|
Dispose();
|
|
ForceUpdate();
|
|
MyVRage.Platform.Windows.ShowSplashScreen(MyPerGameSettings.BasicGameInfo.SplashScreenImage, new(0.7f, 0.7f));
|
|
}
|
|
} |