using XFEEDToolBox.ViewModels;
using CommunityToolkit.Mvvm.Input;
using System.ComponentModel;
using XFEEDToolBox.Core.Presentation;
namespace XFEEDToolBox.Views;
public sealed partial class RefitPage : Page
{
public ToolboxViewModel ViewModel => App.ViewModel;
public IAsyncRelayCommand AddShipToListAction{get;}
public RefitPage()
{
AddShipToListAction=new AsyncRelayCommand(AddShipToListAsync,()=>ViewModel.RefitCanAddToList);
InitializeComponent();NavigationCacheMode=Microsoft.UI.Xaml.Navigation.NavigationCacheMode.Required;
Loaded+=(_,_)=>{ViewModel.PropertyChanged+=UpdateActions;AddShipToListAction.NotifyCanExecuteChanged();};
Unloaded+=(_,_)=>ViewModel.PropertyChanged-=UpdateActions;
}
private void UpdateActions(object? sender,PropertyChangedEventArgs args)
{if(args.PropertyName==nameof(ViewModel.RefitCanAddToList))AddShipToListAction.NotifyCanExecuteChanged();}
protected override void OnNavigatedTo(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); RefitShipModel.ResumePage(); RefitOverviewPanel.ResumePage(); }
protected override async void OnNavigatedFrom(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); await Task.WhenAll(RefitShipModel.SuspendPageAsync(),RefitOverviewPanel.SuspendPageAsync()); }
private async void OpenEdsyLinks(object sender,RoutedEventArgs args)
{
var editor=new EdsyLinkPanel{DataContext=ViewModel};
var dialog=new ContentDialog{Title="EDSY 装配链接",Content=editor,CloseButtonText="关闭",XamlRoot=XamlRoot,DefaultButton=ContentDialogButton.Close};
await dialog.ShowAsync();
}
private async Task AddShipToListAsync(CancellationToken token)
{
if(await ViewModel.AddRefitToListAsync(token)) AppShellPage.Current?.ShowUpgradeFlyout();
else if(!token.IsCancellationRequested)
{
var flyout=new Flyout { Content=new TextBlock { Text=ViewModel.RefitResult,TextWrapping=TextWrapping.Wrap,MaxWidth=380 } };
flyout.ShowAt(AddShipToListButton);
}
}
private void SlotGridSizeChanged(object sender,SizeChangedEventArgs args)
{
if(SlotList.ItemsPanelRoot is not ItemsWrapGrid panel)return;
var width=Math.Max(160,args.NewSize.Width-16);var columns=Math.Max(1,(int)(width/230));
panel.ItemWidth=width/columns;panel.ItemHeight=202;
}
private void ChangeModule(object sender,RoutedEventArgs args)
{
if(sender is Button {Tag:RefitSlotLiveRow slot})
{
ViewModel.BeginRefitModuleSelection(slot);
AppShellPage.Current?.Navigate(typeof(RefitModulePickerPage));
}
}
private void PageScrollSizeChanged(object sender,SizeChangedEventArgs args)=>SizePage();
private void SizePage()
{
if(PageLayout is null)return;
var minimum=PageScroll.ActualWidth<740?1320:800;
PageLayout.Height=Math.Max(PageScroll.ActualHeight,minimum);
}
private void WorkbenchSizeChanged(object sender,SizeChangedEventArgs args)
{
if(CategoryPanel is null||InspectorPanel is null)return;
var stacked=args.NewSize.Width<740;
CategoryColumn.Width=new(args.NewSize.Width<1100?184:230);
SlotColumn.Width=new(1,GridUnitType.Star);
InspectorColumn.Width=stacked?new(0):new(1.25,GridUnitType.Star);
StackedInspectorRow.Height=stacked?new(1.15,GridUnitType.Star):new(0);
Grid.SetColumn(InspectorPanel,stacked?0:2);Grid.SetRow(InspectorPanel,stacked?1:0);Grid.SetColumnSpan(InspectorPanel,stacked?2:1);
SizePage();
}
private void PropertiesGridSizeChanged(object sender,SizeChangedEventArgs args)
{
var columns=args.NewSize.Width>=620;
PropertiesSecondColumn.Width=columns?new(1,GridUnitType.Star):new(0);
Grid.SetColumn(EngineeringProperties,columns?1:0);Grid.SetRow(EngineeringProperties,columns?0:1);
}
private void InspectorTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
{
if(ModuleDataView is null||ModuleEngineeringView is null||EngineeringGradePanel is null)return;
var engineering=sender.Items.IndexOf(sender.SelectedItem)==1;
ModuleDataView.Visibility=engineering?Visibility.Collapsed:Visibility.Visible;
ModuleEngineeringView.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
EngineeringGradePanel.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
CurrentProgressBlock.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
}
private void InspectorTabsSizeChanged(object sender,SizeChangedEventArgs args)
=>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
private void InspectorTabsLoaded(object sender,RoutedEventArgs args)=>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
}
using XFEEDToolBox.ViewModels;
using CommunityToolkit.Mvvm.Input;
using System.ComponentModel;
using XFEEDToolBox.Core.Presentation;
namespace XFEEDToolBox.Views;
public sealed partial class RefitPage : Page
{
public ToolboxViewModel ViewModel => App.ViewModel;
public IAsyncRelayCommand AddShipToListAction{get;}
public RefitPage()
{
AddShipToListAction=new AsyncRelayCommand(AddShipToListAsync,()=>ViewModel.RefitCanAddToList);
InitializeComponent();NavigationCacheMode=Microsoft.UI.Xaml.Navigation.NavigationCacheMode.Required;
Loaded+=(_,_)=>{ViewModel.PropertyChanged+=UpdateActions;AddShipToListAction.NotifyCanExecuteChanged();};
Unloaded+=(_,_)=>ViewModel.PropertyChanged-=UpdateActions;
}
private void UpdateActions(object? sender,PropertyChangedEventArgs args)
{if(args.PropertyName==nameof(ViewModel.RefitCanAddToList))AddShipToListAction.NotifyCanExecuteChanged();}
protected override void OnNavigatedTo(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); RefitShipModel.ResumePage(); RefitOverviewPanel.ResumePage(); }
protected override async void OnNavigatedFrom(Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); await Task.WhenAll(RefitShipModel.SuspendPageAsync(),RefitOverviewPanel.SuspendPageAsync()); }
private async void OpenEdsyLinks(object sender,RoutedEventArgs args)
{
var editor=new EdsyLinkPanel{DataContext=ViewModel};
var dialog=new ContentDialog{Title="EDSY 装配链接",Content=editor,CloseButtonText="关闭",XamlRoot=XamlRoot,DefaultButton=ContentDialogButton.Close};
await dialog.ShowAsync();
}
private async Task AddShipToListAsync(CancellationToken token)
{
if(await ViewModel.AddRefitToListAsync(token)) AppShellPage.Current?.ShowUpgradeFlyout();
else if(!token.IsCancellationRequested)
{
var flyout=new Flyout { Content=new TextBlock { Text=ViewModel.RefitResult,TextWrapping=TextWrapping.Wrap,MaxWidth=380 } };
flyout.ShowAt(AddShipToListButton);
}
}
private void SlotGridSizeChanged(object sender,SizeChangedEventArgs args)
{
if(SlotList.ItemsPanelRoot is not ItemsWrapGrid panel)return;
var width=Math.Max(160,args.NewSize.Width-16);var columns=Math.Max(1,(int)(width/230));
panel.ItemWidth=width/columns;panel.ItemHeight=202;
}
private void ChangeModule(object sender,RoutedEventArgs args)
{
if(sender is Button {Tag:RefitSlotLiveRow slot})
{
ViewModel.BeginRefitModuleSelection(slot);
AppShellPage.Current?.Navigate(typeof(RefitModulePickerPage));
}
}
private void PageScrollSizeChanged(object sender,SizeChangedEventArgs args)=>SizePage();
private void SizePage()
{
if(PageLayout is null)return;
var minimum=PageScroll.ActualWidth<740?1320:800;
PageLayout.Height=Math.Max(PageScroll.ActualHeight,minimum);
}
private void WorkbenchSizeChanged(object sender,SizeChangedEventArgs args)
{
if(CategoryPanel is null||InspectorPanel is null)return;
var stacked=args.NewSize.Width<740;
CategoryColumn.Width=new(args.NewSize.Width<1100?184:230);
SlotColumn.Width=new(1,GridUnitType.Star);
InspectorColumn.Width=stacked?new(0):new(1.25,GridUnitType.Star);
StackedInspectorRow.Height=stacked?new(1.15,GridUnitType.Star):new(0);
Grid.SetColumn(InspectorPanel,stacked?0:2);Grid.SetRow(InspectorPanel,stacked?1:0);Grid.SetColumnSpan(InspectorPanel,stacked?2:1);
SizePage();
}
private void PropertiesGridSizeChanged(object sender,SizeChangedEventArgs args)
{
var columns=args.NewSize.Width>=620;
PropertiesSecondColumn.Width=columns?new(1,GridUnitType.Star):new(0);
Grid.SetColumn(EngineeringProperties,columns?1:0);Grid.SetRow(EngineeringProperties,columns?0:1);
}
private void InspectorTabChanged(SelectorBar sender,SelectorBarSelectionChangedEventArgs args)
{
if(ModuleDataView is null||ModuleEngineeringView is null||EngineeringGradePanel is null)return;
var engineering=sender.Items.IndexOf(sender.SelectedItem)==1;
ModuleDataView.Visibility=engineering?Visibility.Collapsed:Visibility.Visible;
ModuleEngineeringView.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
EngineeringGradePanel.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
CurrentProgressBlock.Visibility=engineering?Visibility.Visible:Visibility.Collapsed;
}
private void InspectorTabsSizeChanged(object sender,SizeChangedEventArgs args)
=>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
private void InspectorTabsLoaded(object sender,RoutedEventArgs args)=>Controls.OutfittingSelectorSizing.Fit(InspectorTabs);
}