using XFEEDToolBox.Core.Galaxy; using XFEEDToolBox.Core.Navigation; namespace XFEEDToolBox.Controls; public sealed partial class GalaxyRouteSettingsPanel { private readonly CheckBox starRoute=new(){Content="将恒星类别筛选用于路线",IsThreeState=true}; private readonly TextBlock starSummary=new(){FontSize=11,TextWrapping=TextWrapping.Wrap}; private readonly Dictionary starGroups=[]; private void AddStarClassControls(StackPanel root) { var grid=new Grid{ColumnSpacing=8};for(var i=0;i<3;i++)grid.ColumnDefinitions.Add(new()); grid.Resources[typeof(CheckBox)]=GalaxyFilterPanel.CreateStaticCheckBoxStyle(); var names=new[]{"O","B","A","F","G","K","M","L","T","Y","原恒星","碳星","沃尔夫–拉叶星","白矮星","非主序星"}; foreach(var group in Enum.GetValues()) { var index=(int)group;if(index%3==0)grid.RowDefinitions.Add(new(){Height=GridLength.Auto}); var item=new CheckBox{Content=names[index],MinWidth=0,FontSize=11};starGroups[group]=item; Grid.SetRow(item,index/3);Grid.SetColumn(item,index%3);grid.Children.Add(item); item.Click+=(_,_)=> { if(updating)return; var current=Options.StarClassFilter??new(); Options=Options with{StarClassFilter=current with{SelectedGroups=starGroups.Where(pair=>pair.Value.IsChecked==true).Select(pair=>pair.Key).ToArray()}}; }; } var choose=new Button{Content="选择恒星类别…",HorizontalAlignment=HorizontalAlignment.Stretch}; choose.Flyout=new Flyout{Content=grid}; var copy=new Button{Content="采用星图所选类别",HorizontalAlignment=HorizontalAlignment.Stretch}; copy.Click+=(_,_)=> { if(CurrentFilter?.Category!=GalaxyFilterCategory.StarClass) {starSummary.Text="请先在星图中选择恒星类别筛选。";return;} if(!GameRouteStarClassFilter.TryFromStarClasses(CurrentFilter.Values,starRoute.IsChecked??true,out var filter,out var reason)) {starSummary.Text=reason;return;} Options=Options with{StarClassFilter=filter}; }; starRoute.Click+=(_,_)=> { if(updating)return; Options=Options with{StarClassFilter=starRoute.IsChecked is{} enabled?(Options.StarClassFilter??new()) with{AffectsRoutePlotting=enabled}:null}; }; root.Children.Add(starRoute);root.Children.Add(choose);root.Children.Add(copy);root.Children.Add(starSummary); } private void RefreshStarClassControls(GameRouteStarClassFilter? filter) { starRoute.IsChecked=filter?.AffectsRoutePlotting; foreach(var (group,item) in starGroups)item.IsChecked=filter?.SelectedGroups.Contains(group)??true; starSummary.Text=filter is null?"横线:沿用游戏恒星类别筛选。":$"已选 {filter.SelectedGroups.Count} / 15 类 · {(filter.AffectsRoutePlotting?"用于路线":"路线不限类别")}\n规划时同步到游戏,并切换游戏星图为恒星类别显示。"; } }