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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using XFEEDToolBox.Core.Engineering;

namespace XFEEDToolBox.ViewModels;

public partial class ToolboxViewModel
{
    private bool resettingWarehouseFilters;
    [ObservableProperty] public partial int MaterialOwnershipIndex { get; set; }
    [ObservableProperty] public partial int MaterialStockLevelIndex { get; set; }
    [ObservableProperty] public partial int MaterialChecklistIndex { get; set; }
    [ObservableProperty] public partial int MaterialMinimumGradeIndex { get; set; }
    [ObservableProperty] public partial int MaterialMaximumGradeIndex { get; set; }
    [ObservableProperty] public partial double MaterialMinimumQuantity { get; set; } = double.NaN;
    [ObservableProperty] public partial double MaterialMaximumQuantity { get; set; } = double.NaN;
    [ObservableProperty] public partial int MaterialSortIndex { get; set; }
    [ObservableProperty, NotifyPropertyChangedFor(nameof(MaterialSortDirectionText), nameof(MaterialSortDirectionGlyph))]
    public partial bool MaterialSortDescending { get; set; }
    public string MaterialSortDirectionText => MaterialSortDescending ? "降序" : "升序";
    public string MaterialSortDirectionGlyph => MaterialSortDescending ? "\uE74B" : "\uE74A";
    [ObservableProperty] public partial string WarehouseFilterSummary { get; set; } = "";
    [ObservableProperty, NotifyPropertyChangedFor(nameof(WarehouseHasNoResults))]
    public partial int WarehouseResultCount { get; set; }
    public bool WarehouseHasNoResults => WarehouseResultCount == 0;
    [ObservableProperty] public partial string WarehouseEmptyText { get; set; } = "没有符合条件的材料,试试重置或放宽筛选。";

    private MaterialWarehouseFilter WarehouseFilter => new()
    {
        Search = MaterialSearch,
        Category = MaterialCategoryIndex switch { 1 => "Raw", 2 => "Manufactured", 3 => "Encoded", _ => "" },
        Ownership = (MaterialOwnership)MaterialOwnershipIndex,
        StockLevel = (MaterialStockLevel)MaterialStockLevelIndex,
        Checklist = (MaterialChecklistFilter)MaterialChecklistIndex,
        MinimumGrade = MaterialMinimumGradeIndex > 0 ? MaterialMinimumGradeIndex : null,
        MaximumGrade = MaterialMaximumGradeIndex > 0 ? MaterialMaximumGradeIndex : null,
        MinimumQuantity = double.IsNaN(MaterialMinimumQuantity) ? null : MaterialMinimumQuantity,
        MaximumQuantity = double.IsNaN(MaterialMaximumQuantity) ? null : MaterialMaximumQuantity,
        Sort = (MaterialSort)MaterialSortIndex,
        Descending = MaterialSortDescending
    };

    private void RefreshMaterialWarehouse()
    {
        if (!resettingWarehouseFilters) RefreshWarehouse(CurrentPlayer);
    }

    // Requirements can change without an inventory event (adding or clearing a plan).
    private void RefreshWarehouseChecklist()
    {
        if (MaterialChecklistIndex != 0 || MaterialSortIndex == (int)MaterialSort.Shortage)
            RefreshMaterialWarehouse();
    }

    [RelayCommand] private void ToggleMaterialSortDirection() => MaterialSortDescending = !MaterialSortDescending;
    [RelayCommand] private void ResetWarehouseFilters()
    {
        resettingWarehouseFilters = true;
        try
        {
            MaterialSearch = "";
            MaterialCategoryIndex = MaterialOwnershipIndex = MaterialStockLevelIndex = MaterialChecklistIndex = 0;
            MaterialMinimumGradeIndex = MaterialMaximumGradeIndex = MaterialSortIndex = 0;
            MaterialMinimumQuantity = MaterialMaximumQuantity = double.NaN;
            MaterialSortDescending = false;
        }
        finally { resettingWarehouseFilters = false; }
        RefreshMaterialWarehouse();
    }

    partial void OnMaterialOwnershipIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialStockLevelIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialChecklistIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialMinimumGradeIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialMaximumGradeIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialMinimumQuantityChanged(double value) => RefreshMaterialWarehouse();
    partial void OnMaterialMaximumQuantityChanged(double value) => RefreshMaterialWarehouse();
    partial void OnMaterialSortIndexChanged(int value) => RefreshMaterialWarehouse();
    partial void OnMaterialSortDescendingChanged(bool value) => RefreshMaterialWarehouse();
}