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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.ComponentModel;
using Windows.ApplicationModel.DataTransfer;
using XFEEDToolBox.Core.Presentation;
using XFEEDToolBox.ViewModels;

namespace XFEEDToolBox.Views;

public sealed partial class LogViewPage : Page
{
    public ToolboxViewModel ViewModel=>App.ViewModel;
    private bool wideDetails;
    public LogViewPage()
    {
        InitializeComponent();
        NavigationCacheMode=Microsoft.UI.Xaml.Navigation.NavigationCacheMode.Required;
    }
    protected override async void OnNavigatedTo(Microsoft.UI.Xaml.Navigation.NavigationEventArgs args)
    {
        base.OnNavigatedTo(args);
        ViewModel.GameLogPageVisible=true;
        ViewModel.PropertyChanged+=GameLogChanged;
        await ViewModel.RefreshGameEventsAsync();
        UpdateSelection();
    }
    protected override void OnNavigatedFrom(Microsoft.UI.Xaml.Navigation.NavigationEventArgs args)
    {
        ViewModel.GameLogPageVisible=false;
        ViewModel.PropertyChanged-=GameLogChanged;
        EventDetailsFlyout.Hide();
        base.OnNavigatedFrom(args);
    }
    private void GameLogChanged(object? sender,PropertyChangedEventArgs args)
    {
        if(args.PropertyName==nameof(ViewModel.GameEventLogBusy)&&!ViewModel.GameEventLogBusy)UpdateSelection();
    }
    private void UpdateSelection()
    {
        if(GameLogList.SelectedItem is null)GameLogList.SelectedItem=ViewModel.GameEventRows.FirstOrDefault();
        ViewModel.SelectGameEvent(GameLogList.SelectedItem as GameEventLiveRow);
        EventDetailsEmptyText.Visibility=ViewModel.HasGameEventDetails?Visibility.Collapsed:Visibility.Visible;
        GameLogEmptyText.Visibility=ViewModel.GameEventRows.Count==0&&!ViewModel.GameEventLogBusy?Visibility.Visible:Visibility.Collapsed;
    }
    private void GameLogSelectionChanged(object sender,SelectionChangedEventArgs args)
    {
        ViewModel.SelectGameEvent(GameLogList.SelectedItem as GameEventLiveRow);
        EventDetailsEmptyText.Visibility=ViewModel.HasGameEventDetails?Visibility.Collapsed:Visibility.Visible;
    }
    private void OpenGameEvent(object sender,ItemClickEventArgs args)
    {
        if(args.ClickedItem is not GameEventLiveRow row)return;
        GameLogList.SelectedItem=row;
        if(!wideDetails)EventDetailsFlyout.ShowAt(GameDetailsButton);
    }
    private void LogPageSizeChanged(object sender,SizeChangedEventArgs args)
    {
        wideDetails=args.NewSize.Width>=1100;
        EventDetailsColumn.Width=new(wideDetails?360:0);
        EventWorkspace.ColumnSpacing=wideDetails?24:0;
        EventDetailsPanel.Visibility=wideDetails?Visibility.Visible:Visibility.Collapsed;
        GameDetailsButton.Visibility=wideDetails?Visibility.Collapsed:Visibility.Visible;
        EventTypeColumn.Width=new(args.NewSize.Width<900?160:200);
        EventSortColumn.Width=new(args.NewSize.Width<900?128:148);
        CompactEventDetails.Width=Math.Clamp(args.NewSize.Width-96,240,420);
        if(wideDetails)EventDetailsFlyout.Hide();
    }
    private void CopyEventJson(object sender,RoutedEventArgs args)
    {
        if(ViewModel.SelectedGameEventDetail is not {} details)return;
        var package=new DataPackage();package.SetText(details.Json);Clipboard.SetContent(package);
    }
}