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;
}
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;
}