using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.Core.Recognition.OpenCv;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.Genshin.Settings;
using BetterGenshinImpact.Helpers;
using BetterGenshinImpact.Helpers.DpiAwareness;
using BetterGenshinImpact.View.Drawable;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;
using Microsoft.Extensions.Logging;
using Serilog.Sinks.RichTextBox.Abstraction;
using System;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Threading;
using Vanara.PInvoke;
using FontFamily = System.Windows.Media.FontFamily;
namespace BetterGenshinImpact.View;
///
/// 一个用于覆盖在游戏窗口上的窗口,用于显示识别结果、显示日志、设置区域位置等
/// 请使用 Instance 方法获取单例
///
public partial class MaskWindow : Window
{
private static MaskWindow? _maskWindow;
private static readonly Typeface _typeface;
private nint _hWnd;
private IRichTextBox? _richTextBox;
private readonly ILogger _logger = App.GetLogger();
static MaskWindow()
{
if (Application.Current.TryFindResource("TextThemeFontFamily") is FontFamily fontFamily)
{
_typeface = fontFamily.GetTypefaces().First();
}
else
{
_typeface = new FontFamily("Microsoft Yahei UI").GetTypefaces().First();
}
DefaultStyleKeyProperty.OverrideMetadata(typeof(MaskWindow), new FrameworkPropertyMetadata(typeof(MaskWindow)));
}
public static MaskWindow Instance()
{
if (_maskWindow == null)
{
throw new Exception("MaskWindow 未初始化");
}
return _maskWindow;
}
public bool IsExist()
{
return _maskWindow != null && PresentationSource.FromVisual(_maskWindow) != null;
}
public void RefreshPosition()
{
if (TaskContext.Instance().Config.MaskWindowConfig.UseSubform)
{
RefreshPositionForSubform();
}
else
{
RefreshPositionForNormal();
}
}
public void RefreshPositionForNormal()
{
var currentRect = SystemControl.GetCaptureRect(TaskContext.Instance().GameHandle);
Invoke(() =>
{
double dpiScale = DpiHelper.ScaleY;
Left = currentRect.Left / dpiScale;
Top = currentRect.Top / dpiScale;
Width = currentRect.Width / dpiScale;
Height = currentRect.Height / dpiScale;
Canvas.SetTop(LogTextBoxWrapper, Height - LogTextBoxWrapper.Height - 65);
Canvas.SetLeft(LogTextBoxWrapper, 20);
Canvas.SetTop(StatusWrapper, Height - LogTextBoxWrapper.Height - 90);
Canvas.SetLeft(StatusWrapper, 20);
});
// 重新计算控件位置
// shit code 预定了
WeakReferenceMessenger.Default.Send(new PropertyChangedMessage