diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 38140459..88779d87 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -769,8 +769,8 @@ void MainWindow::createMenus() } MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), localServer(nullptr), bHasActivated(false), cardUpdateProcess(nullptr), - logviewDialog(nullptr) + : QMainWindow(parent), localServer(nullptr), bHasActivated(false), askedForDbUpdater(false), + cardUpdateProcess(nullptr), logviewDialog(nullptr) { connect(&SettingsCache::instance(), SIGNAL(pixmapCacheSizeChanged(int)), this, SLOT(pixmapCacheSizeChanged(int))); pixmapCacheSizeChanged(SettingsCache::instance().getPixmapCacheSize()); @@ -1003,6 +1003,10 @@ void MainWindow::showWindowIfHidden() void MainWindow::cardDatabaseLoadingFailed() { + if (askedForDbUpdater) { + return; + } + askedForDbUpdater = true; QMessageBox msgBox; msgBox.setWindowTitle(tr("Card database")); msgBox.setIcon(QMessageBox::Question); @@ -1109,17 +1113,34 @@ void MainWindow::actCheckCardUpdates() if (dir.exists(binaryName)) { updaterCmd = dir.absoluteFilePath(binaryName); + } else { // try and find the directory oracle is stored in the build directory + QDir findLocalDir(dir); + findLocalDir.cdUp(); + findLocalDir.cd(getCardUpdaterBinaryName()); + if (findLocalDir.exists(binaryName)) { + dir = findLocalDir; + updaterCmd = dir.absoluteFilePath(binaryName); + } } if (updaterCmd.isEmpty()) { QMessageBox::warning(this, tr("Error"), tr("Unable to run the card database updater: ") + dir.absoluteFilePath(binaryName)); + exitCardDatabaseUpdate(); return; } cardUpdateProcess->start(updaterCmd, QStringList()); } +void MainWindow::exitCardDatabaseUpdate() +{ + cardUpdateProcess->deleteLater(); + cardUpdateProcess = nullptr; + + QtConcurrent::run(db, &CardDatabase::loadCardDatabases); +} + void MainWindow::cardUpdateError(QProcess::ProcessError err) { QString error; @@ -1145,18 +1166,13 @@ void MainWindow::cardUpdateError(QProcess::ProcessError err) break; } - cardUpdateProcess->deleteLater(); - cardUpdateProcess = nullptr; - + exitCardDatabaseUpdate(); QMessageBox::warning(this, tr("Error"), tr("The card database updater exited with an error: %1").arg(error)); } void MainWindow::cardUpdateFinished(int, QProcess::ExitStatus) { - cardUpdateProcess->deleteLater(); - cardUpdateProcess = nullptr; - - QtConcurrent::run(db, &CardDatabase::loadCardDatabases); + exitCardDatabaseUpdate(); } void MainWindow::actCheckServerUpdates() diff --git a/cockatrice/src/window_main.h b/cockatrice/src/window_main.h index 47e10ad4..e9f3c733 100644 --- a/cockatrice/src/window_main.h +++ b/cockatrice/src/window_main.h @@ -116,11 +116,11 @@ private: void createTrayIcon(); void createTrayActions(); int getNextCustomSetPrefix(QDir dataDir); - // TODO: add a preference item to choose updater name for other games inline QString getCardUpdaterBinaryName() { return "oracle"; }; + void exitCardDatabaseUpdate(); QList tabMenus; QMenu *cockatriceMenu, *dbMenu, *helpMenu, *trayIconMenu; @@ -132,7 +132,7 @@ private: RemoteClient *client; QThread *clientThread; LocalServer *localServer; - bool bHasActivated; + bool bHasActivated, askedForDbUpdater; QMessageBox serverShutdownMessageBox; QProcess *cardUpdateProcess; DlgViewLog *logviewDialog;