From 42e57f5ac1ae98779b6b156478443dc175061776 Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Sun, 1 Nov 2026 22:41:43 +0500 Subject: [PATCH] =?UTF-8?q?client:=20DeckBuilder=20=E2=80=94=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D1=8B,=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=D0=BD=D0=B5=20=D0=BA=D0=BE=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=20=C2=AB=D0=A0=D0=B0?= =?UTF-8?q?=D1=81=D0=BF=D1=8B=D0=BB=D0=B8=D1=82=D1=8C=20=D0=B2=D1=81=D1=91?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Кнопка «Сброс» убрана из строки фильтров; сброс остался в оверлее. - В фильтрах добавлен режим «Показывать вне коллекции»: карты без копий показываются серыми, без добавления в колоду (ПКМ — карточка). - Рядом с «Фильтры» — «Распылить всё», если есть копии сверх 4 на название (SP пропускаются). Подтверждение показывает количество и пыль. - DeckListModel.PlanExtras + тест; EditMode 70/70, standalone собран. --- .../Vanguard/Runtime/UI/DeckBuilderView.cs | 189 ++++++++++++++---- .../Vanguard/Runtime/UI/DeckListFilter.cs | 77 ++++++- .../Vanguard/Runtime/UI/Localization.cs | 12 ++ .../Vanguard/Tests/Editor/DeckBuilderTests.cs | 18 ++ 4 files changed, 253 insertions(+), 43 deletions(-) diff --git a/client/Assets/Vanguard/Runtime/UI/DeckBuilderView.cs b/client/Assets/Vanguard/Runtime/UI/DeckBuilderView.cs index 0a00ed8..5177a85 100644 --- a/client/Assets/Vanguard/Runtime/UI/DeckBuilderView.cs +++ b/client/Assets/Vanguard/Runtime/UI/DeckBuilderView.cs @@ -50,6 +50,8 @@ namespace Vanguard.UI private Button _botButton; private Button _duelButton; private Button _deleteButton; + private Button _dismantleAllButton; + private RectTransform _unownedChips; private RectTransform _deckMenuOverlay; private Text _deckMenuTitle; private DeckDto _deckMenuDeck; @@ -61,8 +63,9 @@ namespace Vanguard.UI private RectTransform _clanChips; private RectTransform _confirmOverlay; private InputField _searchInput; + private Text _confirmTitle; private Text _confirmText; - private DeckDto _pendingDelete; + private Action _confirmAction; private RectTransform _cardOverlay; private Image _cardArt; @@ -200,8 +203,15 @@ namespace Vanguard.UI var filters = UiKit.CreateButton(filterBar, "Filters", "Фильтры", OpenFilters, 16); SetFixedSize(filters, 110f, 38f); - var reset = UiKit.CreateButton(filterBar, "ResetFilters", "Сброс", ResetFilters, 16); - SetFixedSize(reset, 90f, 38f); + _dismantleAllButton = UiKit.CreateButton( + filterBar, + "DismantleAll", + "Распылить всё", + ConfirmDismantleExtras, + 15); + SetFixedSize(_dismantleAllButton, 200f, 38f); + SetButtonColor(_dismantleAllButton, new Color(0.30f, 0.16f, 0.08f, 0.95f)); + _dismantleAllButton.gameObject.SetActive(false); var scroll = UiKit.CreateGridScrollView( collectionArea, @@ -334,7 +344,7 @@ namespace Vanguard.UI var overlay = UiKit.CreatePanel(_root, "FilterOverlay", new Color(0f, 0f, 0f, 0.78f)); var card = UiKit.CreateCenteredCard( - overlay, "FilterCard", new Vector2(900f, 940f), PanelFill); + overlay, "FilterCard", new Vector2(900f, 1000f), PanelFill); UiKit.AddVerticalLayout(card, 24, 10); var title = UiKit.CreateText(card, "Title", "Фильтры коллекции", 28, TextPrimary); @@ -345,10 +355,11 @@ namespace Vanguard.UI UiKit.SetPreferredHeight(_searchInput, 44f); _searchInput.onValueChanged.AddListener(value => _draftFilter.Search = value); + _unownedChips = BuildFilterSection(card, "Отображение", 44f); _rarityChips = BuildFilterSection(card, "Редкость", 44f); _gradeChips = BuildFilterSection(card, "Ранг", 44f); _triggerChips = BuildFilterSection(card, "Триггер", 44f); - _clanChips = BuildFilterSection(card, "Клан", 260f, flexible: true); + _clanChips = BuildFilterSection(card, "Клан", 220f, flexible: true); var footer = UiKit.CreatePanel(card, "Footer", new Color(0f, 0f, 0f, 0f)); UiKit.SetPreferredHeight(footer, 48f); @@ -433,18 +444,19 @@ namespace Vanguard.UI _root, "DeleteDeckConfirm", new Color(0f, 0f, 0f, 0.78f)); var card = UiKit.CreateCenteredCard( - overlay, "ConfirmCard", new Vector2(640f, 300f), PanelFill); + overlay, "ConfirmCard", new Vector2(640f, 320f), PanelFill); UiKit.AddVerticalLayout(card, 30, 12); - var title = UiKit.CreateText(card, "Title", "Удалить колоду?", 28, TextPrimary); - title.fontStyle = FontStyle.Bold; - UiKit.SetPreferredHeight(title, 42f); + _confirmTitle = UiKit.CreateText(card, "Title", "Удалить колоду?", 28, TextPrimary); + _confirmTitle.fontStyle = FontStyle.Bold; + UiKit.SetPreferredHeight(_confirmTitle, 42f); _confirmText = UiKit.CreateText( card, "Text", string.Empty, 19, TextMuted); + _confirmText.horizontalOverflow = HorizontalWrapMode.Wrap; UiKit.SetPreferredHeight(_confirmText, 70f); - var yes = UiKit.CreateButton(card, "Yes", "Удалить", ConfirmDelete, 20); + var yes = UiKit.CreateButton(card, "Yes", "Подтвердить", ConfirmAction, 20); UiKit.SetPreferredHeight(yes, 48f); var no = UiKit.CreateButton(card, "No", "Отмена", CancelDelete, 20); @@ -877,8 +889,26 @@ namespace Vanguard.UI ClearChildren(_collectionContent); _countTexts.Clear(); - var items = _collection - .Select(item => new { Item = item, Meta = MetaOf(item) }) + var ownedByPrinting = new Dictionary(StringComparer.Ordinal); + foreach (var item in _collection) + ownedByPrinting[item.PrintingId] = item; + + var source = _filter.IncludeUnowned + ? _catalog.Values.Select(meta => new + { + Meta = meta, + Item = ownedByPrinting.TryGetValue(meta.PrintingId, out var owned) + ? owned + : new CollectionItemDto + { + PrintingId = meta.PrintingId, + NameId = meta.NameId, + Count = 0, + }, + }) + : _collection.Select(item => new { Meta = MetaOf(item), Item = item }); + + var items = source .Where(pair => pair.Meta != null && _filter.Matches(pair.Meta)) .OrderBy(pair => pair.Meta.Clan, StringComparer.Ordinal) .ThenBy(pair => pair.Meta.Grade) @@ -886,6 +916,8 @@ namespace Vanguard.UI foreach (var pair in items) AddCollectionCell(pair.Item, pair.Meta); + + UpdateDismantleButton(); } private void AddCollectionCell(CollectionItemDto item, CardCatalogItemDto meta) @@ -899,7 +931,7 @@ namespace Vanguard.UI frame.effectColor = CardArt.ClanColor(meta.Clan); frame.effectDistance = new Vector2(2f, -2f); - if (_deckOpen) + if (_deckOpen && item.Count > 0) { var button = cell.gameObject.AddComponent