#pragma once // PokemonGameView: unified West + Asia Pokemon UI. One collection file; // separate West/Asia set caches and set-completion catalogs. Sets > Update // Pokemon refreshes both regions. Hosts Single Cards | Set Completion tabs. #include "ccm/domain/PokemonCard.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/PokemonSetCatalogService.hpp" #include "ccm/services/SetService.hpp" #include "ccm/ui/IGameView.hpp" #include #include #include #include class wxBitmapButton; class wxBoxSizer; class wxPanel; class wxSimplebook; class wxSplitterWindow; class wxStaticText; class wxTextCtrl; namespace ccm::ui { class PokemonCardListPanel; class PokemonSelectedCardPanel; class PokemonSetCompletionPanel; class PokemonGameView final : public IGameView { public: PokemonGameView(ConfigService& config, CollectionService& collection, SetService& sets, ImageService& images, CardPreviewService& cardPreview, IGameModule& westModule, IGameModule& asiaModule, PokemonSetCatalogService& catalogStore); [[nodiscard]] Game gameId() const noexcept override { return Game::Pokemon; } [[nodiscard]] std::string displayName() const override { return "Pokemon"; } 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 Pokemon"; } private: void syncEditToolbarVisibility(); void ensureSetsLoaded(); const std::vector& setsForDialog(PokemonRegion region); 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& westModule_; IGameModule& asiaModule_; PokemonSetCatalogService& catalogStore_; wxPanel* contentPanel_{nullptr}; wxPanel* tabBar_{nullptr}; wxSimplebook* book_{nullptr}; wxSplitterWindow* singleSplitter_{nullptr}; PokemonCardListPanel* listPanel_{nullptr}; PokemonSelectedCardPanel* selectedPanel_{nullptr}; PokemonSetCompletionPanel* 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 setsCacheWest_; std::vector setsCacheAsia_; bool attemptedInitialSetLoad_{false}; }; } // namespace ccm::ui