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