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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using Microsoft.UI.Xaml.Controls.Primitives;
using XFEEDToolBox.Core.Navigation;
using XFEEDToolBox.Core.Galaxy;

namespace XFEEDToolBox.Controls;

public sealed partial class GalaxyRouteSettingsPanel:UserControl
{
    public static readonly DependencyProperty OptionsProperty=DependencyProperty.Register(nameof(Options),typeof(GameRoutePlotOptions),typeof(GalaxyRouteSettingsPanel),new PropertyMetadata(null,Changed));
    public static readonly DependencyProperty CargoCapacityProperty=DependencyProperty.Register(nameof(CargoCapacity),typeof(double),typeof(GalaxyRouteSettingsPanel),new PropertyMetadata(0d,Changed));
    public static readonly DependencyProperty CurrentFilterProperty=DependencyProperty.Register(nameof(CurrentFilter),typeof(GalaxyMapFilter),typeof(GalaxyRouteSettingsPanel),new PropertyMetadata(null,Changed));
    public GameRoutePlotOptions Options {get=>(GameRoutePlotOptions?)GetValue(OptionsProperty)??new();set=>SetValue(OptionsProperty,value);}
    public double CargoCapacity {get=>(double)GetValue(CargoCapacityProperty);set=>SetValue(CargoCapacityProperty,value);}
    public GalaxyMapFilter? CurrentFilter {get=>(GalaxyMapFilter?)GetValue(CurrentFilterProperty);set=>SetValue(CurrentFilterProperty,value);}
    private readonly ComboBox mode=new(){Header="航线模式",HorizontalAlignment=HorizontalAlignment.Stretch};
    private readonly ComboBox boost=new(){Header="FSD 增益等级",HorizontalAlignment=HorizontalAlignment.Stretch};
    private readonly CheckBox jet=new(){Content="使用喷流增益",IsThreeState=true};
    private readonly NumberBox cargo=new(){Header="规划货重 / t",PlaceholderText="沿用游戏当前货重",Minimum=0,SmallChange=1,SpinButtonPlacementMode=NumberBoxSpinButtonPlacementMode.Compact};
    private bool updating;
    public GalaxyRouteSettingsPanel()
    {
        Resources[typeof(CheckBox)]=GalaxyFilterPanel.CreateStaticCheckBoxStyle();
        foreach(var title in new[]{"沿用游戏当前模式","经济路线","最快路线","FSD 增益路线"})mode.Items.Add(title);
        foreach(var title in new[]{"沿用游戏当前等级","0 · 无增益","1 · 基础增益","2 · 标准增益","3 · 高级增益"})boost.Items.Add(title);
        var clear=new Button{Content="恢复使用游戏当前设置",HorizontalAlignment=HorizontalAlignment.Stretch};
        var root=new StackPanel{Spacing=6};root.Children.Add(mode);root.Children.Add(jet);root.Children.Add(boost);root.Children.Add(cargo);root.Children.Add(clear);
        AddStarClassControls(root);
        root.Children.Add(new TextBlock{Text="横线和空值表示沿用游戏设置。长按目标规划时应用。",FontSize=11,TextWrapping=TextWrapping.Wrap});Content=root;
        AddMapFilterControls(root);
        mode.SelectionChanged+=(_,_)=>Update();boost.SelectionChanged+=(_,_)=>Update();jet.Click+=(_,_)=>Update();cargo.ValueChanged+=(_,_)=>Update();
        clear.Click+=(_,_)=>Options=new();Refresh();
    }
    private static void Changed(DependencyObject value,DependencyPropertyChangedEventArgs _)=>((GalaxyRouteSettingsPanel)value).Refresh();
    private void Refresh()
    {
        updating=true;
        try
        {
            var value=Options;mode.SelectedIndex=value.Mode is{} m&&Enum.IsDefined(m)?(int)m+1:0;
            boost.SelectedIndex=value.FsdBoostLevel is >=0 and <=3?value.FsdBoostLevel.Value+1:0;
            boost.IsEnabled=value.Mode==GameRoutePlotMode.FsdBoost;jet.IsChecked=value.UseJetConeBoost;
            cargo.Maximum=Math.Clamp(double.IsFinite(CargoCapacity)?CargoCapacity:0,0,2048);cargo.Value=value.VirtualCargoMass??double.NaN;
            RefreshStarClassControls(value.StarClassFilter);
            RefreshMapFilterControls(value.MapFilter);
        }
        finally{updating=false;}
    }
    private void Update()
    {
        if(updating)return;
        var selected=mode.SelectedIndex>0?(GameRoutePlotMode?)(mode.SelectedIndex-1):null;
        Options=Options with{Mode=selected,UseJetConeBoost=jet.IsChecked,FsdBoostLevel=selected==GameRoutePlotMode.FsdBoost&&boost.SelectedIndex>0?boost.SelectedIndex-1:null,
            VirtualCargoMass=double.IsFinite(cargo.Value)?cargo.Value:null};
    }
}