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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.ViewModels;
using XFEEDToolBox.Core.Navigation;

namespace XFEEDToolBox.Views;

public sealed partial class CurrentSystemPage:Page
{
    public ToolboxViewModel ViewModel=>App.ViewModel;
    private bool mapSelection;
    public CurrentSystemPage()
    {
        InitializeComponent();NavigationCacheMode=Microsoft.UI.Xaml.Navigation.NavigationCacheMode.Required;
        SystemMap.LocationSelected+=MapLocationSelected;
        SystemMap.SceneStatusChanged+=value=>ViewModel.SystemSceneStatus=value;
        SystemMap.OrbitStatusChanged+=(value,detail)=>{OrbitCoverageText.Text=value;ToolTipService.SetToolTip(OrbitCoverageText,detail);};
        Loaded+=(_,_)=>{ViewModel.CurrentSystemSceneChanged+=RefreshScene;ViewModel.PropertyChanged+=ModelChanged;ViewModel.ShowCurrentSystem();RefreshScene();ApplyLayout();};
        Unloaded+=(_,_)=>{ViewModel.CurrentSystemSceneChanged-=RefreshScene;ViewModel.PropertyChanged-=ModelChanged;ViewModel.HideCurrentSystem();};
        SizeChanged+=(_,_)=>ApplyLayout();
        ViewportHost.SizeChanged+=(_,_)=>UpdateMapBadge();
    }
    private void RefreshScene(){SystemMap.SetSnapshot(ViewModel.CurrentSystemSceneSnapshot,ViewModel.CurrentSystemLocations.Select(row=>row.Record).ToArray());SystemMap.SetSelection(ViewModel.SelectedSystemLocation?.Record.Identity);}
    private void ModelChanged(object? sender,System.ComponentModel.PropertyChangedEventArgs e)
    {if(e.PropertyName==nameof(ViewModel.SelectedSystemLocation)){SystemMap.SetSelection(ViewModel.SelectedSystemLocation?.Record.Identity);ApplyLayout();}}
    private void MapLocationSelected(object? sender,SystemLocation location)
    {
        var row=ViewModel.CurrentSystemLocations.FirstOrDefault(row=>row.Record.Identity==location.Identity);if(row is null)return;
        mapSelection=true;try{ViewModel.SelectedSystemLocation=row;LocationsList.ScrollIntoView(row,ScrollIntoViewAlignment.Default);}finally{mapSelection=false;}
    }
    private void LocationSelectionChanged(object sender,SelectionChangedEventArgs e)
    {SystemMap.SetSelection(ViewModel.SelectedSystemLocation?.Record.Identity);if(!mapSelection&&e.AddedItems.Count>0)SystemMap.FocusSelection();}
    private void ApplyLayout()
    {
        if(DestinationCard is null)return;var compact=ActualWidth<960;CatalogueColumn.Width=new(ActualWidth<800?190:compact?240:285);
        var selected=ViewModel.SelectedSystemLocation is not null;DestinationCard.Visibility=selected?Visibility.Visible:Visibility.Collapsed;
        CataloguePanel.Padding=new(compact?8:12);CatalogueLayout.RowSpacing=compact?8:10;CatalogueHeading.Visibility=compact?Visibility.Collapsed:Visibility.Visible;
        Grid.SetRow(DestinationCard,compact?1:0);DestinationCard.Width=compact?double.NaN:250;
        Grid.SetColumn(DestinationCard,compact?0:1);Grid.SetColumnSpan(DestinationCard,compact?2:1);
        DestinationActionColumn.Width=new(compact?170:0);Grid.SetRow(DestinationActions,compact?0:1);Grid.SetColumn(DestinationActions,compact?1:0);
        DestinationCard.Padding=new(compact?12:17);DestinationActions.Spacing=compact?8:12;DestinationName.FontSize=compact?18:21;
        ((Grid)DestinationCard.Child).RowSpacing=compact?0:13;
        DestinationInfo.RowSpacing=compact?0:11;DestinationDistanceColumn.Width=new(compact?100:0);
        Grid.SetRow(DestinationDistanceBlock,compact?0:2);Grid.SetColumn(DestinationDistanceBlock,compact?1:0);
        DestinationDivider.Visibility=compact?Visibility.Collapsed:Visibility.Visible;DestinationPosition.Visibility=compact?Visibility.Collapsed:Visibility.Visible;DestinationHelp.Visibility=compact?Visibility.Collapsed:Visibility.Visible;
        DestinationCard.HorizontalAlignment=compact?HorizontalAlignment.Stretch:HorizontalAlignment.Right;
        DestinationCard.Margin=compact?new Thickness(0):new Thickness(0,20,0,0);
        SystemMap.SetOverlayInsets(CatalogueColumn.Width.Value+32,compact||!selected?0:280);CameraHint.Visibility=ActualWidth<1000?Visibility.Collapsed:Visibility.Visible;
        UpdateMapBadge();
    }
    private void UpdateMapBadge()
    {
        var left=CatalogueColumn.Width.Value+48;
        SceneStatusBadge.Visibility=ViewportHost.ActualWidth<1000?Visibility.Collapsed:Visibility.Visible;
        SceneStatusBadge.Margin=new(left,22,16,0);OrbitLegend.Margin=new(left,0,16,68);
        OrbitLegend.MaxWidth=Math.Max(80,ViewportHost.ActualWidth-left-30);
    }
    private void OverviewClicked(object sender,RoutedEventArgs e)=>SystemMap.ResetCamera();
    private void FocusClicked(object sender,RoutedEventArgs e)=>SystemMap.FocusSelection();
    private void ZoomOutClicked(object sender,RoutedEventArgs e)=>SystemMap.Zoom(-1);
    private void ZoomInClicked(object sender,RoutedEventArgs e)=>SystemMap.Zoom(1);
    internal XFEEDToolBox.Controls.LocalSystemMapView MapForProbe=>SystemMap;
}