#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