From 2eb7c59f784fef94a373d9784f1da09b995fdb5c Mon Sep 17 00:00:00 2001 From: Sebastian Dine Date: Thu, 30 Jul 2026 14:51:53 +0200 Subject: [PATCH] Minor: New Game Yu-Gi-Oh! Bandai (#22) --- AGENTS.md | 2 +- README.md | 8 + app/AGENTS.md | 2 +- app/main.cpp | 28 +- core/AGENTS.md | 6 +- core/CMakeLists.txt | 7 + core/include/ccm/domain/Enums.hpp | 3 +- core/include/ccm/domain/YuGiOhBandaiCard.hpp | 37 ++ .../ccm/domain/YuGiOhBandaiSetCatalog.hpp | 52 ++ .../YuGiOhBandaiCardPreviewSource.hpp | 77 +++ .../yugiohbandai/YuGiOhBandaiGameModule.hpp | 29 + .../yugiohbandai/YuGiOhBandaiSetSource.hpp | 67 +++ core/include/ccm/ports/ICardPreviewSource.hpp | 18 + core/include/ccm/services/CardFilter.hpp | 5 + .../ccm/services/CardPreviewService.hpp | 5 + core/include/ccm/services/CardSorter.hpp | 18 + .../YuGiOhBandaiSetCatalogService.hpp | 35 ++ .../services/YuGiOhBandaiSetCompletion.hpp | 51 ++ core/src/domain/Enums.cpp | 9 +- core/src/domain/YuGiOhBandaiCard.cpp | 39 ++ core/src/domain/YuGiOhBandaiSetCatalog.cpp | 45 ++ .../YuGiOhBandaiCardPreviewSource.cpp | 426 ++++++++++++++ .../yugiohbandai/YuGiOhBandaiGameModule.cpp | 8 + .../yugiohbandai/YuGiOhBandaiSetSource.cpp | 267 +++++++++ core/src/services/CardFilter.cpp | 16 + core/src/services/CardPreviewService.cpp | 27 + core/src/services/CardSorter.cpp | 73 +++ .../YuGiOhBandaiSetCatalogService.cpp | 50 ++ .../services/YuGiOhBandaiSetCompletion.cpp | 128 ++++ docs/AGENTS.md | 6 +- docs/adding-a-new-game.md | 3 +- docs/assets-and-info-apis.md | 32 + docs/assets/images/demo-ygo-bandai.png | Bin 0 -> 417203 bytes tests/CMakeLists.txt | 3 + tests/card_filter_tests.cpp | 34 ++ tests/card_sorter_tests.cpp | 46 ++ tests/domain_json_tests.cpp | 88 ++- tests/game_module_tests.cpp | 12 + tests/set_service_tests.cpp | 38 ++ ...yugiohbandai_card_preview_source_tests.cpp | 220 +++++++ tests/yugiohbandai_set_completion_tests.cpp | 153 +++++ tests/yugiohbandai_set_source_tests.cpp | 139 +++++ ui_wx/AGENTS.md | 5 +- ui_wx/CMakeLists.txt | 9 +- ui_wx/include/ccm/ui/AppContext.hpp | 1 + ui_wx/include/ccm/ui/BaseCardEditDialog.hpp | 7 + .../include/ccm/ui/BaseSelectedCardPanel.hpp | 2 + ui_wx/include/ccm/ui/MainFrame.hpp | 4 - ui_wx/include/ccm/ui/Theme.hpp | 3 + .../ccm/ui/YuGiOhBandaiCardEditDialog.hpp | 86 +++ .../ccm/ui/YuGiOhBandaiCardListPanel.hpp | 26 + ui_wx/include/ccm/ui/YuGiOhBandaiGameView.hpp | 109 ++++ .../ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp | 25 + .../ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp | 71 +++ ui_wx/src/DigiBattle99GameView.cpp | 8 +- ui_wx/src/MainFrame.cpp | 32 +- ui_wx/src/PokemonGameView.cpp | 7 +- ui_wx/src/SettingsDialog.cpp | 1 + ui_wx/src/Theme.cpp | 98 +++- ui_wx/src/YuGiOhBandaiCardEditDialog.cpp | 359 ++++++++++++ ui_wx/src/YuGiOhBandaiCardListPanel.cpp | 73 +++ ui_wx/src/YuGiOhBandaiGameView.cpp | 552 ++++++++++++++++++ ui_wx/src/YuGiOhBandaiSelectedCardPanel.cpp | 83 +++ ui_wx/src/YuGiOhBandaiSetCompletionPanel.cpp | 336 +++++++++++ ui_wx/src/YuGiOhGameView.cpp | 8 +- 65 files changed, 4142 insertions(+), 75 deletions(-) create mode 100644 core/include/ccm/domain/YuGiOhBandaiCard.hpp create mode 100644 core/include/ccm/domain/YuGiOhBandaiSetCatalog.hpp create mode 100644 core/include/ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp create mode 100644 core/include/ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp create mode 100644 core/include/ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp create mode 100644 core/include/ccm/services/YuGiOhBandaiSetCatalogService.hpp create mode 100644 core/include/ccm/services/YuGiOhBandaiSetCompletion.hpp create mode 100644 core/src/domain/YuGiOhBandaiCard.cpp create mode 100644 core/src/domain/YuGiOhBandaiSetCatalog.cpp create mode 100644 core/src/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.cpp create mode 100644 core/src/games/yugiohbandai/YuGiOhBandaiGameModule.cpp create mode 100644 core/src/games/yugiohbandai/YuGiOhBandaiSetSource.cpp create mode 100644 core/src/services/YuGiOhBandaiSetCatalogService.cpp create mode 100644 core/src/services/YuGiOhBandaiSetCompletion.cpp create mode 100644 docs/assets/images/demo-ygo-bandai.png create mode 100644 tests/yugiohbandai_card_preview_source_tests.cpp create mode 100644 tests/yugiohbandai_set_completion_tests.cpp create mode 100644 tests/yugiohbandai_set_source_tests.cpp create mode 100644 ui_wx/include/ccm/ui/YuGiOhBandaiCardEditDialog.hpp create mode 100644 ui_wx/include/ccm/ui/YuGiOhBandaiCardListPanel.hpp create mode 100644 ui_wx/include/ccm/ui/YuGiOhBandaiGameView.hpp create mode 100644 ui_wx/include/ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp create mode 100644 ui_wx/include/ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp create mode 100644 ui_wx/src/YuGiOhBandaiCardEditDialog.cpp create mode 100644 ui_wx/src/YuGiOhBandaiCardListPanel.cpp create mode 100644 ui_wx/src/YuGiOhBandaiGameView.cpp create mode 100644 ui_wx/src/YuGiOhBandaiSelectedCardPanel.cpp create mode 100644 ui_wx/src/YuGiOhBandaiSetCompletionPanel.cpp diff --git a/AGENTS.md b/AGENTS.md index 371dc8f..a2e6391 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -92,7 +92,7 @@ Run from the **workspace root**. - Treat UI text from domain/services as UTF-8 and convert explicitly at wx boundaries (`wxString::FromUTF8(...)` for display, `ToStdString(wxConvUTF8)` for write-back); do not rely on implicit `std::string` conversions on Windows. - For dialogs (`wxDialog`) and frames (`wxFrame`), apply title-bar dark mode through top-level-window handling (not frame-only handling), otherwise modal window headers stay light. - The `wxListCtrl` native header can ignore dark hints; if native theming is unreliable, use a custom themed header row and preserve key UX parity (single-click sort, edge-drag resize, divider double-click autosize). -- Do **not** apply `Explorer` class theming to `wxTextCtrl` in dark mode; some Windows builds force black typed text. Keep edit controls palette-driven, and for critical fields (for example the top-right filter box) enforce colors through `WM_CTLCOLOREDIT` handling in `MainFrame` when needed. +- Do **not** apply `Explorer` class theming to `wxTextCtrl` in dark mode; some Windows builds force black typed text. Keep edit controls palette-driven via `applyPaletteToTextCtrl` / `hardenTextCtrlNativeTheme` in `Theme.cpp` (opt out of immersive dark mode + parent `WM_CTLCOLOREDIT` subclass — that message goes to the EDIT's parent, not `MainFrame`). - Theme modal dialogs explicitly before `ShowModal()` (Settings, Create/Edit, image viewer, etc.) so they don't inherit mismatched defaults from Windows. - For button hover/pressed contrast fixes in dark theme, prefer explicit state handling in `Theme.cpp`; native Windows button states can override wx colors and produce unreadable white-on-white combinations. - Keep button theming state dynamic across theme switches (Dark <-> Light). Avoid lambdas that permanently capture old theme colors or behavior; stale handlers can make light-mode buttons look wrong. diff --git a/README.md b/README.md index 8344da1..ae55343 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Currently, the application supports the following TCGs: - Magic the Gathering - Pokemon TCG - Yu-Gi-Oh! +- Yu-Gi-Oh! (Bandai) - Digimon (Digi-Battle) ## Screenshots @@ -34,6 +35,13 @@ Currently, the application supports the following TCGs: +
+Yu-Gi-Oh! (Bandai) + +![CCM3 Demo - Yu-Gi-Oh! (Bandai)](docs/assets/images/demo-ygo-bandai.png) + +
+
Digimon (Digi-Battle) diff --git a/app/AGENTS.md b/app/AGENTS.md index 438ea68..f72a66a 100644 --- a/app/AGENTS.md +++ b/app/AGENTS.md @@ -9,7 +9,7 @@ The `ccm` executable — composition root only. The single place where concrete ## Conventions -1. **Composition root is the only place** that names concrete adapters: `StdFileSystem`, `CprHttpClient`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonSetRepository`, `YuGiOhSetCatalogService`, `DigiBattle99SetCatalogService`, `PokemonSetCatalogService`, `LocalImageStore`, `LocalPreviewByteCache`, `MagicGameModule`, `PokemonGameModule`, `JapanesePokemonGameModule` (Asia sets/preview backend for unified Pokemon), `YuGiOhGameModule`, `DigiBattle99GameModule`, `MagicGameView`, `PokemonGameView`, `YuGiOhGameView`, `DigiBattle99GameView`, etc. If a concrete adapter type appears anywhere else in the codebase, move the wiring here. +1. **Composition root is the only place** that names concrete adapters: `StdFileSystem`, `CprHttpClient`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonCollectionRepository`, `JsonSetRepository`, `YuGiOhSetCatalogService`, `DigiBattle99SetCatalogService`, `YuGiOhBandaiSetCatalogService`, `PokemonSetCatalogService`, `LocalImageStore`, `LocalPreviewByteCache`, `MagicGameModule`, `PokemonGameModule`, `JapanesePokemonGameModule` (Asia sets/preview backend for unified Pokemon), `YuGiOhGameModule`, `DigiBattle99GameModule`, `YuGiOhBandaiGameModule`, `MagicGameView`, `PokemonGameView`, `YuGiOhGameView`, `DigiBattle99GameView`, `YuGiOhBandaiGameView`, etc. If a concrete adapter type appears anywhere else in the codebase, move the wiring here. 2. **Member declaration order in `CcmApp` matters** — destruction is reverse, so a member that depends on another (e.g. `magicCollSvc_` depends on `magicRepo_` and `imgStore_`; `previewSvc_` depends on `http_` and is consumed by `ctx_`; `magicView_` depends on the typed `magicCollSvc_` and the shared services) must be declared **after** its deps. Do not reorder casually. 3. **Use `std::unique_ptr` for everything owned** by `CcmApp`. The `AppContext` then holds plain references into those owned objects, plus a vector of `IGameView*` raw pointers (the `unique_ptr<>`s for the views are the actual owners; the vector just describes the active set). 4. **Game-to-directory mapping** lives in `dirNameForGame(Game)` (anonymous namespace). When adding a new game, extend this function — it is wired into all three repositories (`JsonCollectionRepository`, `JsonSetRepository`, `LocalImageStore`). Pokemon West (`Game::Pokemon`) and Asia (`Game::JapanesePokemon`) both map to `"pokemon"`; `JsonSetRepository` stores their set caches as `sets-west.json` / `sets-asia.json` in that directory (other games keep `sets.json`). diff --git a/app/main.cpp b/app/main.cpp index cfb68a2..3b6fe77 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -5,6 +5,7 @@ #include "ccm/domain/DigiBattle99Card.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include "ccm/games/digibattle99/DigiBattle99GameModule.hpp" #include "ccm/games/magic/MagicGameModule.hpp" @@ -12,6 +13,7 @@ #include "ccm/games/pokemonjp/JapanesePokemonEnCatalog.hpp" #include "ccm/games/pokemonjp/JapanesePokemonGameModule.hpp" #include "ccm/games/yugioh/YuGiOhGameModule.hpp" +#include "ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp" #include "ccm/infra/CprHttpClient.hpp" #include "ccm/infra/JsonCollectionRepository.hpp" #include "ccm/infra/JsonSetRepository.hpp" @@ -23,6 +25,7 @@ #include "ccm/services/ConfigService.hpp" #include "ccm/services/DigiBattle99SetCatalogService.hpp" #include "ccm/services/PokemonSetCatalogService.hpp" +#include "ccm/services/YuGiOhBandaiSetCatalogService.hpp" #include "ccm/services/YuGiOhSetCatalogService.hpp" #include "ccm/services/ImageService.hpp" #include "ccm/services/SetService.hpp" @@ -31,6 +34,7 @@ #include "ccm/ui/MagicGameView.hpp" #include "ccm/ui/MainFrame.hpp" #include "ccm/ui/PokemonGameView.hpp" +#include "ccm/ui/YuGiOhBandaiGameView.hpp" #include "ccm/ui/YuGiOhGameView.hpp" #include @@ -54,6 +58,7 @@ std::string dirNameForGame(ccm::Game g) { case ccm::Game::Pokemon: return "pokemon"; case ccm::Game::YuGiOh: return "yugioh"; case ccm::Game::DigiBattle99: return "digibattle99"; + case ccm::Game::YuGiOhBandai: return "yugiohbandai"; case ccm::Game::JapanesePokemon: return "pokemon"; } return "magic"; @@ -91,6 +96,7 @@ public: pokeMod_ = std::make_unique(*http_); ygoMod_ = std::make_unique(*http_); digiBattle99Mod_ = std::make_unique(*http_); + ygoBandaiMod_ = std::make_unique(*http_); ccm::JapanesePokemonEnCatalog jpCatalog; { @@ -112,11 +118,16 @@ public: digiBattle99Repo_ = std::make_unique>( *fs_, *config_, &dirNameForGame); + ygoBandaiRepo_ = + std::make_unique>( + *fs_, *config_, &dirNameForGame); setRepo_ = std::make_unique(*fs_, *config_, &dirNameForGame); digiBattle99CatalogStore_ = std::make_unique(*fs_, *config_, &dirNameForGame); ygoCatalogStore_ = std::make_unique(*fs_, *config_, &dirNameForGame); + ygoBandaiCatalogStore_ = + std::make_unique(*fs_, *config_, &dirNameForGame); pokeCatalogStore_ = std::make_unique(*fs_, *config_, &dirNameForGame); imgStore_ = std::make_unique(*fs_, *config_, &dirNameForGame); @@ -131,11 +142,15 @@ public: digiBattle99CollSvc_ = std::make_unique>( *digiBattle99Repo_, *imgStore_); + ygoBandaiCollSvc_ = + std::make_unique>( + *ygoBandaiRepo_, *imgStore_); setSvc_ = std::make_unique(*setRepo_); setSvc_->registerModule(magicMod_.get()); setSvc_->registerModule(pokeMod_.get()); setSvc_->registerModule(ygoMod_.get()); setSvc_->registerModule(digiBattle99Mod_.get()); + setSvc_->registerModule(ygoBandaiMod_.get()); setSvc_->registerModule(jpPokeMod_.get()); // Disk-backed preview cache lives next to the executable, in the same @@ -161,6 +176,7 @@ public: previewSvc_->registerModule(*pokeMod_); previewSvc_->registerModule(*ygoMod_); previewSvc_->registerModule(*digiBattle99Mod_); + previewSvc_->registerModule(*ygoBandaiMod_); previewSvc_->registerModule(*jpPokeMod_); // Per-game UI bundles. Order here is the order shown in the Game menu. @@ -175,6 +191,9 @@ public: digiBattle99View_ = std::make_unique( *config_, *digiBattle99CollSvc_, *setSvc_, *imgSvc_, *previewSvc_, *digiBattle99Mod_, *digiBattle99CatalogStore_); + ygoBandaiView_ = std::make_unique( + *config_, *ygoBandaiCollSvc_, *setSvc_, *imgSvc_, *previewSvc_, + *ygoBandaiMod_, *ygoBandaiCatalogStore_); ctx_ = std::make_unique(ccm::ui::AppContext{ *config_, @@ -185,8 +204,10 @@ public: *pokeMod_, *ygoMod_, *digiBattle99Mod_, + *ygoBandaiMod_, *jpPokeMod_, - { magicView_.get(), pokeView_.get(), ygoView_.get(), digiBattle99View_.get() }, + { magicView_.get(), pokeView_.get(), ygoView_.get(), ygoBandaiView_.get(), + digiBattle99View_.get() }, }); auto* frame = new ccm::ui::MainFrame(*ctx_); @@ -208,14 +229,17 @@ private: std::unique_ptr pokeMod_; std::unique_ptr ygoMod_; std::unique_ptr digiBattle99Mod_; + std::unique_ptr ygoBandaiMod_; std::unique_ptr jpPokeMod_; std::unique_ptr> magicRepo_; std::unique_ptr> pokeRepo_; std::unique_ptr> ygoRepo_; std::unique_ptr> digiBattle99Repo_; + std::unique_ptr> ygoBandaiRepo_; std::unique_ptr setRepo_; std::unique_ptr digiBattle99CatalogStore_; std::unique_ptr ygoCatalogStore_; + std::unique_ptr ygoBandaiCatalogStore_; std::unique_ptr pokeCatalogStore_; std::unique_ptr imgStore_; std::unique_ptr imgSvc_; @@ -223,6 +247,7 @@ private: std::unique_ptr> pokeCollSvc_; std::unique_ptr> ygoCollSvc_; std::unique_ptr> digiBattle99CollSvc_; + std::unique_ptr> ygoBandaiCollSvc_; std::unique_ptr setSvc_; std::unique_ptr previewCache_; std::unique_ptr previewSvc_; @@ -230,6 +255,7 @@ private: std::unique_ptr pokeView_; std::unique_ptr ygoView_; std::unique_ptr digiBattle99View_; + std::unique_ptr ygoBandaiView_; std::unique_ptr ctx_; }; diff --git a/core/AGENTS.md b/core/AGENTS.md index 9c7fe41..b3a6b9e 100644 --- a/core/AGENTS.md +++ b/core/AGENTS.md @@ -4,11 +4,11 @@ ## Layer pointers -- `include/ccm/domain/` — POD value types: `Enums` (includes `PokemonRegion`), `Set`, `MagicCard`, `PokemonCard` (unified West/Asia via `region`), `YuGiOhCard`, `YuGiOhSetCatalog` (Yu-Gi-Oh! pack checklists for set completion), `DigiBattle99Card`, `DigiBattle99SetCatalog` (Digi-Battle pack checklists for set completion), `PokemonSetCatalog` (Pokemon West/Asia pack checklists for set completion), `JapanesePokemonCard` (legacy type retained for tests/serde; app collection uses `PokemonCard`), `Configuration`. Each has `to_json` / `from_json` defined in the matching `src/domain/*.cpp`. +- `include/ccm/domain/` — POD value types: `Enums` (includes `PokemonRegion`), `Set`, `MagicCard`, `PokemonCard` (unified West/Asia via `region`), `YuGiOhCard`, `YuGiOhSetCatalog` (Yu-Gi-Oh! pack checklists for set completion), `YuGiOhBandaiCard`, `YuGiOhBandaiSetCatalog` (Bandai pack checklists for set completion), `DigiBattle99Card`, `DigiBattle99SetCatalog` (Digi-Battle pack checklists for set completion), `PokemonSetCatalog` (Pokemon West/Asia pack checklists for set completion), `JapanesePokemonCard` (legacy type retained for tests/serde; app collection uses `PokemonCard`), `Configuration`. Each has `to_json` / `from_json` defined in the matching `src/domain/*.cpp`. - `include/ccm/ports/` — interfaces (`IHttpClient`, `IFileSystem`, `ICollectionRepository`, `ISetRepository`, `IImageStore`, `ICardPreviewSource`, `IPreviewByteCache`). All seams the services depend on. Add new ports here when adding new external concerns. - `include/ccm/infra/` — concrete adapters: `CprHttpClient`, `StdFileSystem`, `JsonCollectionRepository` (header-only template), `JsonSetRepository`, `LocalImageStore`, `LocalPreviewByteCache`. -- `include/ccm/services/` — high-level operations: `ConfigService`, `CollectionService` (header-only template), `SetService`, `ImageService`, `CardPreviewService`, `CardSorter` (free functions; per-column sort comparators that mirror established table sorting behavior — UI-agnostic so they can be unit-tested directly), `CardFilter` (free functions; case-insensitive substring row matcher restricted to each game's `tableFields` valueKey list), `YuGiOhSetCompletion` / `DigiBattle99SetCompletion` / `PokemonSetCompletion` (pure set-completion / checklist helpers), `YuGiOhSetCatalogService` (`yugioh/set-catalog.json`), `DigiBattle99SetCatalogService` (`digibattle99/set-catalog.json`), `PokemonSetCatalogService` (`pokemon/set-catalog-west.json` / `set-catalog-asia.json`). They depend only on ports / domain. -- `include/ccm/games/` — `IGameModule` + per-game modules. `IGameModule` consolidates the per-game seams: every module owns an `ISetSource` (required) and may own an `ICardPreviewSource` (optional, default `nullptr`). `magic/`, `pokemon/`, `yugioh/`, `digibattle99/`, and `pokemonjp/` are the reference implementations — all five expose a fully working set source + card preview source. `YuGiOhSetSource`, `DigiBattle99SetSource`, `PokemonSetSource`, and `JapanesePokemonSetSource` also expose `fetchAllWithCatalog` (and related catalog parsers) for set-completion checklists. `pokemonjp/` is the **Asia region backend** for the unified Pokemon UI (set cache at `pokemon/sets-asia.json`, same data dir as West; TCGdex JA previews); it is registered for sets/previews but is not a separate Game menu entry. Japanese Pokémon also loads an optional EN name catalog (`JapanesePokemonEnCatalog`) for display/auto-detect / Asia set-completion gap-fill. +- `include/ccm/services/` — high-level operations: `ConfigService`, `CollectionService` (header-only template), `SetService`, `ImageService`, `CardPreviewService`, `CardSorter` (free functions; per-column sort comparators that mirror established table sorting behavior — UI-agnostic so they can be unit-tested directly), `CardFilter` (free functions; case-insensitive substring row matcher restricted to each game's `tableFields` valueKey list), `YuGiOhSetCompletion` / `YuGiOhBandaiSetCompletion` / `DigiBattle99SetCompletion` / `PokemonSetCompletion` (pure set-completion / checklist helpers), `YuGiOhSetCatalogService` (`yugioh/set-catalog.json`), `YuGiOhBandaiSetCatalogService` (`yugiohbandai/set-catalog.json`), `DigiBattle99SetCatalogService` (`digibattle99/set-catalog.json`), `PokemonSetCatalogService` (`pokemon/set-catalog-west.json` / `set-catalog-asia.json`). They depend only on ports / domain. +- `include/ccm/games/` — `IGameModule` + per-game modules. `IGameModule` consolidates the per-game seams: every module owns an `ISetSource` (required) and may own an `ICardPreviewSource` (optional, default `nullptr`). `magic/`, `pokemon/`, `yugioh/`, `yugiohbandai/`, `digibattle99/`, and `pokemonjp/` are the reference implementations — all expose a fully working set source + card preview source. `YuGiOhSetSource`, `YuGiOhBandaiSetSource`, `DigiBattle99SetSource`, `PokemonSetSource`, and `JapanesePokemonSetSource` also expose `fetchAllWithCatalog` (and related catalog parsers) for set-completion checklists. `pokemonjp/` is the **Asia region backend** for the unified Pokemon UI (set cache at `pokemon/sets-asia.json`, same data dir as West; TCGdex JA previews); it is registered for sets/previews but is not a separate Game menu entry. Japanese Pokémon also loads an optional EN name catalog (`JapanesePokemonEnCatalog`) for display/auto-detect / Asia set-completion gap-fill. - `include/ccm/util/` — `Result.hpp` (the sum type), `FsNames.hpp` (filename munging ported from `util/fs.rs`), `YuGiOhPrintingSlot.hpp` / `YuGiOhSetLookup.hpp` (Yu-Gi-Oh! print-slot helpers and cached-set **set code** lookup for the edit dialog; both header-only, unit-tested). - `src/` mirrors `include/ccm/` for non-template implementations. diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index f89471a..b29518c 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -7,6 +7,8 @@ add_library(ccm_core STATIC src/domain/MagicCard.cpp src/domain/PokemonCard.cpp src/domain/YuGiOhCard.cpp + src/domain/YuGiOhBandaiCard.cpp + src/domain/YuGiOhBandaiSetCatalog.cpp src/domain/DigiBattle99Card.cpp src/domain/DigiBattle99SetCatalog.cpp src/domain/YuGiOhSetCatalog.cpp @@ -24,6 +26,8 @@ add_library(ccm_core STATIC src/services/DigiBattle99SetCatalogService.cpp src/services/YuGiOhSetCompletion.cpp src/services/YuGiOhSetCatalogService.cpp + src/services/YuGiOhBandaiSetCompletion.cpp + src/services/YuGiOhBandaiSetCatalogService.cpp src/services/PokemonSetCompletion.cpp src/services/PokemonSetCatalogService.cpp @@ -47,6 +51,9 @@ add_library(ccm_core STATIC src/games/digibattle99/DigiBattle99SetSource.cpp src/games/digibattle99/DigiBattle99CardPreviewSource.cpp src/games/digibattle99/DigiBattle99GameModule.cpp + src/games/yugiohbandai/YuGiOhBandaiSetSource.cpp + src/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.cpp + src/games/yugiohbandai/YuGiOhBandaiGameModule.cpp src/games/pokemonjp/JapanesePokemonEnCatalog.cpp src/games/pokemonjp/JapanesePokemonSetSource.cpp src/games/pokemonjp/JapanesePokemonCardPreviewSource.cpp diff --git a/core/include/ccm/domain/Enums.hpp b/core/include/ccm/domain/Enums.hpp index 085bdb3..a532132 100644 --- a/core/include/ccm/domain/Enums.hpp +++ b/core/include/ccm/domain/Enums.hpp @@ -21,6 +21,7 @@ enum class Game { Pokemon, YuGiOh, DigiBattle99, + YuGiOhBandai, JapanesePokemon, // internal Asia sets/preview routing; not in allGames() }; @@ -70,7 +71,7 @@ std::optional conditionFromString(std::string_view s) noexcept; std::optional themeFromString(std::string_view s) noexcept; // User-facing games (Game menu / Settings). JapanesePokemon is internal-only. -const std::array& allGames() noexcept; +const std::array& allGames() noexcept; const std::array& allLanguages() noexcept; const std::array& allConditions() noexcept; const std::array& allThemes() noexcept; diff --git a/core/include/ccm/domain/YuGiOhBandaiCard.hpp b/core/include/ccm/domain/YuGiOhBandaiCard.hpp new file mode 100644 index 0000000..4eb12f6 --- /dev/null +++ b/core/include/ccm/domain/YuGiOhBandaiCard.hpp @@ -0,0 +1,37 @@ +#pragma once + +// YuGiOhBandaiCard - Bandai Carddass (pre-Konami) card model. + +#include "ccm/domain/Enums.hpp" +#include "ccm/domain/Set.hpp" + +#include + +#include +#include +#include + +namespace ccm { + +struct YuGiOhBandaiCard { + std::uint32_t id{0}; + std::uint8_t amount{1}; + std::string name; + Set set; + std::string setNo; + std::string rarity; + std::string note; + std::vector images; + Language language{Language::Japanese}; + Condition condition{Condition::NearMint}; + bool holo{false}; + bool signed_{false}; + bool altered{false}; + + friend bool operator==(const YuGiOhBandaiCard&, const YuGiOhBandaiCard&) = default; +}; + +void to_json(nlohmann::json& j, const YuGiOhBandaiCard& c); +void from_json(const nlohmann::json& j, YuGiOhBandaiCard& c); + +} // namespace ccm diff --git a/core/include/ccm/domain/YuGiOhBandaiSetCatalog.hpp b/core/include/ccm/domain/YuGiOhBandaiSetCatalog.hpp new file mode 100644 index 0000000..c143751 --- /dev/null +++ b/core/include/ccm/domain/YuGiOhBandaiSetCatalog.hpp @@ -0,0 +1,52 @@ +#pragma once + +// YuGiOhBandaiSetCatalog: offline pack → card checklist for Bandai set +// completion. Filled from Yugipedia set-gallery wikitext and persisted at +// `/yugiohbandai/set-catalog.json`. + +#include + +#include +#include +#include + +namespace ccm { + +struct YuGiOhBandaiCatalogCard { + std::string setNo; + std::string name; + std::string rarity; + + friend bool operator==(const YuGiOhBandaiCatalogCard&, + const YuGiOhBandaiCatalogCard&) = default; +}; + +struct YuGiOhBandaiSetCatalogPack { + std::string setId; + std::string setName; + std::vector cards; + + friend bool operator==(const YuGiOhBandaiSetCatalogPack&, + const YuGiOhBandaiSetCatalogPack&) = default; +}; + +struct YuGiOhBandaiSetCatalog { + std::vector packs; + + [[nodiscard]] const YuGiOhBandaiSetCatalogPack* findPack( + std::string_view setId) const; + + [[nodiscard]] bool empty() const noexcept { return packs.empty(); } + + friend bool operator==(const YuGiOhBandaiSetCatalog&, + const YuGiOhBandaiSetCatalog&) = default; +}; + +void to_json(nlohmann::json& j, const YuGiOhBandaiCatalogCard& c); +void from_json(const nlohmann::json& j, YuGiOhBandaiCatalogCard& c); +void to_json(nlohmann::json& j, const YuGiOhBandaiSetCatalogPack& p); +void from_json(const nlohmann::json& j, YuGiOhBandaiSetCatalogPack& p); +void to_json(nlohmann::json& j, const YuGiOhBandaiSetCatalog& c); +void from_json(const nlohmann::json& j, YuGiOhBandaiSetCatalog& c); + +} // namespace ccm diff --git a/core/include/ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp new file mode 100644 index 0000000..2fc93bc --- /dev/null +++ b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp @@ -0,0 +1,77 @@ +#pragma once + +// YuGiOhBandaiCardPreviewSource: Yugipedia pageimages + SMW ask for Bandai +// Carddass previews and auto-detect (by English name or Bandai number). + +#include "ccm/ports/ICardPreviewSource.hpp" +#include "ccm/ports/IHttpClient.hpp" + +#include +#include +#include + +namespace ccm { + +class YuGiOhBandaiCardPreviewSource final : public ICardPreviewSource { +public: + explicit YuGiOhBandaiCardPreviewSource(IHttpClient& http); + + [[nodiscard]] bool supportsAutoDetectPrint() const noexcept override { return true; } + + Result + fetchImageUrl(std::string_view name, + std::string_view setId, + std::string_view setNo) override; + + Result detectFirstPrint(std::string_view name, + std::string_view setId) override; + + Result> detectPrintVariants(std::string_view name, + std::string_view setId) override; + + Result detectBySetNo(std::string_view setNo) override; + + Result> detectVariantsBySetNo( + std::string_view setNo) override; + + // Prefer " (Bandai)" / English / Sealdass page depending on setId. + static std::string preferredPageTitle(std::string_view name, + std::string_view setId, + std::string_view setNo); + + static std::string buildPageImagesUrl(std::string_view pageTitle); + + static std::string buildAskByNameUrl(std::string_view englishName); + + static std::string buildAskByNumberUrl(std::string_view setNo); + + // True for Jump/Toei promo codes (J1, TA2, …). Yugipedia's SMW + // `Bandai number` property is numeric-only, so these must use the + // promotional gallery instead of `action=ask`. + [[nodiscard]] static bool isAlphanumericPromoNumber(std::string_view setNo); + + static Result> + parsePromoGalleryResponse(const std::string& body, + std::string_view wantedSetNo); + + static Result + parsePageImagesResponse(const std::string& body); + + static Result> + parseAskResponse(const std::string& body, std::string_view preferredSetId); + + static AutoDetectedPrint enrichPrint(AutoDetectedPrint print, + std::string_view pageTitle); + +private: + Result fetchPageImage(std::string_view pageTitle); + + Result> askByName(std::string_view name, + std::string_view setId); + + Result> askByNumber(std::string_view setNo); + + IHttpClient& http_; +}; + +} // namespace ccm diff --git a/core/include/ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp new file mode 100644 index 0000000..fe2b337 --- /dev/null +++ b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp @@ -0,0 +1,29 @@ +#pragma once + +// YuGiOhBandaiGameModule: Bandai Carddass via Yugipedia. + +#include "ccm/games/IGameModule.hpp" +#include "ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp" +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" + +namespace ccm { + +class YuGiOhBandaiGameModule final : public IGameModule { +public: + explicit YuGiOhBandaiGameModule(IHttpClient& http); + + [[nodiscard]] Game id() const noexcept override { return Game::YuGiOhBandai; } + [[nodiscard]] std::string dirName() const override { return "yugiohbandai"; } + [[nodiscard]] std::string displayName() const override { return "Yu-Gi-Oh! (Bandai)"; } + + ISetSource& setSource() override { return setSource_; } + ICardPreviewSource* cardPreviewSource() noexcept override { return &previewSource_; } + + YuGiOhBandaiSetSource& bandaiSetSource() noexcept { return setSource_; } + +private: + YuGiOhBandaiSetSource setSource_; + YuGiOhBandaiCardPreviewSource previewSource_; +}; + +} // namespace ccm diff --git a/core/include/ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp new file mode 100644 index 0000000..c967125 --- /dev/null +++ b/core/include/ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp @@ -0,0 +1,67 @@ +#pragma once + +// YuGiOhBandaiSetSource: hardcoded Bandai set manifest + Yugipedia gallery +// wikitext catalogs for set completion. + +#include "ccm/domain/Set.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" +#include "ccm/games/IGameModule.hpp" +#include "ccm/ports/IHttpClient.hpp" + +#include +#include +#include + +namespace ccm { + +class YuGiOhBandaiSetSource final : public ISetSource { +public: + struct FetchWithCatalog { + std::vector sets; + YuGiOhBandaiSetCatalog catalog; + }; + + struct SetManifestEntry { + const char* id; + const char* name; + const char* releaseDate; // YYYY/MM/DD + const char* galleryPage; // Yugipedia page title (may be shared) + // For the shared promo gallery: keep cards whose setNo starts with + // this prefix (empty = keep all from that page into this pack). + const char* setNoPrefix; + }; + + explicit YuGiOhBandaiSetSource(IHttpClient& http); + + Result> fetchAll() override; + + Result fetchAllWithCatalog(); + + [[nodiscard]] static const std::vector& setManifest(); + + static Result> parseResponse(const std::string& /*unused*/); + + // Parse one gallery wikitext body into checklist cards. + static Result> + parseGalleryWikitext(const std::string& wikitext); + + // Map a Bandai number string to a set id (ban1/ban2/ban3/promos/sealdass). + static std::string setIdForNumber(std::string_view setNo); + + static std::string setNameForId(std::string_view setId); + + // Normalize printed numbers: strip leading zeros on pure-decimal values; + // uppercase letter prefixes (j1 → J1). Sealdass stays unpadded decimal. + static std::string normalizeCardNumber(std::string_view setNo); + + static std::string expandRarityCode(std::string_view code); + + static std::string buildGalleryParseUrl(std::string_view pageTitle); + + static std::string englishNameFromGalleryTitle(std::string_view pageTitle); + +private: + IHttpClient& http_; +}; + +} // namespace ccm diff --git a/core/include/ccm/ports/ICardPreviewSource.hpp b/core/include/ccm/ports/ICardPreviewSource.hpp index fb9cfe4..f86614f 100644 --- a/core/include/ccm/ports/ICardPreviewSource.hpp +++ b/core/include/ccm/ports/ICardPreviewSource.hpp @@ -19,6 +19,12 @@ namespace ccm { struct AutoDetectedPrint { std::string setNo; std::string rarity; + // Optional fields used by games that resolve set/name/language during + // auto-detect (e.g. Yu-Gi-Oh! Bandai). Existing games leave them empty. + std::string name; + std::string setId; + std::string setName; + std::string language; // Language enum spelling when known ("Japanese" / "English") }; // Classified error returned by ICardPreviewSource::fetchImageUrl. The kind @@ -79,6 +85,18 @@ public: return Result>::err( "Print variant listing not supported by this game."); } + + // Optional lookup by collector / Bandai number (fills name + set + rarity). + virtual Result detectBySetNo(std::string_view /*setNo*/) { + return Result::err( + "Detect-by-number not supported by this game."); + } + + virtual Result> + detectVariantsBySetNo(std::string_view /*setNo*/) { + return Result>::err( + "Detect-by-number variants not supported by this game."); + } }; } // namespace ccm diff --git a/core/include/ccm/services/CardFilter.hpp b/core/include/ccm/services/CardFilter.hpp index 34570fd..2eb3b10 100644 --- a/core/include/ccm/services/CardFilter.hpp +++ b/core/include/ccm/services/CardFilter.hpp @@ -23,6 +23,7 @@ #include "ccm/domain/JapanesePokemonCard.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include @@ -47,6 +48,10 @@ namespace ccm { [[nodiscard]] bool matchesDigiBattle99Filter(const DigiBattle99Card& card, std::string_view filter); +// Bandai: name, set.name, setNo, rarity, language, condition, amount, note. +[[nodiscard]] bool matchesYuGiOhBandaiFilter(const YuGiOhBandaiCard& card, + std::string_view filter); + // Japanese Pokemon mirrors Pokemon searchable columns (includes setNo). [[nodiscard]] bool matchesJapanesePokemonFilter(const JapanesePokemonCard& card, std::string_view filter); diff --git a/core/include/ccm/services/CardPreviewService.hpp b/core/include/ccm/services/CardPreviewService.hpp index 9fc2d8b..2804209 100644 --- a/core/include/ccm/services/CardPreviewService.hpp +++ b/core/include/ccm/services/CardPreviewService.hpp @@ -81,6 +81,11 @@ public: std::string_view name, std::string_view setId); + Result detectBySetNo(Game game, std::string_view setNo); + + Result> detectVariantsBySetNo(Game game, + std::string_view setNo); + // Download image bytes from a fully-qualified URL without going through // per-game preview-source resolution. Cached by URL (same LRU bound). Result fetchImageBytesByUrl(std::string_view url); diff --git a/core/include/ccm/services/CardSorter.hpp b/core/include/ccm/services/CardSorter.hpp index 637cf12..427db43 100644 --- a/core/include/ccm/services/CardSorter.hpp +++ b/core/include/ccm/services/CardSorter.hpp @@ -20,6 +20,7 @@ #include "ccm/domain/JapanesePokemonCard.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include @@ -82,6 +83,20 @@ enum class DigiBattle99SortColumn { Note, }; +enum class YuGiOhBandaiSortColumn { + Name, + SetReleaseDate, + SetNo, + Rarity, + Language, + Condition, + Amount, + Holo, + Signed, + Altered, + Note, +}; + // Japanese Pokemon mirrors Pokemon columns. enum class JapanesePokemonSortColumn { Name, @@ -107,6 +122,9 @@ void sortYuGiOhCards(std::vector& cards, YuGiOhSortColumn column, void sortDigiBattle99Cards(std::vector& cards, DigiBattle99SortColumn column, bool ascending); +void sortYuGiOhBandaiCards(std::vector& cards, + YuGiOhBandaiSortColumn column, + bool ascending); void sortJapanesePokemonCards(std::vector& cards, JapanesePokemonSortColumn column, bool ascending); diff --git a/core/include/ccm/services/YuGiOhBandaiSetCatalogService.hpp b/core/include/ccm/services/YuGiOhBandaiSetCatalogService.hpp new file mode 100644 index 0000000..fdf24c3 --- /dev/null +++ b/core/include/ccm/services/YuGiOhBandaiSetCatalogService.hpp @@ -0,0 +1,35 @@ +#pragma once + +// YuGiOhBandaiSetCatalogService: load/save yugiohbandai/set-catalog.json. + +#include "ccm/domain/Enums.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" +#include "ccm/ports/IFileSystem.hpp" +#include "ccm/services/ConfigService.hpp" +#include "ccm/util/Result.hpp" + +#include +#include + +namespace ccm { + +class YuGiOhBandaiSetCatalogService { +public: + using DirNameFn = std::function; + + YuGiOhBandaiSetCatalogService(IFileSystem& fs, ConfigService& config, DirNameFn dirName); + + Result load() const; + Result save(const YuGiOhBandaiSetCatalog& catalog); + + [[nodiscard]] bool exists() const; + +private: + IFileSystem& fs_; + ConfigService& config_; + DirNameFn dirName_; + + [[nodiscard]] std::filesystem::path catalogPath() const; +}; + +} // namespace ccm diff --git a/core/include/ccm/services/YuGiOhBandaiSetCompletion.hpp b/core/include/ccm/services/YuGiOhBandaiSetCompletion.hpp new file mode 100644 index 0000000..03de4ae --- /dev/null +++ b/core/include/ccm/services/YuGiOhBandaiSetCompletion.hpp @@ -0,0 +1,51 @@ +#pragma once + +// Pure helpers: Bandai set-completion progress and per-set checklists. +// Ownership keys on (set.id, normalized setNo). Never name-only. + +#include "ccm/domain/Enums.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" + +#include +#include +#include +#include +#include + +namespace ccm { + +struct YuGiOhBandaiSetCompletionProgress { + std::string setId; + std::string setName; + std::size_t ownedUnique{0}; + std::size_t total{0}; + + [[nodiscard]] int percent() const noexcept { + if (total == 0) return 0; + return static_cast((ownedUnique * 100) / total); + } +}; + +struct YuGiOhBandaiChecklistEntry { + std::string setNo; + std::string name; + std::string rarity; + bool owned{false}; +}; + +[[nodiscard]] std::vector +yuGiOhBandaiLanguagesInCollection(const std::vector& collection); + +[[nodiscard]] std::vector +computeYuGiOhBandaiSetCompletion(const std::vector& collection, + const YuGiOhBandaiSetCatalog& catalog, + std::optional languageFilter = std::nullopt); + +[[nodiscard]] std::vector +yuGiOhBandaiChecklistForSet(const std::vector& collection, + const YuGiOhBandaiSetCatalog& catalog, + std::string_view setId, + std::optional languageFilter = std::nullopt); + +} // namespace ccm diff --git a/core/src/domain/Enums.cpp b/core/src/domain/Enums.cpp index ae6a88e..f0443a2 100644 --- a/core/src/domain/Enums.cpp +++ b/core/src/domain/Enums.cpp @@ -17,6 +17,7 @@ std::string_view to_string(Game g) noexcept { case Game::Pokemon: return "Pokemon"; case Game::YuGiOh: return "YuGiOh"; case Game::DigiBattle99: return "DigiBattle99"; + case Game::YuGiOhBandai: return "YuGiOhBandai"; case Game::JapanesePokemon: return "JapanesePokemon"; } CCM_UNREACHABLE(); @@ -72,6 +73,7 @@ std::optional gameFromString(std::string_view s) noexcept { if (s == "Pokemon") return Game::Pokemon; if (s == "YuGiOh") return Game::YuGiOh; if (s == "DigiBattle99") return Game::DigiBattle99; + if (s == "YuGiOhBandai") return Game::YuGiOhBandai; if (s == "JapanesePokemon") return Game::JapanesePokemon; return std::nullopt; } @@ -115,9 +117,10 @@ std::optional themeFromString(std::string_view s) noexcept { return std::nullopt; } -const std::array& allGames() noexcept { - static constexpr std::array v{ - Game::Magic, Game::Pokemon, Game::YuGiOh, Game::DigiBattle99}; +const std::array& allGames() noexcept { + static constexpr std::array v{ + Game::Magic, Game::Pokemon, Game::YuGiOh, Game::YuGiOhBandai, + Game::DigiBattle99}; return v; } diff --git a/core/src/domain/YuGiOhBandaiCard.cpp b/core/src/domain/YuGiOhBandaiCard.cpp new file mode 100644 index 0000000..8b74fbb --- /dev/null +++ b/core/src/domain/YuGiOhBandaiCard.cpp @@ -0,0 +1,39 @@ +#include "ccm/domain/YuGiOhBandaiCard.hpp" + +namespace ccm { + +void to_json(nlohmann::json& j, const YuGiOhBandaiCard& c) { + j = nlohmann::json{ + {"id", c.id}, + {"amount", c.amount}, + {"name", c.name}, + {"set", c.set}, + {"setNo", c.setNo}, + {"rarity", c.rarity}, + {"note", c.note}, + {"images", c.images}, + {"language", c.language}, + {"condition", c.condition}, + {"holo", c.holo}, + {"signed", c.signed_}, + {"altered", c.altered}, + }; +} + +void from_json(const nlohmann::json& j, YuGiOhBandaiCard& c) { + j.at("id").get_to(c.id); + j.at("amount").get_to(c.amount); + j.at("name").get_to(c.name); + j.at("set").get_to(c.set); + j.at("setNo").get_to(c.setNo); + j.at("rarity").get_to(c.rarity); + j.at("note").get_to(c.note); + j.at("images").get_to(c.images); + j.at("language").get_to(c.language); + j.at("condition").get_to(c.condition); + j.at("holo").get_to(c.holo); + j.at("signed").get_to(c.signed_); + j.at("altered").get_to(c.altered); +} + +} // namespace ccm diff --git a/core/src/domain/YuGiOhBandaiSetCatalog.cpp b/core/src/domain/YuGiOhBandaiSetCatalog.cpp new file mode 100644 index 0000000..f296a79 --- /dev/null +++ b/core/src/domain/YuGiOhBandaiSetCatalog.cpp @@ -0,0 +1,45 @@ +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" + +namespace ccm { + +const YuGiOhBandaiSetCatalogPack* YuGiOhBandaiSetCatalog::findPack( + std::string_view setId) const { + for (const auto& pack : packs) { + if (pack.setId == setId) return &pack; + } + return nullptr; +} + +void to_json(nlohmann::json& j, const YuGiOhBandaiCatalogCard& c) { + j = nlohmann::json{{"setNo", c.setNo}, {"name", c.name}, {"rarity", c.rarity}}; +} + +void from_json(const nlohmann::json& j, YuGiOhBandaiCatalogCard& c) { + j.at("setNo").get_to(c.setNo); + j.at("name").get_to(c.name); + if (j.contains("rarity")) { + j.at("rarity").get_to(c.rarity); + } else { + c.rarity.clear(); + } +} + +void to_json(nlohmann::json& j, const YuGiOhBandaiSetCatalogPack& p) { + j = nlohmann::json{{"id", p.setId}, {"name", p.setName}, {"cards", p.cards}}; +} + +void from_json(const nlohmann::json& j, YuGiOhBandaiSetCatalogPack& p) { + j.at("id").get_to(p.setId); + j.at("name").get_to(p.setName); + j.at("cards").get_to(p.cards); +} + +void to_json(nlohmann::json& j, const YuGiOhBandaiSetCatalog& c) { + j = nlohmann::json{{"packs", c.packs}}; +} + +void from_json(const nlohmann::json& j, YuGiOhBandaiSetCatalog& c) { + j.at("packs").get_to(c.packs); +} + +} // namespace ccm diff --git a/core/src/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.cpp b/core/src/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.cpp new file mode 100644 index 0000000..85a2fee --- /dev/null +++ b/core/src/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.cpp @@ -0,0 +1,426 @@ +#include "ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp" + +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" + +#include + +#include +#include +#include + +namespace ccm { + +namespace { + +using K = PreviewLookupError::Kind; + +std::string trimCopy(std::string_view s) { + while (!s.empty() && + (s.front() == ' ' || s.front() == '\t' || s.front() == '\n' || + s.front() == '\r')) { + s.remove_prefix(1); + } + while (!s.empty() && + (s.back() == ' ' || s.back() == '\t' || s.back() == '\n' || + s.back() == '\r')) { + s.remove_suffix(1); + } + return std::string(s); +} + +std::string urlEncode(std::string_view s) { + static constexpr char hex[] = "0123456789ABCDEF"; + std::string out; + out.reserve(s.size() * 3); + for (unsigned char c : s) { + if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { + out.push_back(static_cast(c)); + } else if (c == ' ') { + out.push_back('+'); + } else { + out.push_back('%'); + out.push_back(hex[c >> 4]); + out.push_back(hex[c & 0xF]); + } + } + return out; +} + +std::string wikiTitleEncode(std::string_view title) { + // MediaWiki titles use underscores for spaces in the titles= parameter. + std::string s; + s.reserve(title.size()); + for (char c : title) { + s.push_back(c == ' ' ? '_' : c); + } + return urlEncode(s); +} + +bool endsWith(std::string_view s, std::string_view suffix) { + return s.size() >= suffix.size() && + s.compare(s.size() - suffix.size(), suffix.size(), suffix) == 0; +} + +int askMatchRank(std::string_view pageTitle, std::string_view preferredSetId) { + // Lower is better. + if (preferredSetId == "bansealdass") { + if (endsWith(pageTitle, " (Bandai Sealdass)")) return 0; + if (endsWith(pageTitle, " (Bandai)")) return 1; + return 5; + } + if (preferredSetId == "ban3") { + if (endsWith(pageTitle, " (Bandai)")) return 0; + if (endsWith(pageTitle, " (English Bandai)")) return 1; + if (endsWith(pageTitle, " (Bandai Sealdass)")) return 4; + return 5; + } + if (endsWith(pageTitle, " (Bandai)")) return 0; + if (endsWith(pageTitle, " (English Bandai)")) return 1; + if (endsWith(pageTitle, " (Bandai Sealdass)")) return 3; + return 5; +} + +} // namespace + +YuGiOhBandaiCardPreviewSource::YuGiOhBandaiCardPreviewSource(IHttpClient& http) + : http_(http) {} + +std::string YuGiOhBandaiCardPreviewSource::preferredPageTitle( + std::string_view name, + std::string_view setId, + std::string_view setNo) { + const std::string n = trimCopy(name); + if (n.empty()) return {}; + + const std::string num = YuGiOhBandaiSetSource::normalizeCardNumber(setNo); + if (setId == "bansealdass") { + return n + " (Bandai Sealdass)"; + } + // Promo pages on Yugipedia often omit the "(Bandai)" disambiguator + // (e.g. Blue-Eyes White Dragon's 3-Body Connection for TA2). + if (setId == "banpromo-j" || setId == "banpromo-ta" || + isAlphanumericPromoNumber(num)) { + return n; + } + if (num == "118" || setId == "ban3") { + // Prefer JP Bandai page for most ban3 cards; English #118 uses the + // English Bandai title when setNo is 118. + if (num == "118") return n + " (English Bandai)"; + } + return n + " (Bandai)"; +} + +std::string YuGiOhBandaiCardPreviewSource::buildPageImagesUrl( + std::string_view pageTitle) { + return std::string( + "https://yugipedia.com/api.php?action=query&format=json" + "&prop=pageimages&piprop=original&titles=") + + wikiTitleEncode(pageTitle); +} + +std::string YuGiOhBandaiCardPreviewSource::buildAskByNameUrl( + std::string_view englishName) { + // [[Category:Bandai cards]][[English name::]]|?English name|?Bandai number|?Rarity|limit=20 + std::ostringstream q; + q << "[[Category:Bandai cards]][[English name::" << englishName + << "]]|?English name|?Bandai number|?Rarity|limit=20"; + return std::string("https://yugipedia.com/api.php?action=ask&format=json&query=") + + urlEncode(q.str()); +} + +std::string YuGiOhBandaiCardPreviewSource::buildAskByNumberUrl( + std::string_view setNo) { + const std::string n = YuGiOhBandaiSetSource::normalizeCardNumber(setNo); + std::ostringstream q; + q << "[[Category:Bandai cards]][[Bandai number::" << n + << "]]|?English name|?Bandai number|?Rarity|limit=20"; + return std::string("https://yugipedia.com/api.php?action=ask&format=json&query=") + + urlEncode(q.str()); +} + +bool YuGiOhBandaiCardPreviewSource::isAlphanumericPromoNumber( + std::string_view setNo) { + const std::string n = YuGiOhBandaiSetSource::normalizeCardNumber(setNo); + for (unsigned char c : n) { + if (std::isalpha(c)) return true; + } + return false; +} + +Result> +YuGiOhBandaiCardPreviewSource::parsePromoGalleryResponse( + const std::string& body, + std::string_view wantedSetNo) { + using R = Result>; + const std::string want = YuGiOhBandaiSetSource::normalizeCardNumber(wantedSetNo); + if (want.empty()) return R::err("Card number is empty."); + + std::string wikitext; + try { + const auto j = nlohmann::json::parse(body); + if (!j.contains("parse") || !j.at("parse").contains("wikitext")) { + return R::err("Yugipedia promo gallery response missing parse.wikitext"); + } + wikitext = j.at("parse").at("wikitext").get(); + } catch (const std::exception& e) { + return R::err(std::string("Yugipedia promo gallery JSON parse error: ") + + e.what()); + } + + auto cards = YuGiOhBandaiSetSource::parseGalleryWikitext(wikitext); + if (!cards) return R::err(cards.error()); + + std::vector out; + for (const auto& card : cards.value()) { + if (YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo) != want) continue; + AutoDetectedPrint print; + print.name = card.name; + print.setNo = card.setNo; + print.rarity = card.rarity; + print.setId = YuGiOhBandaiSetSource::setIdForNumber(card.setNo); + print.setName = YuGiOhBandaiSetSource::setNameForId(print.setId); + print.language = "Japanese"; + out.push_back(std::move(print)); + } + return R::ok(std::move(out)); +} + +AutoDetectedPrint YuGiOhBandaiCardPreviewSource::enrichPrint( + AutoDetectedPrint print, + std::string_view pageTitle) { + print.name = YuGiOhBandaiSetSource::englishNameFromGalleryTitle(pageTitle); + + if (endsWith(pageTitle, " (Bandai Sealdass)")) { + print.setId = "bansealdass"; + print.language = "Japanese"; + } else if (endsWith(pageTitle, " (English Bandai)")) { + print.setId = "ban3"; + print.language = "English"; + } else { + if (print.setId.empty() && !print.setNo.empty()) { + print.setId = YuGiOhBandaiSetSource::setIdForNumber(print.setNo); + } + print.language = "Japanese"; + } + if (!print.setId.empty()) { + print.setName = YuGiOhBandaiSetSource::setNameForId(print.setId); + } + return print; +} + +Result +YuGiOhBandaiCardPreviewSource::parsePageImagesResponse(const std::string& body) { + using R = Result; + try { + const auto j = nlohmann::json::parse(body); + if (!j.contains("query") || !j.at("query").contains("pages")) { + return R::err({K::Transient, "Yugipedia pageimages: missing query.pages"}); + } + const auto& pages = j.at("query").at("pages"); + for (auto it = pages.begin(); it != pages.end(); ++it) { + const auto& page = it.value(); + if (page.contains("missing") || page.contains("invalid")) continue; + if (page.contains("original") && page.at("original").contains("source")) { + const auto url = page.at("original").at("source").get(); + if (!url.empty()) return R::ok(url); + } + if (page.contains("thumbnail") && page.at("thumbnail").contains("original")) { + const auto url = page.at("thumbnail").at("original").get(); + if (!url.empty()) return R::ok(url); + } + } + return R::err({K::NotFound, "Yugipedia pageimages: no image for page"}); + } catch (const std::exception& e) { + return R::err({K::Transient, + std::string("Yugipedia pageimages JSON parse error: ") + e.what()}); + } +} + +Result> +YuGiOhBandaiCardPreviewSource::parseAskResponse(const std::string& body, + std::string_view preferredSetId) { + using R = Result>; + try { + const auto j = nlohmann::json::parse(body); + if (!j.contains("query") || !j.at("query").contains("results")) { + return R::err("Yugipedia ask: missing query.results"); + } + const auto& results = j.at("query").at("results"); + if (!results.is_object() || results.empty()) { + return R::ok({}); + } + + std::vector> ranked; + for (auto it = results.begin(); it != results.end(); ++it) { + const std::string pageTitle = it.key(); + const auto& printouts = it.value().value("printouts", nlohmann::json::object()); + + AutoDetectedPrint print; + if (printouts.contains("Bandai number") && + printouts.at("Bandai number").is_array() && + !printouts.at("Bandai number").empty()) { + const auto& num = printouts.at("Bandai number").at(0); + if (num.is_number_integer()) { + print.setNo = YuGiOhBandaiSetSource::normalizeCardNumber( + std::to_string(num.get())); + } else if (num.is_string()) { + print.setNo = + YuGiOhBandaiSetSource::normalizeCardNumber(num.get()); + } + } + if (printouts.contains("Rarity") && printouts.at("Rarity").is_array() && + !printouts.at("Rarity").empty()) { + const auto& rar = printouts.at("Rarity").at(0); + if (rar.is_object() && rar.contains("fulltext")) { + print.rarity = rar.at("fulltext").get(); + } else if (rar.is_string()) { + print.rarity = rar.get(); + } + } + if (printouts.contains("English name") && + printouts.at("English name").is_array() && + !printouts.at("English name").empty()) { + print.name = printouts.at("English name").at(0).get(); + } + + print = enrichPrint(std::move(print), pageTitle); + if (print.name.empty()) continue; + ranked.emplace_back(askMatchRank(pageTitle, preferredSetId), std::move(print)); + } + + std::sort(ranked.begin(), ranked.end(), + [](const auto& a, const auto& b) { return a.first < b.first; }); + + std::vector out; + out.reserve(ranked.size()); + for (auto& [rank, print] : ranked) { + (void)rank; + out.push_back(std::move(print)); + } + return R::ok(std::move(out)); + } catch (const std::exception& e) { + return R::err(std::string("Yugipedia ask JSON parse error: ") + e.what()); + } +} + +Result +YuGiOhBandaiCardPreviewSource::fetchPageImage(std::string_view pageTitle) { + using R = Result; + if (pageTitle.empty()) { + return R::err({K::NotFound, "Empty Bandai page title"}); + } + const std::string url = buildPageImagesUrl(pageTitle); + auto resp = http_.get(url); + if (!resp) return R::err({K::Transient, resp.error()}); + return parsePageImagesResponse(resp.value()); +} + +Result> YuGiOhBandaiCardPreviewSource::askByName( + std::string_view name, + std::string_view setId) { + using R = Result>; + const std::string n = trimCopy(name); + if (n.empty()) return R::err("Card name is empty."); + const std::string url = buildAskByNameUrl(n); + auto resp = http_.get(url); + if (!resp) return R::err(resp.error()); + return parseAskResponse(resp.value(), setId); +} + +Result> YuGiOhBandaiCardPreviewSource::askByNumber( + std::string_view setNo) { + using R = Result>; + const std::string n = YuGiOhBandaiSetSource::normalizeCardNumber(setNo); + if (n.empty()) return R::err("Card number is empty."); + + // Promo codes (J1, TA2, …) are not valid values for SMW's numeric + // `Bandai number` property — ask returns a type error. Resolve them from + // the promotional set gallery instead. + if (isAlphanumericPromoNumber(n)) { + static constexpr const char* kPromoGallery = + "Set Card Galleries:Promotional Cards (Bandai)"; + const std::string url = YuGiOhBandaiSetSource::buildGalleryParseUrl(kPromoGallery); + auto resp = http_.get(url); + if (!resp) return R::err(resp.error()); + return parsePromoGalleryResponse(resp.value(), n); + } + + const std::string url = buildAskByNumberUrl(n); + auto resp = http_.get(url); + if (!resp) return R::err(resp.error()); + return parseAskResponse(resp.value(), {}); +} + +Result +YuGiOhBandaiCardPreviewSource::fetchImageUrl(std::string_view name, + std::string_view setId, + std::string_view setNo) { + using R = Result; + + const std::string title = preferredPageTitle(name, setId, setNo); + auto direct = fetchPageImage(title); + if (direct) return direct; + // Try English Bandai if JP page missed for #118. + if (YuGiOhBandaiSetSource::normalizeCardNumber(setNo) == "118") { + auto en = fetchPageImage(trimCopy(name) + " (English Bandai)"); + if (en) return en; + } + + // Fall back to SMW ask by name, then pageimages on the best hit. + auto variants = askByName(name, setId); + if (!variants) { + // Prefer the original NotFound if ask also failed transiently only + // after a clean miss; otherwise surface ask error as Transient. + if (direct.error().kind == K::NotFound) { + return R::err({K::Transient, variants.error()}); + } + return direct; + } + if (variants.value().empty()) { + return R::err({K::NotFound, "No Bandai card matched the name"}); + } + + const auto& best = variants.value().front(); + std::string askTitle = preferredPageTitle(best.name, best.setId, best.setNo); + if (best.language == "English") { + askTitle = best.name + " (English Bandai)"; + } else if (best.setId == "bansealdass") { + askTitle = best.name + " (Bandai Sealdass)"; + } + return fetchPageImage(askTitle); +} + +Result YuGiOhBandaiCardPreviewSource::detectFirstPrint( + std::string_view name, + std::string_view setId) { + auto list = detectPrintVariants(name, setId); + if (!list) return Result::err(list.error()); + if (list.value().empty()) { + return Result::err("Could not auto-detect Bandai print metadata."); + } + return Result::ok(list.value().front()); +} + +Result> +YuGiOhBandaiCardPreviewSource::detectPrintVariants(std::string_view name, + std::string_view setId) { + return askByName(name, setId); +} + +Result YuGiOhBandaiCardPreviewSource::detectBySetNo( + std::string_view setNo) { + auto list = detectVariantsBySetNo(setNo); + if (!list) return Result::err(list.error()); + if (list.value().empty()) { + return Result::err( + "Could not auto-detect Bandai card from number."); + } + return Result::ok(list.value().front()); +} + +Result> +YuGiOhBandaiCardPreviewSource::detectVariantsBySetNo(std::string_view setNo) { + return askByNumber(setNo); +} + +} // namespace ccm diff --git a/core/src/games/yugiohbandai/YuGiOhBandaiGameModule.cpp b/core/src/games/yugiohbandai/YuGiOhBandaiGameModule.cpp new file mode 100644 index 0000000..74b9239 --- /dev/null +++ b/core/src/games/yugiohbandai/YuGiOhBandaiGameModule.cpp @@ -0,0 +1,8 @@ +#include "ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp" + +namespace ccm { + +YuGiOhBandaiGameModule::YuGiOhBandaiGameModule(IHttpClient& http) + : setSource_(http), previewSource_(http) {} + +} // namespace ccm diff --git a/core/src/games/yugiohbandai/YuGiOhBandaiSetSource.cpp b/core/src/games/yugiohbandai/YuGiOhBandaiSetSource.cpp new file mode 100644 index 0000000..db45f81 --- /dev/null +++ b/core/src/games/yugiohbandai/YuGiOhBandaiSetSource.cpp @@ -0,0 +1,267 @@ +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" + +#include + +#include +#include +#include +#include + +namespace ccm { + +namespace { + +std::string trimCopy(std::string_view s) { + while (!s.empty() && + (s.front() == ' ' || s.front() == '\t' || s.front() == '\n' || + s.front() == '\r')) { + s.remove_prefix(1); + } + while (!s.empty() && + (s.back() == ' ' || s.back() == '\t' || s.back() == '\n' || + s.back() == '\r')) { + s.remove_suffix(1); + } + return std::string(s); +} + +std::string urlEncode(std::string_view s) { + static constexpr char hex[] = "0123456789ABCDEF"; + std::string out; + out.reserve(s.size() * 3); + for (unsigned char c : s) { + if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') { + out.push_back(static_cast(c)); + } else if (c == ' ') { + out.push_back('+'); + } else { + out.push_back('%'); + out.push_back(hex[c >> 4]); + out.push_back(hex[c & 0xF]); + } + } + return out; +} + +} // namespace + +YuGiOhBandaiSetSource::YuGiOhBandaiSetSource(IHttpClient& http) : http_(http) {} + +const std::vector& +YuGiOhBandaiSetSource::setManifest() { + static const std::vector kManifest{ + {"ban1", "1st Generation", "1998/09/01", + "Set Card Galleries:Yu-Gi-Oh! Bandai OCG: 1st Generation", ""}, + {"ban2", "2nd Generation", "1998/11/01", + "Set Card Galleries:2nd Generation (Bandai)", ""}, + {"ban3", "3rd Generation", "1999/03/06", + "Set Card Galleries:3rd Generation (Bandai)", ""}, + {"banpromo-j", "Jump Promos", "1998/01/01", + "Set Card Galleries:Promotional Cards (Bandai)", "J"}, + {"banpromo-ta", "Toei Promos", "1999/03/06", + "Set Card Galleries:Promotional Cards (Bandai)", "TA"}, + {"bansealdass", "Sealdass", "1999/06/01", + "Set Card Galleries:Yu-Gi-Oh! Bandai Sealdass", ""}, + }; + return kManifest; +} + +Result> YuGiOhBandaiSetSource::parseResponse( + const std::string& /*unused*/) { + std::vector out; + for (const auto& e : setManifest()) { + out.push_back(Set{e.id, e.name, e.releaseDate}); + } + return Result>::ok(std::move(out)); +} + +Result> YuGiOhBandaiSetSource::fetchAll() { + return parseResponse({}); +} + +std::string YuGiOhBandaiSetSource::buildGalleryParseUrl(std::string_view pageTitle) { + return std::string( + "https://yugipedia.com/api.php?action=parse&format=json&formatversion=2" + "&prop=wikitext&page=") + + urlEncode(pageTitle); +} + +std::string YuGiOhBandaiSetSource::normalizeCardNumber(std::string_view setNo) { + std::string s = trimCopy(setNo); + if (s.empty()) return {}; + + // Strip a leading '#' if present. + if (s.front() == '#') s.erase(s.begin()); + + // Uppercase letter prefix forms: j1 / ta2. + bool hasAlpha = false; + for (char& c : s) { + if (std::isalpha(static_cast(c))) { + hasAlpha = true; + c = static_cast(std::toupper(static_cast(c))); + } + } + if (hasAlpha) return s; + + // Pure decimal: strip leading zeros but keep a single zero. + std::size_t i = 0; + while (i + 1 < s.size() && s[i] == '0') ++i; + return s.substr(i); +} + +std::string YuGiOhBandaiSetSource::expandRarityCode(std::string_view code) { + const std::string c = trimCopy(code); + if (c == "C") return "Common"; + if (c == "R") return "Rare"; + if (c == "SR") return "Super Rare"; + if (c == "UR") return "Ultra Rare"; + if (c == "HFR" || c == "Holo Seal" || c == "HS") return "Holo Seal"; + if (c.empty()) return {}; + return c; +} + +std::string YuGiOhBandaiSetSource::englishNameFromGalleryTitle( + std::string_view pageTitle) { + std::string name = trimCopy(pageTitle); + const auto stripSuffix = [&](std::string_view suffix) { + if (name.size() > suffix.size() && + name.compare(name.size() - suffix.size(), suffix.size(), suffix) == 0) { + name.resize(name.size() - suffix.size()); + name = trimCopy(name); + } + }; + stripSuffix(" (Bandai Sealdass)"); + stripSuffix(" (English Bandai)"); + stripSuffix(" (Bandai)"); + return name; +} + +std::string YuGiOhBandaiSetSource::setIdForNumber(std::string_view setNo) { + const std::string n = normalizeCardNumber(setNo); + if (n.empty()) return {}; + if (!n.empty() && (n[0] == 'J' || n[0] == 'j')) return "banpromo-j"; + if (n.size() >= 2 && (n[0] == 'T' || n[0] == 't') && + (n[1] == 'A' || n[1] == 'a')) { + return "banpromo-ta"; + } + + // Pure decimal → generation by range. Callers that need Sealdass must + // pass set context; number alone cannot disambiguate 1–42 vs Sealdass. + bool pureDecimal = true; + for (char c : n) { + if (!std::isdigit(static_cast(c))) { + pureDecimal = false; + break; + } + } + if (!pureDecimal) return {}; + + const int v = std::stoi(n); + if (v >= 1 && v <= 42) return "ban1"; + if (v >= 43 && v <= 88) return "ban2"; + if (v >= 89 && v <= 118) return "ban3"; + return {}; +} + +std::string YuGiOhBandaiSetSource::setNameForId(std::string_view setId) { + for (const auto& e : setManifest()) { + if (e.id == setId) return e.name; + } + return {}; +} + +Result> +YuGiOhBandaiSetSource::parseGalleryWikitext(const std::string& wikitext) { + using R = Result>; + std::vector out; + + // Generation galleries (raw): + // … | {{pound}}014 ([[R]]) {{Gallery card names|Dark Magician (Bandai)|ja}} + // Promo galleries (often expanded with
): + // … | [[TA2]] ([[SR]])
{{Gallery card names|Blue-Eyes White Dragon's 3-Body Connection|ja}} + static const std::regex kLine( + R"((?:\{\{pound\}\}|\[\[)([A-Za-z0-9]+)(?:\]\])?(?:\s*\(\[\[([A-Za-z0-9]+)\]\]\))?[^\n]*?\{\{Gallery card names\|([^}|]+))", + std::regex::ECMAScript); + + std::unordered_set seen; + for (std::sregex_iterator it(wikitext.begin(), wikitext.end(), kLine), end; + it != end; ++it) { + const std::smatch& m = *it; + YuGiOhBandaiCatalogCard card; + card.setNo = normalizeCardNumber(m[1].str()); + if (card.setNo.empty()) continue; + if (m[2].matched) { + card.rarity = expandRarityCode(m[2].str()); + } + card.name = englishNameFromGalleryTitle(m[3].str()); + if (card.name.empty()) continue; + if (!seen.insert(card.setNo).second) continue; + out.push_back(std::move(card)); + } + + return R::ok(std::move(out)); +} + +Result +YuGiOhBandaiSetSource::fetchAllWithCatalog() { + using R = Result; + + auto sets = parseResponse({}); + if (!sets) return R::err(sets.error()); + + YuGiOhBandaiSetCatalog catalog; + std::unordered_map pageCache; + + for (const auto& entry : setManifest()) { + const std::string page = entry.galleryPage; + std::string body; + auto cached = pageCache.find(page); + if (cached != pageCache.end()) { + body = cached->second; + } else { + const std::string url = buildGalleryParseUrl(page); + auto resp = http_.get(url); + if (!resp) return R::err(resp.error()); + body = std::move(resp).value(); + pageCache.emplace(page, body); + } + + std::string wikitext; + try { + const auto j = nlohmann::json::parse(body); + if (!j.contains("parse") || !j.at("parse").contains("wikitext")) { + return R::err("Yugipedia gallery response missing parse.wikitext"); + } + wikitext = j.at("parse").at("wikitext").get(); + } catch (const std::exception& e) { + return R::err(std::string("Yugipedia gallery JSON parse error: ") + + e.what()); + } + + auto cards = parseGalleryWikitext(wikitext); + if (!cards) return R::err(cards.error()); + + YuGiOhBandaiSetCatalogPack pack; + pack.setId = entry.id; + pack.setName = entry.name; + const std::string prefix = entry.setNoPrefix; + for (const auto& card : cards.value()) { + if (!prefix.empty()) { + if (card.setNo.size() < prefix.size() || + card.setNo.compare(0, prefix.size(), prefix) != 0) { + continue; + } + } + pack.cards.push_back(card); + } + + catalog.packs.push_back(std::move(pack)); + } + + FetchWithCatalog out; + out.sets = std::move(sets).value(); + out.catalog = std::move(catalog); + return R::ok(std::move(out)); +} + +} // namespace ccm diff --git a/core/src/services/CardFilter.cpp b/core/src/services/CardFilter.cpp index 17a33c6..5596919 100644 --- a/core/src/services/CardFilter.cpp +++ b/core/src/services/CardFilter.cpp @@ -83,6 +83,22 @@ bool matchesDigiBattle99Filter(const DigiBattle99Card& card, std::string_view fi return false; } +bool matchesYuGiOhBandaiFilter(const YuGiOhBandaiCard& card, std::string_view filter) { + if (filter.empty()) return true; + + const std::string needle = asciiLower(filter); + + if (containsLower(card.name, needle)) return true; + if (containsLower(card.set.name, needle)) return true; + if (containsLower(card.setNo, needle)) return true; + if (containsLower(card.rarity, needle)) return true; + if (containsLower(to_string(card.language), needle)) return true; + if (containsLower(to_string(card.condition), needle)) return true; + if (containsLower(std::to_string(card.amount), needle)) return true; + if (containsLower(card.note, needle)) return true; + return false; +} + bool matchesJapanesePokemonFilter(const JapanesePokemonCard& card, std::string_view filter) { if (filter.empty()) return true; diff --git a/core/src/services/CardPreviewService.cpp b/core/src/services/CardPreviewService.cpp index c983e5d..8761cb6 100644 --- a/core/src/services/CardPreviewService.cpp +++ b/core/src/services/CardPreviewService.cpp @@ -262,6 +262,33 @@ Result> CardPreviewService::detectPrintVariants( return it->second->detectPrintVariants(name, setId); } +Result CardPreviewService::detectBySetNo(Game game, + std::string_view setNo) { + auto it = sources_.find(game); + if (it == sources_.end() || it->second == nullptr) { + return Result::err("No preview source registered for this game."); + } + if (!it->second->supportsAutoDetectPrint()) { + return Result::err("Auto-detect not enabled for this game."); + } + return it->second->detectBySetNo(setNo); +} + +Result> CardPreviewService::detectVariantsBySetNo( + Game game, + std::string_view setNo) { + auto it = sources_.find(game); + if (it == sources_.end() || it->second == nullptr) { + return Result>::err( + "No preview source registered for this game."); + } + if (!it->second->supportsAutoDetectPrint()) { + return Result>::err( + "Auto-detect not enabled for this game."); + } + return it->second->detectVariantsBySetNo(setNo); +} + Result CardPreviewService::fetchImageBytesByUrl(std::string_view url) { // The by-URL path is used for fixed per-game card-back fallback images. // A failure there is always transient (the URL itself is constant), so diff --git a/core/src/services/CardSorter.cpp b/core/src/services/CardSorter.cpp index 4cd194d..3470df3 100644 --- a/core/src/services/CardSorter.cpp +++ b/core/src/services/CardSorter.cpp @@ -293,6 +293,79 @@ void sortDigiBattle99Cards(std::vector& cards, } } +void sortYuGiOhBandaiCards(std::vector& cards, + YuGiOhBandaiSortColumn column, + bool ascending) { + switch (column) { + case YuGiOhBandaiSortColumn::Name: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(a.name) < asciiLower(b.name); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::SetReleaseDate: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(a.set.releaseDate) < asciiLower(b.set.releaseDate); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::SetNo: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(a.setNo) < asciiLower(b.setNo); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Rarity: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(a.rarity) < asciiLower(b.rarity); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Language: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(to_string(a.language)) < asciiLower(to_string(b.language)); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Condition: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(to_string(a.condition)) < asciiLower(to_string(b.condition)); + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Amount: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return a.amount < b.amount; + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Holo: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return a.holo < b.holo; + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Signed: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return a.signed_ < b.signed_; + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Altered: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return a.altered < b.altered; + }, ascending)); + break; + case YuGiOhBandaiSortColumn::Note: + std::stable_sort(cards.begin(), cards.end(), directional( + [](const YuGiOhBandaiCard& a, const YuGiOhBandaiCard& b) { + return asciiLower(a.note) < asciiLower(b.note); + }, ascending)); + break; + } +} + void sortJapanesePokemonCards(std::vector& cards, JapanesePokemonSortColumn column, bool ascending) { diff --git a/core/src/services/YuGiOhBandaiSetCatalogService.cpp b/core/src/services/YuGiOhBandaiSetCatalogService.cpp new file mode 100644 index 0000000..e63836a --- /dev/null +++ b/core/src/services/YuGiOhBandaiSetCatalogService.cpp @@ -0,0 +1,50 @@ +#include "ccm/services/YuGiOhBandaiSetCatalogService.hpp" + +#include + +#include + +namespace ccm { + +namespace fs = std::filesystem; + +YuGiOhBandaiSetCatalogService::YuGiOhBandaiSetCatalogService(IFileSystem& fs, + ConfigService& config, + DirNameFn dirName) + : fs_(fs), config_(config), dirName_(std::move(dirName)) {} + +fs::path YuGiOhBandaiSetCatalogService::catalogPath() const { + return fs::path(config_.current().dataStorage) / dirName_(Game::YuGiOhBandai) / + "set-catalog.json"; +} + +bool YuGiOhBandaiSetCatalogService::exists() const { + return fs_.exists(catalogPath()); +} + +Result YuGiOhBandaiSetCatalogService::load() const { + const auto p = catalogPath(); + if (!fs_.exists(p)) { + return Result::err( + "Yu-Gi-Oh! (Bandai) set catalog not yet downloaded."); + } + auto text = fs_.readText(p); + if (!text) return Result::err(text.error()); + try { + const auto j = nlohmann::json::parse(text.value()); + return Result::ok(j.get()); + } catch (const std::exception& e) { + return Result::err( + std::string("set-catalog.json parse error: ") + e.what()); + } +} + +Result YuGiOhBandaiSetCatalogService::save(const YuGiOhBandaiSetCatalog& catalog) { + const auto p = catalogPath(); + auto dir = fs_.ensureDirectory(p.parent_path()); + if (!dir) return dir; + const nlohmann::json j = catalog; + return fs_.writeText(p, j.dump(2)); +} + +} // namespace ccm diff --git a/core/src/services/YuGiOhBandaiSetCompletion.cpp b/core/src/services/YuGiOhBandaiSetCompletion.cpp new file mode 100644 index 0000000..c35c3af --- /dev/null +++ b/core/src/services/YuGiOhBandaiSetCompletion.cpp @@ -0,0 +1,128 @@ +#include "ccm/services/YuGiOhBandaiSetCompletion.hpp" + +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" + +#include +#include +#include +#include + +namespace ccm { + +namespace { + +using OwnedBySet = std::unordered_map>; + +bool passesLanguageFilter(const YuGiOhBandaiCard& card, + std::optional languageFilter) { + return !languageFilter.has_value() || card.language == *languageFilter; +} + +OwnedBySet ownedSetNosBySetId(const std::vector& collection, + std::optional languageFilter) { + OwnedBySet out; + for (const auto& card : collection) { + if (!passesLanguageFilter(card, languageFilter)) continue; + if (card.set.id.empty()) continue; + const std::string setNo = YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo); + if (setNo.empty()) continue; + out[card.set.id].insert(setNo); + } + return out; +} + +} // namespace + +std::vector +yuGiOhBandaiLanguagesInCollection(const std::vector& collection) { + const auto& langs = allLanguages(); + std::array present{}; + for (const auto& card : collection) { + for (std::size_t i = 0; i < langs.size(); ++i) { + if (langs[i] == card.language) { + present[i] = true; + break; + } + } + } + + std::vector out; + for (std::size_t i = 0; i < langs.size(); ++i) { + if (present[i]) out.push_back(langs[i]); + } + return out; +} + +std::vector +computeYuGiOhBandaiSetCompletion(const std::vector& collection, + const YuGiOhBandaiSetCatalog& catalog, + std::optional languageFilter) { + const OwnedBySet owned = ownedSetNosBySetId(collection, languageFilter); + + std::vector out; + out.reserve(owned.size()); + + for (const auto& [setId, ownedNos] : owned) { + const auto* pack = catalog.findPack(setId); + if (pack == nullptr || pack->cards.empty()) continue; + + std::size_t matched = 0; + for (const auto& card : pack->cards) { + const std::string catalogNo = + YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo); + if (!catalogNo.empty() && ownedNos.count(catalogNo) != 0) ++matched; + } + + YuGiOhBandaiSetCompletionProgress row; + row.setId = pack->setId; + row.setName = pack->setName; + row.ownedUnique = matched; + row.total = pack->cards.size(); + out.push_back(std::move(row)); + } + + std::sort(out.begin(), out.end(), + [](const YuGiOhBandaiSetCompletionProgress& a, + const YuGiOhBandaiSetCompletionProgress& b) { + return a.setName < b.setName; + }); + return out; +} + +std::vector +yuGiOhBandaiChecklistForSet(const std::vector& collection, + const YuGiOhBandaiSetCatalog& catalog, + std::string_view setId, + std::optional languageFilter) { + const auto* pack = catalog.findPack(setId); + if (pack == nullptr) return {}; + + std::unordered_set ownedNos; + for (const auto& card : collection) { + if (!passesLanguageFilter(card, languageFilter)) continue; + if (card.set.id != setId) continue; + const std::string setNo = YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo); + if (!setNo.empty()) ownedNos.insert(setNo); + } + + std::vector out; + out.reserve(pack->cards.size()); + for (const auto& card : pack->cards) { + YuGiOhBandaiChecklistEntry entry; + entry.setNo = YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo); + entry.name = card.name; + entry.rarity = card.rarity; + entry.owned = !entry.setNo.empty() && ownedNos.count(entry.setNo) != 0; + out.push_back(std::move(entry)); + } + + std::sort(out.begin(), out.end(), + [](const YuGiOhBandaiChecklistEntry& a, + const YuGiOhBandaiChecklistEntry& b) { + if (a.setNo != b.setNo) return a.setNo < b.setNo; + return a.name < b.name; + }); + return out; +} + +} // namespace ccm diff --git a/docs/AGENTS.md b/docs/AGENTS.md index a300196..efb07b0 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -11,13 +11,13 @@ Long-form contributor documentation that lives outside the source tree. - `dow-doc-build-locally.md` — complete local build/setup reference for Windows and Linux, including dependency management and troubleshooting. - `intro-to-new-developers.md` — onboarding map for new contributors: architecture, folder responsibilities, guardrails, anti-patterns, and links to deeper docs. - `testing-and-test-code-of-conduct.md` — testing workflow plus expected standards for writing and maintaining deterministic, hermetic, behavior-focused tests. -- `assets-and-info-apis.md` — reference for the external info APIs (set metadata) and asset APIs (card preview images) used by the Magic, Pokémon (West + Asia backends), Yu-Gi-Oh!, and Digimon Digi-Battle modules, plus the runtime flow through `SetService` / `CardPreviewService`, shared HTTP defaults (`CprHttpClient`, `Accept: */*`), per-game card-back fallbacks (URLs + bundled `ygo_card_back.png` / `digibattle99_card_back.png`), the Japanese Pokémon EN catalog asset (Asia region), and error-surface conventions. The Yu-Gi-Oh! **Info API** section also documents the local **set code** lookup used by the edit dialog (`YuGiOhSetLookup`, no extra HTTP). +- `assets-and-info-apis.md` — reference for the external info APIs (set metadata) and asset APIs (card preview images) used by the Magic, Pokémon (West + Asia backends), Yu-Gi-Oh!, Yu-Gi-Oh! (Bandai), and Digimon Digi-Battle modules, plus the runtime flow through `SetService` / `CardPreviewService`, shared HTTP defaults (`CprHttpClient`, `Accept: */*`), per-game card-back fallbacks (URLs + bundled `ygo_card_back.png` / `digibattle99_card_back.png`), the Japanese Pokémon EN catalog asset (Asia region), and error-surface conventions. The Yu-Gi-Oh! **Info API** section also documents the local **set code** lookup used by the edit dialog (`YuGiOhSetLookup`, no extra HTTP). - `caching.md` — dedicated reference for preview-byte caching tiers (`CardPreviewService` LRU + `LocalPreviewByteCache`), cache keys and eviction, HTTP session reuse via `CprHttpClient`, and explicit non-goals (no error caching). - `README.md` — index page that clusters docs by area and links to all documents in this directory. ## Subdirectories -- `assets/images/` — static screenshots and other binary assets referenced from the documentation (currently `demo-mtg.png`, `demo-pkm.png`, `demo-ygo.png`, `demo-digibattle99.png`). Keep filenames stable so cross-doc links don't break, and prefer compressed PNG/JPEG over uncompressed formats. +- `assets/images/` — static screenshots and other binary assets referenced from the documentation (currently `demo-mtg.png`, `demo-pkm.png`, `demo-ygo.png`, `demo-ygo-bandai.png`, `demo-digibattle99.png`). Keep filenames stable so cross-doc links don't break, and prefer compressed PNG/JPEG over uncompressed formats. ## Conventions @@ -28,7 +28,7 @@ Long-form contributor documentation that lives outside the source tree. ## Required follow-ups - After changing per-game seams in `core/` (e.g. `IGameModule`, `ISetSource`, `ICardPreviewSource`, `CollectionService`, `SetService`, `CardPreviewService`, `ImageService`) you **must** update `adding-a-new-game.md` to keep the canonical procedure in sync. The same applies to the UI seams (`IGameView`, `BaseCardListPanel`, `BaseCardEditDialog`, `BaseSelectedCardPanel`) and the composition-root wiring in `app/main.cpp`. -- After changing any game's set/preview adapters (`MagicSetSource`, `MagicCardPreviewSource`, `PokemonSetSource`, `PokemonCardPreviewSource`, `YuGiOhSetSource`, `YuGiOhCardPreviewSource`, `DigiBattle99SetSource`, `DigiBattle99CardPreviewSource`) — endpoints, response parsing, name/number normalization, or the info-vs-asset split — you **must** update `assets-and-info-apis.md` so the API reference matches the live behavior. +- After changing any game's set/preview adapters (`MagicSetSource`, `MagicCardPreviewSource`, `PokemonSetSource`, `PokemonCardPreviewSource`, `YuGiOhSetSource`, `YuGiOhCardPreviewSource`, `YuGiOhBandaiSetSource`, `YuGiOhBandaiCardPreviewSource`, `DigiBattle99SetSource`, `DigiBattle99CardPreviewSource`) — endpoints, response parsing, name/number normalization, or the info-vs-asset split — you **must** update `assets-and-info-apis.md` so the API reference matches the live behavior. - After bumping a key dependency (`nlohmann/json`, `cpr`, `wxWidgets`, `doctest`) in a way that changes a public API used in the guide's examples, update those examples. - After adding a new file under `docs/` (or a new entry under `docs/assets/images/`) you **must** add it to the file list above **and** to `README.md` so the index stays complete. - Do **not** rename, move, or split this file without first updating every other `AGENTS.md` that points at it (root, `core/`, `ui_wx/`, `app/`, `tests/`). diff --git a/docs/adding-a-new-game.md b/docs/adding-a-new-game.md index ddd7307..038a7ac 100644 --- a/docs/adding-a-new-game.md +++ b/docs/adding-a-new-game.md @@ -141,7 +141,7 @@ Mirror `core/include/ccm/games/pokemon/PokemonCardPreviewSource.hpp`. The header - `static std::string buildSearchUrl(std::string_view name, std::string_view setId, std::string_view setNo);` - `static Result parseResponse(const std::string& body);` -If your game benefits from edit-dialog metadata helpers (for example auto-detecting collector number / rarity), you can opt in to `ICardPreviewSource::detectFirstPrint(...)` and route it via `CardPreviewService::detectFirstPrint(...)`. If you need to enumerate multiple upstream printings (for example Yu-Gi-Oh! “Next” cycling between alternate `set_code` or `set_rarity` values), also override `ICardPreviewSource::detectPrintVariants(...)` and expose it through `CardPreviewService::detectPrintVariants(...)`. Keep both optional per game — default behavior should remain an explicit unsupported error. +If your game benefits from edit-dialog metadata helpers (for example auto-detecting collector number / rarity), you can opt in to `ICardPreviewSource::detectFirstPrint(...)` and route it via `CardPreviewService::detectFirstPrint(...)`. If you need to enumerate multiple upstream printings (for example Yu-Gi-Oh! “Next” cycling between alternate `set_code` or `set_rarity` values), also override `ICardPreviewSource::detectPrintVariants(...)` and expose it through `CardPreviewService::detectPrintVariants(...)`. Games that can resolve metadata from a collector / Bandai number alone (Yu-Gi-Oh! Bandai) should also override `detectBySetNo(...)` / `detectVariantsBySetNo(...)` and wire them through `CardPreviewService`. `AutoDetectedPrint` carries `setNo` + `rarity` for every game; optional `name` / `setId` / `setName` / `language` fields stay empty when unused. Keep all of these optional per game — default behavior should remain an explicit unsupported error. Both `buildSearchUrl` and `parseResponse` are static and pure on purpose: every URL-encoding and JSON-shape rule is testable without HTTP. Common edge cases your tests must cover: @@ -325,6 +325,7 @@ Derive from `BaseCardEditDialog<Card>`. Override: - `readExtraFromCard()` — copy fields from `constCard()` into your widgets. - `writeExtraToCard()` — copy values from your widgets back into `mutableCard()`. - `updateMenuName()` — return `"Update "`. This is what the dialog's "no sets cached" hint shows the user. +- `validateExtraFields()` — optional; called from OK after name/set checks. Return `false` to block save (show your own themed dialog). Yu-Gi-Oh! (Bandai) requires a non-empty set number here. Optional `BaseCardEditDialog` extension points (defaults keep a single read-only set combo in the **Set** row): diff --git a/docs/assets-and-info-apis.md b/docs/assets-and-info-apis.md index bcb61e8..f9ab71d 100644 --- a/docs/assets-and-info-apis.md +++ b/docs/assets-and-info-apis.md @@ -109,6 +109,37 @@ Each catalog pack stores `id` (YGOPRODeck product `set_code` / `Set.id`, e.g. `L If `set-catalog.json` is missing, the Set Completion tab prompts the user to run Update Yu-Gi-Oh!. +## Yu-Gi-Oh! (Bandai) APIs (Yugipedia) + +Bandai Carddass (pre-Konami) is wired as `Game::YuGiOhBandai` (`dirName` `yugiohbandai`, UI label **Yu-Gi-Oh! (Bandai)**). There is no dedicated Bandai REST API; everything goes through Yugipedia MediaWiki + Semantic MediaWiki. + +### Info API (sets + catalog) + +`YuGiOhBandaiSetSource` keeps an **app-owned set manifest** (stable ids, no fragile category scrape): + +| id | Name | Numbers | +|---|---|---| +| `ban1` | 1st Generation | 1–42 | +| `ban2` | 2nd Generation | 43–88 | +| `ban3` | 3rd Generation | 89–118 | +| `banpromo-j` | Jump Promos | J1–J3 | +| `banpromo-ta` | Toei Promos | TA1–TA2 | +| `bansealdass` | Sealdass | 1–42 | + +`fetchAll()` returns that manifest (offline — no HTTP). `fetchAllWithCatalog()` additionally `GET`s each set’s Yugipedia gallery page via `action=parse&prop=wikitext` and parses lines like `… | {{pound}}014 ([[R]]) {{Gallery card names|Dark Magician (Bandai)|…}}` into checklist entries `{setNo, name, rarity}` (rarity codes `C`/`R`/`SR` → Common/Rare/Super Rare). The shared promo gallery is split by `setNo` prefix (`J*` vs `TA*`). Persisted at `yugiohbandai/set-catalog.json`. + +**Set Completion** ownership keys on `(set.id, normalized setNo)`. Because `fetchAll()` is offline, Add/Edit can work before any catalog download; the catalog is filled on the first visit to the Set Completion tab (or via **Sets → Update Yu-Gi-Oh! (Bandai)**). Cards without a set number do not count toward progress. + +English Blue-Eyes is **not** a separate set — it is `ban3` card `#118` with language English. + +### Asset API (preview + auto-detect) + +1. **Preview:** `pageimages` on preferred titles `Name (Bandai)` / `Name (English Bandai)` / `Name (Bandai Sealdass)`, falling back to SMW `ask` by English name then `pageimages` on the best hit. +2. **Auto-detect by name:** SMW `ask` `[[Category:Bandai cards]][[English name::…]]` → fills `name`, `setId`/`setName`, `setNo`, `rarity`, `language`. +3. **Auto-detect by number:** SMW `ask` `[[Bandai number::…]]` → same fields. + +Card-back fallback URL: `https://ms.yugipedia.com//3/34/Back-BAN-JP-1999.png`. + ## Digimon Digi-Battle (1999) APIs (digimoncard.io) English Digi-Battle is wired as `Game::DigiBattle99` (`dirName` `digibattle99`, UI label **Digimon (Digi-Battle)**). Upstream docs: [digimoncard.io Public API](https://digimoncard.io/api-documentation). Always scope requests with `series=Digimon Digi-Battle Card Game` so modern Digimon Card Game rows are never mixed in. Rate limit: **15 requests / 10 seconds / IP** (429 then temporary block on abuse). @@ -315,6 +346,7 @@ Fallback card-back sources (`BaseSelectedCardPanel`; Magic/Pokémon URLs match C - Pokémon: `https://archives.bulbagarden.net/media/upload/1/17/Cardback.jpg` - Japanese Pokémon: `https://archives.bulbagarden.net/media/upload/2/2a/TCG_Card_Back_Japanese.jpg` - Yu-Gi-Oh!: Yugipedia English TCG back — try `https://ms.yugipedia.com/thumb/e/e5/Back-EN.png/250px-Back-EN.png`, then `https://ms.yugipedia.com/e/e5/Back-EN.png`; if both fail, load `/assets/ygo_card_back.png` (shipped from `ui_wx/assets/ygo_card_back.png` at link time). `fallbackImageUrlForGame(Game::YuGiOh)` returns the thumbnail URL for helpers that only consult a single string. +- Yu-Gi-Oh! (Bandai): `https://ms.yugipedia.com//3/34/Back-BAN-JP-1999.png`. - Digimon (Digi-Battle): no stable public back URL; load `/assets/digibattle99_card_back.png` (shipped from `ui_wx/assets/digibattle99_card_back.png` at link time). If a game module does not provide a preview source (`cardPreviewSource() == nullptr`), preview registration is skipped and the UI behaves as "no remote preview API available." diff --git a/docs/assets/images/demo-ygo-bandai.png b/docs/assets/images/demo-ygo-bandai.png new file mode 100644 index 0000000000000000000000000000000000000000..83953bf218f1eaeec440f0568dc073f48bdfc55d GIT binary patch literal 417203 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%0DD;%t^r}w%JGXrQu13xAew}g-7vi5SG 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�@}K*|I)E9G)i3oL&<6Bh6B`VDikWcS<7r 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%0D$(RnxW7^CdDd{RZLtR%4n3 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 literal 0 HcmV?d00001 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4166afa..d2b7404 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -26,6 +26,9 @@ add_executable(ccm_core_tests digibattle99_set_source_tests.cpp digibattle99_card_preview_source_tests.cpp digibattle99_set_completion_tests.cpp + yugiohbandai_set_source_tests.cpp + yugiohbandai_card_preview_source_tests.cpp + yugiohbandai_set_completion_tests.cpp yugioh_set_completion_tests.cpp pokemon_set_completion_tests.cpp set_no_natural_tests.cpp diff --git a/tests/card_filter_tests.cpp b/tests/card_filter_tests.cpp index d976e5b..3d252de 100644 --- a/tests/card_filter_tests.cpp +++ b/tests/card_filter_tests.cpp @@ -10,6 +10,7 @@ #include "ccm/domain/JapanesePokemonCard.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include "ccm/services/CardFilter.hpp" @@ -287,6 +288,39 @@ TEST_SUITE("CardFilter::matchesDigiBattle99Filter") { } } +TEST_SUITE("CardFilter::matchesYuGiOhBandaiFilter") { + TEST_CASE("matches name set setNo rarity language") { + YuGiOhBandaiCard c; + c.name = "Dark Magician"; + c.set.name = "1st Generation"; + c.setNo = "14"; + c.rarity = "Rare"; + c.language = Language::Japanese; + CHECK(matchesYuGiOhBandaiFilter(c, "magician")); + CHECK(matchesYuGiOhBandaiFilter(c, "1st")); + CHECK(matchesYuGiOhBandaiFilter(c, "14")); + CHECK(matchesYuGiOhBandaiFilter(c, "rare")); + CHECK(matchesYuGiOhBandaiFilter(c, "japanese")); + CHECK_FALSE(matchesYuGiOhBandaiFilter(c, "blue-eyes")); + } + + TEST_CASE("empty filter matches everything") { + YuGiOhBandaiCard c; + c.name = "Dark Magician"; + CHECK(matchesYuGiOhBandaiFilter(c, "")); + } + + TEST_CASE("boolean flag columns are not matched") { + YuGiOhBandaiCard c; + c.name = "Dark Magician"; + c.holo = true; + c.signed_ = true; + c.altered = true; + CHECK_FALSE(matchesYuGiOhBandaiFilter(c, "true")); + CHECK(matchesYuGiOhBandaiFilter(c, "dark")); + } +} + TEST_SUITE("CardFilter::matchesJapanesePokemonFilter") { TEST_CASE("matches by name and set.name") { JapanesePokemonCard c; diff --git a/tests/card_sorter_tests.cpp b/tests/card_sorter_tests.cpp index 7a63836..111612e 100644 --- a/tests/card_sorter_tests.cpp +++ b/tests/card_sorter_tests.cpp @@ -10,6 +10,7 @@ #include "ccm/domain/JapanesePokemonCard.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include "ccm/domain/Set.hpp" #include "ccm/services/CardSorter.hpp" @@ -548,6 +549,51 @@ TEST_SUITE("CardSorter - DigiBattle99 columns") { } } +TEST_SUITE("CardSorter - YuGiOhBandai columns") { + TEST_CASE("Holo sorts false before true; Rarity and SetNo sort") { + YuGiOhBandaiCard a; + a.id = 1; + a.name = "a"; + a.set = Set{"ban1", "1st Generation", "1998/09/01"}; + a.setNo = "14"; + a.rarity = "Rare"; + a.holo = true; + + YuGiOhBandaiCard b; + b.id = 2; + b.name = "b"; + b.set = Set{"ban1", "1st Generation", "1998/09/01"}; + b.setNo = "9"; + b.rarity = "Common"; + b.holo = false; + + std::vector v = {a, b}; + sortYuGiOhBandaiCards(v, YuGiOhBandaiSortColumn::Holo, /*ascending=*/true); + CHECK(v[0].id == 2); + CHECK(v[1].id == 1); + + sortYuGiOhBandaiCards(v, YuGiOhBandaiSortColumn::SetNo, /*ascending=*/true); + CHECK(v[0].setNo == "14"); + CHECK(v[1].setNo == "9"); + + sortYuGiOhBandaiCards(v, YuGiOhBandaiSortColumn::Rarity, /*ascending=*/true); + CHECK(v[0].rarity == "Common"); + } + + TEST_CASE("Set column sorts by release date") { + YuGiOhBandaiCard a; + a.id = 1; + a.set = Set{"ban3", "3rd Generation", "1999/03/06"}; + YuGiOhBandaiCard b; + b.id = 2; + b.set = Set{"ban1", "1st Generation", "1998/09/01"}; + std::vector v = {a, b}; + sortYuGiOhBandaiCards(v, YuGiOhBandaiSortColumn::SetReleaseDate, /*ascending=*/true); + CHECK(v[0].id == 2); + CHECK(v[1].id == 1); + } +} + TEST_SUITE("CardSorter - JapanesePokemon columns") { TEST_CASE("Holo and FirstEdition sort false before true") { std::vector v = { diff --git a/tests/domain_json_tests.cpp b/tests/domain_json_tests.cpp index 4be6b40..6d03435 100644 --- a/tests/domain_json_tests.cpp +++ b/tests/domain_json_tests.cpp @@ -9,6 +9,8 @@ #include "ccm/domain/JapanesePokemonCard.hpp" #include "ccm/domain/MagicCard.hpp" #include "ccm/domain/PokemonCard.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" #include "ccm/domain/YuGiOhCard.hpp" #include "ccm/domain/Set.hpp" @@ -31,6 +33,9 @@ TEST_SUITE("domain enums round-trip JSON as strings") { nlohmann::json jDigi = "DigiBattle99"; CHECK(jDigi.get() == Game::DigiBattle99); + nlohmann::json jBandai = "YuGiOhBandai"; + CHECK(jBandai.get() == Game::YuGiOhBandai); + nlohmann::json jJp = "JapanesePokemon"; CHECK(jJp.get() == Game::JapanesePokemon); @@ -77,7 +82,7 @@ TEST_SUITE("domain enums round-trip JSON as strings") { for (const auto game : allGames()) { CHECK(game != Game::JapanesePokemon); } - CHECK(allGames().size() == 4); + CHECK(allGames().size() == 5); CHECK(gameFromString("JapanesePokemon") == Game::JapanesePokemon); CHECK(pokemonBackendGame(PokemonRegion::West) == Game::Pokemon); CHECK(pokemonBackendGame(PokemonRegion::Asia) == Game::JapanesePokemon); @@ -312,6 +317,87 @@ TEST_SUITE("DigiBattle99SetCatalog JSON") { } } +TEST_SUITE("YuGiOhBandaiCard JSON") { + TEST_CASE("round-trips with setNo, rarity, holo and signed alias") { + YuGiOhBandaiCard c; + c.id = 14; + c.amount = 2; + c.name = "Dark Magician"; + c.set = Set{"ban1", "1st Generation", "1998/09/01"}; + c.setNo = "14"; + c.rarity = "Rare"; + c.note = "classic"; + c.images = {"a.png"}; + c.language = Language::Japanese; + c.condition = Condition::NearMint; + c.holo = true; + c.signed_ = true; + c.altered = false; + + nlohmann::json j = c; + CHECK(j.at("setNo") == "14"); + CHECK(j.at("rarity") == "Rare"); + CHECK(j.at("holo") == true); + CHECK(j.at("signed") == true); + CHECK_FALSE(j.contains("firstEdition")); + + const YuGiOhBandaiCard back = j.get(); + CHECK(back == c); + } + + TEST_CASE("missing each required key throws") { + const nlohmann::json full = { + {"id", 14}, + {"amount", 1}, + {"name", "Dark Magician"}, + {"set", nlohmann::json{ + {"id", "ban1"}, + {"name", "1st Generation"}, + {"releaseDate", "1998/09/01"}, + }}, + {"setNo", "14"}, + {"rarity", "Rare"}, + {"note", ""}, + {"images", nlohmann::json::array()}, + {"language", "Japanese"}, + {"condition", "NearMint"}, + {"holo", false}, + {"signed", false}, + {"altered", false}, + }; + + for (const char* key : { + "id", "amount", "name", "set", "setNo", "rarity", "note", "images", + "language", "condition", "holo", "signed", "altered"}) { + nlohmann::json partial = full; + partial.erase(key); + CHECK_THROWS(partial.get()); + } + } +} + +TEST_SUITE("YuGiOhBandaiSetCatalog JSON") { + TEST_CASE("round-trips packs with rarity") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban1"; + pack.setName = "1st Generation"; + pack.cards.push_back(YuGiOhBandaiCatalogCard{"14", "Dark Magician", "Rare"}); + pack.cards.push_back(YuGiOhBandaiCatalogCard{"9", "Blue-Eyes White Dragon", "Super Rare"}); + catalog.packs.push_back(std::move(pack)); + + nlohmann::json j = catalog; + CHECK(j.at("packs").at(0).at("id") == "ban1"); + CHECK(j.at("packs").at(0).at("cards").at(0).at("setNo") == "14"); + CHECK(j.at("packs").at(0).at("cards").at(0).at("rarity") == "Rare"); + + const YuGiOhBandaiSetCatalog back = j.get(); + CHECK(back == catalog); + CHECK(back.findPack("ban1") != nullptr); + CHECK(back.findPack("missing") == nullptr); + } +} + TEST_SUITE("YuGiOhSetCatalog JSON") { TEST_CASE("round-trips packs and setNo alias") { YuGiOhSetCatalog catalog; diff --git a/tests/game_module_tests.cpp b/tests/game_module_tests.cpp index 8d5ab92..4cc0c2c 100644 --- a/tests/game_module_tests.cpp +++ b/tests/game_module_tests.cpp @@ -5,6 +5,7 @@ #include "ccm/games/pokemon/PokemonGameModule.hpp" #include "ccm/games/pokemonjp/JapanesePokemonGameModule.hpp" #include "ccm/games/yugioh/YuGiOhGameModule.hpp" +#include "ccm/games/yugiohbandai/YuGiOhBandaiGameModule.hpp" #include "ccm/ports/IHttpClient.hpp" using namespace ccm; @@ -65,6 +66,17 @@ TEST_SUITE("game modules expose stable identity and wiring") { CHECK(static_cast(&module.setSource()) != static_cast(module.cardPreviewSource())); } + TEST_CASE("YuGiOhBandai module reports canonical metadata") { + NoopHttpClient http; + YuGiOhBandaiGameModule module(http); + + CHECK(module.id() == Game::YuGiOhBandai); + CHECK(module.dirName() == "yugiohbandai"); + CHECK(module.displayName() == "Yu-Gi-Oh! (Bandai)"); + CHECK(module.cardPreviewSource() != nullptr); + CHECK(static_cast(&module.setSource()) != static_cast(module.cardPreviewSource())); + } + TEST_CASE("JapanesePokemon module reports canonical metadata") { NoopHttpClient http; JapanesePokemonGameModule module(http); diff --git a/tests/set_service_tests.cpp b/tests/set_service_tests.cpp index 91107a4..77551c1 100644 --- a/tests/set_service_tests.cpp +++ b/tests/set_service_tests.cpp @@ -31,6 +31,7 @@ public: if (gameId == Game::Pokemon) return "pokemon"; if (gameId == Game::YuGiOh) return "yugioh"; if (gameId == Game::DigiBattle99) return "digibattle99"; + if (gameId == Game::YuGiOhBandai) return "yugiohbandai"; if (gameId == Game::JapanesePokemon) return "pokemon"; return "yugioh"; } @@ -182,6 +183,43 @@ TEST_SUITE("SetService") { CHECK(digi.source.calls == 1); } + TEST_CASE("YuGiOhBandai module routes independently when all games are registered") { + InMemSetRepo repo; + SetService svc{repo}; + + FakeGameModule magic{Game::Magic}; + magic.source.result = Result>::ok({{"lea", "Alpha", "1993/08/05"}}); + FakeGameModule pokemon{Game::Pokemon}; + pokemon.source.result = Result>::ok({{"base1", "Base", "1999/01/09"}}); + FakeGameModule yugioh{Game::YuGiOh}; + yugioh.source.result = Result>::ok({{"LOB", "Legend of Blue Eyes", "2002/03/08"}}); + FakeGameModule digi{Game::DigiBattle99}; + digi.source.result = Result>::ok( + {{"series-1-starter-set", "Series 1 Starter Set", "1999/06/01"}}); + FakeGameModule bandai{Game::YuGiOhBandai}; + bandai.source.result = Result>::ok( + {{"ban1", "1st Generation", "1998/09/01"}}); + + svc.registerModule(&magic); + svc.registerModule(&pokemon); + svc.registerModule(&yugioh); + svc.registerModule(&digi); + svc.registerModule(&bandai); + + REQUIRE(svc.updateSets(Game::Magic).isOk()); + REQUIRE(svc.updateSets(Game::Pokemon).isOk()); + REQUIRE(svc.updateSets(Game::YuGiOh).isOk()); + REQUIRE(svc.updateSets(Game::DigiBattle99).isOk()); + const auto out = svc.updateSets(Game::YuGiOhBandai); + REQUIRE(out.isOk()); + CHECK(out.value().front().id == "ban1"); + CHECK(magic.source.calls == 1); + CHECK(pokemon.source.calls == 1); + CHECK(yugioh.source.calls == 1); + CHECK(digi.source.calls == 1); + CHECK(bandai.source.calls == 1); + } + TEST_CASE("JapanesePokemon module routes independently when all games are registered") { InMemSetRepo repo; SetService svc{repo}; diff --git a/tests/yugiohbandai_card_preview_source_tests.cpp b/tests/yugiohbandai_card_preview_source_tests.cpp new file mode 100644 index 0000000..7a18284 --- /dev/null +++ b/tests/yugiohbandai_card_preview_source_tests.cpp @@ -0,0 +1,220 @@ +#include "ccm/games/yugiohbandai/YuGiOhBandaiCardPreviewSource.hpp" + +#include + +#include + +using namespace ccm; + +namespace { + +class FixedHttpClient final : public IHttpClient { +public: + std::string body; + std::string lastUrl; + bool fail{false}; + + Result get(std::string_view url) override { + lastUrl = std::string(url); + if (fail) return Result::err("http fail"); + return Result::ok(body); + } +}; + +} // namespace + +TEST_SUITE("YuGiOhBandaiCardPreviewSource helpers") { + TEST_CASE("preferredPageTitle picks Bandai / English / Sealdass") { + CHECK(YuGiOhBandaiCardPreviewSource::preferredPageTitle("Dark Magician", "ban1", "14") == + "Dark Magician (Bandai)"); + CHECK(YuGiOhBandaiCardPreviewSource::preferredPageTitle("Blue-Eyes White Dragon", "ban3", + "118") == + "Blue-Eyes White Dragon (English Bandai)"); + CHECK(YuGiOhBandaiCardPreviewSource::preferredPageTitle("Dark Magician", "bansealdass", + "2") == + "Dark Magician (Bandai Sealdass)"); + } + + TEST_CASE("buildPageImagesUrl encodes spaces as underscores then percent") { + const auto url = + YuGiOhBandaiCardPreviewSource::buildPageImagesUrl("Dark Magician (Bandai)"); + CHECK(url.find("titles=Dark_Magician_%28Bandai%29") != std::string::npos); + } + + TEST_CASE("buildAskByNameUrl includes English name constraint") { + const auto url = YuGiOhBandaiCardPreviewSource::buildAskByNameUrl("Dark Magician"); + CHECK(url.find("action=ask") != std::string::npos); + CHECK(url.find("query=") != std::string::npos); + } + + TEST_CASE("parsePageImagesResponse returns original source") { + const std::string body = R"JSON({ + "query": { + "pages": { + "1": { + "title": "Dark Magician (Bandai)", + "original": {"source": "https://ms.yugipedia.com/d/d0/DarkMagician.png"} + } + } + } + })JSON"; + auto out = YuGiOhBandaiCardPreviewSource::parsePageImagesResponse(body); + REQUIRE(out); + CHECK(out.value() == "https://ms.yugipedia.com/d/d0/DarkMagician.png"); + } + + TEST_CASE("parsePageImagesResponse missing page is NotFound") { + const std::string body = R"JSON({ + "query": { "pages": { "-1": { "missing": true, "title": "Nope" } } } + })JSON"; + auto out = YuGiOhBandaiCardPreviewSource::parsePageImagesResponse(body); + REQUIRE_FALSE(out); + CHECK(out.error().kind == PreviewLookupError::Kind::NotFound); + } + + TEST_CASE("parseAskResponse fills setNo rarity name and setId") { + const std::string body = R"JSON({ + "query": { + "results": { + "Dark Magician (Bandai)": { + "printouts": { + "English name": ["Dark Magician"], + "Bandai number": [14], + "Rarity": [{"fulltext": "Rare"}] + } + } + } + } + })JSON"; + auto out = YuGiOhBandaiCardPreviewSource::parseAskResponse(body, "ban1"); + REQUIRE(out); + REQUIRE(out.value().size() == 1); + CHECK(out.value()[0].name == "Dark Magician"); + CHECK(out.value()[0].setNo == "14"); + CHECK(out.value()[0].rarity == "Rare"); + CHECK(out.value()[0].setId == "ban1"); + CHECK(out.value()[0].language == "Japanese"); + } + + TEST_CASE("parseAskResponse prefers Bandai over Sealdass when set is ban1") { + const std::string body = R"JSON({ + "query": { + "results": { + "Dark Magician (Bandai Sealdass)": { + "printouts": { + "English name": ["Dark Magician"], + "Bandai number": [2], + "Rarity": [{"fulltext": "Common"}] + } + }, + "Dark Magician (Bandai)": { + "printouts": { + "English name": ["Dark Magician"], + "Bandai number": [14], + "Rarity": [{"fulltext": "Rare"}] + } + } + } + } + })JSON"; + auto out = YuGiOhBandaiCardPreviewSource::parseAskResponse(body, "ban1"); + REQUIRE(out); + REQUIRE(out.value().size() == 2); + CHECK(out.value()[0].setNo == "14"); + CHECK(out.value()[0].setId == "ban1"); + } + + TEST_CASE("fetchImageUrl uses pageimages URL") { + FixedHttpClient http; + http.body = R"JSON({ + "query": { + "pages": { + "1": { + "title": "Dark Magician (Bandai)", + "original": {"source": "https://ms.yugipedia.com/x.png"} + } + } + } + })JSON"; + YuGiOhBandaiCardPreviewSource src(http); + auto out = src.fetchImageUrl("Dark Magician", "ban1", "14"); + REQUIRE(out); + CHECK(out.value() == "https://ms.yugipedia.com/x.png"); + CHECK(http.lastUrl.find("pageimages") != std::string::npos); + } + + TEST_CASE("detectFirstPrint uses ask response") { + FixedHttpClient http; + http.body = R"JSON({ + "query": { + "results": { + "Dark Magician (Bandai)": { + "printouts": { + "English name": ["Dark Magician"], + "Bandai number": [14], + "Rarity": [{"fulltext": "Rare"}] + } + } + } + } + })JSON"; + YuGiOhBandaiCardPreviewSource src(http); + auto out = src.detectFirstPrint("Dark Magician", "ban1"); + REQUIRE(out); + CHECK(out.value().setNo == "14"); + CHECK(out.value().rarity == "Rare"); + CHECK(out.value().setId == "ban1"); + } + + TEST_CASE("detectBySetNo uses ask-by-number URL") { + FixedHttpClient http; + http.body = R"JSON({ + "query": { + "results": { + "Dark Magician (Bandai)": { + "printouts": { + "English name": ["Dark Magician"], + "Bandai number": [14], + "Rarity": [{"fulltext": "Rare"}] + } + } + } + } + })JSON"; + YuGiOhBandaiCardPreviewSource src(http); + auto out = src.detectBySetNo("014"); + REQUIRE(out); + CHECK(out.value().name == "Dark Magician"); + CHECK(http.lastUrl.find("action=ask") != std::string::npos); + } + + TEST_CASE("detectBySetNo resolves promo TA2 from gallery parse") { + FixedHttpClient http; + http.body = R"JSON({ + "parse": { + "wikitext": "WickedChain-BAN1-JP-SR.png | [[TA1]] ([[SR]]) {{Gallery card names|Wicked Chain|ja}}\nBlueEyesWhiteDragons3BodyConnection-BAN1-JP-SR.png | [[TA2]] ([[SR]])
{{Gallery card names|Blue-Eyes White Dragon's 3-Body Connection|ja}}\n" + } + })JSON"; + YuGiOhBandaiCardPreviewSource src(http); + auto out = src.detectBySetNo("ta2"); + REQUIRE(out); + CHECK(out.value().name == "Blue-Eyes White Dragon's 3-Body Connection"); + CHECK(out.value().setNo == "TA2"); + CHECK(out.value().setId == "banpromo-ta"); + CHECK(out.value().rarity == "Super Rare"); + CHECK(http.lastUrl.find("action=parse") != std::string::npos); + CHECK(http.lastUrl.find("Promotional") != std::string::npos); + } + + TEST_CASE("isAlphanumericPromoNumber detects Jump and Toei codes") { + CHECK(YuGiOhBandaiCardPreviewSource::isAlphanumericPromoNumber("TA2")); + CHECK(YuGiOhBandaiCardPreviewSource::isAlphanumericPromoNumber("j1")); + CHECK_FALSE(YuGiOhBandaiCardPreviewSource::isAlphanumericPromoNumber("14")); + } + + TEST_CASE("preferredPageTitle omits Bandai suffix for promo sets") { + CHECK(YuGiOhBandaiCardPreviewSource::preferredPageTitle( + "Blue-Eyes White Dragon's 3-Body Connection", "banpromo-ta", "TA2") == + "Blue-Eyes White Dragon's 3-Body Connection"); + } +} diff --git a/tests/yugiohbandai_set_completion_tests.cpp b/tests/yugiohbandai_set_completion_tests.cpp new file mode 100644 index 0000000..2ebee16 --- /dev/null +++ b/tests/yugiohbandai_set_completion_tests.cpp @@ -0,0 +1,153 @@ +#include "ccm/domain/Configuration.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" +#include "ccm/services/ConfigService.hpp" +#include "ccm/services/YuGiOhBandaiSetCatalogService.hpp" +#include "ccm/services/YuGiOhBandaiSetCompletion.hpp" +#include "fakes/InMemoryFileSystem.hpp" + +#include + +#include + +using namespace ccm; +using ccm::testing::InMemoryFileSystem; + +namespace { + +ConfigService makeConfig(InMemoryFileSystem& fs, const std::string& dataDir) { + Configuration c; + c.dataStorage = dataDir; + c.defaultGame = Game::Magic; + fs.writeText("/app/config.json", nlohmann::json(c).dump()); + ConfigService cfg{fs, "/app/config.json", dataDir}; + cfg.initialize(); + return cfg; +} + +YuGiOhBandaiCard makeOwned(std::string setId, std::string setName, std::string setNo) { + YuGiOhBandaiCard c; + c.set = Set{std::move(setId), std::move(setName), "1998/09/01"}; + c.setNo = std::move(setNo); + c.name = "Card"; + c.language = Language::Japanese; + return c; +} + +} // namespace + +TEST_SUITE("YuGiOhBandaiSetCompletion") { + TEST_CASE("unique setNo within a pack; amount does not inflate") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban1"; + pack.setName = "1st Generation"; + pack.cards.push_back({"9", "Blue-Eyes", "Super Rare"}); + pack.cards.push_back({"14", "Dark Magician", "Rare"}); + catalog.packs.push_back(pack); + + std::vector coll; + auto a = makeOwned("ban1", "1st Generation", "14"); + a.amount = 5; + coll.push_back(a); + coll.push_back(makeOwned("ban1", "1st Generation", "014")); + + auto progress = computeYuGiOhBandaiSetCompletion(coll, catalog); + REQUIRE(progress.size() == 1); + CHECK(progress[0].ownedUnique == 1); + CHECK(progress[0].total == 2); + CHECK(progress[0].percent() == 50); + } + + TEST_CASE("ownership on one pack does not complete another pack sharing setNo") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack ban1; + ban1.setId = "ban1"; + ban1.setName = "1st Generation"; + ban1.cards.push_back({"14", "Dark Magician", "Rare"}); + YuGiOhBandaiSetCatalogPack seal; + seal.setId = "bansealdass"; + seal.setName = "Sealdass"; + seal.cards.push_back({"14", "Other", "Common"}); + catalog.packs.push_back(ban1); + catalog.packs.push_back(seal); + + std::vector coll{makeOwned("ban1", "1st Generation", "14")}; + auto progress = computeYuGiOhBandaiSetCompletion(coll, catalog); + REQUIRE(progress.size() == 1); + CHECK(progress[0].setId == "ban1"); + } + + TEST_CASE("checklist marks owned rows") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban1"; + pack.setName = "1st Generation"; + pack.cards.push_back({"9", "Blue-Eyes", "Super Rare"}); + pack.cards.push_back({"14", "Dark Magician", "Rare"}); + catalog.packs.push_back(pack); + + std::vector coll{makeOwned("ban1", "1st Generation", "14")}; + auto list = yuGiOhBandaiChecklistForSet(coll, catalog, "ban1"); + REQUIRE(list.size() == 2); + CHECK(list[0].setNo == "14"); + CHECK(list[0].owned); + CHECK(list[1].setNo == "9"); + CHECK_FALSE(list[1].owned); + } + + TEST_CASE("empty setNo produces no progress rows") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban1"; + pack.setName = "1st Generation"; + pack.cards.push_back({"14", "Dark Magician", "Rare"}); + catalog.packs.push_back(pack); + + YuGiOhBandaiCard missingNo = makeOwned("ban1", "1st Generation", ""); + YuGiOhBandaiCard whitespaceNo = makeOwned("ban1", "1st Generation", " "); + std::vector coll{missingNo, whitespaceNo}; + auto progress = computeYuGiOhBandaiSetCompletion(coll, catalog); + CHECK(progress.empty()); + } + + TEST_CASE("set.id plus setNo against catalog pack yields a tile") { + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban2"; + pack.setName = "2nd Generation"; + pack.cards.push_back({"47", "Time Wizard", "Super Rare"}); + pack.cards.push_back({"48", "Polymerization", "Super Rare"}); + catalog.packs.push_back(pack); + + std::vector coll{makeOwned("ban2", "2nd Generation", "047")}; + auto progress = computeYuGiOhBandaiSetCompletion(coll, catalog); + REQUIRE(progress.size() == 1); + CHECK(progress[0].setId == "ban2"); + CHECK(progress[0].setName == "2nd Generation"); + CHECK(progress[0].ownedUnique == 1); + CHECK(progress[0].total == 2); + CHECK(progress[0].percent() == 50); + } +} + +TEST_SUITE("YuGiOhBandaiSetCatalogService") { + TEST_CASE("catalog service round-trips against InMemoryFileSystem") { + InMemoryFileSystem fs; + auto config = makeConfig(fs, "/data"); + YuGiOhBandaiSetCatalogService svc(fs, config, [](Game) { return "yugiohbandai"; }); + + YuGiOhBandaiSetCatalog catalog; + YuGiOhBandaiSetCatalogPack pack; + pack.setId = "ban1"; + pack.setName = "1st Generation"; + pack.cards.push_back({"14", "Dark Magician", "Rare"}); + catalog.packs.push_back(pack); + + REQUIRE(svc.save(catalog)); + CHECK(svc.exists()); + auto loaded = svc.load(); + REQUIRE(loaded); + CHECK(loaded.value() == catalog); + } +} diff --git a/tests/yugiohbandai_set_source_tests.cpp b/tests/yugiohbandai_set_source_tests.cpp new file mode 100644 index 0000000..0b1c095 --- /dev/null +++ b/tests/yugiohbandai_set_source_tests.cpp @@ -0,0 +1,139 @@ +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" + +#include + +#include + +using namespace ccm; + +namespace { + +class FixedHttpClient final : public IHttpClient { +public: + std::string body; + std::string lastUrl; + bool fail{false}; + + Result get(std::string_view url) override { + lastUrl = std::string(url); + if (fail) return Result::err("http fail"); + return Result::ok(body); + } +}; + +} // namespace + +TEST_SUITE("YuGiOhBandaiSetSource") { + TEST_CASE("parseResponse returns stable manifest ordered by release date") { + auto sets = YuGiOhBandaiSetSource::parseResponse({}); + REQUIRE(sets); + REQUIRE(sets.value().size() == 6); + CHECK(sets.value()[0].id == "ban1"); + CHECK(sets.value()[0].name == "1st Generation"); + CHECK(sets.value()[0].releaseDate == "1998/09/01"); + CHECK(sets.value()[5].id == "bansealdass"); + } + + TEST_CASE("normalizeCardNumber strips leading zeros and uppercases prefixes") { + CHECK(YuGiOhBandaiSetSource::normalizeCardNumber("014") == "14"); + CHECK(YuGiOhBandaiSetSource::normalizeCardNumber("#9") == "9"); + CHECK(YuGiOhBandaiSetSource::normalizeCardNumber("j1") == "J1"); + CHECK(YuGiOhBandaiSetSource::normalizeCardNumber("ta2") == "TA2"); + CHECK(YuGiOhBandaiSetSource::normalizeCardNumber(" ") == ""); + } + + TEST_CASE("expandRarityCode maps gallery abbreviations") { + CHECK(YuGiOhBandaiSetSource::expandRarityCode("C") == "Common"); + CHECK(YuGiOhBandaiSetSource::expandRarityCode("R") == "Rare"); + CHECK(YuGiOhBandaiSetSource::expandRarityCode("SR") == "Super Rare"); + CHECK(YuGiOhBandaiSetSource::expandRarityCode("HFR") == "Holo Seal"); + } + + TEST_CASE("setIdForNumber maps ranges and promo prefixes") { + CHECK(YuGiOhBandaiSetSource::setIdForNumber("14") == "ban1"); + CHECK(YuGiOhBandaiSetSource::setIdForNumber("50") == "ban2"); + CHECK(YuGiOhBandaiSetSource::setIdForNumber("118") == "ban3"); + CHECK(YuGiOhBandaiSetSource::setIdForNumber("J1") == "banpromo-j"); + CHECK(YuGiOhBandaiSetSource::setIdForNumber("TA2") == "banpromo-ta"); + } + + TEST_CASE("parseGalleryWikitext extracts number rarity and English name") { + const std::string wiki = + "DarkMagician-BAN1-JP-R.png | {{pound}}014 ([[R]]) " + "{{Gallery card names|Dark Magician (Bandai)|ja}}\n" + "BlueEyesWhiteDragon-BAN1-JP-SR.png | {{pound}}009 ([[SR]]) " + "{{Gallery card names|Blue-Eyes White Dragon (Bandai)|ja}}\n"; + + auto cards = YuGiOhBandaiSetSource::parseGalleryWikitext(wiki); + REQUIRE(cards); + REQUIRE(cards.value().size() == 2); + CHECK(cards.value()[0].setNo == "14"); + CHECK(cards.value()[0].name == "Dark Magician"); + CHECK(cards.value()[0].rarity == "Rare"); + CHECK(cards.value()[1].setNo == "9"); + CHECK(cards.value()[1].rarity == "Super Rare"); + } + + TEST_CASE("parseGalleryWikitext accepts promo [[TA2]] number format") { + const std::string wiki = + "WickedChain-BAN1-JP-SR.png | [[TA1]] ([[SR]]) " + "{{Gallery card names|Wicked Chain|ja}}\n" + "BlueEyesWhiteDragons3BodyConnection-BAN1-JP-SR.png | [[TA2]] ([[SR]]) " + "{{Gallery card names|Blue-Eyes White Dragon's 3-Body Connection|ja}}\n" + "MirrorForce-BAN1-JP-SR.png | [[J1]] ([[SR]]) " + "{{Gallery card names|Mirror Force (Bandai)|ja}}\n"; + + auto cards = YuGiOhBandaiSetSource::parseGalleryWikitext(wiki); + REQUIRE(cards); + REQUIRE(cards.value().size() == 3); + CHECK(cards.value()[0].setNo == "TA1"); + CHECK(cards.value()[0].name == "Wicked Chain"); + CHECK(cards.value()[0].rarity == "Super Rare"); + CHECK(cards.value()[1].setNo == "TA2"); + CHECK(cards.value()[1].name == "Blue-Eyes White Dragon's 3-Body Connection"); + CHECK(cards.value()[2].setNo == "J1"); + CHECK(cards.value()[2].name == "Mirror Force"); + } + + TEST_CASE("parseGalleryWikitext tolerates
between rarity and name template") { + // Live Yugipedia promo gallery captions insert
after expansion. + const std::string wiki = + "\n" + "BlueEyesWhiteDragons3BodyConnection-BAN1-JP-SR.png | [[TA2]] ([[SR]])
" + "{{Gallery card names|Blue-Eyes White Dragon's 3-Body Connection|ja}}\n" + "MirrorForce-BAN1-JP-SR.png | [[J1]] ([[SR]])
" + "{{Gallery card names|Mirror Force (Bandai)|ja}}\n" + "
\n"; + + auto cards = YuGiOhBandaiSetSource::parseGalleryWikitext(wiki); + REQUIRE(cards); + REQUIRE(cards.value().size() == 2); + CHECK(cards.value()[0].setNo == "TA2"); + CHECK(cards.value()[0].name == "Blue-Eyes White Dragon's 3-Body Connection"); + CHECK(cards.value()[0].rarity == "Super Rare"); + CHECK(cards.value()[1].setNo == "J1"); + } + + TEST_CASE("parseGalleryWikitext empty body yields empty ok") { + auto cards = YuGiOhBandaiSetSource::parseGalleryWikitext(""); + REQUIRE(cards); + CHECK(cards.value().empty()); + } + + TEST_CASE("fetchAll returns manifest without HTTP") { + FixedHttpClient http; + YuGiOhBandaiSetSource src(http); + auto sets = src.fetchAll(); + REQUIRE(sets); + CHECK(sets.value().size() == 6); + CHECK(http.lastUrl.empty()); + } + + TEST_CASE("buildGalleryParseUrl percent-encodes page title") { + const auto url = YuGiOhBandaiSetSource::buildGalleryParseUrl( + "Set Card Galleries:Yu-Gi-Oh! Bandai OCG: 1st Generation"); + CHECK(url.find("action=parse") != std::string::npos); + CHECK(url.find("prop=wikitext") != std::string::npos); + CHECK(url.find("page=") != std::string::npos); + } +} diff --git a/ui_wx/AGENTS.md b/ui_wx/AGENTS.md index fac8b54..b259d2c 100644 --- a/ui_wx/AGENTS.md +++ b/ui_wx/AGENTS.md @@ -16,6 +16,7 @@ - `include/ccm/ui/Pokemon*.hpp` + `src/Pokemon*.cpp` — Pokemon implementations: `PokemonCardListPanel`, `PokemonSelectedCardPanel`, `PokemonCardEditDialog`, `PokemonGameView`, `PokemonSetCompletionPanel`. Same Add/Edit shape as Magic for the card form; the game view hosts **Single Cards | Set Completion** via `contentPanel` / `hostsOwnLayout` (like Digimon/Yu-Gi-Oh!). Catalog from `PokemonSetCatalogService` (`set-catalog-west.json` / `set-catalog-asia.json`), filled on Update Pokemon. The Add/Edit/Delete + filter toolbar lives inside the Single Cards tab; MainFrame hides its shared toolbar while Pokemon is active. - `include/ccm/ui/DigiBattle99*.hpp` + `src/DigiBattle99*.cpp` — Digimon Digi-Battle: list/selected/edit plus `DigiBattle99GameView` via `contentPanel` with a **palette-painted tab strip** + `wxSimplebook` (**Single Cards** | **Set Completion**) — not native `wxNotebook`, which stays light on MSW dark mode — and `DigiBattle99SetCompletionPanel` (pack progress tiles + greyed checklist). Catalog from `DigiBattle99SetCatalogService` (`set-catalog.json`), filled on Update Sets. The Add/Edit/Delete + filter toolbar lives **inside** the Single Cards page; MainFrame hides its shared toolbar while Digimon is active (`hostsOwnLayout`). - `include/ccm/ui/YuGiOh*.hpp` + `src/YuGiOh*.cpp` — Yu-Gi-Oh!: list/selected/edit plus `YuGiOhGameView` notebook (**Single Cards** | **Set Completion**) via the same `hostsOwnLayout` / `contentPanel` pattern as Digimon, and `YuGiOhSetCompletionPanel`. Catalog from `YuGiOhSetCatalogService` (`yugioh/set-catalog.json`), filled on Update Sets from YGOPRODeck `cardinfo.php`. +- `include/ccm/ui/YuGiOhBandai*.hpp` + `src/YuGiOhBandai*.cpp` — Yu-Gi-Oh! (Bandai): same notebook layout as Digimon/YGO; dual auto-detect (name or Bandai number) via Yugipedia SMW ask; catalog from `YuGiOhBandaiSetCatalogService` (`yugiohbandai/set-catalog.json`). - `include/ccm/ui/SvgIcons.hpp` + `src/SvgIcons.cpp` — embedded SVG templates with a `@FILL@` placeholder. Magic flags: `kSvgFoil` / `kSvgSigned` / `kSvgAltered`. Pokemon flags: `kSvgHolo` (sparkle, mirroring the original `IconHolo` from `PokemonTable.tsx`) and `kSvgFirstEdition` (themed "1" inside an outlined badge, rebuilt from the original `IconPokemonFirstEdition.tsx` — every fill/stroke uses `@FILL@` so the icon themes alongside the others). Toolbar glyphs: `kSvgToolbarAdd` / `kSvgToolbarEdit` / `kSvgToolbarDelete` (vscode-codicons). `svgIconBitmap` / `paddedSvgIcon` helpers backed by `wxBitmapBundle::FromSVG`. Bitmaps from `svgIconBitmap` go straight to `wxStaticBitmap` / `wxBitmapButton::SetBitmap` cleanly; for the row-icon path `IconListCtrl` packs them into a private premultiplied-BGRA `HIMAGELIST` and draws with `ImageList_Draw`. See convention 11 for the full pitfall write-up. - `src/BaseEvents.cpp` — single-translation-unit definitions for `EVT_CARD_SELECTED` and `EVT_PREVIEW_STATUS`. Both events are template-instantiation-agnostic so all per-game panels share the same event types. - `include/ccm/ui/SettingsDialog.hpp` + `src/SettingsDialog.cpp` — edits `Configuration` via `ConfigService::store`. @@ -61,7 +62,7 @@ - Center popup dialogs on the app window (`CentreOnParent()`) so confirmations/info boxes open relative to the current app window. - Include `wxSpinCtrl` in themed input controls (Amount field) or it will keep a mismatched native background. - Do not call `applyNativeClassTheme(..., "DarkMode_Explorer", "Explorer")` for `wxTextCtrl`; on some Windows builds this causes black typed text in dark mode. Keep text inputs palette-driven (`SetThemeEnabled(false)` in dark/high-contrast as needed). - - If a specific text field still renders wrong while typing (notably `MainFrame`'s filter box), enforce text/background in `MainFrame::MSWWindowProc` via `WM_CTLCOLOREDIT` for that control handle. + - Text inputs are hardened in `Theme.cpp` via `applyPaletteToTextCtrl` / `hardenTextCtrlNativeTheme`: opt the EDIT HWND out of immersive dark mode, clear its visual style, and subclass the **parent** to answer `WM_CTLCOLOREDIT` (that message goes to the parent, not the frame — an earlier frame-level handler never ran for the toolbar filter). - Keep toolbar button behavior stable under dark/high-contrast: avoid changes that break click/tooltip affordances while experimenting with hover contrast fixes. - For dark/high-contrast button readability, do not trust native hover/pressed rendering on Windows; custom state painting in `Theme.cpp` is allowed when native visuals ignore configured colors. - Button event handlers must use per-button state that is refreshed when theme changes. Avoid one-time captures of theme colors/mode in lambdas; these can leak dark-mode behavior into light mode. @@ -90,7 +91,7 @@ 1. Implement three derived classes under `include/ccm/ui/` mirroring the Magic / Pokemon trio: - `CardListPanel : public BaseCardListPanel<Card, SortColumn>` — override `declareTextColumns()`, `declareIconColumns()`, `renderTextCell()`, `isIconColumnSet()`, `sortBy()`, `matchesFilter()`. - `SelectedCardPanel : public BaseSelectedCardPanel<Card>` — override `declareDetailRows()`, `declareFlagIcons()`, `detailValueFor()`, `isFlagSet()`, `previewKey()`, `gameId()`. Define a local `enum` of `DetailKey` constants for clarity. - - `CardEditDialog : public BaseCardEditDialog<Card>` — override `buildFlagsRow()`, optionally `appendExtraRows()`, `readExtraFromCard()`, `writeExtraToCard()`, `updateMenuName()`. + - `CardEditDialog : public BaseCardEditDialog<Card>` — override `buildFlagsRow()`, optionally `appendExtraRows()`, `readExtraFromCard()`, `writeExtraToCard()`, `updateMenuName()`, and optionally `validateExtraFields()` (Bandai requires set number). 2. Add a `GameView : public IGameView` that owns those panels and the typed `CollectionService<Card>&`. Bind `EVT_CARD_SELECTED` on the list panel inside `listPanel(parent)` to push the typed selection into the selected panel. The `MagicGameView` / `PokemonGameView` pair is the canonical reference. 3. Re-add the new view to `AppContext::gameViews` in the composition root (`app/main.cpp`). The `Game` and `Sets` menus pick it up automatically. 4. Add SVG glyphs for any new flag columns to `SvgIcons.{hpp,cpp}` (with the `@FILL@` placeholder). diff --git a/ui_wx/CMakeLists.txt b/ui_wx/CMakeLists.txt index f122ee6..18b545a 100644 --- a/ui_wx/CMakeLists.txt +++ b/ui_wx/CMakeLists.txt @@ -26,6 +26,11 @@ add_library(ccm_ui_wx STATIC src/DigiBattle99CardEditDialog.cpp src/DigiBattle99GameView.cpp src/DigiBattle99SetCompletionPanel.cpp + src/YuGiOhBandaiCardListPanel.cpp + src/YuGiOhBandaiSelectedCardPanel.cpp + src/YuGiOhBandaiCardEditDialog.cpp + src/YuGiOhBandaiGameView.cpp + src/YuGiOhBandaiSetCompletionPanel.cpp src/SettingsDialog.cpp src/SwitchCtrl.cpp @@ -61,8 +66,10 @@ target_link_libraries(ccm_ui_wx # the per-row flag glyphs with proper transparency. Without msimg32 linked # explicitly the linker fails on `AlphaBlend@44` even though gdi32 is pulled # in transitively by wxWidgets. +# Theme.cpp subclasses EDIT parents via SetWindowSubclass / DefSubclassProc / +# RemoveWindowSubclass (comctl32); those symbols are not pulled in by wx alone. if (WIN32) - target_link_libraries(ccm_ui_wx PRIVATE msimg32) + target_link_libraries(ccm_ui_wx PRIVATE msimg32 comctl32) endif() target_compile_features(ccm_ui_wx PUBLIC cxx_std_20) diff --git a/ui_wx/include/ccm/ui/AppContext.hpp b/ui_wx/include/ccm/ui/AppContext.hpp index 0d2baf6..37e6a61 100644 --- a/ui_wx/include/ccm/ui/AppContext.hpp +++ b/ui_wx/include/ccm/ui/AppContext.hpp @@ -27,6 +27,7 @@ struct AppContext { IGameModule& pokemonModule; IGameModule& yuGiOhModule; IGameModule& digiBattle99Module; + IGameModule& yuGiOhBandaiModule; // Asia Pokemon sets/preview backend (not a separate Game menu entry). IGameModule& japanesePokemonModule; // Active per-game UI bundles. The order is the order shown in the diff --git a/ui_wx/include/ccm/ui/BaseCardEditDialog.hpp b/ui_wx/include/ccm/ui/BaseCardEditDialog.hpp index 12642a3..6dd48af 100644 --- a/ui_wx/include/ccm/ui/BaseCardEditDialog.hpp +++ b/ui_wx/include/ccm/ui/BaseCardEditDialog.hpp @@ -136,6 +136,10 @@ protected: // controls cannot outlive the lookup identity. virtual void onCardLookupContextChanged() {} + // Extra validation after name/set checks and writeFromControls(). Return + // false to block OK (subclass should show its own themed dialog). + [[nodiscard]] virtual bool validateExtraFields() { return true; } + // Common helpers ---------------------------------------------------------- void appendRow(wxFlexGridSizer* grid, const wxString& label, wxWindow* ctrl) { @@ -148,6 +152,8 @@ protected: [[nodiscard]] const TCard& constCard() const noexcept { return card_; } void syncCardFromControls() { writeFromControls(); } [[nodiscard]] wxComboBox* setComboControl() const noexcept { return setCombo_; } + [[nodiscard]] wxTextCtrl* nameControl() const noexcept { return nameCtrl_; } + [[nodiscard]] wxChoice* languageChoiceControl() const noexcept { return languageChoice_; } [[nodiscard]] const Set* selectedSetFromControls() const { const auto& available = availableSets(); @@ -471,6 +477,7 @@ private: "Add card", wxOK | wxICON_INFORMATION); return; } + if (!validateExtraFields()) return; if (mode_ == EditMode::Edit && !(card_ == openingSnapshot_)) { if (showThemedConfirmDialog( this, diff --git a/ui_wx/include/ccm/ui/BaseSelectedCardPanel.hpp b/ui_wx/include/ccm/ui/BaseSelectedCardPanel.hpp index c10a805..1c535c9 100644 --- a/ui_wx/include/ccm/ui/BaseSelectedCardPanel.hpp +++ b/ui_wx/include/ccm/ui/BaseSelectedCardPanel.hpp @@ -307,6 +307,8 @@ private: case Game::DigiBattle99: // No stable public Digi-Battle back URL; UI uses bundled PNG. return {}; + case Game::YuGiOhBandai: + return "https://ms.yugipedia.com//3/34/Back-BAN-JP-1999.png"; } return {}; } diff --git a/ui_wx/include/ccm/ui/MainFrame.hpp b/ui_wx/include/ccm/ui/MainFrame.hpp index 6f9451a..ae4e1b8 100644 --- a/ui_wx/include/ccm/ui/MainFrame.hpp +++ b/ui_wx/include/ccm/ui/MainFrame.hpp @@ -51,10 +51,6 @@ private: [[nodiscard]] IGameView* activeView(); -#ifdef __WXMSW__ - WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) override; -#endif - AppContext& ctx_; Game activeGame_{Game::Magic}; diff --git a/ui_wx/include/ccm/ui/Theme.hpp b/ui_wx/include/ccm/ui/Theme.hpp index b5b0ea2..bc779e0 100644 --- a/ui_wx/include/ccm/ui/Theme.hpp +++ b/ui_wx/include/ccm/ui/Theme.hpp @@ -7,6 +7,7 @@ class wxDialog; class wxWindow; class wxString; +class wxTextCtrl; namespace ccm::ui { @@ -23,6 +24,8 @@ struct ThemePalette { ThemePalette paletteForTheme(Theme theme); Theme inferThemeFromWindow(const wxWindow* window); void applyThemeToWindowTree(wxWindow* root, const ThemePalette& palette, Theme theme); +// Force palette colors onto a text input (incl. MSW dark-mode typed-text fix). +void applyPaletteToTextCtrl(wxTextCtrl* text, const ThemePalette& palette, Theme theme); void themeModalDialog(wxDialog* dlg, Theme theme); int showThemedMessageDialog(wxWindow* parent, const wxString& message, const wxString& caption, long style); int showThemedConfirmDialog(wxWindow* parent, const wxString& message, const wxString& caption); diff --git a/ui_wx/include/ccm/ui/YuGiOhBandaiCardEditDialog.hpp b/ui_wx/include/ccm/ui/YuGiOhBandaiCardEditDialog.hpp new file mode 100644 index 0000000..092f98c --- /dev/null +++ b/ui_wx/include/ccm/ui/YuGiOhBandaiCardEditDialog.hpp @@ -0,0 +1,86 @@ +#pragma once + +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/ports/ICardPreviewSource.hpp" +#include "ccm/services/CardPreviewService.hpp" +#include "ccm/ui/BaseCardEditDialog.hpp" +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace ccm::ui { + +class YuGiOhBandaiCardEditDialog final : public BaseCardEditDialog { +public: + YuGiOhBandaiCardEditDialog(wxWindow* parent, + ImageService& imageService, + SetService& setService, + CardPreviewService& cardPreview, + EditMode mode, + YuGiOhBandaiCard initial, + const std::vector* preloadedSets = nullptr); + ~YuGiOhBandaiCardEditDialog() override; + +protected: + void buildFlagsRow(wxBoxSizer* flagsBox) override; + void appendExtraRows(wxFlexGridSizer* grid) override; + void readExtraFromCard() override; + void writeExtraToCard() override; + [[nodiscard]] std::span languagesForChoice() const override; + [[nodiscard]] std::string updateMenuName() const override { + return "Update Yu-Gi-Oh! (Bandai)"; + } + void onCardLookupContextChanged() override; + [[nodiscard]] bool validateExtraFields() override; + +private: + struct VariantFetchState { + std::atomic alive{true}; + }; + + void onAutoDetectBySetNo(wxCommandEvent&); + void onNextSetNo(wxCommandEvent&); + void onAutoDetectByName(wxCommandEvent&); + void onRarityChoiceChanged(wxCommandEvent&); + void onSetSelectionChanged(wxCommandEvent&); + + void scheduleDeferredVariantPrefetch(); + void prefetchVariantsForCurrentCardSilent(unsigned capturedEpoch); + void requestByNameAsync(unsigned capturedEpoch, std::string name, std::string setId, + bool showFailureDialog); + void requestByNoAsync(unsigned capturedEpoch, std::string setNo, bool showFailureDialog); + void applyDetectedList(unsigned capturedEpoch, + Result> detected, + bool showFailureDialog, bool applyFirst); + void clearCachedPrintVariants(); + void applyDetectedPrint(const AutoDetectedPrint& print); + void applyRarityStringToChoice(const std::string& rarity); + void maybeAutoCheckHoloForRarity(const std::string& rarity); + void refreshVariantNextControls(); + [[nodiscard]] std::size_t findAvailableSetIndex(const std::string& setId) const; + + EditMode dialogMode_; + unsigned variantFetchEpoch_{0}; + CardPreviewService& cardPreview_; + std::shared_ptr variantFetchState_; + + wxTextCtrl* setNoCtrl_{nullptr}; + wxButton* autoSetNoBtn_{nullptr}; + wxButton* nextSetNoBtn_{nullptr}; + wxChoice* rarityChoice_{nullptr}; + wxButton* autoRarityBtn_{nullptr}; + wxCheckBox* holoCheck_{nullptr}; + wxCheckBox* signedCheck_{nullptr}; + wxCheckBox* alteredCheck_{nullptr}; + + std::vector cachedVariants_; + std::size_t variantRingPos_{0}; +}; + +} // namespace ccm::ui diff --git a/ui_wx/include/ccm/ui/YuGiOhBandaiCardListPanel.hpp b/ui_wx/include/ccm/ui/YuGiOhBandaiCardListPanel.hpp new file mode 100644 index 0000000..f86132d --- /dev/null +++ b/ui_wx/include/ccm/ui/YuGiOhBandaiCardListPanel.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/services/CardSorter.hpp" +#include "ccm/ui/BaseCardListPanel.hpp" + +namespace ccm::ui { + +class YuGiOhBandaiCardListPanel final + : public BaseCardListPanel { +public: + explicit YuGiOhBandaiCardListPanel(wxWindow* parent); + +protected: + [[nodiscard]] std::vector declareTextColumns() const override; + [[nodiscard]] std::vector declareIconColumns() const override; + [[nodiscard]] std::string renderTextCell(const YuGiOhBandaiCard& card, + std::size_t idx) const override; + [[nodiscard]] bool isIconColumnSet(const YuGiOhBandaiCard& card, + std::size_t idx) const override; + void sortBy(YuGiOhBandaiSortColumn column, bool ascending) override; + [[nodiscard]] bool matchesFilter(const YuGiOhBandaiCard& card, + std::string_view filter) const override; +}; + +} // namespace ccm::ui diff --git a/ui_wx/include/ccm/ui/YuGiOhBandaiGameView.hpp b/ui_wx/include/ccm/ui/YuGiOhBandaiGameView.hpp new file mode 100644 index 0000000..74fbe51 --- /dev/null +++ b/ui_wx/include/ccm/ui/YuGiOhBandaiGameView.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/games/IGameModule.hpp" +#include "ccm/services/CardPreviewService.hpp" +#include "ccm/services/CollectionService.hpp" +#include "ccm/services/ConfigService.hpp" +#include "ccm/services/ImageService.hpp" +#include "ccm/services/SetService.hpp" +#include "ccm/services/YuGiOhBandaiSetCatalogService.hpp" +#include "ccm/ui/IGameView.hpp" + +#include +#include +#include +#include +#include + +class wxBitmapButton; +class wxBoxSizer; +class wxPanel; +class wxSimplebook; +class wxSplitterWindow; +class wxStaticText; +class wxTextCtrl; + +namespace ccm::ui { + +class YuGiOhBandaiCardListPanel; +class YuGiOhBandaiSelectedCardPanel; +class YuGiOhBandaiSetCompletionPanel; + +class YuGiOhBandaiGameView final : public IGameView { +public: + YuGiOhBandaiGameView(ConfigService& config, + CollectionService& collection, + SetService& sets, + ImageService& images, + CardPreviewService& cardPreview, + IGameModule& module, + YuGiOhBandaiSetCatalogService& catalogStore); + + [[nodiscard]] Game gameId() const noexcept override { return Game::YuGiOhBandai; } + [[nodiscard]] std::string displayName() const override { return "Yu-Gi-Oh! (Bandai)"; } + + wxPanel* listPanel(wxWindow* parent) override; + wxPanel* selectedPanel(wxWindow* parent) override; + wxPanel* contentPanel(wxWindow* parent) override; + [[nodiscard]] wxPanel* contentPanelIfCreated() const noexcept override { + return contentPanel_; + } + [[nodiscard]] bool hostsOwnLayout() const noexcept override { return true; } + + void refreshCollection(std::optional selectId = std::nullopt) override; + void onAddCard(wxWindow* parentWindow) override; + void onEditCard(wxWindow* parentWindow) override; + void onDeleteCard(wxWindow* parentWindow) override; + std::string onUpdateSets(wxWindow* parentWindow) override; + void setFilter(std::string_view filter) override; + void nudgeSelection(int delta) override; + void applyTheme(const ThemePalette& palette) override; + [[nodiscard]] std::string updateSetsMenuLabel() const override { + return "Update Yu-Gi-Oh! (Bandai)"; + } + +private: + void ensureSetsLoaded(); + // Fetches sets + checklist catalog from Yugipedia and persists both. + // Returns false on failure (error dialogs already shown). + [[nodiscard]] bool downloadSetsAndCatalog(wxWindow* parentWindow, + std::size_t* setCountOut = nullptr, + std::size_t* packCountOut = nullptr); + // Fetches sets + checklist catalog when set-catalog.json is missing. + // Returns true if the catalog exists afterward. Shows error dialogs on failure. + [[nodiscard]] bool ensureCatalogLoaded(wxWindow* parentWindow); + void refreshSetCompletionFromStore(); + const std::vector& setsForDialog(); + void ensureSingleCardsMounted(wxWindow* splitterParent); + void buildSingleCardsToolbar(wxWindow* parent, wxBoxSizer* pageSizer); + void buildTabBar(wxWindow* parent, wxBoxSizer* rootSizer); + void selectTab(int index); + void refreshToolbarIcons(const ThemePalette& palette); + void refreshTabBarTheme(const ThemePalette& palette); + + ConfigService& config_; + CollectionService& collection_; + SetService& sets_; + ImageService& images_; + CardPreviewService& cardPreview_; + IGameModule& module_; + YuGiOhBandaiSetCatalogService& catalogStore_; + + wxPanel* contentPanel_{nullptr}; + wxPanel* tabBar_{nullptr}; + wxSimplebook* book_{nullptr}; + wxSplitterWindow* singleSplitter_{nullptr}; + YuGiOhBandaiCardListPanel* listPanel_{nullptr}; + YuGiOhBandaiSelectedCardPanel* selectedPanel_{nullptr}; + YuGiOhBandaiSetCompletionPanel* setCompletionPanel_{nullptr}; + std::array tabPanels_{{nullptr, nullptr}}; + std::array tabLabels_{{nullptr, nullptr}}; + int activeTab_{0}; + std::array toolbarButtons_{{nullptr, nullptr, nullptr}}; + wxTextCtrl* filterInput_{nullptr}; + std::vector setsCache_; + bool attemptedInitialSetLoad_{false}; +}; + +} // namespace ccm::ui diff --git a/ui_wx/include/ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp b/ui_wx/include/ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp new file mode 100644 index 0000000..0009190 --- /dev/null +++ b/ui_wx/include/ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/ui/BaseSelectedCardPanel.hpp" + +namespace ccm::ui { + +class YuGiOhBandaiSelectedCardPanel final : public BaseSelectedCardPanel { +public: + YuGiOhBandaiSelectedCardPanel(wxWindow* parent, + ImageService& imageService, + CardPreviewService& cardPreview); + +protected: + [[nodiscard]] std::vector declareDetailRows() const override; + [[nodiscard]] std::vector declareFlagIcons() const override; + [[nodiscard]] std::string detailValueFor(const YuGiOhBandaiCard& card, + DetailKey key) const override; + [[nodiscard]] bool isFlagSet(const YuGiOhBandaiCard& card, DetailKey key) const override; + [[nodiscard]] std::tuple + previewKey(const YuGiOhBandaiCard& card) const override; + [[nodiscard]] Game gameId() const noexcept override { return Game::YuGiOhBandai; } +}; + +} // namespace ccm::ui diff --git a/ui_wx/include/ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp b/ui_wx/include/ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp new file mode 100644 index 0000000..8ecc136 --- /dev/null +++ b/ui_wx/include/ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp @@ -0,0 +1,71 @@ +#pragma once + +// YuGiOhBandaiSetCompletionPanel: Set Completion tab — pack tiles with +// progress bars for sets the user owns >=1 card of, plus an in-tab checklist +// drill-down (unowned rows greyed). Catalog is offline (set-catalog.json). +// Optional language filter restricts ownership to one language and labels +// set titles as "{setName} ({language})". + +#include "ccm/domain/Enums.hpp" +#include "ccm/domain/YuGiOhBandaiCard.hpp" +#include "ccm/domain/YuGiOhBandaiSetCatalog.hpp" +#include "ccm/services/YuGiOhBandaiSetCatalogService.hpp" +#include "ccm/ui/Theme.hpp" + +#include + +#include +#include +#include + +class wxBoxSizer; +class wxChoice; +class wxListCtrl; +class wxScrolledWindow; +class wxSimplebook; +class wxStaticText; + +namespace ccm::ui { + +class YuGiOhBandaiSetCompletionPanel : public wxPanel { +public: + YuGiOhBandaiSetCompletionPanel(wxWindow* parent, YuGiOhBandaiSetCatalogService& catalogStore); + + void setCollection(std::vector cards); + void reloadFromStore(); + void applyTheme(const ThemePalette& palette); + +private: + void showGridPage(); + void showChecklistPage(const std::string& setId, const std::string& setName); + void rebuildGrid(); + void rebuildChecklist(const std::string& setId); + void setEmptyMessage(const wxString& message); + void clearGridTiles(); + void refreshLanguageChoice(); + void onLanguageChoice(wxCommandEvent& event); + void rebuildCurrentView(); + [[nodiscard]] std::string displaySetName(const std::string& setName) const; + + YuGiOhBandaiSetCatalogService& catalogStore_; + YuGiOhBandaiSetCatalog catalog_; + bool catalogLoaded_{false}; + std::vector collection_; + ThemePalette palette_{}; + std::optional languageFilter_; + + wxChoice* languageChoice_{nullptr}; + wxSimplebook* book_{nullptr}; + wxPanel* gridPage_{nullptr}; + wxScrolledWindow* scroll_{nullptr}; + wxBoxSizer* gridSizer_{nullptr}; + wxStaticText* emptyLabel_{nullptr}; + + wxPanel* detailPage_{nullptr}; + wxStaticText* detailTitle_{nullptr}; + wxListCtrl* checklist_{nullptr}; + std::string detailSetId_; + std::string detailSetName_; +}; + +} // namespace ccm::ui diff --git a/ui_wx/src/DigiBattle99GameView.cpp b/ui_wx/src/DigiBattle99GameView.cpp index fae55f7..e952e97 100644 --- a/ui_wx/src/DigiBattle99GameView.cpp +++ b/ui_wx/src/DigiBattle99GameView.cpp @@ -518,13 +518,7 @@ void DigiBattle99GameView::applyTheme(const ThemePalette& palette) { if (setCompletionPanel_) setCompletionPanel_->applyTheme(palette); refreshToolbarIcons(palette); refreshTabBarTheme(palette); - if (filterInput_ != nullptr) { - filterInput_->SetBackgroundColour(palette.inputBg); - filterInput_->SetForegroundColour(palette.inputText); - filterInput_->SetOwnBackgroundColour(palette.inputBg); - filterInput_->SetOwnForegroundColour(palette.inputText); - filterInput_->Refresh(); - } + applyPaletteToTextCtrl(filterInput_, palette, config_.current().theme); } } // namespace ccm::ui diff --git a/ui_wx/src/MainFrame.cpp b/ui_wx/src/MainFrame.cpp index 96a17bd..4ef060e 100644 --- a/ui_wx/src/MainFrame.cpp +++ b/ui_wx/src/MainFrame.cpp @@ -29,10 +29,6 @@ #include #include -#ifdef __WXMSW__ -#include -#endif - namespace ccm::ui { namespace { @@ -44,6 +40,7 @@ std::string dirNameForGame(Game g) { case Game::Magic: return "magic"; case Game::Pokemon: return "pokemon"; case Game::YuGiOh: return "yugioh"; + case Game::YuGiOhBandai: return "yugiohbandai"; case Game::DigiBattle99: return "digibattle99"; case Game::JapanesePokemon: return "pokemon"; } @@ -314,11 +311,7 @@ void MainFrame::applyTheme() { SetBackgroundColour(palette.windowBg); SetForegroundColour(palette.text); if (filterInput_ != nullptr) { - filterInput_->SetBackgroundColour(palette.inputBg); - filterInput_->SetForegroundColour(palette.inputText); - filterInput_->SetOwnBackgroundColour(palette.inputBg); - filterInput_->SetOwnForegroundColour(palette.inputText); - filterInput_->Refresh(); + applyPaletteToTextCtrl(filterInput_, palette, currentTheme); } for (auto* view : ctx_.gameViews) { if (view != nullptr) view->applyTheme(palette); @@ -481,25 +474,4 @@ void MainFrame::onDelete(wxCommandEvent&) { if (auto* view = activeView()) view->onDeleteCard(this); } -#ifdef __WXMSW__ -WXLRESULT MainFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { - if (message == WM_CTLCOLOREDIT && filterInput_ != nullptr) { - const HWND target = reinterpret_cast(lParam); - const HWND filterHwnd = reinterpret_cast(filterInput_->GetHandle()); - if (target != nullptr && filterHwnd != nullptr && target == filterHwnd) { - const ThemePalette palette = paletteForTheme(ctx_.config.current().theme); - HDC hdc = reinterpret_cast(wParam); - ::SetTextColor(hdc, RGB(palette.inputText.Red(), palette.inputText.Green(), - palette.inputText.Blue())); - ::SetBkColor(hdc, RGB(palette.inputBg.Red(), palette.inputBg.Green(), - palette.inputBg.Blue())); - ::SetDCBrushColor(hdc, RGB(palette.inputBg.Red(), palette.inputBg.Green(), - palette.inputBg.Blue())); - return reinterpret_cast(::GetStockObject(DC_BRUSH)); - } - } - return wxFrame::MSWWindowProc(message, wParam, lParam); -} -#endif - } // namespace ccm::ui diff --git a/ui_wx/src/PokemonGameView.cpp b/ui_wx/src/PokemonGameView.cpp index 2a14dc3..addecc6 100644 --- a/ui_wx/src/PokemonGameView.cpp +++ b/ui_wx/src/PokemonGameView.cpp @@ -601,12 +601,7 @@ void PokemonGameView::applyTheme(const ThemePalette& palette) { if (setCompletionPanel_) setCompletionPanel_->applyTheme(palette); refreshToolbarIcons(palette); refreshTabBarTheme(palette); - if (filterInput_ != nullptr) { - filterInput_->SetBackgroundColour(palette.inputBg); - filterInput_->SetForegroundColour(palette.inputText); - filterInput_->SetOwnBackgroundColour(palette.inputBg); - filterInput_->SetOwnForegroundColour(palette.inputText); - } + applyPaletteToTextCtrl(filterInput_, palette, config_.current().theme); } } // namespace ccm::ui diff --git a/ui_wx/src/SettingsDialog.cpp b/ui_wx/src/SettingsDialog.cpp index c8c94c9..e1ba7d1 100644 --- a/ui_wx/src/SettingsDialog.cpp +++ b/ui_wx/src/SettingsDialog.cpp @@ -18,6 +18,7 @@ wxString displayLabelForGame(Game g) { case Game::Pokemon: return "Pokemon"; case Game::YuGiOh: return "Yu-Gi-Oh!"; case Game::DigiBattle99: return "Digimon (Digi-Battle)"; + case Game::YuGiOhBandai: return "Yu-Gi-Oh! (Bandai)"; case Game::JapanesePokemon: return "Pokemon"; // internal; not in allGames() } return wxString::FromUTF8(to_string(g).data()); diff --git a/ui_wx/src/Theme.cpp b/ui_wx/src/Theme.cpp index 74d1ee0..05f345b 100644 --- a/ui_wx/src/Theme.cpp +++ b/ui_wx/src/Theme.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #ifdef __WXMSW__ @@ -216,6 +217,79 @@ void applyNativeClassTheme(wxWindow* window, Theme theme, const wchar_t* darkCla setWindowTheme(hwnd, dark ? darkClass : lightClass, nullptr); } +// WM_CTLCOLOREDIT is sent to the EDIT's parent, not the top-level frame. Immersive +// dark mode can still paint black typed text even when wx colours are set, so we +// subclass each parent once and force text/background from the wxTextCtrl palette. +constexpr UINT_PTR kEditColorSubclassId = 0x43434d45; // 'CCME' +std::unordered_set gEditColorSubclassedParents; +std::unordered_map gPaletteTextCtrls; +std::unordered_set gPaletteTextCtrlDestroyBound; + +LRESULT CALLBACK editColorParentSubclass(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, + UINT_PTR /*subclassId*/, DWORD_PTR /*refData*/) { + if (msg == WM_CTLCOLOREDIT) { + const HWND editHwnd = reinterpret_cast(lParam); + const auto it = gPaletteTextCtrls.find(editHwnd); + if (it != gPaletteTextCtrls.end() && it->second != nullptr) { + wxTextCtrl* text = it->second; + const wxColour fg = text->GetForegroundColour(); + const wxColour bg = text->GetBackgroundColour(); + if (fg.IsOk() && bg.IsOk()) { + HDC hdc = reinterpret_cast(wParam); + ::SetTextColor(hdc, RGB(fg.Red(), fg.Green(), fg.Blue())); + ::SetBkColor(hdc, RGB(bg.Red(), bg.Green(), bg.Blue())); + ::SetDCBrushColor(hdc, RGB(bg.Red(), bg.Green(), bg.Blue())); + return reinterpret_cast(::GetStockObject(DC_BRUSH)); + } + } + } else if (msg == WM_NCDESTROY) { + gEditColorSubclassedParents.erase(hwnd); + ::RemoveWindowSubclass(hwnd, editColorParentSubclass, kEditColorSubclassId); + } + return ::DefSubclassProc(hwnd, msg, wParam, lParam); +} + +void ensureEditColorParentSubclass(wxTextCtrl* text) { + if (text == nullptr) return; + const HWND editHwnd = reinterpret_cast(text->GetHandle()); + if (editHwnd == nullptr) return; + gPaletteTextCtrls[editHwnd] = text; + if (gPaletteTextCtrlDestroyBound.insert(text).second) { + text->Bind(wxEVT_DESTROY, [text, editHwnd](wxWindowDestroyEvent& event) { + gPaletteTextCtrls.erase(editHwnd); + gPaletteTextCtrlDestroyBound.erase(text); + event.Skip(); + }); + } + const HWND parent = ::GetParent(editHwnd); + if (parent == nullptr) return; + if (gEditColorSubclassedParents.count(parent) != 0) return; + if (::SetWindowSubclass(parent, editColorParentSubclass, kEditColorSubclassId, 0) != FALSE) { + gEditColorSubclassedParents.insert(parent); + } +} + +void hardenTextCtrlNativeTheme(wxTextCtrl* text, Theme theme) { + if (text == nullptr) return; + const bool darkLike = isDarkLikeTheme(theme); + text->SetThemeEnabled(!darkLike); + + const HWND hwnd = reinterpret_cast(text->GetHandle()); + if (hwnd == nullptr) return; + + // Opt this EDIT out of immersive dark mode so typed text uses our palette. + if (auto allowDarkModeForWindow = resolveAllowDarkModeForWindow()) { + allowDarkModeForWindow(hwnd, FALSE); + } + if (darkLike) { + if (auto setWindowTheme = resolveSetWindowTheme()) { + // Empty theme class disables visual-style painting of the EDIT contents. + setWindowTheme(hwnd, L"", L""); + } + } + ensureEditColorParentSubclass(text); +} + COLORREF toColorRef(const wxColour& c) { return RGB(c.Red(), c.Green(), c.Blue()); } @@ -412,9 +486,13 @@ void applyThemeToWindowTree(wxWindow* root, const ThemePalette& palette, Theme t dynamic_cast(root) != nullptr) { if (auto* text = dynamic_cast(root)) { // On Windows, themed EDIT controls can ignore wx foreground color - // while typing in dark mode; disable native theming there so the - // control consistently uses palette-driven text/background colors. + // while typing in dark mode; disable native theming and force + // WM_CTLCOLOREDIT colours via the parent subclass helper. +#ifdef __WXMSW__ + hardenTextCtrlNativeTheme(text, theme); +#else text->SetThemeEnabled(!isDarkLikeTheme(theme)); +#endif } root->SetBackgroundColour(palette.inputBg); root->SetForegroundColour(palette.inputText); @@ -428,7 +506,7 @@ void applyThemeToWindowTree(wxWindow* root, const ThemePalette& palette, Theme t } else if (dynamic_cast(root) != nullptr) { // Do not apply Explorer class theming to edit controls: on some // Windows builds it forces black typed text in dark mode. - // Keep text fields palette-driven via wx colors instead. + // Keep text fields palette-driven via wx colours + CTLCOLOR fix. } else { applyNativeClassTheme(root, theme, L"DarkMode_Explorer", L"Explorer"); } @@ -637,6 +715,20 @@ void applyThemeToWindowTree(wxWindow* root, const ThemePalette& palette, Theme t } } +void applyPaletteToTextCtrl(wxTextCtrl* text, const ThemePalette& palette, Theme theme) { + if (text == nullptr) return; +#ifdef __WXMSW__ + hardenTextCtrlNativeTheme(text, theme); +#else + text->SetThemeEnabled(!isDarkLikeTheme(theme)); +#endif + text->SetBackgroundColour(palette.inputBg); + text->SetForegroundColour(palette.inputText); + text->SetOwnBackgroundColour(palette.inputBg); + text->SetOwnForegroundColour(palette.inputText); + text->Refresh(); +} + void themeModalDialog(wxDialog* dlg, Theme theme) { if (dlg == nullptr) return; const ThemePalette palette = paletteForTheme(theme); diff --git a/ui_wx/src/YuGiOhBandaiCardEditDialog.cpp b/ui_wx/src/YuGiOhBandaiCardEditDialog.cpp new file mode 100644 index 0000000..73e547d --- /dev/null +++ b/ui_wx/src/YuGiOhBandaiCardEditDialog.cpp @@ -0,0 +1,359 @@ +#include "ccm/ui/YuGiOhBandaiCardEditDialog.hpp" + +#include "ccm/domain/Enums.hpp" +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" +#include "ccm/ui/Theme.hpp" +#include +#include + +#include +#include +#include +#include + +namespace ccm::ui { + +namespace { +const char* const kRarityOptions[] = { + "Common", + "Rare", + "Super Rare", + "Ultra Rare", + "Holo Seal", +}; +} // namespace + +YuGiOhBandaiCardEditDialog::YuGiOhBandaiCardEditDialog(wxWindow* parent, + ImageService& imageService, + SetService& setService, + CardPreviewService& cardPreview, + EditMode mode, + YuGiOhBandaiCard initial, + const std::vector* preloadedSets) + : BaseCardEditDialog( + parent, + mode == EditMode::Create ? "Add Yu-Gi-Oh! (Bandai) Card" + : "Edit Yu-Gi-Oh! (Bandai) Card", + imageService, setService, mode, std::move(initial), Game::YuGiOhBandai, + preloadedSets), + dialogMode_(mode), + cardPreview_(cardPreview), + variantFetchState_(std::make_shared()) { + buildAndPopulate(); + if (dialogMode_ == EditMode::Edit) { + scheduleDeferredVariantPrefetch(); + } +} + +YuGiOhBandaiCardEditDialog::~YuGiOhBandaiCardEditDialog() { + if (variantFetchState_) { + variantFetchState_->alive.store(false); + } +} + +std::span YuGiOhBandaiCardEditDialog::languagesForChoice() const { + static constexpr Language kLangs[] = {Language::Japanese, Language::English}; + return kLangs; +} + +void YuGiOhBandaiCardEditDialog::onCardLookupContextChanged() { + clearCachedPrintVariants(); +} + +bool YuGiOhBandaiCardEditDialog::validateExtraFields() { + const std::string setNo = + YuGiOhBandaiSetSource::normalizeCardNumber(constCard().setNo); + if (setNo.empty()) { + showThemedMessageDialog( + this, + "Set number (No.) is required for set completion tracking.\n" + "Enter a Bandai number or use Auto detect.", + "Add card", wxOK | wxICON_INFORMATION); + return false; + } + // Persist the normalized form so ownership keys stay stable. + mutableCard().setNo = setNo; + if (setNoCtrl_) setNoCtrl_->ChangeValue(wxString::FromUTF8(setNo.c_str())); + return true; +} + +void YuGiOhBandaiCardEditDialog::buildFlagsRow(wxBoxSizer* flagsBox) { + holoCheck_ = new wxCheckBox(this, wxID_ANY, "Holo"); + signedCheck_ = new wxCheckBox(this, wxID_ANY, "Signed"); + alteredCheck_ = new wxCheckBox(this, wxID_ANY, "Altered"); + flagsBox->Add(holoCheck_, 0, wxRIGHT, 12); + flagsBox->Add(signedCheck_, 0, wxRIGHT, 12); + flagsBox->Add(alteredCheck_, 0, wxRIGHT, 12); +} + +void YuGiOhBandaiCardEditDialog::appendExtraRows(wxFlexGridSizer* grid) { + auto* setNoPanel = new wxPanel(this, wxID_ANY); + setNoCtrl_ = new wxTextCtrl(setNoPanel, wxID_ANY); + autoSetNoBtn_ = new wxButton(setNoPanel, wxID_ANY, "Auto detect"); + autoSetNoBtn_->Bind(wxEVT_BUTTON, &YuGiOhBandaiCardEditDialog::onAutoDetectBySetNo, this); + nextSetNoBtn_ = new wxButton(setNoPanel, wxID_ANY, "Next"); + nextSetNoBtn_->Bind(wxEVT_BUTTON, &YuGiOhBandaiCardEditDialog::onNextSetNo, this); + nextSetNoBtn_->Show(false); + auto* setNoRow = new wxBoxSizer(wxHORIZONTAL); + setNoRow->Add(setNoCtrl_, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + setNoRow->Add(autoSetNoBtn_, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + setNoRow->Add(nextSetNoBtn_, 0, wxALIGN_CENTER_VERTICAL); + setNoPanel->SetSizer(setNoRow); + + auto* rarityPanel = new wxPanel(this, wxID_ANY); + rarityChoice_ = new wxChoice(rarityPanel, wxID_ANY); + wxArrayString rarityItems; + rarityItems.Alloc(static_cast(sizeof(kRarityOptions) / sizeof(kRarityOptions[0]))); + for (const char* rarity : kRarityOptions) { + rarityItems.Add(wxString::FromUTF8(rarity)); + } + rarityChoice_->Append(rarityItems); + rarityChoice_->Bind(wxEVT_CHOICE, &YuGiOhBandaiCardEditDialog::onRarityChoiceChanged, this); + autoRarityBtn_ = new wxButton(rarityPanel, wxID_ANY, "Auto detect"); + autoRarityBtn_->Bind(wxEVT_BUTTON, &YuGiOhBandaiCardEditDialog::onAutoDetectByName, this); + auto* rarityRow = new wxBoxSizer(wxHORIZONTAL); + rarityRow->Add(rarityChoice_, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 6); + rarityRow->Add(autoRarityBtn_, 0, wxALIGN_CENTER_VERTICAL); + rarityPanel->SetSizer(rarityRow); + + appendRow(grid, "No.", setNoPanel); + appendRow(grid, "Rarity", rarityPanel); + + if (auto* setCombo = setComboControl()) { + setCombo->Bind(wxEVT_COMBOBOX, &YuGiOhBandaiCardEditDialog::onSetSelectionChanged, this); + } +} + +void YuGiOhBandaiCardEditDialog::readExtraFromCard() { + clearCachedPrintVariants(); + if (setNoCtrl_) setNoCtrl_->ChangeValue(wxString::FromUTF8(constCard().setNo.c_str())); + applyRarityStringToChoice(constCard().rarity); + if (holoCheck_) holoCheck_->SetValue(constCard().holo); + if (signedCheck_) signedCheck_->SetValue(constCard().signed_); + if (alteredCheck_) alteredCheck_->SetValue(constCard().altered); +} + +void YuGiOhBandaiCardEditDialog::writeExtraToCard() { + if (setNoCtrl_) mutableCard().setNo = setNoCtrl_->GetValue().ToStdString(wxConvUTF8); + if (rarityChoice_) mutableCard().rarity = rarityChoice_->GetStringSelection().ToStdString(wxConvUTF8); + if (holoCheck_) mutableCard().holo = holoCheck_->IsChecked(); + if (signedCheck_) mutableCard().signed_ = signedCheck_->IsChecked(); + if (alteredCheck_) mutableCard().altered = alteredCheck_->IsChecked(); +} + +void YuGiOhBandaiCardEditDialog::applyRarityStringToChoice(const std::string& rarity) { + if (!rarityChoice_) return; + if (rarity.empty()) { + rarityChoice_->SetSelection(0); + return; + } + const wxString wxRare = wxString::FromUTF8(rarity.c_str()); + int idx = rarityChoice_->FindString(wxRare); + if (idx == wxNOT_FOUND) { + rarityChoice_->Append(wxRare); + idx = rarityChoice_->GetCount() - 1; + } + if (idx != wxNOT_FOUND) rarityChoice_->SetSelection(idx); +} + +void YuGiOhBandaiCardEditDialog::maybeAutoCheckHoloForRarity(const std::string& rarity) { + if (rarity == "Holo Seal" && holoCheck_ != nullptr) { + holoCheck_->SetValue(true); + } +} + +void YuGiOhBandaiCardEditDialog::onRarityChoiceChanged(wxCommandEvent&) { + if (!rarityChoice_) return; + maybeAutoCheckHoloForRarity(rarityChoice_->GetStringSelection().ToStdString(wxConvUTF8)); +} + +std::size_t YuGiOhBandaiCardEditDialog::findAvailableSetIndex(const std::string& setId) const { + const auto& available = availableSets(); + auto lowerAscii = [](std::string s) { + std::transform(s.begin(), s.end(), s.begin(), + [](unsigned char ch) { return static_cast(std::tolower(ch)); }); + return s; + }; + const std::string target = lowerAscii(setId); + for (std::size_t i = 0; i < available.size(); ++i) { + if (lowerAscii(available[i].id) == target) return i; + } + return available.size(); +} + +void YuGiOhBandaiCardEditDialog::applyDetectedPrint(const AutoDetectedPrint& print) { + if (!print.name.empty()) { + if (auto* name = nameControl()) { + name->ChangeValue(wxString::FromUTF8(print.name.c_str())); + } + } + if (!print.setNo.empty() && setNoCtrl_) { + setNoCtrl_->ChangeValue(wxString::FromUTF8(print.setNo.c_str())); + } + if (!print.rarity.empty()) { + applyRarityStringToChoice(print.rarity); + maybeAutoCheckHoloForRarity(print.rarity); + } + if (!print.language.empty()) { + if (auto lang = languageFromString(print.language)) { + for (const Language l : languagesForChoice()) { + if (l != *lang) continue; + if (auto* choice = languageChoiceControl()) { + const wxString wanted = + wxString::FromUTF8(std::string(to_string(*lang)).c_str()); + const int idx = choice->FindString(wanted); + if (idx != wxNOT_FOUND) choice->SetSelection(idx); + } + break; + } + } + } + if (!print.setId.empty()) { + const std::size_t idx = findAvailableSetIndex(print.setId); + if (idx < availableSets().size()) { + applySetSelectionByIndex(idx); + } + } +} + +void YuGiOhBandaiCardEditDialog::clearCachedPrintVariants() { + ++variantFetchEpoch_; + cachedVariants_.clear(); + variantRingPos_ = 0; + refreshVariantNextControls(); +} + +void YuGiOhBandaiCardEditDialog::refreshVariantNextControls() { + if (!nextSetNoBtn_) return; + nextSetNoBtn_->Show(cachedVariants_.size() > 1); + Layout(); + if (GetSizer()) Fit(); +} + +void YuGiOhBandaiCardEditDialog::scheduleDeferredVariantPrefetch() { + const unsigned epoch = variantFetchEpoch_; + wxTheApp->CallAfter([this, epoch]() { + prefetchVariantsForCurrentCardSilent(epoch); + }); +} + +void YuGiOhBandaiCardEditDialog::prefetchVariantsForCurrentCardSilent(unsigned capturedEpoch) { + if (capturedEpoch != variantFetchEpoch_) return; + if (!cachedVariants_.empty()) return; + const auto& card = constCard(); + if (card.name.empty()) return; + requestByNameAsync(capturedEpoch, card.name, card.set.id, false); +} + +void YuGiOhBandaiCardEditDialog::requestByNameAsync(unsigned capturedEpoch, std::string name, + std::string setId, bool showFailureDialog) { + if (capturedEpoch != variantFetchEpoch_) return; + if (showFailureDialog && autoRarityBtn_) autoRarityBtn_->Disable(); + + auto state = variantFetchState_; + CardPreviewService* svc = &cardPreview_; + YuGiOhBandaiCardEditDialog* self = this; + std::thread([state, svc, self, capturedEpoch, name = std::move(name), + setId = std::move(setId), showFailureDialog]() { + auto detected = svc->detectPrintVariants(Game::YuGiOhBandai, name, setId); + wxTheApp->CallAfter([state, self, capturedEpoch, detected = std::move(detected), + showFailureDialog]() mutable { + if (!state->alive.load()) return; + self->applyDetectedList(capturedEpoch, std::move(detected), showFailureDialog, + /*applyFirst=*/true); + }); + }).detach(); +} + +void YuGiOhBandaiCardEditDialog::requestByNoAsync(unsigned capturedEpoch, std::string setNo, + bool showFailureDialog) { + if (capturedEpoch != variantFetchEpoch_) return; + if (showFailureDialog && autoSetNoBtn_) autoSetNoBtn_->Disable(); + + auto state = variantFetchState_; + CardPreviewService* svc = &cardPreview_; + YuGiOhBandaiCardEditDialog* self = this; + std::thread([state, svc, self, capturedEpoch, setNo = std::move(setNo), + showFailureDialog]() { + auto detected = svc->detectVariantsBySetNo(Game::YuGiOhBandai, setNo); + wxTheApp->CallAfter([state, self, capturedEpoch, detected = std::move(detected), + showFailureDialog]() mutable { + if (!state->alive.load()) return; + self->applyDetectedList(capturedEpoch, std::move(detected), showFailureDialog, + /*applyFirst=*/true); + }); + }).detach(); +} + +void YuGiOhBandaiCardEditDialog::applyDetectedList( + unsigned capturedEpoch, + Result> detected, + bool showFailureDialog, + bool applyFirst) { + if (capturedEpoch != variantFetchEpoch_) return; + + if (autoSetNoBtn_) autoSetNoBtn_->Enable(); + if (autoRarityBtn_) autoRarityBtn_->Enable(); + + if (!detected) { + if (showFailureDialog) { + showThemedMessageDialog(this, "Auto detect failed: " + detected.error(), + "Auto detect", wxOK | wxICON_WARNING); + } + return; + } + if (detected.value().empty()) { + if (showFailureDialog) { + showThemedMessageDialog(this, "No matching Yu-Gi-Oh! (Bandai) card found.", + "Auto detect", wxOK | wxICON_INFORMATION); + } + return; + } + + cachedVariants_ = std::move(detected).value(); + variantRingPos_ = 0; + if (applyFirst) applyDetectedPrint(cachedVariants_.front()); + refreshVariantNextControls(); +} + +void YuGiOhBandaiCardEditDialog::onAutoDetectBySetNo(wxCommandEvent&) { + syncCardFromControls(); + const std::string setNo = + setNoCtrl_ ? setNoCtrl_->GetValue().ToStdString(wxConvUTF8) : std::string(); + if (setNo.empty()) { + showThemedMessageDialog(this, "Enter a Bandai number first.", "Auto detect", + wxOK | wxICON_INFORMATION); + return; + } + const unsigned epoch = variantFetchEpoch_; + requestByNoAsync(epoch, setNo, true); +} + +void YuGiOhBandaiCardEditDialog::onNextSetNo(wxCommandEvent&) { + if (cachedVariants_.size() <= 1) return; + variantRingPos_ = (variantRingPos_ + 1) % cachedVariants_.size(); + applyDetectedPrint(cachedVariants_[variantRingPos_]); +} + +void YuGiOhBandaiCardEditDialog::onAutoDetectByName(wxCommandEvent&) { + syncCardFromControls(); + const auto& card = constCard(); + if (card.name.empty()) { + showThemedMessageDialog(this, "Enter a card name first.", "Auto detect", + wxOK | wxICON_INFORMATION); + return; + } + std::string setId; + if (const Set* set = selectedSetFromControls()) setId = set->id; + + const unsigned epoch = variantFetchEpoch_; + requestByNameAsync(epoch, card.name, setId, true); +} + +void YuGiOhBandaiCardEditDialog::onSetSelectionChanged(wxCommandEvent& ev) { + clearCachedPrintVariants(); + scheduleDeferredVariantPrefetch(); + ev.Skip(); +} + +} // namespace ccm::ui diff --git a/ui_wx/src/YuGiOhBandaiCardListPanel.cpp b/ui_wx/src/YuGiOhBandaiCardListPanel.cpp new file mode 100644 index 0000000..6aa081d --- /dev/null +++ b/ui_wx/src/YuGiOhBandaiCardListPanel.cpp @@ -0,0 +1,73 @@ +#include "ccm/ui/YuGiOhBandaiCardListPanel.hpp" + +#include "ccm/services/CardFilter.hpp" +#include "ccm/ui/SvgIcons.hpp" + +#include + +namespace ccm::ui { + +YuGiOhBandaiCardListPanel::YuGiOhBandaiCardListPanel(wxWindow* parent) + : BaseCardListPanel(parent) { + buildLayout(); +} + +std::vector +YuGiOhBandaiCardListPanel::declareTextColumns() const { + return { + {"Name", 200, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::Name}, + {"Set", 150, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::SetReleaseDate}, + {"No.", 70, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::SetNo}, + {"Rarity", 100, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::Rarity}, + {"Amount", 70, wxLIST_FORMAT_RIGHT, YuGiOhBandaiSortColumn::Amount}, + {"Condition", 100, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::Condition}, + {"Language", 100, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::Language}, + {"Note", 180, wxLIST_FORMAT_LEFT, YuGiOhBandaiSortColumn::Note}, + }; +} + +std::vector +YuGiOhBandaiCardListPanel::declareIconColumns() const { + constexpr int kFlagColWidth = 36; + return { + {kSvgHolo, kFlagColWidth, YuGiOhBandaiSortColumn::Holo}, + {kSvgSigned, kFlagColWidth, YuGiOhBandaiSortColumn::Signed}, + {kSvgAltered, kFlagColWidth, YuGiOhBandaiSortColumn::Altered}, + }; +} + +std::string YuGiOhBandaiCardListPanel::renderTextCell(const YuGiOhBandaiCard& card, + std::size_t idx) const { + switch (idx) { + case 0: return card.name; + case 1: return card.set.name; + case 2: return card.setNo; + case 3: return card.rarity; + case 4: return std::to_string(card.amount); + case 5: return std::string(to_string(card.condition)); + case 6: return std::string(to_string(card.language)); + case 7: return card.note; + } + return {}; +} + +bool YuGiOhBandaiCardListPanel::isIconColumnSet(const YuGiOhBandaiCard& card, + std::size_t idx) const { + switch (idx) { + case 0: return card.holo; + case 1: return card.signed_; + case 2: return card.altered; + } + return false; +} + +void YuGiOhBandaiCardListPanel::sortBy(YuGiOhBandaiSortColumn column, bool ascending) { + sortYuGiOhBandaiCards(mutableCards(), column, ascending); +} + +bool YuGiOhBandaiCardListPanel::matchesFilter(const YuGiOhBandaiCard& card, + std::string_view filter) const { + return matchesYuGiOhBandaiFilter(card, filter); +} + +} // namespace ccm::ui diff --git a/ui_wx/src/YuGiOhBandaiGameView.cpp b/ui_wx/src/YuGiOhBandaiGameView.cpp new file mode 100644 index 0000000..3925e6e --- /dev/null +++ b/ui_wx/src/YuGiOhBandaiGameView.cpp @@ -0,0 +1,552 @@ +#include "ccm/ui/YuGiOhBandaiGameView.hpp" + +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" +#include "ccm/ui/CardEditModalGuard.hpp" +#include "ccm/ui/YuGiOhBandaiCardEditDialog.hpp" +#include "ccm/ui/YuGiOhBandaiCardListPanel.hpp" +#include "ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp" +#include "ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp" +#include "ccm/ui/SvgIcons.hpp" +#include "ccm/ui/Theme.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace ccm::ui { + +namespace { +constexpr int kBandaiToolbarIconPx = 18; +constexpr const char kBandaiFilterHint[] = "Filter"; + +wxColour lighten(const wxColour& c, int amount) { + auto lift = [amount](unsigned char channel) -> unsigned char { + const int raised = static_cast(channel) + amount; + return static_cast(raised > 255 ? 255 : raised); + }; + return wxColour(lift(c.Red()), lift(c.Green()), lift(c.Blue())); +} + +wxColour darken(const wxColour& c, int amount) { + auto drop = [amount](unsigned char channel) -> unsigned char { + const int lowered = static_cast(channel) - amount; + return static_cast(lowered < 0 ? 0 : lowered); + }; + return wxColour(drop(c.Red()), drop(c.Green()), drop(c.Blue())); +} +} // namespace + +YuGiOhBandaiGameView::YuGiOhBandaiGameView(ConfigService& config, + CollectionService& collection, + SetService& sets, + ImageService& images, + CardPreviewService& cardPreview, + IGameModule& module, + YuGiOhBandaiSetCatalogService& catalogStore) + : config_(config), + collection_(collection), + sets_(sets), + images_(images), + cardPreview_(cardPreview), + module_(module), + catalogStore_(catalogStore) {} + +void YuGiOhBandaiGameView::ensureSetsLoaded() { + if (attemptedInitialSetLoad_) return; + attemptedInitialSetLoad_ = true; + + auto cached = sets_.getSets(Game::YuGiOhBandai); + if (cached) { + setsCache_ = std::move(cached).value(); + if (!setsCache_.empty()) return; + } else { + setsCache_.clear(); + } + + auto refreshed = sets_.updateSets(Game::YuGiOhBandai); + if (refreshed) { + setsCache_ = std::move(refreshed).value(); + } +} + +void YuGiOhBandaiGameView::refreshSetCompletionFromStore() { + if (setCompletionPanel_ == nullptr) return; + setCompletionPanel_->reloadFromStore(); + if (auto loaded = collection_.list(Game::YuGiOhBandai)) { + setCompletionPanel_->setCollection(std::move(loaded).value()); + } +} + +bool YuGiOhBandaiGameView::downloadSetsAndCatalog(wxWindow* parentWindow, + std::size_t* setCountOut, + std::size_t* packCountOut) { + auto* bandaiSrc = dynamic_cast(&module_.setSource()); + if (bandaiSrc == nullptr) { + showThemedMessageDialog(parentWindow, "Yu-Gi-Oh! (Bandai) set source unavailable.", + "Error", wxOK | wxICON_ERROR); + return false; + } + + auto both = bandaiSrc->fetchAllWithCatalog(); + if (!both) { + showThemedMessageDialog(parentWindow, "Failed to update sets: " + both.error(), + "Error", wxOK | wxICON_ERROR); + return false; + } + + auto savedSets = sets_.saveSets(Game::YuGiOhBandai, both.value().sets); + if (!savedSets) { + showThemedMessageDialog(parentWindow, "Failed to save sets: " + savedSets.error(), + "Error", wxOK | wxICON_ERROR); + return false; + } + + auto savedCatalog = catalogStore_.save(both.value().catalog); + if (!savedCatalog) { + showThemedMessageDialog(parentWindow, + "Sets saved, but set catalog failed: " + savedCatalog.error(), + "Warning", wxOK | wxICON_WARNING); + return false; + } + + setsCache_ = both.value().sets; + if (setCountOut != nullptr) *setCountOut = both.value().sets.size(); + if (packCountOut != nullptr) *packCountOut = both.value().catalog.packs.size(); + refreshSetCompletionFromStore(); + return true; +} + +bool YuGiOhBandaiGameView::ensureCatalogLoaded(wxWindow* parentWindow) { + if (catalogStore_.exists()) return true; + return downloadSetsAndCatalog(parentWindow, nullptr, nullptr); +} + +void YuGiOhBandaiGameView::ensureSingleCardsMounted(wxWindow* splitterParent) { + if (singleSplitter_ == nullptr) { + singleSplitter_ = new wxSplitterWindow(splitterParent, wxID_ANY, wxDefaultPosition, + wxDefaultSize, wxSP_LIVE_UPDATE); + singleSplitter_->SetMinimumPaneSize(280); + } + auto* list = listPanel(singleSplitter_); + auto* selected = selectedPanel(singleSplitter_); + if (!singleSplitter_->IsSplit()) { + singleSplitter_->SplitVertically(selected, list, 360); + } +} + +void YuGiOhBandaiGameView::buildSingleCardsToolbar(wxWindow* parent, wxBoxSizer* pageSizer) { + auto* toolbar = new wxBoxSizer(wxHORIZONTAL); + auto makeToolBtn = [&](const char* svg, const wxString& tip) { + wxBitmap bmp = svgIconBitmap(svg, kBandaiToolbarIconPx, "#000000"); + auto* b = new wxBitmapButton(parent, wxID_ANY, bmp, wxDefaultPosition, wxDefaultSize, + wxBU_EXACTFIT); + b->SetToolTip(tip); + return b; + }; + toolbarButtons_[0] = makeToolBtn(kSvgToolbarAdd, "Add Card"); + toolbarButtons_[1] = makeToolBtn(kSvgToolbarEdit, "Edit"); + toolbarButtons_[2] = makeToolBtn(kSvgToolbarDelete, "Delete"); + toolbar->AddSpacer(4); + toolbar->Add(toolbarButtons_[0], 0, wxALIGN_CENTER_VERTICAL | wxALL, 4); + toolbar->Add(toolbarButtons_[1], 0, wxALIGN_CENTER_VERTICAL | wxALL, 4); + toolbar->Add(toolbarButtons_[2], 0, wxALIGN_CENTER_VERTICAL | wxALL, 4); + toolbar->AddStretchSpacer(1); + filterInput_ = new wxTextCtrl(parent, wxID_ANY, "", wxDefaultPosition, wxSize(260, -1)); + filterInput_->SetHint(kBandaiFilterHint); + toolbar->Add(filterInput_, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxTOP | wxBOTTOM, 4); + pageSizer->Add(toolbar, 0, wxEXPAND); + + toolbarButtons_[0]->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + wxWindow* owner = wxGetTopLevelParent(contentPanel_); + onAddCard(owner != nullptr ? owner : contentPanel_); + }); + toolbarButtons_[1]->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + wxWindow* owner = wxGetTopLevelParent(contentPanel_); + onEditCard(owner != nullptr ? owner : contentPanel_); + }); + toolbarButtons_[2]->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + wxWindow* owner = wxGetTopLevelParent(contentPanel_); + onDeleteCard(owner != nullptr ? owner : contentPanel_); + }); + filterInput_->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { + if (filterInput_ == nullptr) return; + setFilter(filterInput_->GetValue().ToStdString(wxConvUTF8)); + }); + filterInput_->Bind(wxEVT_KEY_DOWN, [this](wxKeyEvent& ev) { + const int code = ev.GetKeyCode(); + if (code == WXK_UP || code == WXK_DOWN) { + nudgeSelection(code == WXK_UP ? -1 : 1); + return; + } + ev.Skip(); + }); +} + +void YuGiOhBandaiGameView::refreshToolbarIcons(const ThemePalette& palette) { + const std::string tbHex = palette.buttonText.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + if (toolbarButtons_[0]) { + toolbarButtons_[0]->SetBitmap( + svgIconBitmap(kSvgToolbarAdd, kBandaiToolbarIconPx, tbHex.c_str())); + } + if (toolbarButtons_[1]) { + toolbarButtons_[1]->SetBitmap( + svgIconBitmap(kSvgToolbarEdit, kBandaiToolbarIconPx, tbHex.c_str())); + } + if (toolbarButtons_[2]) { + toolbarButtons_[2]->SetBitmap( + svgIconBitmap(kSvgToolbarDelete, kBandaiToolbarIconPx, tbHex.c_str())); + } +} + +void YuGiOhBandaiGameView::selectTab(int index) { + if (index < 0 || index > 1 || book_ == nullptr) return; + activeTab_ = index; + book_->SetSelection(index); + refreshTabBarTheme(paletteForTheme(config_.current().theme)); + + // Bandai sets.json can load offline from the hardcoded manifest; the + // set-completion catalog needs a Yugipedia fetch. Pull it on first visit. + if (index == 1 && !catalogStore_.exists()) { + wxWindow* owner = wxGetTopLevelParent(contentPanel_); + // Errors are shown inside ensureCatalogLoaded; empty-state UI remains if it fails. + (void)ensureCatalogLoaded(owner != nullptr ? owner : contentPanel_); + } +} + +void YuGiOhBandaiGameView::refreshTabBarTheme(const ThemePalette& palette) { + if (tabBar_ == nullptr) return; + + const wxColour barBg = palette.panelBg; + // Match toolbar button plate (Add/Edit/Delete), not a darker inset fill. + const wxColour tabBg = palette.buttonBg; + + tabBar_->SetBackgroundColour(barBg); + tabBar_->SetOwnBackgroundColour(barBg); + + for (int i = 0; i < 2; ++i) { + auto* tab = tabPanels_[i]; + auto* label = tabLabels_[i]; + if (tab == nullptr || label == nullptr) continue; + const bool selected = (i == activeTab_); + tab->SetBackgroundColour(tabBg); + tab->SetOwnBackgroundColour(tabBg); + // Keep the label plate identical to the tab fill so a late theme pass + // cannot leave a darker box around the caption. + label->SetBackgroundColour(tabBg); + label->SetOwnBackgroundColour(tabBg); + label->SetForegroundColour(palette.text); + label->SetOwnForegroundColour(palette.text); + wxFont font = label->GetFont(); + font.SetWeight(selected ? wxFONTWEIGHT_BOLD : wxFONTWEIGHT_NORMAL); + label->SetFont(font); + tab->Refresh(); + label->Refresh(); + } + tabBar_->Layout(); + tabBar_->Refresh(); +} + +void YuGiOhBandaiGameView::buildTabBar(wxWindow* parent, wxBoxSizer* rootSizer) { + tabBar_ = new wxPanel(parent, wxID_ANY); + tabBar_->SetBackgroundStyle(wxBG_STYLE_PAINT); + auto* tabSizer = new wxBoxSizer(wxHORIZONTAL); + tabSizer->AddSpacer(4); + + const char* labels[2] = {"Single Cards", "Set Completion"}; + for (int i = 0; i < 2; ++i) { + auto* tab = new wxPanel(tabBar_, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + tab->SetCursor(wxCursor(wxCURSOR_HAND)); + tab->SetBackgroundStyle(wxBG_STYLE_PAINT); + auto* label = new wxStaticText(tab, wxID_ANY, wxString::FromUTF8(labels[i])); + auto* inner = new wxBoxSizer(wxVERTICAL); + // Compact padding so the strip stays short; frame is drawn in paint. + inner->Add(label, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT | wxTOP | wxBOTTOM, 5); + tab->SetSizer(inner); + + auto onClick = [this, i](wxMouseEvent&) { selectTab(i); }; + tab->Bind(wxEVT_LEFT_DOWN, onClick); + label->Bind(wxEVT_LEFT_DOWN, onClick); + tab->Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent&) {}); + tab->Bind(wxEVT_PAINT, [this, tab, i](wxPaintEvent&) { + wxPaintDC dc(tab); + const ThemePalette palette = paletteForTheme(config_.current().theme); + const bool dark = config_.current().theme == Theme::Dark; + const bool selected = (i == activeTab_); + // Same plate as toolbar bitmap buttons. + const wxColour bg = palette.buttonBg; + const wxColour frame = + dark ? lighten(palette.panelBg, 55) : darken(palette.panelBg, 45); + const wxColour frameSel = dark ? lighten(palette.panelBg, 85) : darken(palette.panelBg, 70); + const wxRect r = tab->GetClientRect(); + dc.SetPen(wxPen(selected ? frameSel : frame, 1)); + dc.SetBrush(wxBrush(bg)); + dc.DrawRectangle(r.x, r.y, r.width, r.height); + if (selected) { + dc.SetPen(wxPen(palette.text, 2)); + dc.DrawLine(r.GetLeft() + 4, r.GetBottom() - 1, r.GetRight() - 4, + r.GetBottom() - 1); + } + }); + + tabPanels_[i] = tab; + tabLabels_[i] = label; + if (i > 0) tabSizer->AddSpacer(4); + tabSizer->Add(tab, 0, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM, 3); + } + tabSizer->AddStretchSpacer(1); + + tabBar_->Bind(wxEVT_PAINT, [this](wxPaintEvent&) { + wxPaintDC dc(tabBar_); + const ThemePalette palette = paletteForTheme(config_.current().theme); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(palette.panelBg)); + dc.DrawRectangle(tabBar_->GetClientRect()); + dc.SetPen(wxPen(darken(palette.text, 120), 1)); + const wxRect r = tabBar_->GetClientRect(); + dc.DrawLine(r.GetLeft(), r.GetBottom(), r.GetRight(), r.GetBottom()); + }); + tabBar_->Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent&) {}); + + tabBar_->SetSizer(tabSizer); + rootSizer->Add(tabBar_, 0, wxEXPAND); + refreshTabBarTheme(paletteForTheme(config_.current().theme)); +} + +wxPanel* YuGiOhBandaiGameView::contentPanel(wxWindow* parent) { + if (contentPanel_ == nullptr) { + contentPanel_ = new wxPanel(parent); + auto* root = new wxBoxSizer(wxVERTICAL); + + buildTabBar(contentPanel_, root); + + book_ = new wxSimplebook(contentPanel_, wxID_ANY); + auto* singlePage = new wxPanel(book_); + auto* singleSizer = new wxBoxSizer(wxVERTICAL); + buildSingleCardsToolbar(singlePage, singleSizer); + ensureSingleCardsMounted(singlePage); + singleSizer->Add(singleSplitter_, 1, wxEXPAND); + singlePage->SetSizer(singleSizer); + book_->AddPage(singlePage, "Single Cards"); + + setCompletionPanel_ = new YuGiOhBandaiSetCompletionPanel(book_, catalogStore_); + setCompletionPanel_->reloadFromStore(); + book_->AddPage(setCompletionPanel_, "Set Completion"); + + root->Add(book_, 1, wxEXPAND | wxTOP, 5); + contentPanel_->SetSizer(root); + + selectTab(0); + refreshToolbarIcons(paletteForTheme(config_.current().theme)); + // First mount: re-assert tab plate colors after the initial layout paint. + contentPanel_->CallAfter([this]() { + refreshTabBarTheme(paletteForTheme(config_.current().theme)); + }); + } + return contentPanel_; +} + +wxPanel* YuGiOhBandaiGameView::listPanel(wxWindow* parent) { + if (listPanel_ == nullptr) { + listPanel_ = new YuGiOhBandaiCardListPanel(parent); + listPanel_->Bind(EVT_CARD_SELECTED, [this](wxCommandEvent&) { + if (selectedPanel_ != nullptr && listPanel_ != nullptr) { + selectedPanel_->setCard(listPanel_->selected()); + } + }); + listPanel_->Bind(EVT_CARD_ACTIVATED, [this](wxCommandEvent&) { + wxWindow* owner = wxGetTopLevelParent(listPanel_); + onEditCard(owner != nullptr ? owner : static_cast(listPanel_)); + }); + } + return listPanel_; +} + +wxPanel* YuGiOhBandaiGameView::selectedPanel(wxWindow* parent) { + if (selectedPanel_ == nullptr) { + selectedPanel_ = new YuGiOhBandaiSelectedCardPanel(parent, images_, cardPreview_); + } + return selectedPanel_; +} + +void YuGiOhBandaiGameView::refreshCollection(std::optional selectId) { + // Ensure the Bandai host (and list panel) exist even when MainFrame mounts + // via contentPanel before an explicit listPanel call. + if (contentPanel_ == nullptr && listPanel_ == nullptr) return; + + auto loaded = collection_.list(Game::YuGiOhBandai); + if (!loaded) { + showThemedMessageDialog( + nullptr, + "Failed to load Yu-Gi-Oh! (Bandai) collection: " + loaded.error(), + "Error", wxOK | wxICON_ERROR); + return; + } + auto cards = std::move(loaded).value(); + if (listPanel_ != nullptr) { + listPanel_->setCards(cards, selectId); + listPanel_->activateSelection(); + if (selectedPanel_) selectedPanel_->setCard(listPanel_->selected()); + } + if (setCompletionPanel_ != nullptr) { + setCompletionPanel_->setCollection(std::move(cards)); + } +} + +const std::vector& YuGiOhBandaiGameView::setsForDialog() { + ensureSetsLoaded(); + if (!setsCache_.empty()) return setsCache_; + auto loaded = sets_.getSets(Game::YuGiOhBandai); + if (loaded) setsCache_ = std::move(loaded).value(); + else setsCache_.clear(); + return setsCache_; +} + +void YuGiOhBandaiGameView::onAddCard(wxWindow* parentWindow) { + if (cardEditModalIsActive()) { + showThemedMessageDialog(parentWindow, wxString::FromUTF8(kCardEditModalBlockedUtf8), + wxString::FromUTF8("Add card"), wxOK | wxICON_INFORMATION); + return; + } + YuGiOhBandaiCard fresh; + fresh.amount = 1; + fresh.condition = Condition::NearMint; + // language defaults to Language::Japanese via the domain type. + + YuGiOhBandaiCardEditDialog dlg(parentWindow, images_, sets_, cardPreview_, EditMode::Create, + fresh, &setsForDialog()); + themeModalDialog(&dlg, config_.current().theme); + CardEditModalGuard modalGuard; + if (dlg.ShowModal() != wxID_OK) return; + + auto added = collection_.add(Game::YuGiOhBandai, dlg.card()); + if (!added) { + showThemedMessageDialog(parentWindow, "Failed to add card: " + added.error(), + "Error", wxOK | wxICON_ERROR); + return; + } + + YuGiOhBandaiCard persisted = dlg.card(); + persisted.id = added.value(); + auto normalized = images_.normalizeNamesForPersistedCard( + Game::YuGiOhBandai, persisted.id, persisted.set.name, persisted.name, persisted.images); + if (normalized) { + if (normalized.value() != persisted.images) { + persisted.images = std::move(normalized).value(); + auto updated = collection_.update(Game::YuGiOhBandai, persisted); + if (!updated) { + showThemedMessageDialog( + parentWindow, + "Card added, but image name normalization failed to persist: " + + updated.error(), + "Warning", wxOK | wxICON_WARNING); + } + } + } else { + showThemedMessageDialog( + parentWindow, + "Card added, but image rename to ID-prefixed format failed: " + normalized.error(), + "Warning", wxOK | wxICON_WARNING); + } + refreshCollection(added.value()); +} + +void YuGiOhBandaiGameView::onEditCard(wxWindow* parentWindow) { + if (listPanel_ == nullptr) return; + auto sel = listPanel_->selected(); + if (!sel) { + showThemedMessageDialog(parentWindow, "Select a card first.", "Edit", + wxOK | wxICON_INFORMATION); + return; + } + if (cardEditModalIsActive()) { + showThemedMessageDialog(parentWindow, wxString::FromUTF8(kCardEditModalBlockedUtf8), + wxString::FromUTF8("Edit"), wxOK | wxICON_INFORMATION); + return; + } + YuGiOhBandaiCardEditDialog dlg(parentWindow, images_, sets_, cardPreview_, EditMode::Edit, + *sel, &setsForDialog()); + themeModalDialog(&dlg, config_.current().theme); + CardEditModalGuard modalGuard; + if (dlg.ShowModal() != wxID_OK) return; + auto updated = collection_.update(Game::YuGiOhBandai, dlg.card()); + if (!updated) { + showThemedMessageDialog(parentWindow, "Failed to update card: " + updated.error(), + "Error", wxOK | wxICON_ERROR); + return; + } + refreshCollection(); +} + +void YuGiOhBandaiGameView::onDeleteCard(wxWindow* parentWindow) { + if (listPanel_ == nullptr) return; + auto sel = listPanel_->selected(); + if (!sel) { + showThemedMessageDialog(parentWindow, "Select a card first.", "Delete", + wxOK | wxICON_INFORMATION); + return; + } + if (showThemedConfirmDialog(parentWindow, "Delete \"" + sel->name + "\"?", + "Confirm") != wxID_YES) { + return; + } + auto removed = collection_.remove(Game::YuGiOhBandai, sel->id); + if (!removed) { + showThemedMessageDialog(parentWindow, "Failed to delete card: " + removed.error(), + "Error", wxOK | wxICON_ERROR); + return; + } + refreshCollection(); +} + +std::string YuGiOhBandaiGameView::onUpdateSets(wxWindow* parentWindow) { + std::size_t setCount = 0; + std::size_t packCount = 0; + if (!downloadSetsAndCatalog(parentWindow, &setCount, &packCount)) { + return "Update failed"; + } + + showThemedMessageDialog( + parentWindow, + "Updated " + std::to_string(setCount) + " Yu-Gi-Oh! (Bandai) sets and " + + std::to_string(packCount) + " set checklists.", + "Sets updated", wxOK | wxICON_INFORMATION); + return "Yu-Gi-Oh! (Bandai) sets updated."; +} + +void YuGiOhBandaiGameView::setFilter(std::string_view filter) { + if (filterInput_ != nullptr) { + const wxString wanted = wxString::FromUTF8(std::string(filter).c_str()); + if (filterInput_->GetValue() != wanted) { + filterInput_->ChangeValue(wanted); + if (filter.empty()) { + filterInput_->SetHint(kBandaiFilterHint); + filterInput_->Refresh(); + } + } + } + if (listPanel_) listPanel_->setFilter(filter); +} + +void YuGiOhBandaiGameView::nudgeSelection(int delta) { + if (listPanel_) listPanel_->nudgeSelection(delta); +} + +void YuGiOhBandaiGameView::applyTheme(const ThemePalette& palette) { + if (contentPanel_) applyThemeToWindowTree(contentPanel_, palette, config_.current().theme); + if (listPanel_) listPanel_->applyTheme(palette); + if (selectedPanel_) selectedPanel_->applyTheme(palette); + if (setCompletionPanel_) setCompletionPanel_->applyTheme(palette); + refreshToolbarIcons(palette); + refreshTabBarTheme(palette); + applyPaletteToTextCtrl(filterInput_, palette, config_.current().theme); +} + +} // namespace ccm::ui diff --git a/ui_wx/src/YuGiOhBandaiSelectedCardPanel.cpp b/ui_wx/src/YuGiOhBandaiSelectedCardPanel.cpp new file mode 100644 index 0000000..aa5c1de --- /dev/null +++ b/ui_wx/src/YuGiOhBandaiSelectedCardPanel.cpp @@ -0,0 +1,83 @@ +#include "ccm/ui/YuGiOhBandaiSelectedCardPanel.hpp" + +#include "ccm/ui/SvgIcons.hpp" + +#include + +namespace ccm::ui { + +namespace { +enum YuGiOhBandaiDetailKey : int { + kName = 0, + kSet, + kSetNo, + kRarity, + kAmount, + kCondition, + kLanguage, + kHolo, + kSigned, + kAltered, +}; +} // namespace + +YuGiOhBandaiSelectedCardPanel::YuGiOhBandaiSelectedCardPanel(wxWindow* parent, + ImageService& imageService, + CardPreviewService& cardPreview) + : BaseSelectedCardPanel(parent, imageService, cardPreview) { + buildLayout(); +} + +std::vector +YuGiOhBandaiSelectedCardPanel::declareDetailRows() const { + return { + {"Name", kName, "(no card selected)"}, + {"Set", kSet, ""}, + {"No.", kSetNo, ""}, + {"Rarity", kRarity, ""}, + {"Amount", kAmount, ""}, + {"Condition", kCondition, ""}, + {"Language", kLanguage, ""}, + }; +} + +std::vector +YuGiOhBandaiSelectedCardPanel::declareFlagIcons() const { + return { + {kSvgHolo, "Holo", kHolo}, + {kSvgSigned, "Signed", kSigned}, + {kSvgAltered, "Altered", kAltered}, + }; +} + +std::string YuGiOhBandaiSelectedCardPanel::detailValueFor(const YuGiOhBandaiCard& card, + DetailKey key) const { + switch (key) { + case kName: return card.name; + case kSet: return card.set.name; + case kSetNo: return card.setNo; + case kRarity: return card.rarity; + case kAmount: return std::to_string(card.amount); + case kCondition: return std::string(to_string(card.condition)); + case kLanguage: return std::string(to_string(card.language)); + case kNoteKey: return card.note; + } + return {}; +} + +bool YuGiOhBandaiSelectedCardPanel::isFlagSet(const YuGiOhBandaiCard& card, + DetailKey key) const { + switch (key) { + case kHolo: return card.holo; + case kSigned: return card.signed_; + case kAltered: return card.altered; + } + return false; +} + +std::tuple +YuGiOhBandaiSelectedCardPanel::previewKey(const YuGiOhBandaiCard& card) const { + return {card.name, card.set.id, card.setNo}; +} + +} // namespace ccm::ui diff --git a/ui_wx/src/YuGiOhBandaiSetCompletionPanel.cpp b/ui_wx/src/YuGiOhBandaiSetCompletionPanel.cpp new file mode 100644 index 0000000..037d33d --- /dev/null +++ b/ui_wx/src/YuGiOhBandaiSetCompletionPanel.cpp @@ -0,0 +1,336 @@ +#include "ccm/ui/YuGiOhBandaiSetCompletionPanel.hpp" + +#include "ccm/games/yugiohbandai/YuGiOhBandaiSetSource.hpp" +#include "ccm/services/YuGiOhBandaiSetCompletion.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ccm::ui { + +namespace { + +wxColour mutedTextColour(const ThemePalette& palette) { + // Blend text toward panel background so missing checklist rows read as greyed. + const auto blend = [](unsigned char a, unsigned char b) -> unsigned char { + return static_cast((static_cast(a) * 2 + static_cast(b)) / 3); + }; + return wxColour(blend(palette.text.Red(), palette.panelBg.Red()), + blend(palette.text.Green(), palette.panelBg.Green()), + blend(palette.text.Blue(), palette.panelBg.Blue())); +} + +} // namespace + +YuGiOhBandaiSetCompletionPanel::YuGiOhBandaiSetCompletionPanel( + wxWindow* parent, YuGiOhBandaiSetCatalogService& catalogStore) + : wxPanel(parent), catalogStore_(catalogStore) { + palette_ = paletteForTheme(inferThemeFromWindow(this)); + + auto* langRow = new wxBoxSizer(wxHORIZONTAL); + auto* langLabel = new wxStaticText(this, wxID_ANY, "Language"); + languageChoice_ = new wxChoice(this, wxID_ANY); + languageChoice_->Append("All languages"); + languageChoice_->SetSelection(0); + languageChoice_->Bind(wxEVT_CHOICE, &YuGiOhBandaiSetCompletionPanel::onLanguageChoice, + this); + langRow->Add(langLabel, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 8); + langRow->Add(languageChoice_, 0, wxALIGN_CENTER_VERTICAL); + + book_ = new wxSimplebook(this, wxID_ANY); + + gridPage_ = new wxPanel(book_); + auto* gridRoot = new wxBoxSizer(wxVERTICAL); + emptyLabel_ = new wxStaticText(gridPage_, wxID_ANY, ""); + emptyLabel_->Wrap(480); + gridRoot->Add(emptyLabel_, 0, wxALL | wxEXPAND, 12); + + scroll_ = new wxScrolledWindow(gridPage_, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxVSCROLL | wxTAB_TRAVERSAL); + scroll_->SetScrollRate(0, 16); + gridSizer_ = new wxBoxSizer(wxVERTICAL); + scroll_->SetSizer(gridSizer_); + gridRoot->Add(scroll_, 1, wxEXPAND); + gridPage_->SetSizer(gridRoot); + book_->AddPage(gridPage_, "Grid"); + + detailPage_ = new wxPanel(book_); + auto* detailRoot = new wxBoxSizer(wxVERTICAL); + auto* topRow = new wxBoxSizer(wxHORIZONTAL); + auto* backBtn = new wxButton(detailPage_, wxID_ANY, "Back"); + backBtn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { showGridPage(); }); + detailTitle_ = new wxStaticText(detailPage_, wxID_ANY, ""); + auto titleFont = detailTitle_->GetFont(); + titleFont.MakeBold().MakeLarger(); + detailTitle_->SetFont(titleFont); + topRow->Add(backBtn, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 8); + topRow->Add(detailTitle_, 1, wxALIGN_CENTER_VERTICAL); + detailRoot->Add(topRow, 0, wxEXPAND | wxALL, 8); + + checklist_ = new wxListCtrl(detailPage_, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER); + checklist_->AppendColumn("Card", wxLIST_FORMAT_LEFT, 520); + detailRoot->Add(checklist_, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 8); + detailPage_->SetSizer(detailRoot); + book_->AddPage(detailPage_, "Detail"); + + auto* root = new wxBoxSizer(wxVERTICAL); + root->Add(langRow, 0, wxEXPAND | wxALL, 8); + root->Add(book_, 1, wxEXPAND); + SetSizer(root); + + showGridPage(); +} + +void YuGiOhBandaiSetCompletionPanel::setCollection(std::vector cards) { + collection_ = std::move(cards); + refreshLanguageChoice(); + rebuildCurrentView(); +} + +void YuGiOhBandaiSetCompletionPanel::reloadFromStore() { + catalogLoaded_ = false; + catalog_ = {}; + if (catalogStore_.exists()) { + if (auto loaded = catalogStore_.load()) { + catalog_ = std::move(loaded).value(); + catalogLoaded_ = true; + } + } + showGridPage(); + rebuildGrid(); +} + +void YuGiOhBandaiSetCompletionPanel::applyTheme(const ThemePalette& palette) { + palette_ = palette; + applyThemeToWindowTree(this, palette, inferThemeFromWindow(this)); + rebuildCurrentView(); +} + +void YuGiOhBandaiSetCompletionPanel::showGridPage() { + detailSetId_.clear(); + detailSetName_.clear(); + book_->SetSelection(0); +} + +void YuGiOhBandaiSetCompletionPanel::showChecklistPage(const std::string& setId, + const std::string& setName) { + detailSetId_ = setId; + detailSetName_ = setName; + detailTitle_->SetLabelText(wxString::FromUTF8(displaySetName(setName).c_str())); + rebuildChecklist(setId); + book_->SetSelection(1); +} + +std::string YuGiOhBandaiSetCompletionPanel::displaySetName(const std::string& setName) const { + if (!languageFilter_.has_value()) return setName; + return setName + " (" + std::string(to_string(*languageFilter_)) + ")"; +} + +void YuGiOhBandaiSetCompletionPanel::refreshLanguageChoice() { + const auto previous = languageFilter_; + const auto present = yuGiOhBandaiLanguagesInCollection(collection_); + + languageChoice_->Clear(); + languageChoice_->Append("All languages"); + for (const Language lang : present) { + languageChoice_->Append(wxString::FromUTF8(std::string(to_string(lang)).c_str())); + } + + int selection = 0; + languageFilter_ = std::nullopt; + if (previous.has_value()) { + for (std::size_t i = 0; i < present.size(); ++i) { + if (present[i] == *previous) { + selection = static_cast(i + 1); + languageFilter_ = previous; + break; + } + } + } + languageChoice_->SetSelection(selection); +} + +void YuGiOhBandaiSetCompletionPanel::onLanguageChoice(wxCommandEvent& /*event*/) { + const int sel = languageChoice_->GetSelection(); + if (sel <= 0) { + languageFilter_ = std::nullopt; + } else { + const auto present = yuGiOhBandaiLanguagesInCollection(collection_); + const auto idx = static_cast(sel - 1); + if (idx < present.size()) { + languageFilter_ = present[idx]; + } else { + languageFilter_ = std::nullopt; + languageChoice_->SetSelection(0); + } + } + rebuildCurrentView(); +} + +void YuGiOhBandaiSetCompletionPanel::rebuildCurrentView() { + if (book_->GetSelection() == 1 && !detailSetId_.empty()) { + const auto rows = + computeYuGiOhBandaiSetCompletion(collection_, catalog_, languageFilter_); + bool stillVisible = false; + for (const auto& row : rows) { + if (row.setId == detailSetId_) { + stillVisible = true; + break; + } + } + if (!stillVisible) { + showGridPage(); + rebuildGrid(); + return; + } + detailTitle_->SetLabelText( + wxString::FromUTF8(displaySetName(detailSetName_).c_str())); + rebuildChecklist(detailSetId_); + } else { + rebuildGrid(); + } +} + +void YuGiOhBandaiSetCompletionPanel::setEmptyMessage(const wxString& message) { + clearGridTiles(); + emptyLabel_->SetLabelText(message); + emptyLabel_->Wrap(480); + emptyLabel_->Show(); + scroll_->Hide(); + gridPage_->Layout(); +} + +void YuGiOhBandaiSetCompletionPanel::clearGridTiles() { + if (gridSizer_ == nullptr) return; + gridSizer_->Clear(true); +} + +void YuGiOhBandaiSetCompletionPanel::rebuildGrid() { + if (!catalogLoaded_) { + setEmptyMessage(wxString::FromUTF8( + "Set checklists are not downloaded yet.\n" + "Run Sets \xE2\x86\x92 Update Yu-Gi-Oh! (Bandai) to enable Set Completion.")); + return; + } + + const auto rows = computeYuGiOhBandaiSetCompletion(collection_, catalog_, languageFilter_); + if (rows.empty()) { + if (collection_.empty()) { + setEmptyMessage(wxString::FromUTF8( + "No Yu-Gi-Oh! (Bandai) sets in progress yet.\n" + "Add cards on the Single Cards tab to track set completion here.")); + } else { + bool anyCountable = false; + for (const auto& card : collection_) { + if (card.set.id.empty()) continue; + if (YuGiOhBandaiSetSource::normalizeCardNumber(card.setNo).empty()) continue; + anyCountable = true; + break; + } + if (!anyCountable) { + setEmptyMessage(wxString::FromUTF8( + "Your cards need a set number (No.) to track set completion.\n" + "Edit each card and enter its Bandai number, or use Auto detect.")); + } else { + setEmptyMessage(wxString::FromUTF8( + "None of your cards match a downloaded set checklist.\n" + "Run Sets \xE2\x86\x92 Update Yu-Gi-Oh! (Bandai), and confirm " + "each card's set and No.")); + } + } + return; + } + + emptyLabel_->Hide(); + scroll_->Show(); + clearGridTiles(); + + for (const auto& row : rows) { + auto* tile = new wxPanel(scroll_, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxBORDER_SIMPLE); + tile->SetBackgroundColour(palette_.panelBg); + auto* tileSizer = new wxBoxSizer(wxVERTICAL); + + const std::string title = displaySetName(row.setName); + auto* nameLbl = new wxStaticText(tile, wxID_ANY, wxString::FromUTF8(title.c_str())); + auto nameFont = nameLbl->GetFont(); + nameFont.MakeBold(); + nameLbl->SetFont(nameFont); + nameLbl->SetForegroundColour(palette_.text); + + const std::string counts = + std::to_string(row.ownedUnique) + " / " + std::to_string(row.total) + " (" + + std::to_string(row.percent()) + "%)"; + auto* countLbl = new wxStaticText(tile, wxID_ANY, wxString::FromUTF8(counts.c_str())); + countLbl->SetForegroundColour(palette_.text); + + auto* gauge = new wxGauge(tile, wxID_ANY, 100, wxDefaultPosition, wxSize(-1, 14), + wxGA_HORIZONTAL | wxGA_SMOOTH); + gauge->SetValue(row.percent()); + + tileSizer->Add(nameLbl, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 10); + tileSizer->Add(countLbl, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 6); + tileSizer->Add(gauge, 0, wxEXPAND | wxALL, 10); + tile->SetSizer(tileSizer); + + const std::string setId = row.setId; + const std::string setName = row.setName; + auto openDetail = [this, setId, setName](wxMouseEvent&) { + showChecklistPage(setId, setName); + }; + tile->Bind(wxEVT_LEFT_UP, openDetail); + nameLbl->Bind(wxEVT_LEFT_UP, openDetail); + countLbl->Bind(wxEVT_LEFT_UP, openDetail); + gauge->Bind(wxEVT_LEFT_UP, openDetail); + tile->SetCursor(wxCursor(wxCURSOR_HAND)); + nameLbl->SetCursor(wxCursor(wxCURSOR_HAND)); + countLbl->SetCursor(wxCursor(wxCURSOR_HAND)); + + gridSizer_->Add(tile, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 8); + } + gridSizer_->AddStretchSpacer(1); + scroll_->FitInside(); + gridPage_->Layout(); + Layout(); +} + +void YuGiOhBandaiSetCompletionPanel::rebuildChecklist(const std::string& setId) { + checklist_->DeleteAllItems(); + const auto entries = + yuGiOhBandaiChecklistForSet(collection_, catalog_, setId, languageFilter_); + const wxColour muted = mutedTextColour(palette_); + // Fixed green so owned checkmarks stay readable in both light and dark themes. + const wxColour ownedGreen(46, 160, 67); + + long idx = 0; + for (const auto& entry : entries) { + // Align names: checkmark + two spaces vs four spaces for missing cards. + std::string line = + (entry.owned ? "\xE2\x9C\x93 " : " ") + entry.setNo + " \xE2\x80\x94 " + entry.name; + if (!entry.rarity.empty()) { + line += " (" + entry.rarity + ")"; + } + const long row = checklist_->InsertItem(idx++, wxString::FromUTF8(line.c_str())); + if (row < 0) continue; + if (entry.owned) { + checklist_->SetItemTextColour(row, ownedGreen); + } else { + checklist_->SetItemTextColour(row, muted); + } + } + checklist_->SetColumnWidth(0, wxLIST_AUTOSIZE); + detailPage_->Layout(); +} + +} // namespace ccm::ui diff --git a/ui_wx/src/YuGiOhGameView.cpp b/ui_wx/src/YuGiOhGameView.cpp index 543b602..78d3706 100644 --- a/ui_wx/src/YuGiOhGameView.cpp +++ b/ui_wx/src/YuGiOhGameView.cpp @@ -524,13 +524,7 @@ void YuGiOhGameView::applyTheme(const ThemePalette& palette) { if (setCompletionPanel_) setCompletionPanel_->applyTheme(palette); refreshToolbarIcons(palette); refreshTabBarTheme(palette); - if (filterInput_ != nullptr) { - filterInput_->SetBackgroundColour(palette.inputBg); - filterInput_->SetForegroundColour(palette.inputText); - filterInput_->SetOwnBackgroundColour(palette.inputBg); - filterInput_->SetOwnForegroundColour(palette.inputText); - filterInput_->Refresh(); - } + applyPaletteToTextCtrl(filterInput_, palette, config_.current().theme); } } // namespace ccm::ui