// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team // SPDX-License-Identifier: GPL-3.0+ #include "pcsx2/SupportURLs.h" #include "AboutDialog.h" #include "QtHost.h" #include "QtUtils.h" #include "common/FileSystem.h" #include "common/Path.h" #include "common/SmallString.h" #include #include #include #include #include #include #include static QString GetDocFileUrl(std::string_view name) { #ifdef _WIN32 // Windows uses the docs directory in bin. const std::string path = Path::Combine(EmuFolders::AppRoot, TinyString::from_format("docs" FS_OSPATH_SEPARATOR_STR "{}", name)); #else // Linux/Mac has this in the Resources directory. const std::string path = Path::Combine(EmuFolders::Resources, TinyString::from_format("docs" FS_OSPATH_SEPARATOR_STR "{}", name)); #endif return QUrl::fromLocalFile(QString::fromStdString(path)).toString(); } AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent) { m_ui.setupUi(this); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setFixedSize(geometry().width(), geometry().height()); m_ui.scmversion->setTextInteractionFlags(Qt::TextSelectableByMouse); m_ui.scmversion->setText(QtHost::GetAppNameAndVersion()); m_ui.links->setTextInteractionFlags(Qt::TextBrowserInteraction); m_ui.links->setText(QStringLiteral( R"(%2 | %4 | %6 | %8 | %10)") .arg(getWebsiteUrl()) .arg(tr("Website")) .arg(getSupportForumsUrl()) .arg(tr("Support Forums")) .arg(getGitHubRepositoryUrl()) .arg(tr("GitHub Repository")) .arg(getLicenseUrl()) .arg(tr("License")) .arg(getThirdPartyLicensesUrl()) .arg(tr("Third-Party Licenses"))); connect(m_ui.links, &QLabel::linkActivated, this, &AboutDialog::linksLinkActivated); connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close); } AboutDialog::~AboutDialog() = default; QString AboutDialog::getWebsiteUrl() { return QString::fromUtf8(PCSX2_WEBSITE_URL); } QString AboutDialog::getSupportForumsUrl() { return QString::fromUtf8(PCSX2_FORUMS_URL); } QString AboutDialog::getGitHubRepositoryUrl() { return QString::fromUtf8(PCSX2_GITHUB_URL); } QString AboutDialog::getLicenseUrl() { return GetDocFileUrl("GPL.html"); } QString AboutDialog::getThirdPartyLicensesUrl() { return GetDocFileUrl("ThirdPartyLicenses.html"); } QString AboutDialog::getDiscordServerUrl() { return QString::fromUtf8(PCSX2_DISCORD_URL); } void AboutDialog::linksLinkActivated(const QString& link) { const QUrl url(link); if (!url.isValid()) return; if (!url.isLocalFile()) { QDesktopServices::openUrl(url); return; } showHTMLDialog(this, tr("View Document"), url.toLocalFile()); } void AboutDialog::showHTMLDialog(QWidget* parent, const QString& title, const QString& path) { QDialog dialog(parent); dialog.setMinimumSize(700, 400); dialog.setWindowTitle(title); dialog.setWindowIcon(QtHost::GetAppIcon()); QVBoxLayout* layout = new QVBoxLayout(&dialog); QTextBrowser* tb = new QTextBrowser(&dialog); tb->setAcceptRichText(true); tb->setReadOnly(true); tb->setOpenExternalLinks(true); QFile file(path); file.open(QIODevice::ReadOnly); if (const QByteArray data = file.readAll(); !data.isEmpty()) tb->setText(QString::fromUtf8(data)); else tb->setText(tr("File not found: %1").arg(path)); layout->addWidget(tb, 1); QDialogButtonBox* bb = new QDialogButtonBox(QDialogButtonBox::Close, &dialog); connect(bb->button(QDialogButtonBox::Close), &QPushButton::clicked, &dialog, &QDialog::done); layout->addWidget(bb, 0); dialog.exec(); }