From e1ba37d396473ac8e35823e70e36330a92c1628b Mon Sep 17 00:00:00 2001 From: RickyRister Date: Thu, 12 Dec 2024 02:51:23 -0800 Subject: [PATCH] implement thing --- .../src/dialogs/dlg_move_top_cards_until.cpp | 51 +++++++++++++++++-- .../src/dialogs/dlg_move_top_cards_until.h | 4 +- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/cockatrice/src/dialogs/dlg_move_top_cards_until.cpp b/cockatrice/src/dialogs/dlg_move_top_cards_until.cpp index 15293fd8c..c21bbef45 100644 --- a/cockatrice/src/dialogs/dlg_move_top_cards_until.cpp +++ b/cockatrice/src/dialogs/dlg_move_top_cards_until.cpp @@ -1,5 +1,7 @@ #include "dlg_move_top_cards_until.h" +#include "../game/cards/card_database.h" +#include "../game/cards/card_database_manager.h" #include "../game/filters/filter_string.h" #include "trice_limits.h" @@ -45,14 +47,57 @@ DlgMoveTopCardsUntil::DlgMoveTopCardsUntil(QWidget *parent, QString _expr, uint setWindowTitle(tr("Put top cards on stack until...")); } +/** + * @brief Checks if a card matching the expr exists in the card database. + * + * @returns true if a card matching the expression exists. + */ +static bool matchExistsInDb(const FilterString &filterString) +{ + const auto cardDatabase = CardDatabaseManager::getInstance(); + const auto allCards = cardDatabase->getCardList(); + + const auto it = std::find_if(allCards.begin(), allCards.end(), + [&filterString](const CardInfoPtr &card) { return filterString.check(card); }); + + return it != allCards.end(); +} + +/** + * @brief Validates that a card matching the expr exists in the card database. + * If no match is found, then pop up a window to warn the user, giving them a chance to back out. + * + * @returns whether to proceed with the action + */ +bool DlgMoveTopCardsUntil::validateMatchExists(const FilterString &filterString) +{ + if (matchExistsInDb(filterString)) { + return true; + } + + const auto msg = tr("No cards matching the search expression exists in the card database. Proceed anyways?"); + const auto res = + QMessageBox::warning(this, tr("Cockatrice"), msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (res == QMessageBox::No) { + return false; + } + + return true; +} + void DlgMoveTopCardsUntil::validateAndAccept() { auto movingCardsUntilFilter = FilterString(exprEdit->text()); - if (movingCardsUntilFilter.valid()) { - accept(); - } else { + if (!movingCardsUntilFilter.valid()) { QMessageBox::warning(this, tr("Invalid filter"), movingCardsUntilFilter.error(), QMessageBox::Ok); + return; } + + if (!validateMatchExists(movingCardsUntilFilter)) { + return; + } + + accept(); } QString DlgMoveTopCardsUntil::getExpr() const diff --git a/cockatrice/src/dialogs/dlg_move_top_cards_until.h b/cockatrice/src/dialogs/dlg_move_top_cards_until.h index 7b026a942..96ce65baf 100644 --- a/cockatrice/src/dialogs/dlg_move_top_cards_until.h +++ b/cockatrice/src/dialogs/dlg_move_top_cards_until.h @@ -6,7 +6,8 @@ #include #include #include -#include + +class FilterString; class DlgMoveTopCardsUntil : public QDialog { @@ -18,6 +19,7 @@ class DlgMoveTopCardsUntil : public QDialog QDialogButtonBox *buttonBox; void validateAndAccept(); + bool validateMatchExists(const FilterString &filterString); public: explicit DlgMoveTopCardsUntil(QWidget *parent = nullptr, QString expr = QString(), uint numberOfHits = 1);