|
|
|
|
@ -1,41 +1,45 @@
|
|
|
|
|
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
|
|
|
|
|
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <stenzek@gmail.com>
|
|
|
|
|
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
|
|
|
|
|
|
|
|
|
|
#include "coverdownloaddialog.h"
|
|
|
|
|
#include "coverdownloadwindow.h"
|
|
|
|
|
#include "qthost.h"
|
|
|
|
|
|
|
|
|
|
#include "core/game_list.h"
|
|
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
|
|
|
|
|
|
CoverDownloadDialog::CoverDownloadDialog(QWidget* parent /*= nullptr*/) : QDialog(parent)
|
|
|
|
|
CoverDownloadWindow::CoverDownloadWindow() : QWidget()
|
|
|
|
|
{
|
|
|
|
|
m_ui.setupUi(this);
|
|
|
|
|
setWindowIcon(QtHost::GetAppIcon());
|
|
|
|
|
m_ui.coverIcon->setPixmap(QIcon::fromTheme(QStringLiteral("artboard-2-line")).pixmap(32));
|
|
|
|
|
updateEnabled();
|
|
|
|
|
QtUtils::RestoreWindowGeometry("CoverDownloadWindow", this);
|
|
|
|
|
|
|
|
|
|
connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadDialog::onStartClicked);
|
|
|
|
|
connect(m_ui.close, &QPushButton::clicked, this, &CoverDownloadDialog::onCloseClicked);
|
|
|
|
|
connect(m_ui.urls, &QTextEdit::textChanged, this, &CoverDownloadDialog::updateEnabled);
|
|
|
|
|
connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadWindow::onStartClicked);
|
|
|
|
|
connect(m_ui.close, &QPushButton::clicked, this, &CoverDownloadWindow::onCloseClicked);
|
|
|
|
|
connect(m_ui.urls, &QTextEdit::textChanged, this, &CoverDownloadWindow::updateEnabled);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CoverDownloadDialog::~CoverDownloadDialog()
|
|
|
|
|
CoverDownloadWindow::~CoverDownloadWindow()
|
|
|
|
|
{
|
|
|
|
|
Assert(!m_thread);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::closeEvent(QCloseEvent* ev)
|
|
|
|
|
void CoverDownloadWindow::closeEvent(QCloseEvent* ev)
|
|
|
|
|
{
|
|
|
|
|
QtUtils::SaveWindowGeometry("CoverDownloadWindow", this);
|
|
|
|
|
QWidget::closeEvent(ev);
|
|
|
|
|
cancelThread();
|
|
|
|
|
emit closed();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::onDownloadStatus(const QString& text)
|
|
|
|
|
void CoverDownloadWindow::onDownloadStatus(const QString& text)
|
|
|
|
|
{
|
|
|
|
|
m_ui.status->setText(text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::onDownloadProgress(int value, int range)
|
|
|
|
|
void CoverDownloadWindow::onDownloadProgress(int value, int range)
|
|
|
|
|
{
|
|
|
|
|
// Limit to once every five seconds, otherwise it's way too flickery.
|
|
|
|
|
// Ideally in the future we'd have some way to invalidate only a single cover.
|
|
|
|
|
@ -50,7 +54,7 @@ void CoverDownloadDialog::onDownloadProgress(int value, int range)
|
|
|
|
|
m_ui.progress->setValue(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::onDownloadComplete()
|
|
|
|
|
void CoverDownloadWindow::onDownloadComplete()
|
|
|
|
|
{
|
|
|
|
|
emit coverRefreshRequested();
|
|
|
|
|
|
|
|
|
|
@ -65,7 +69,7 @@ void CoverDownloadDialog::onDownloadComplete()
|
|
|
|
|
m_ui.status->setText(tr("Download complete."));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::onStartClicked()
|
|
|
|
|
void CoverDownloadWindow::onStartClicked()
|
|
|
|
|
{
|
|
|
|
|
if (m_thread)
|
|
|
|
|
cancelThread();
|
|
|
|
|
@ -73,15 +77,15 @@ void CoverDownloadDialog::onStartClicked()
|
|
|
|
|
startThread();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::onCloseClicked()
|
|
|
|
|
void CoverDownloadWindow::onCloseClicked()
|
|
|
|
|
{
|
|
|
|
|
if (m_thread)
|
|
|
|
|
cancelThread();
|
|
|
|
|
|
|
|
|
|
reject();
|
|
|
|
|
close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::updateEnabled()
|
|
|
|
|
void CoverDownloadWindow::updateEnabled()
|
|
|
|
|
{
|
|
|
|
|
const bool running = static_cast<bool>(m_thread);
|
|
|
|
|
m_ui.start->setText(running ? tr("Stop") : tr("Start"));
|
|
|
|
|
@ -90,18 +94,19 @@ void CoverDownloadDialog::updateEnabled()
|
|
|
|
|
m_ui.urls->setEnabled(!running);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::startThread()
|
|
|
|
|
void CoverDownloadWindow::startThread()
|
|
|
|
|
{
|
|
|
|
|
m_thread = std::make_unique<CoverDownloadThread>(this, m_ui.urls->toPlainText(), m_ui.useSerialFileNames->isChecked());
|
|
|
|
|
m_thread =
|
|
|
|
|
std::make_unique<CoverDownloadThread>(this, m_ui.urls->toPlainText(), m_ui.useSerialFileNames->isChecked());
|
|
|
|
|
m_last_refresh_time.Reset();
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::statusUpdated, this, &CoverDownloadDialog::onDownloadStatus);
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::progressUpdated, this, &CoverDownloadDialog::onDownloadProgress);
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::threadFinished, this, &CoverDownloadDialog::onDownloadComplete);
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::statusUpdated, this, &CoverDownloadWindow::onDownloadStatus);
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::progressUpdated, this, &CoverDownloadWindow::onDownloadProgress);
|
|
|
|
|
connect(m_thread.get(), &CoverDownloadThread::threadFinished, this, &CoverDownloadWindow::onDownloadComplete);
|
|
|
|
|
m_thread->start();
|
|
|
|
|
updateEnabled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::cancelThread()
|
|
|
|
|
void CoverDownloadWindow::cancelThread()
|
|
|
|
|
{
|
|
|
|
|
if (!m_thread)
|
|
|
|
|
return;
|
|
|
|
|
@ -111,16 +116,16 @@ void CoverDownloadDialog::cancelThread()
|
|
|
|
|
m_thread.reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CoverDownloadDialog::CoverDownloadThread::CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials)
|
|
|
|
|
CoverDownloadWindow::CoverDownloadThread::CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials)
|
|
|
|
|
: QtAsyncProgressThread(parent), m_use_serials(use_serials)
|
|
|
|
|
{
|
|
|
|
|
for (const QString& str : urls.split(QChar('\n')))
|
|
|
|
|
m_urls.push_back(str.toStdString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CoverDownloadDialog::CoverDownloadThread::~CoverDownloadThread() = default;
|
|
|
|
|
CoverDownloadWindow::CoverDownloadThread::~CoverDownloadThread() = default;
|
|
|
|
|
|
|
|
|
|
void CoverDownloadDialog::CoverDownloadThread::runAsync()
|
|
|
|
|
void CoverDownloadWindow::CoverDownloadThread::runAsync()
|
|
|
|
|
{
|
|
|
|
|
GameList::DownloadCovers(m_urls, m_use_serials, this);
|
|
|
|
|
}
|