From f10bfa31daf3cfb7cd0e03e66c9a0dda7937289d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sat, 28 Jun 2025 16:12:28 +0200 Subject: [PATCH] Change to a prompt instead. --- cockatrice/CMakeLists.txt | 1 + cockatrice/src/client/ui/window_main.cpp | 31 +++++++++++- cockatrice/src/dialogs/dlg_settings.cpp | 36 +++++++++++-- cockatrice/src/dialogs/dlg_settings.h | 2 +- .../src/dialogs/dlg_startup_card_check.cpp | 50 +++++++++++++++++++ .../src/dialogs/dlg_startup_card_check.h | 24 +++++++++ cockatrice/src/settings/cache_settings.cpp | 15 ++++-- cockatrice/src/settings/cache_settings.h | 13 +++-- dbconverter/src/mocks.cpp | 5 +- tests/carddatabase/mocks.cpp | 5 +- 10 files changed, 166 insertions(+), 16 deletions(-) create mode 100644 cockatrice/src/dialogs/dlg_startup_card_check.cpp create mode 100644 cockatrice/src/dialogs/dlg_startup_card_check.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 26cc72aca..612181bca 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -172,6 +172,7 @@ set(cockatrice_SOURCES src/dialogs/dlg_roll_dice.cpp src/dialogs/dlg_select_set_for_cards.cpp src/dialogs/dlg_settings.cpp + src/dialogs/dlg_startup_card_check.cpp src/dialogs/dlg_tip_of_the_day.cpp src/dialogs/dlg_update.cpp src/dialogs/dlg_view_log.cpp diff --git a/cockatrice/src/client/ui/window_main.cpp b/cockatrice/src/client/ui/window_main.cpp index bbe8b356a..9acaf3753 100644 --- a/cockatrice/src/client/ui/window_main.cpp +++ b/cockatrice/src/client/ui/window_main.cpp @@ -27,6 +27,7 @@ #include "../../dialogs/dlg_manage_sets.h" #include "../../dialogs/dlg_register.h" #include "../../dialogs/dlg_settings.h" +#include "../../dialogs/dlg_startup_card_check.h" #include "../../dialogs/dlg_tip_of_the_day.h" #include "../../dialogs/dlg_update.h" #include "../../dialogs/dlg_view_log.h" @@ -62,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -69,6 +71,7 @@ #include #include #include +#include #define GITHUB_PAGES_URL "https://cockatrice.github.io" #define GITHUB_CONTRIBUTORS_URL "https://github.com/Cockatrice/Cockatrice/graphs/contributors?type=c" @@ -949,7 +952,33 @@ void MainWindow::startupConfigCheck() qCInfo(WindowMainStartupVersionLog) << "Startup: found config with current version"; if (SettingsCache::instance().getCardUpdateCheckRequired()) { - actCheckCardUpdatesBackground(); + if (SettingsCache::instance().getStartupCardUpdateCheckPromptForUpdate()) { + auto startupCardCheckDialog = new DlgStartupCardCheck(this); + + if (startupCardCheckDialog->exec() == QDialog::Accepted) { + switch (startupCardCheckDialog->group->checkedId()) { + case 0: // foreground + actCheckCardUpdates(); + break; + case 1: // background + actCheckCardUpdatesBackground(); + break; + case 2: // background + always + SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate(false); + SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate(true); + actCheckCardUpdatesBackground(); + break; + case 3: // don't prompt again + don't run + SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate(false); + SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate(false); + break; + default: + break; + } + } + } else if (SettingsCache::instance().getStartupCardUpdateCheckAlwaysUpdate()) { + actCheckCardUpdatesBackground(); + } } const auto reloadOk1 = QtConcurrent::run([] { CardDatabaseManager::getInstance()->loadCardDatabases(); }); diff --git a/cockatrice/src/dialogs/dlg_settings.cpp b/cockatrice/src/dialogs/dlg_settings.cpp index 60bc09579..b69d675db 100644 --- a/cockatrice/src/dialogs/dlg_settings.cpp +++ b/cockatrice/src/dialogs/dlg_settings.cpp @@ -52,6 +52,13 @@ #define WIKI_CUSTOM_SHORTCUTS "https://github.com/Cockatrice/Cockatrice/wiki/Custom-Keyboard-Shortcuts" #define WIKI_TRANSLATION_FAQ "https://github.com/Cockatrice/Cockatrice/wiki/Translation-FAQ" +enum startupCardUpdateCheckBehaviorIndex +{ + startupCardUpdateCheckBehaviorIndexNone, + startupCardUpdateCheckBehaviorIndexPrompt, + startupCardUpdateCheckBehaviorIndexAlways +}; + GeneralSettingsPage::GeneralSettingsPage() { QStringList languageCodes = findQmFiles(); @@ -71,7 +78,17 @@ GeneralSettingsPage::GeneralSettingsPage() // updates SettingsCache &settings = SettingsCache::instance(); startupUpdateCheckCheckBox.setChecked(settings.getCheckUpdatesOnStartup()); - startupCardUpdateCheckCheckBox.setChecked(settings.getCheckCardUpdatesOnStartup()); + startupCardUpdateCheckBehaviorSelector.addItem(""); // these will be set in retranslateUI + startupCardUpdateCheckBehaviorSelector.addItem(""); + startupCardUpdateCheckBehaviorSelector.addItem(""); + if (SettingsCache::instance().getStartupCardUpdateCheckPromptForUpdate()) { + startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexPrompt); + } else if (SettingsCache::instance().getStartupCardUpdateCheckAlwaysUpdate()) { + startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexAlways); + } else { + startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexNone); + } + cardUpdateCheckIntervalSpinBox.setMinimum(1); cardUpdateCheckIntervalSpinBox.setMaximum(30); cardUpdateCheckIntervalSpinBox.setValue(settings.getCardUpdateCheckInterval()); @@ -87,8 +104,13 @@ GeneralSettingsPage::GeneralSettingsPage() &GeneralSettingsPage::languageBoxChanged); connect(&startupUpdateCheckCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setCheckUpdatesOnStartup); - connect(&startupCardUpdateCheckCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setCheckCardUpdatesOnStartup); + connect(&startupCardUpdateCheckBehaviorSelector, QOverload::of(&QComboBox::currentIndexChanged), this, + [](int index) { + SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate( + index == startupCardUpdateCheckBehaviorIndexPrompt); + SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate( + index == startupCardUpdateCheckBehaviorIndexAlways); + }); connect(&cardUpdateCheckIntervalSpinBox, qOverload(&QSpinBox::valueChanged), &settings, &SettingsCache::setCardUpdateCheckInterval); connect(&updateNotificationCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setNotifyAboutUpdate); @@ -103,7 +125,7 @@ GeneralSettingsPage::GeneralSettingsPage() personalGrid->addWidget(&updateReleaseChannelLabel, 2, 0); personalGrid->addWidget(&updateReleaseChannelBox, 2, 1); personalGrid->addWidget(&startupUpdateCheckCheckBox, 4, 0, 1, 2); - personalGrid->addWidget(&startupCardUpdateCheckCheckBox, 5, 0, 1, 2); + personalGrid->addWidget(&startupCardUpdateCheckBehaviorSelector, 5, 0, 1, 2); personalGrid->addWidget(&cardUpdateCheckIntervalLabel, 6, 0); personalGrid->addWidget(&cardUpdateCheckIntervalSpinBox, 6, 1); personalGrid->addWidget(&lastCardUpdateCheckDateLabel, 7, 1); @@ -353,7 +375,11 @@ void GeneralSettingsPage::retranslateUi() tokenDatabasePathLabel.setText(tr("Token database:")); updateReleaseChannelLabel.setText(tr("Update channel")); startupUpdateCheckCheckBox.setText(tr("Check for client updates on startup")); - startupCardUpdateCheckCheckBox.setText(tr("Automatically update card database in the background on startup")); + startupCardUpdateCheckBehaviorSelector.setItemText(startupCardUpdateCheckBehaviorIndexNone, tr("Don't check")); + startupCardUpdateCheckBehaviorSelector.setItemText(startupCardUpdateCheckBehaviorIndexPrompt, + tr("Prompt for update")); + startupCardUpdateCheckBehaviorSelector.setItemText(startupCardUpdateCheckBehaviorIndexAlways, + tr("Always update in the background")); cardUpdateCheckIntervalLabel.setText(tr("Check for card database updates every")); cardUpdateCheckIntervalSpinBox.setSuffix(tr(" days")); updateNotificationCheckBox.setText(tr("Notify if a feature supported by the server is missing in my client")); diff --git a/cockatrice/src/dialogs/dlg_settings.h b/cockatrice/src/dialogs/dlg_settings.h index 6b2b7ce9b..00742fe18 100644 --- a/cockatrice/src/dialogs/dlg_settings.h +++ b/cockatrice/src/dialogs/dlg_settings.h @@ -71,7 +71,7 @@ private: QGroupBox *pathsGroupBox; QComboBox languageBox; QCheckBox startupUpdateCheckCheckBox; - QCheckBox startupCardUpdateCheckCheckBox; + QComboBox startupCardUpdateCheckBehaviorSelector; QLabel cardUpdateCheckIntervalLabel; QSpinBox cardUpdateCheckIntervalSpinBox; QLabel lastCardUpdateCheckDateLabel; diff --git a/cockatrice/src/dialogs/dlg_startup_card_check.cpp b/cockatrice/src/dialogs/dlg_startup_card_check.cpp new file mode 100644 index 000000000..5d76bc253 --- /dev/null +++ b/cockatrice/src/dialogs/dlg_startup_card_check.cpp @@ -0,0 +1,50 @@ +#include "dlg_startup_card_check.h" + +#include "../settings/cache_settings.h" + +#include + +DlgStartupCardCheck::DlgStartupCardCheck(QWidget *parent) : QDialog(parent) +{ + setWindowTitle(tr("Card Update Check")); + + layout = new QVBoxLayout(this); + + QDate lastCheckDate = SettingsCache::instance().getLastCardUpdateCheck(); + int daysAgo = lastCheckDate.daysTo(QDate::currentDate()); + + instructionLabel = new QLabel( + tr("It has been more than %2 days since you last checked your card database for updates.\nChoose how you would " + "like to run the card database updater.\nYou can always change this behavior in the 'General' settings tab.") + .arg(daysAgo)); + + layout->addWidget(instructionLabel); + + group = new QButtonGroup(this); + + foregroundBtn = new QRadioButton(tr("Run in foreground")); + backgroundBtn = new QRadioButton(tr("Run in background")); + backgroundAlwaysBtn = new QRadioButton(tr("Run in background and always from now on")); + dontPromptBtn = new QRadioButton(tr("Don't prompt again and don't run")); + dontRunBtn = new QRadioButton(tr("Don't run this time")); + + group->addButton(foregroundBtn, 0); + group->addButton(backgroundBtn, 1); + group->addButton(backgroundAlwaysBtn, 2); + group->addButton(dontPromptBtn, 3); + group->addButton(dontRunBtn, 4); + + foregroundBtn->setChecked(true); // default + + layout->addWidget(foregroundBtn); + layout->addWidget(backgroundBtn); + layout->addWidget(backgroundAlwaysBtn); + layout->addWidget(dontPromptBtn); + layout->addWidget(dontRunBtn); + + buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout->addWidget(buttonBox); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} diff --git a/cockatrice/src/dialogs/dlg_startup_card_check.h b/cockatrice/src/dialogs/dlg_startup_card_check.h new file mode 100644 index 000000000..cb7acd280 --- /dev/null +++ b/cockatrice/src/dialogs/dlg_startup_card_check.h @@ -0,0 +1,24 @@ +#ifndef DLG_STARTUP_CARD_CHECK_H +#define DLG_STARTUP_CARD_CHECK_H + +#include +#include +#include +#include +#include +#include + +class DlgStartupCardCheck : public QDialog +{ + Q_OBJECT +public: + explicit DlgStartupCardCheck(QWidget *parent); + + QVBoxLayout *layout; + QLabel *instructionLabel; + QButtonGroup *group; + QRadioButton *foregroundBtn, *backgroundBtn, *backgroundAlwaysBtn, *dontPromptBtn, *dontRunBtn; + QDialogButtonBox *buttonBox; +}; + +#endif // DLG_STARTUP_CARD_CHECK_H diff --git a/cockatrice/src/settings/cache_settings.cpp b/cockatrice/src/settings/cache_settings.cpp index 8398c408a..2ad735128 100644 --- a/cockatrice/src/settings/cache_settings.cpp +++ b/cockatrice/src/settings/cache_settings.cpp @@ -194,7 +194,9 @@ SettingsCache::SettingsCache() mbDownloadSpoilers = settings->value("personal/downloadspoilers", false).toBool(); checkUpdatesOnStartup = settings->value("personal/startupUpdateCheck", true).toBool(); - checkCardUpdatesOnStartup = settings->value("personal/startupCardUpdateCheck", true).toBool(); + startupCardUpdateCheckPromptForUpdate = + settings->value("personal/startupCardUpdateCheckPromptForUpdate", true).toBool(); + startupCardUpdateCheckAlwaysUpdate = settings->value("personal/startupCardUpdateCheckAlwaysUpdate", false).toBool(); cardUpdateCheckInterval = settings->value("personal/cardUpdateCheckInterval", 7).toInt(); lastCardUpdateCheck = settings->value("personal/lastCardUpdateCheck", QDateTime::currentDateTime().date()).toDate(); notifyAboutUpdates = settings->value("personal/updatenotification", true).toBool(); @@ -1366,10 +1368,15 @@ void SettingsCache::setCheckUpdatesOnStartup(QT_STATE_CHANGED_T value) settings->setValue("personal/startupUpdateCheck", checkUpdatesOnStartup); } -void SettingsCache::setCheckCardUpdatesOnStartup(QT_STATE_CHANGED_T value) +void SettingsCache::setStartupCardUpdateCheckPromptForUpdate(bool value) { - checkCardUpdatesOnStartup = static_cast(value); - settings->setValue("personal/startupCardUpdateCheck", checkCardUpdatesOnStartup); + startupCardUpdateCheckPromptForUpdate = value; + settings->setValue("personal/startupCardUpdateCheckPromptForUpdate", startupCardUpdateCheckPromptForUpdate); +} +void SettingsCache::setStartupCardUpdateCheckAlwaysUpdate(bool value) +{ + startupCardUpdateCheckAlwaysUpdate = value; + settings->setValue("personal/startupCardUpdateCheckAlwaysUpdate", startupCardUpdateCheckAlwaysUpdate); } void SettingsCache::setCardUpdateCheckInterval(int value) diff --git a/cockatrice/src/settings/cache_settings.h b/cockatrice/src/settings/cache_settings.h index 960d8a138..16822d755 100644 --- a/cockatrice/src/settings/cache_settings.h +++ b/cockatrice/src/settings/cache_settings.h @@ -199,6 +199,8 @@ private: bool tabVisualDeckStorageOpen, tabServerOpen, tabAccountOpen, tabDeckStorageOpen, tabReplaysOpen, tabAdminOpen, tabLogOpen; bool checkUpdatesOnStartup; + bool startupCardUpdateCheckPromptForUpdate; + bool startupCardUpdateCheckAlwaysUpdate; bool checkCardUpdatesOnStartup; int cardUpdateCheckInterval; QDate lastCardUpdateCheck; @@ -442,9 +444,13 @@ public: { return checkUpdatesOnStartup; } - bool getCheckCardUpdatesOnStartup() const + bool getStartupCardUpdateCheckPromptForUpdate() { - return checkCardUpdatesOnStartup; + return startupCardUpdateCheckPromptForUpdate; + } + bool getStartupCardUpdateCheckAlwaysUpdate() + { + return startupCardUpdateCheckAlwaysUpdate; } int getCardUpdateCheckInterval() const { @@ -1028,7 +1034,8 @@ public slots: void setDefaultStartingLifeTotal(const int _defaultStartingLifeTotal); void setRememberGameSettings(const bool _rememberGameSettings); void setCheckUpdatesOnStartup(QT_STATE_CHANGED_T value); - void setCheckCardUpdatesOnStartup(QT_STATE_CHANGED_T value); + void setStartupCardUpdateCheckPromptForUpdate(bool value); + void setStartupCardUpdateCheckAlwaysUpdate(bool value); void setCardUpdateCheckInterval(int value); void setLastCardUpdateCheck(QDate value); void setNotifyAboutUpdate(QT_STATE_CHANGED_T _notifyaboutupdate); diff --git a/dbconverter/src/mocks.cpp b/dbconverter/src/mocks.cpp index f44b50402..738a17695 100644 --- a/dbconverter/src/mocks.cpp +++ b/dbconverter/src/mocks.cpp @@ -408,7 +408,10 @@ void SettingsCache::setRememberGameSettings(const bool /* _rememberGameSettings void SettingsCache::setCheckUpdatesOnStartup(QT_STATE_CHANGED_T /* value */) { } -void SettingsCache::setCheckCardUpdatesOnStartup(QT_STATE_CHANGED_T /* value */) +void SettingsCache::setStartupCardUpdateCheckPromptForUpdate(bool /* value */) +{ +} +void SettingsCache::setStartupCardUpdateCheckAlwaysUpdate(bool /* value */) { } void SettingsCache::setCardUpdateCheckInterval(int /* value */) diff --git a/tests/carddatabase/mocks.cpp b/tests/carddatabase/mocks.cpp index d68bd4180..9d158217e 100644 --- a/tests/carddatabase/mocks.cpp +++ b/tests/carddatabase/mocks.cpp @@ -412,7 +412,10 @@ void SettingsCache::setRememberGameSettings(const bool /* _rememberGameSettings void SettingsCache::setCheckUpdatesOnStartup(QT_STATE_CHANGED_T /* value */) { } -void SettingsCache::setCheckCardUpdatesOnStartup(QT_STATE_CHANGED_T /* value */) +void SettingsCache::setStartupCardUpdateCheckPromptForUpdate(bool /* value */) +{ +} +void SettingsCache::setStartupCardUpdateCheckAlwaysUpdate(bool /* value */) { } void SettingsCache::setCardUpdateCheckInterval(int /* value */)