XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text.Json;
using XFEEDToolBox.Controls;
using XFEEDToolBox.Core.Galaxy;

namespace XFEEDToolBox;

public partial class App
{
    private static async Task<object> RunGalaxyStateOptionsProbeAsync(string directory)
    {
        static void Require(bool value,string text){if(!value)throw new InvalidOperationException(text);}
        var previous=MainWindow.Content;
        var previousPosition=MainWindow.AppWindow.Position;
        var original=new HashSet<string>{"None","Boom","Unpopulated","Frontline"};
        var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.State,RequireOriginalStateFacts=true,Values=null,
            OriginalRouteOptionKeys=new Dictionary<GalaxyFilterCategory,IReadOnlySet<string>>{{GalaxyFilterCategory.State,original}}};
        var panel=new GalaxyFilterPanel{Filter=filter,Systems=Array.Empty<GalacticSystem>(),Width=420,
            QueryChoices=new[]{new GalaxyFilterChoice("publiconly","公共兼容项(本夹具不应显示)")}};
        var host=new Grid{Background=new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255,11,16,23))};
        host.Children.Add(new Border{Child=panel,HorizontalAlignment=HorizontalAlignment.Left,Margin=new(20)});MainWindow.Content=host;
        Panel? choiceContainer=null;
        // The visual tree retains removed rows during WinUI exit transitions.
        // After locating the source list, inspect its current logical children.
        CheckBox[] Rows()=>choiceContainer is{} current?current.Children.OfType<CheckBox>().ToArray():
            Descendants(panel).OfType<CheckBox>().Where(c=>c.Content is StackPanel stack&&stack.Children.OfType<TextBlock>().Any()).ToArray();
        string Text(CheckBox row)=>((StackPanel)row.Content).Children.OfType<TextBlock>().Single().Text;
        try
        {
            MainWindow.AppWindow.Move(new(-30000,-30000));MainWindow.AppWindow.Show(false);
            await Task.Delay(100);host.UpdateLayout();
            var rows=Rows();Require(rows.Length==4&&rows.All(c=>c.IsChecked==true),"Original State rows were replaced by static/public choices.");
            choiceContainer=rows[0].Parent as Panel??throw new InvalidOperationException("Original State source list has no logical container.");
            var search=Descendants(panel).OfType<TextBox>().Single(t=>t.PlaceholderText=="查找筛选值(中文或原名)");
            var scroll=Descendants(panel).OfType<ScrollViewer>().First();
            if(scroll.Content is UIElement content)
            {var offset=search.TransformToVisual(content).TransformPoint(new(0,0)).Y;scroll.ChangeView(null,Math.Max(0,offset-60),null,true);}
            await CaptureRefinementElementAsync(host,Path.Combine(directory,"state-options-all.png"));
            search.Text="boom";await Task.Delay(40);host.UpdateLayout();
            var searched=Rows();var boomLabel=GalaxyStateFilterChoices.FromOriginal(filter)!.Single(c=>c.Key=="boom").Label;
            Require(searched.Length==1&&Text(searched.Single()).StartsWith(boomLabel+"  ",StringComparison.Ordinal),
                "Original State search did not narrow the shown rows: "+string.Join("; ",searched.Select(Text)));
            Rows().Single().IsChecked=false;await Task.Delay(40);
            Require(panel.Filter.Values is{} selected&&selected.SetEquals(new[]{"none","unpopulated","frontline"}),"Cancelling a searched State row lost source rows outside the search.");
            search.Text="";await Task.Delay(40);
            rows=Rows();Require(rows.Length==4&&rows.Count(c=>c.IsChecked==true)==3&&rows.Any(c=>Text(c).Contains("unpopulated"))&&rows.Any(c=>Text(c).Contains("frontline")),"Dynamic original State options were lost after an edit.");
            await CaptureRefinementElementAsync(host,Path.Combine(directory,"state-options-after-search.png"));
            var result=new{syntheticOriginalOptions=true,noCatalogueCoordinatesSupplied=true,staticAndPublicRowsExcluded=true,
                allFourInitiallySelected=true,searchThenUncheckPreservesOtherThree=true,labels=rows.Select(Text).ToArray(),selectedKeys=panel.Filter.Values!.Order().ToArray(),gameAccess=false};
            await File.WriteAllTextAsync(Path.Combine(directory,"state-options-probe.json"),JsonSerializer.Serialize(result,new JsonSerializerOptions{WriteIndented=true}));
            return result;
        }
        finally{MainWindow.AppWindow.Hide();MainWindow.AppWindow.Move(previousPosition);MainWindow.Content=previous;}
    }
}