using Microsoft.UI.Xaml.Media;
using XFEEDToolBox.ViewModels;
namespace XFEEDToolBox.Controls;
public sealed partial class RefitShipOverview : UserControl
{
private bool measuringHeight;
public ToolboxViewModel ViewModel=>App.ViewModel;
public RefitShipOverview(){InitializeComponent();}
private GridLength Portion(double value)=>new(Math.Max(0,value),GridUnitType.Star);
private GridLength Remaining(double value)=>new(Math.Max(0,1-value),GridUnitType.Star);
private string ShipName(string type)=>Core.Localization.ChineseNames.Ship(type);
private Brush PowerBrush(bool overloaded)=>(Brush)Resources[overloaded?"OutfittingOverload":"OutfittingOrange"];
public void ResumePage()=>OverviewShipModel.ResumePage();
public Task SuspendPageAsync()=>OverviewShipModel.SuspendPageAsync();
private void OverviewTabsLoaded(object sender,RoutedEventArgs args)
{OutfittingSelectorSizing.Fit(OverviewTabs);ReserveViewHeight(OverviewLayout.ActualWidth);}
private void OverviewTabsSizeChanged(object sender,SizeChangedEventArgs args)=>OutfittingSelectorSizing.Fit(OverviewTabs);
private void OverviewTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
{
if(SpecificationsPanel is null||DefencePanel is null||WeaponPanel is null||CapacityPanel is null)return;
ShowView(sender.Items.IndexOf(sender.SelectedItem));
SummaryViewName.Text=sender.SelectedItem?.Text??"常规";
}
private void ShowView(int index)
{
SpecificationsPanel.Visibility=PowerPanel.Visibility=index==0?Visibility.Visible:Visibility.Collapsed;
DefencePanel.Visibility=index==1?Visibility.Visible:Visibility.Collapsed;
WeaponPanel.Visibility=index==2?Visibility.Visible:Visibility.Collapsed;
CapacityPanel.Visibility=index==3?Visibility.Visible:Visibility.Collapsed;
}
private void OpenShipDetails(object sender,RoutedEventArgs args)=>Views.AppShellPage.Current?.Navigate(typeof(Views.RefitShipDetailsPage));
private void ReserveViewHeight(double width)
{
if(measuringHeight||width<=0||OverviewLayout is null)return;
measuringHeight=true;
var selected=OverviewTabs.Items.IndexOf(OverviewTabs.SelectedItem);double height=0;
try
{
// Measure every view at this width before reserving their common
// height. Collapsed panels must be measured too, including wrapping
// and the stacked power panel at narrow widths.
OverviewLayout.MinHeight=0;
for(var index=0;index<4;index++)
{
ShowView(index);OverviewLayout.Measure(new(width,double.PositiveInfinity));
height=Math.Max(height,OverviewLayout.DesiredSize.Height);
}
}
finally
{
ShowView(selected);OverviewLayout.MinHeight=Math.Ceiling(height);measuringHeight=false;
}
}
private void OverviewSizeChanged(object sender,SizeChangedEventArgs args)
{
if(measuringHeight||PowerPanel is null||IdentityPanel is null)return;
var stacked=args.NewSize.Width<1120;var compact=args.NewSize.Width<700;
IdentityColumn.Width=compact?new(0):new(130);PowerColumn.Width=stacked?new(0):new(1,GridUnitType.Star);
IdentityPanel.Visibility=compact?Visibility.Collapsed:Visibility.Visible;
Grid.SetColumn(SpecificationsPanel,compact?0:1);Grid.SetColumnSpan(SpecificationsPanel,compact?2:1);
Grid.SetColumn(PowerPanel,stacked?0:2);Grid.SetRow(PowerPanel,stacked?1:0);Grid.SetColumnSpan(PowerPanel,stacked?3:1);
ModelColumn.Width=new(compact?108:150);
foreach(var panel in new[]{DefencePanel,WeaponPanel,CapacityPanel})
{
Grid.SetColumn(panel,compact?0:1);Grid.SetColumnSpan(panel,compact?3:2);
var narrow=args.NewSize.Width<900;
panel.ColumnDefinitions[1].Width=narrow?new(0):new(1,GridUnitType.Star);
var right=(FrameworkElement)panel.Children[1];Grid.SetColumn(right,narrow?0:1);Grid.SetRow(right,narrow?1:0);
}
ReserveViewHeight(args.NewSize.Width);
}
}
using Microsoft.UI.Xaml.Media;
using XFEEDToolBox.ViewModels;
namespace XFEEDToolBox.Controls;
public sealed partial class RefitShipOverview : UserControl
{
private bool measuringHeight;
public ToolboxViewModel ViewModel=>App.ViewModel;
public RefitShipOverview(){InitializeComponent();}
private GridLength Portion(double value)=>new(Math.Max(0,value),GridUnitType.Star);
private GridLength Remaining(double value)=>new(Math.Max(0,1-value),GridUnitType.Star);
private string ShipName(string type)=>Core.Localization.ChineseNames.Ship(type);
private Brush PowerBrush(bool overloaded)=>(Brush)Resources[overloaded?"OutfittingOverload":"OutfittingOrange"];
public void ResumePage()=>OverviewShipModel.ResumePage();
public Task SuspendPageAsync()=>OverviewShipModel.SuspendPageAsync();
private void OverviewTabsLoaded(object sender,RoutedEventArgs args)
{OutfittingSelectorSizing.Fit(OverviewTabs);ReserveViewHeight(OverviewLayout.ActualWidth);}
private void OverviewTabsSizeChanged(object sender,SizeChangedEventArgs args)=>OutfittingSelectorSizing.Fit(OverviewTabs);
private void OverviewTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
{
if(SpecificationsPanel is null||DefencePanel is null||WeaponPanel is null||CapacityPanel is null)return;
ShowView(sender.Items.IndexOf(sender.SelectedItem));
SummaryViewName.Text=sender.SelectedItem?.Text??"常规";
}
private void ShowView(int index)
{
SpecificationsPanel.Visibility=PowerPanel.Visibility=index==0?Visibility.Visible:Visibility.Collapsed;
DefencePanel.Visibility=index==1?Visibility.Visible:Visibility.Collapsed;
WeaponPanel.Visibility=index==2?Visibility.Visible:Visibility.Collapsed;
CapacityPanel.Visibility=index==3?Visibility.Visible:Visibility.Collapsed;
}
private void OpenShipDetails(object sender,RoutedEventArgs args)=>Views.AppShellPage.Current?.Navigate(typeof(Views.RefitShipDetailsPage));
private void ReserveViewHeight(double width)
{
if(measuringHeight||width<=0||OverviewLayout is null)return;
measuringHeight=true;
var selected=OverviewTabs.Items.IndexOf(OverviewTabs.SelectedItem);double height=0;
try
{
// Measure every view at this width before reserving their common
// height. Collapsed panels must be measured too, including wrapping
// and the stacked power panel at narrow widths.
OverviewLayout.MinHeight=0;
for(var index=0;index<4;index++)
{
ShowView(index);OverviewLayout.Measure(new(width,double.PositiveInfinity));
height=Math.Max(height,OverviewLayout.DesiredSize.Height);
}
}
finally
{
ShowView(selected);OverviewLayout.MinHeight=Math.Ceiling(height);measuringHeight=false;
}
}
private void OverviewSizeChanged(object sender,SizeChangedEventArgs args)
{
if(measuringHeight||PowerPanel is null||IdentityPanel is null)return;
var stacked=args.NewSize.Width<1120;var compact=args.NewSize.Width<700;
IdentityColumn.Width=compact?new(0):new(130);PowerColumn.Width=stacked?new(0):new(1,GridUnitType.Star);
IdentityPanel.Visibility=compact?Visibility.Collapsed:Visibility.Visible;
Grid.SetColumn(SpecificationsPanel,compact?0:1);Grid.SetColumnSpan(SpecificationsPanel,compact?2:1);
Grid.SetColumn(PowerPanel,stacked?0:2);Grid.SetRow(PowerPanel,stacked?1:0);Grid.SetColumnSpan(PowerPanel,stacked?3:1);
ModelColumn.Width=new(compact?108:150);
foreach(var panel in new[]{DefencePanel,WeaponPanel,CapacityPanel})
{
Grid.SetColumn(panel,compact?0:1);Grid.SetColumnSpan(panel,compact?3:2);
var narrow=args.NewSize.Width<900;
panel.ColumnDefinitions[1].Width=narrow?new(0):new(1,GridUnitType.Star);
var right=(FrameworkElement)panel.Children[1];Grid.SetColumn(right,narrow?0:1);Grid.SetRow(right,narrow?1:0);
}
ReserveViewHeight(args.NewSize.Width);
}
}