338 lines
7.8 KiB
C#
338 lines
7.8 KiB
C#
using System;
|
|
using System.CodeDom.Compiler;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Text.Json;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Media.Imaging;
|
|
using System.Windows.Resources;
|
|
using System.Windows.Shapes;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public class AboutWindow : Window, IComponentConnector
|
|
{
|
|
internal Canvas DiamondIconCanvas;
|
|
|
|
internal Image AppIconImage;
|
|
|
|
internal TextBlock FallbackIcon;
|
|
|
|
internal Image MascotImage;
|
|
|
|
internal TextBlock AppNameText;
|
|
|
|
internal TextBlock VersionText;
|
|
|
|
internal Grid MascotOverlay;
|
|
|
|
internal Image MascotOverlayImage;
|
|
|
|
internal TextBlock PurposeText;
|
|
|
|
internal TextBlock CompanyNameText;
|
|
|
|
internal Button BlogLinkBtn;
|
|
|
|
internal Grid ContributorsGrid;
|
|
|
|
internal TextBlock ContributorsText;
|
|
|
|
internal TextBlock BuildInfoText;
|
|
|
|
private bool _contentLoaded;
|
|
|
|
public AboutWindow()
|
|
{
|
|
InitializeComponent();
|
|
base.Loaded += OnLoaded;
|
|
base.KeyDown += delegate(object _, KeyEventArgs e)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0009: Invalid comparison between Unknown and I4
|
|
if ((int)e.Key == 13)
|
|
{
|
|
Close();
|
|
}
|
|
};
|
|
}
|
|
|
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
|
{
|
|
Version version = Assembly.GetExecutingAssembly().GetName().Version;
|
|
VersionText.Text = ((version != null) ? $"v{version.Major}.{version.Minor}.{version.Build}" : "v1.0");
|
|
BuildInfoText.Text = "AX Copilot · Commander + Agent · © 2026";
|
|
TryLoadBranding(version);
|
|
TryLoadAppIcon();
|
|
TryLoadMascot();
|
|
}
|
|
|
|
private void TryLoadBranding(Version? version)
|
|
{
|
|
try
|
|
{
|
|
Uri uriResource = new Uri("pack://application:,,,/Assets/about.json");
|
|
StreamResourceInfo resourceStream = Application.GetResourceStream(uriResource);
|
|
if (resourceStream == null)
|
|
{
|
|
return;
|
|
}
|
|
using StreamReader streamReader = new StreamReader(resourceStream.Stream);
|
|
using JsonDocument jsonDocument = JsonDocument.Parse(streamReader.ReadToEnd());
|
|
JsonElement root = jsonDocument.RootElement;
|
|
string text = Get("appName");
|
|
string text2 = Get("companyName");
|
|
string text3 = Get("authorName");
|
|
string text4 = Get("authorTitle");
|
|
string text5 = Get("purpose");
|
|
string value = Get("copyright");
|
|
string text6 = Get("blogUrl");
|
|
if (!string.IsNullOrWhiteSpace(text))
|
|
{
|
|
AppNameText.Text = text;
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(text2))
|
|
{
|
|
CompanyNameText.Text = text2;
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(text5))
|
|
{
|
|
PurposeText.Text = text5;
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(value))
|
|
{
|
|
string value2 = ((version != null) ? $"v{version.Major}.{version.Minor}.{version.Build}" : "v1.0");
|
|
BuildInfoText.Text = $"{text} · {value2} · Commander + Agent · {value}";
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(text6) && BlogLinkBtn != null)
|
|
{
|
|
BlogLinkBtn.Content = text6;
|
|
}
|
|
string text7 = Get("contributors");
|
|
if (!string.IsNullOrWhiteSpace(text7))
|
|
{
|
|
ContributorsText.Text = text7;
|
|
ContributorsGrid.Visibility = Visibility.Visible;
|
|
}
|
|
string Get(string key)
|
|
{
|
|
JsonElement value3;
|
|
return root.TryGetProperty(key, out value3) ? (value3.GetString() ?? "") : "";
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
private void TryLoadAppIcon()
|
|
{
|
|
try
|
|
{
|
|
Uri uriResource = new Uri("pack://application:,,,/Assets/icon.ico");
|
|
Stream stream = Application.GetResourceStream(uriResource)?.Stream;
|
|
if (stream != null)
|
|
{
|
|
BitmapImage bitmapImage = new BitmapImage();
|
|
bitmapImage.BeginInit();
|
|
bitmapImage.StreamSource = stream;
|
|
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
|
|
bitmapImage.DecodePixelWidth = 176;
|
|
bitmapImage.EndInit();
|
|
((Freezable)bitmapImage).Freeze();
|
|
AppIconImage.Source = bitmapImage;
|
|
FallbackIcon.Visibility = Visibility.Collapsed;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
private void TryLoadMascot()
|
|
{
|
|
string[] array = new string[3] { "mascot.png", "mascot.jpg", "mascot.webp" };
|
|
foreach (string text in array)
|
|
{
|
|
try
|
|
{
|
|
Uri uriResource = new Uri("pack://application:,,,/Assets/" + text);
|
|
Stream stream = Application.GetResourceStream(uriResource)?.Stream;
|
|
if (stream == null)
|
|
{
|
|
continue;
|
|
}
|
|
BitmapImage bitmapImage = new BitmapImage();
|
|
bitmapImage.BeginInit();
|
|
bitmapImage.StreamSource = stream;
|
|
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
|
|
bitmapImage.DecodePixelWidth = 400;
|
|
bitmapImage.EndInit();
|
|
((Freezable)bitmapImage).Freeze();
|
|
MascotImage.Source = bitmapImage;
|
|
return;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
string path = System.IO.Path.GetDirectoryName(Environment.ProcessPath) ?? AppContext.BaseDirectory;
|
|
string[] array2 = new string[3] { "mascot.png", "mascot.jpg", "mascot.webp" };
|
|
foreach (string path2 in array2)
|
|
{
|
|
string text2 = System.IO.Path.Combine(path, "Assets", path2);
|
|
if (File.Exists(text2))
|
|
{
|
|
try
|
|
{
|
|
BitmapImage bitmapImage2 = new BitmapImage();
|
|
bitmapImage2.BeginInit();
|
|
bitmapImage2.UriSource = new Uri(text2, UriKind.Absolute);
|
|
bitmapImage2.CacheOption = BitmapCacheOption.OnLoad;
|
|
bitmapImage2.DecodePixelWidth = 400;
|
|
bitmapImage2.EndInit();
|
|
MascotImage.Source = bitmapImage2;
|
|
break;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ShowMascot_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (MascotImage.Source != null)
|
|
{
|
|
MascotOverlayImage.Source = MascotImage.Source;
|
|
MascotOverlay.Visibility = Visibility.Visible;
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
private void HideMascot_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
MascotOverlay.Visibility = Visibility.Collapsed;
|
|
e.Handled = true;
|
|
}
|
|
|
|
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ChangedButton == MouseButton.Left && e.LeftButton == MouseButtonState.Pressed)
|
|
{
|
|
try
|
|
{
|
|
DragMove();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Close_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void Blog_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Process.Start(new ProcessStartInfo("https://www.swarchitect.net")
|
|
{
|
|
UseShellExecute = true
|
|
});
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
|
public void InitializeComponent()
|
|
{
|
|
if (!_contentLoaded)
|
|
{
|
|
_contentLoaded = true;
|
|
Uri resourceLocator = new Uri("/AxCopilot;component/views/aboutwindow.xaml", UriKind.Relative);
|
|
Application.LoadComponent(this, resourceLocator);
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
void IComponentConnector.Connect(int connectionId, object target)
|
|
{
|
|
switch (connectionId)
|
|
{
|
|
case 1:
|
|
((AboutWindow)target).MouseDown += Window_MouseDown;
|
|
break;
|
|
case 2:
|
|
((Button)target).Click += Close_Click;
|
|
break;
|
|
case 3:
|
|
DiamondIconCanvas = (Canvas)target;
|
|
break;
|
|
case 4:
|
|
AppIconImage = (Image)target;
|
|
break;
|
|
case 5:
|
|
FallbackIcon = (TextBlock)target;
|
|
break;
|
|
case 6:
|
|
MascotImage = (Image)target;
|
|
break;
|
|
case 7:
|
|
AppNameText = (TextBlock)target;
|
|
break;
|
|
case 8:
|
|
VersionText = (TextBlock)target;
|
|
break;
|
|
case 9:
|
|
MascotOverlay = (Grid)target;
|
|
break;
|
|
case 10:
|
|
((Rectangle)target).MouseDown += HideMascot_Click;
|
|
break;
|
|
case 11:
|
|
MascotOverlayImage = (Image)target;
|
|
break;
|
|
case 12:
|
|
PurposeText = (TextBlock)target;
|
|
break;
|
|
case 13:
|
|
((Grid)target).MouseDown += ShowMascot_Click;
|
|
break;
|
|
case 14:
|
|
CompanyNameText = (TextBlock)target;
|
|
break;
|
|
case 15:
|
|
BlogLinkBtn = (Button)target;
|
|
BlogLinkBtn.Click += Blog_Click;
|
|
break;
|
|
case 16:
|
|
ContributorsGrid = (Grid)target;
|
|
break;
|
|
case 17:
|
|
ContributorsText = (TextBlock)target;
|
|
break;
|
|
case 18:
|
|
BuildInfoText = (TextBlock)target;
|
|
break;
|
|
default:
|
|
_contentLoaded = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|