231 lines
5.8 KiB
C#
231 lines
5.8 KiB
C#
#define DEBUG
|
|
using System;
|
|
using System.CodeDom.Compiler;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Media;
|
|
using AxCopilot.Services;
|
|
using Microsoft.Web.WebView2.Core;
|
|
using Microsoft.Web.WebView2.Wpf;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public class GuideViewerWindow : Window, IComponentConnector
|
|
{
|
|
private string? _pendingHtml;
|
|
|
|
private Uri? _pendingUri;
|
|
|
|
internal TextBlock TitleText;
|
|
|
|
internal TextBlock MaxBtnIcon;
|
|
|
|
internal WebView2 GuideBrowser;
|
|
|
|
private bool _contentLoaded;
|
|
|
|
public GuideViewerWindow()
|
|
{
|
|
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();
|
|
}
|
|
};
|
|
base.StateChanged += delegate
|
|
{
|
|
MaxBtnIcon.Text = ((base.WindowState == WindowState.Maximized) ? "\ue923" : "\ue922");
|
|
};
|
|
}
|
|
|
|
private async void OnLoaded(object sender, RoutedEventArgs e)
|
|
{
|
|
bool devMode = (Application.Current as App)?.SettingsService?.Settings?.Llm?.DevMode == true;
|
|
PrepareGuide(devMode);
|
|
try
|
|
{
|
|
CoreWebView2Environment env = await CoreWebView2Environment.CreateAsync(null, Path.Combine(Path.GetTempPath(), "AxCopilot_GuideViewer"));
|
|
await GuideBrowser.EnsureCoreWebView2Async(env);
|
|
if (_pendingHtml != null)
|
|
{
|
|
GuideBrowser.NavigateToString(_pendingHtml);
|
|
}
|
|
else if (_pendingUri != null)
|
|
{
|
|
GuideBrowser.Source = _pendingUri;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.WriteLine("WebView2 init error: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
public void PrepareGuide(bool devMode)
|
|
{
|
|
TitleText.Text = (devMode ? "AX Copilot 개발자 가이드" : "AX Copilot 사용 가이드");
|
|
base.Title = (devMode ? "AX Copilot — 개발자 가이드" : "AX Copilot — 사용 가이드");
|
|
try
|
|
{
|
|
string path = Path.GetDirectoryName(Environment.ProcessPath) ?? AppContext.BaseDirectory;
|
|
string path2 = Path.Combine(path, "Assets");
|
|
string text = (devMode ? Path.Combine(path2, "guide_dev.enc") : Path.Combine(path2, "guide_user.enc"));
|
|
if (File.Exists(text))
|
|
{
|
|
_pendingHtml = GuideEncryptor.DecryptToString(text);
|
|
return;
|
|
}
|
|
string text2 = (devMode ? Path.Combine(path2, "AX Copilot 개발자가이드.htm") : Path.Combine(path2, "AX Copilot 사용가이드.htm"));
|
|
if (File.Exists(text2))
|
|
{
|
|
_pendingUri = new Uri(text2);
|
|
}
|
|
else
|
|
{
|
|
_pendingHtml = "<html><body style='font-family:Segoe UI;padding:40px;color:#666;'><h2>가이드를 찾을 수 없습니다</h2><p>경로: " + text + "</p></body></html>";
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_pendingHtml = "<html><body style='font-family:Segoe UI;padding:40px;color:#c00;'><h2>가이드 로드 오류</h2><p>" + ex.Message + "</p></body></html>";
|
|
}
|
|
}
|
|
|
|
public void LoadGuide(bool devMode)
|
|
{
|
|
PrepareGuide(devMode);
|
|
if (GuideBrowser.CoreWebView2 != null)
|
|
{
|
|
if (_pendingHtml != null)
|
|
{
|
|
GuideBrowser.NavigateToString(_pendingHtml);
|
|
}
|
|
else if (_pendingUri != null)
|
|
{
|
|
GuideBrowser.Source = _pendingUri;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ClickCount == 2)
|
|
{
|
|
ToggleMaximize();
|
|
}
|
|
else
|
|
{
|
|
DragMove();
|
|
}
|
|
}
|
|
|
|
private void MinBtn_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
base.WindowState = WindowState.Minimized;
|
|
}
|
|
|
|
private void MaxBtn_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
ToggleMaximize();
|
|
}
|
|
|
|
private void CloseBtn_Click(object sender, MouseButtonEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
Close();
|
|
}
|
|
|
|
private void ToggleMaximize()
|
|
{
|
|
base.WindowState = ((base.WindowState != WindowState.Maximized) ? WindowState.Maximized : WindowState.Normal);
|
|
}
|
|
|
|
private void TitleBtn_Enter(object sender, MouseEventArgs e)
|
|
{
|
|
if (sender is Border border)
|
|
{
|
|
border.Background = (TryFindResource("ItemHoverBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue));
|
|
}
|
|
}
|
|
|
|
private void CloseBtnEnter(object sender, MouseEventArgs e)
|
|
{
|
|
if (sender is Border border)
|
|
{
|
|
border.Background = new SolidColorBrush(Color.FromArgb(68, byte.MaxValue, 64, 64));
|
|
}
|
|
}
|
|
|
|
private void TitleBtn_Leave(object sender, MouseEventArgs e)
|
|
{
|
|
if (sender is Border border)
|
|
{
|
|
border.Background = Brushes.Transparent;
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
|
public void InitializeComponent()
|
|
{
|
|
if (!_contentLoaded)
|
|
{
|
|
_contentLoaded = true;
|
|
Uri resourceLocator = new Uri("/AxCopilot;component/views/guideviewerwindow.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:
|
|
((Border)target).MouseLeftButtonDown += TitleBar_MouseLeftButtonDown;
|
|
break;
|
|
case 2:
|
|
TitleText = (TextBlock)target;
|
|
break;
|
|
case 3:
|
|
((Border)target).MouseLeftButtonDown += MinBtn_Click;
|
|
((Border)target).MouseEnter += TitleBtn_Enter;
|
|
((Border)target).MouseLeave += TitleBtn_Leave;
|
|
break;
|
|
case 4:
|
|
((Border)target).MouseLeftButtonDown += MaxBtn_Click;
|
|
((Border)target).MouseEnter += TitleBtn_Enter;
|
|
((Border)target).MouseLeave += TitleBtn_Leave;
|
|
break;
|
|
case 5:
|
|
MaxBtnIcon = (TextBlock)target;
|
|
break;
|
|
case 6:
|
|
((Border)target).MouseLeftButtonDown += CloseBtn_Click;
|
|
((Border)target).MouseEnter += CloseBtnEnter;
|
|
((Border)target).MouseLeave += TitleBtn_Leave;
|
|
break;
|
|
case 7:
|
|
GuideBrowser = (WebView2)target;
|
|
break;
|
|
default:
|
|
_contentLoaded = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|