chovy-sign/ChovySign-GUI/Ps1/GameInfoSelector.axaml.cs

205 lines
5.9 KiB
C#

using Avalonia.Controls;
using Avalonia.Media.Imaging;
using ChovySign_GUI.Global;
using ChovySign_GUI.Popup.Global;
using GameBuilder.Pops;
using LibChovy.Art;
using System;
using System.IO;
using System.Threading.Tasks;
#pragma warning disable CS8601 // Possible null reference assignment.
// beacuse im checking if its null in the setter, but visual studio doesnt seem to understand :d
namespace ChovySign_GUI.Ps1
{
public partial class GameInfoSelector : UserControl
{
private byte[] iconCache;
private byte[] pic0Cache;
private byte[] pic1Cache;
public string DiscId
{
get
{
if (this.discId.Text is null) return "";
return this.discId.Text;
}
set
{
this.discId.Text = value;
}
}
public string Title
{
get
{
if (this.gameTitle.Text is null) return "";
return this.gameTitle.Text;
}
set
{
this.gameTitle.Text = value;
}
}
public byte[] Icon0
{
get
{
return iconCache;
}
set
{
if(value is not null)
iconCache = value;
loadIcon(iconCache);
}
}
public byte[] Pic0
{
get
{
return pic0Cache;
}
set
{
if (value is not null)
pic0Cache = value;
}
}
public byte[] Pic1
{
get
{
return pic1Cache;
}
set
{
if (value is not null)
pic1Cache = value;
}
}
private void loadIcon(byte[] imageData)
{
using (MemoryStream imageStream = new MemoryStream(imageData))
this.iconPreview.Source = new Bitmap(imageStream);
}
public async Task GetGameInfo(string cueFile)
{
try
{
PSInfo disc = new PSInfo(cueFile);
Title = disc.DiscName;
DiscId = disc.DiscId;
byte[] newCover = await Downloader.DownloadCover(disc);
loadIcon(newCover);
iconCache = newCover;
}
catch (Exception e) {
Window? currentWindow = this.VisualRoot as Window;
if (currentWindow is not Window) throw new Exception("could not find current window");
await MessageBox.Show(currentWindow, "unable to read cue sheet: " + Path.GetFileName(cueFile) + "\n" + e.Message + "\n\nSTACKTRACE: " + e.StackTrace, "cannot load cue sheet", MessageBox.MessageBoxButtons.Ok);
}
}
private async Task<byte[]?> doLoad(BrowseButton imgFile, int width, int height)
{
imgFile.IsEnabled = false;
if (imgFile.FilePath != "")
{
try
{
byte[] imageData = await Resizer.LoadImage(imgFile.FilePath, width, height);
imgFile.IsEnabled = true;
return imageData;
}
catch (Exception)
{
Window? currentWindow = this.VisualRoot as Window;
if (currentWindow is not Window) throw new Exception("could not find current window");
await MessageBox.Show(currentWindow, "The image you selected is could not be loaded!", "Invalid image.", MessageBox.MessageBoxButtons.Ok);
imgFile.FilePath = "";
};
}
imgFile.IsEnabled = true;
return null;
}
private async void onIconChange(object? sender, EventArgs e)
{
BrowseButton? button = sender as BrowseButton;
if (button is null) return;
Icon0 = await doLoad(button, 80, 80);
}
private async void onPic0Change(object? sender, EventArgs e)
{
BrowseButton? button = sender as BrowseButton;
if (button is null) return;
Pic0 = await doLoad(button, 310, 180);
}
private async void onPic1Change(object? sender, EventArgs e)
{
BrowseButton? button = sender as BrowseButton;
if (button is null) return;
Pic1 = await doLoad(button, 480, 272);
}
public event EventHandler<EventArgs>? TitleChanged;
protected virtual void OnTitleChanged(EventArgs e)
{
if (TitleChanged is not null)
TitleChanged(this, e);
}
public event EventHandler<EventArgs>? DiscIdChanged;
protected virtual void OnDiscIdChanged(EventArgs e)
{
if (DiscIdChanged is not null)
DiscIdChanged(this, e);
}
public GameInfoSelector()
{
InitializeComponent();
iconCache = LibChovy.Resources.ICON0;
pic0Cache = LibChovy.Resources.PIC0;
pic1Cache = LibChovy.Resources.PIC1;
loadIcon(iconCache);
this.iconFile.FileChanged += onIconChange;
this.pic0File.FileChanged += onPic0Change;
this.pic1File.FileChanged += onPic1Change;
this.gameTitle.TextChanged += onTitleChange;
this.discId.TextChanged += onDiscIdChange;
}
private void onDiscIdChange(object? sender, EventArgs e)
{
OnDiscIdChanged(new EventArgs());
}
private void onTitleChange(object? sender, EventArgs e)
{
OnTitleChanged(new EventArgs());
}
}
}
#pragma warning restore CS8601 // Possible null reference assignment.