mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-06 01:53:25 -08:00
[Client] Improve card database update visibility (#7458)
* [Client] Improve card database update visibility Addresses Cockatrice/Cockatrice#7431. Cockatrice previously offered no in-client feedback while the card database updater ran: the only progress UI lived in the first-run wizard, stderr/stdout were not parsed in interactive runs, and starting a second update with Oracle already open or with a hidden background run active just showed a confusing 'already running' guard - even though Oracle is launched as a separate process with no lifecycle tracking. - Add a status-bar widget (CardDatabaseUpdateStatusBar) that appears while an update runs and shows the Downloading/Parsing/Importing stages with percent progress; it is also used in the quit-confirm prompt so users see an unfinished update before cancelling it. - Parse the updater's PROGRESS lines (new CardUpdateProgressParser, unit-tested) in both foreground and background runs and log stage changes to the new card_database.update category, throttled to at most one line per second; forward Oracle stderr to the logs. - Show a tray balloon when a background update starts and on finish or failure instead of staying silent. - Request a running Oracle instance to raise itself (QLocalServer CockatriceOracleRaise-<user>) when the user starts another update, and demote the 'already running' guard to an informative message only when no running instance can be found. - Emit download/scan/import progress unconditionally from Oracle so interactive and background runs behave the same. - Document the new log category in the troubleshooting guide. * [Client] Address card database update review feedback * [Client] Add setting to control card database update tray notifications * [Client] Address remaining card database update review nits - Rename card_update_progress_parser.{h,cpp} to card_update_progress.{h,cpp} - Store the CardUpdateProgress struct in the status bar widget * Lint. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
6bed5d6f67
commit
a44757bd11
26 changed files with 702 additions and 67 deletions
|
|
@ -14,13 +14,17 @@
|
|||
#include <QFile>
|
||||
#include <QIODevice>
|
||||
#include <QList>
|
||||
#include <QLocalServer>
|
||||
#include <QLocalSocket>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QSettings>
|
||||
#include <QVariant>
|
||||
#include <QWindow>
|
||||
#include <QWizardPage>
|
||||
#include <QtGlobal>
|
||||
#include <libcockatrice/settings/cards_display_settings.h>
|
||||
#include <libcockatrice/settings/personal_settings.h>
|
||||
#include <libcockatrice/utility/local_server_name.h>
|
||||
#include <qlogging.h>
|
||||
|
||||
class QWidget;
|
||||
|
|
@ -71,6 +75,7 @@ OracleWizard::OracleWizard(QWidget *parent) : QWizard(parent)
|
|||
}
|
||||
|
||||
retranslateUi();
|
||||
startRaiseServer();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -139,6 +144,54 @@ void OracleWizard::runInBackground()
|
|||
currentPage()->initializePage();
|
||||
}
|
||||
|
||||
void OracleWizard::startRaiseServer()
|
||||
{
|
||||
// Scope the socket name to the current user, mirroring the hosting client.
|
||||
raiseServer = new QLocalServer(this);
|
||||
connect(raiseServer, &QLocalServer::newConnection, this, &OracleWizard::handleRaiseRequest);
|
||||
const QString serverName = scopedLocalServerName(QStringLiteral("CockatriceOracleRaise"));
|
||||
if (raiseServer->listen(serverName)) {
|
||||
return;
|
||||
}
|
||||
// A stale socket left behind by a crashed run holds the name: take it back.
|
||||
QLocalServer::removeServer(serverName);
|
||||
if (!raiseServer->listen(serverName)) {
|
||||
qWarning() << "Oracle: could not listen for raise requests on" << serverName;
|
||||
delete raiseServer;
|
||||
raiseServer = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void OracleWizard::handleRaiseRequest()
|
||||
{
|
||||
while (raiseServer && raiseServer->hasPendingConnections()) {
|
||||
QLocalSocket *socket = raiseServer->nextPendingConnection();
|
||||
connect(socket, &QLocalSocket::readyRead, this, [this, socket]() {
|
||||
socket->readAll();
|
||||
socket->deleteLater();
|
||||
raiseWizard();
|
||||
});
|
||||
connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater);
|
||||
}
|
||||
raiseWizard();
|
||||
}
|
||||
|
||||
void OracleWizard::raiseWizard()
|
||||
{
|
||||
// An ongoing background run is hidden; the user asked to see it, so promote it to a window.
|
||||
if (backgroundMode && !isVisible()) {
|
||||
show();
|
||||
}
|
||||
if (isMinimized()) {
|
||||
showNormal();
|
||||
}
|
||||
raise();
|
||||
activateWindow();
|
||||
if (windowHandle()) {
|
||||
windowHandle()->requestActivate();
|
||||
}
|
||||
}
|
||||
|
||||
void OracleWizard::enableButtons()
|
||||
{
|
||||
button(QWizard::NextButton)->setDisabled(false);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue