From 31dc84653d454e8b913d7bf06609096e335c8318 Mon Sep 17 00:00:00 2001 From: Yihe Li Date: Tue, 13 May 2025 05:14:45 +0800 Subject: [PATCH] Refactor shortcut parameter into its own struct Signed-off-by: Yihe Li --- launcher/minecraft/ShortcutUtils.cpp | 103 +++++++++------------ launcher/minecraft/ShortcutUtils.h | 34 +++---- launcher/minecraft/WorldList.cpp | 6 +- launcher/ui/MainWindow.cpp | 6 +- launcher/ui/pages/instance/ServersPage.cpp | 6 +- 5 files changed, 66 insertions(+), 89 deletions(-) diff --git a/launcher/minecraft/ShortcutUtils.cpp b/launcher/minecraft/ShortcutUtils.cpp index ac3a60614..2bbeacb08 100644 --- a/launcher/minecraft/ShortcutUtils.cpp +++ b/launcher/minecraft/ShortcutUtils.cpp @@ -48,14 +48,9 @@ namespace ShortcutUtils { -void createInstanceShortcut(BaseInstance* instance, - QString shortcutName, - QString shortcutFilePath, - QString targetString, - QWidget* parent, - const QStringList& extraArgs) +void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) { - if (!instance) + if (!shortcut.instance) return; QString appPath = QApplication::applicationFilePath(); @@ -64,21 +59,21 @@ void createInstanceShortcut(BaseInstance* instance, #if defined(Q_OS_MACOS) appPath = QApplication::applicationFilePath(); if (appPath.startsWith("/private/var/")) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts.")); return; } - auto pIcon = APPLICATION->icons()->icon(instance->iconKey()); + auto pIcon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); if (pIcon == nullptr) { pIcon = APPLICATION->icons()->icon("grass"); } - iconPath = FS::PathCombine(instance->instanceRoot(), "Icon.icns"); + iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "Icon.icns"); QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for application.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for application.")); return; } @@ -89,7 +84,7 @@ void createInstanceShortcut(BaseInstance* instance, if (!success) { iconFile.remove(); - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for application.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for application.")); return; } #elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) @@ -98,23 +93,23 @@ void createInstanceShortcut(BaseInstance* instance, appPath = QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE")); if (appPath.isEmpty()) { QMessageBox::critical( - parent, QObject::tr("Create Shortcut"), + shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Launcher is running as misconfigured AppImage? ($APPIMAGE environment variable is missing)")); } else if (appPath.endsWith("/")) { appPath.chop(1); } } - auto icon = APPLICATION->icons()->icon(instance->iconKey()); + auto icon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); if (icon == nullptr) { icon = APPLICATION->icons()->icon("grass"); } - iconPath = FS::PathCombine(instance->instanceRoot(), "icon.png"); + iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "icon.png"); QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); return; } bool success = icon->icon().pixmap(64, 64).save(&iconFile, "PNG"); @@ -122,7 +117,7 @@ void createInstanceShortcut(BaseInstance* instance, if (!success) { iconFile.remove(); - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); return; } @@ -132,12 +127,12 @@ void createInstanceShortcut(BaseInstance* instance, } #elif defined(Q_OS_WIN) - auto icon = APPLICATION->icons()->icon(instance->iconKey()); + auto icon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); if (icon == nullptr) { icon = APPLICATION->icons()->icon("grass"); } - iconPath = FS::PathCombine(instance->instanceRoot(), "icon.ico"); + iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "icon.ico"); // part of fix for weird bug involving the window icon being replaced // dunno why it happens, but parent 2-line fix seems to be enough, so w/e @@ -145,7 +140,7 @@ void createInstanceShortcut(BaseInstance* instance, QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); return; } bool success = icon->icon().pixmap(64, 64).save(&iconFile, "ICO"); @@ -156,58 +151,51 @@ void createInstanceShortcut(BaseInstance* instance, if (!success) { iconFile.remove(); - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create icon for shortcut.")); return; } #else - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Not supported on your platform!")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Not supported on your platform!")); return; #endif - args.append({ "--launch", instance->id() }); - args.append(extraArgs); + args.append({ "--launch", shortcut.instance->id() }); + args.append(shortcut.extraArgs); - if (!FS::createShortcut(std::move(shortcutFilePath), appPath, args, shortcutName, iconPath)) { + if (!FS::createShortcut(std::move(filePath), appPath, args, shortcut.name, iconPath)) { #if not defined(Q_OS_MACOS) iconFile.remove(); #endif - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create %1 shortcut!").arg(targetString)); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), + QObject::tr("Failed to create %1 shortcut!").arg(shortcut.targetString)); } } -void createInstanceShortcutOnDesktop(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent, - const QStringList& extraArgs) +void createInstanceShortcutOnDesktop(const Shortcut& shortcut) { - if (!instance) + if (!shortcut.instance) return; QString desktopDir = FS::getDesktopDir(); if (desktopDir.isEmpty()) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Couldn't find desktop?!")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Couldn't find desktop?!")); return; } - QString shortcutFilePath = FS::PathCombine(FS::getDesktopDir(), FS::RemoveInvalidFilenameChars(shortcutName)); - createInstanceShortcut(instance, shortcutName, shortcutFilePath, targetString, parent, extraArgs); - QMessageBox::information(parent, QObject::tr("Create Shortcut"), - QObject::tr("Created a shortcut to this %1 on your desktop!").arg(targetString)); + QString shortcutFilePath = FS::PathCombine(desktopDir, FS::RemoveInvalidFilenameChars(shortcut.name)); + createInstanceShortcut(shortcut, shortcutFilePath); + QMessageBox::information(shortcut.parent, QObject::tr("Create Shortcut"), + QObject::tr("Created a shortcut to this %1 on your desktop!").arg(shortcut.targetString)); } -void createInstanceShortcutInApplications(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent, - const QStringList& extraArgs) +void createInstanceShortcutInApplications(const Shortcut& shortcut) { - if (!instance) + if (!shortcut.instance) return; QString applicationsDir = FS::getApplicationsDir(); if (applicationsDir.isEmpty()) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Couldn't find applications folder?!")); + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Couldn't find applications folder?!")); return; } @@ -216,25 +204,21 @@ void createInstanceShortcutInApplications(BaseInstance* instance, QDir applicationsDirQ(applicationsDir); if (!applicationsDirQ.mkpath(".")) { - QMessageBox::critical(parent, QObject::tr("Create Shortcut"), + QMessageBox::critical(shortcut.parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create instances folder in applications folder!")); return; } #endif - QString shortcutFilePath = FS::PathCombine(applicationsDir, FS::RemoveInvalidFilenameChars(shortcutName)); - createInstanceShortcut(instance, shortcutName, shortcutFilePath, targetString, parent, extraArgs); - QMessageBox::information(parent, QObject::tr("Create Shortcut"), - QObject::tr("Created a shortcut to this %1 in your applications folder!").arg(targetString)); + QString shortcutFilePath = FS::PathCombine(applicationsDir, FS::RemoveInvalidFilenameChars(shortcut.name)); + createInstanceShortcut(shortcut, shortcutFilePath); + QMessageBox::information(shortcut.parent, QObject::tr("Create Shortcut"), + QObject::tr("Created a shortcut to this %1 in your applications folder!").arg(shortcut.targetString)); } -void createInstanceShortcutInOther(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent, - const QStringList& extraArgs) +void createInstanceShortcutInOther(const Shortcut& shortcut) { - if (!instance) + if (!shortcut.instance) return; QString defaultedDir = FS::getDesktopDir(); @@ -246,20 +230,21 @@ void createInstanceShortcutInOther(BaseInstance* instance, QString extension = ""; #endif - QString shortcutFilePath = FS::PathCombine(defaultedDir, FS::RemoveInvalidFilenameChars(shortcutName) + extension); + QString shortcutFilePath = FS::PathCombine(defaultedDir, FS::RemoveInvalidFilenameChars(shortcut.name) + extension); QFileDialog fileDialog; // workaround to make sure the portal file dialog opens in the desktop directory fileDialog.setDirectoryUrl(defaultedDir); - shortcutFilePath = fileDialog.getSaveFileName(parent, QObject::tr("Create Shortcut"), shortcutFilePath, + shortcutFilePath = fileDialog.getSaveFileName(shortcut.parent, QObject::tr("Create Shortcut"), shortcutFilePath, QObject::tr("Desktop Entries") + " (*" + extension + ")"); if (shortcutFilePath.isEmpty()) return; // file dialog canceled by user if (shortcutFilePath.endsWith(extension)) shortcutFilePath = shortcutFilePath.mid(0, shortcutFilePath.length() - extension.length()); - createInstanceShortcut(instance, shortcutName, shortcutFilePath, targetString, parent, extraArgs); - QMessageBox::information(parent, QObject::tr("Create Shortcut"), QObject::tr("Created a shortcut to this %1!").arg(targetString)); + createInstanceShortcut(shortcut, shortcutFilePath); + QMessageBox::information(shortcut.parent, QObject::tr("Create Shortcut"), + QObject::tr("Created a shortcut to this %1!").arg(shortcut.targetString)); } } // namespace ShortcutUtils diff --git a/launcher/minecraft/ShortcutUtils.h b/launcher/minecraft/ShortcutUtils.h index 7c0eeea5d..a21ccf06a 100644 --- a/launcher/minecraft/ShortcutUtils.h +++ b/launcher/minecraft/ShortcutUtils.h @@ -41,33 +41,25 @@ #include namespace ShortcutUtils { +/// A struct to hold parameters for creating a shortcut +struct Shortcut { + BaseInstance* instance; + QString name; + QString targetString; + QWidget* parent = nullptr; + QStringList extraArgs = {}; +}; + /// Create an instance shortcut on the specified file path -void createInstanceShortcut(BaseInstance* instance, - QString shortcutName, - QString shortcutFilePath, - QString targetString, - QWidget* parent = nullptr, - const QStringList& extraArgs = {}); +void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath); /// Create an instance shortcut on the desktop -void createInstanceShortcutOnDesktop(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent = nullptr, - const QStringList& extraArgs = {}); +void createInstanceShortcutOnDesktop(const Shortcut& shortcut); /// Create an instance shortcut in the Applications directory -void createInstanceShortcutInApplications(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent = nullptr, - const QStringList& extraArgs = {}); +void createInstanceShortcutInApplications(const Shortcut& shortcut); /// Create an instance shortcut in other directories -void createInstanceShortcutInOther(BaseInstance* instance, - QString shortcutName, - QString targetString, - QWidget* parent = nullptr, - const QStringList& extraArgs = {}); +void createInstanceShortcutInOther(const Shortcut& shortcut); } // namespace ShortcutUtils diff --git a/launcher/minecraft/WorldList.cpp b/launcher/minecraft/WorldList.cpp index ec6328018..582531577 100644 --- a/launcher/minecraft/WorldList.cpp +++ b/launcher/minecraft/WorldList.cpp @@ -473,7 +473,7 @@ void WorldList::createWorldShortcutOnDesktop(const QModelIndex& index, QWidget* const auto& world = allWorlds().at(index.row()); QString name = QString(tr("%1 - %2")).arg(m_instance->name(), world.name()); QStringList extraArgs{ "--world", world.name() }; - ShortcutUtils::createInstanceShortcutOnDesktop(m_instance, name, tr("world"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutOnDesktop({ m_instance, name, tr("world"), parent, extraArgs }); } void WorldList::createWorldShortcutInApplications(const QModelIndex& index, QWidget* parent) const @@ -481,7 +481,7 @@ void WorldList::createWorldShortcutInApplications(const QModelIndex& index, QWid const auto& world = allWorlds().at(index.row()); QString name = QString(tr("%1 - %2")).arg(m_instance->name(), world.name()); QStringList extraArgs{ "--world", world.name() }; - ShortcutUtils::createInstanceShortcutInApplications(m_instance, name, tr("world"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutInApplications({ m_instance, name, tr("world"), parent, extraArgs }); } void WorldList::createWorldShortcutInOther(const QModelIndex& index, QWidget* parent) const @@ -489,7 +489,7 @@ void WorldList::createWorldShortcutInOther(const QModelIndex& index, QWidget* pa const auto& world = allWorlds().at(index.row()); QString name = QString(tr("%1 - %2")).arg(m_instance->name(), world.name()); QStringList extraArgs{ "--world", world.name() }; - ShortcutUtils::createInstanceShortcutInOther(m_instance, name, tr("world"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutInOther({ m_instance, name, tr("world"), parent, extraArgs }); } #include "WorldList.moc" diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 4f03d14da..d64e92124 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1559,17 +1559,17 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() void MainWindow::on_actionCreateInstanceShortcutDesktop_triggered() { - ShortcutUtils::createInstanceShortcutOnDesktop(m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this); + ShortcutUtils::createInstanceShortcutOnDesktop({ m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this }); } void MainWindow::on_actionCreateInstanceShortcutApplications_triggered() { - ShortcutUtils::createInstanceShortcutInApplications(m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this); + ShortcutUtils::createInstanceShortcutInApplications({ m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this }); } void MainWindow::on_actionCreateInstanceShortcutOther_triggered() { - ShortcutUtils::createInstanceShortcutInOther(m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this); + ShortcutUtils::createInstanceShortcutInOther({ m_selectedInstance.get(), m_selectedInstance->name(), tr("instance"), this }); } void MainWindow::taskEnd() diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index 88b21a787..b29cc1137 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -119,21 +119,21 @@ struct Server { { QString name = QString(QObject::tr("%1 - Server %2")).arg(instance->name(), m_name); QStringList extraArgs{ "--server", m_address }; - ShortcutUtils::createInstanceShortcutOnDesktop(instance, name, QObject::tr("server"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutOnDesktop({ instance, name, QObject::tr("server"), parent, extraArgs }); } void createServerShortcutInApplications(BaseInstance* instance, QWidget* parent = nullptr) const { QString name = QString(QObject::tr("%1 - Server %2")).arg(instance->name(), m_name); QStringList extraArgs{ "--server", m_address }; - ShortcutUtils::createInstanceShortcutInApplications(instance, name, QObject::tr("server"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutInApplications({ instance, name, QObject::tr("server"), parent, extraArgs }); } void createServerShortcutInOther(BaseInstance* instance, QWidget* parent = nullptr) const { QString name = QString(QObject::tr("%1 - Server %2")).arg(instance->name(), m_name); QStringList extraArgs{ "--server", m_address }; - ShortcutUtils::createInstanceShortcutInOther(instance, name, QObject::tr("server"), parent, extraArgs); + ShortcutUtils::createInstanceShortcutInOther({ instance, name, QObject::tr("server"), parent, extraArgs }); } // Data - persistent and user changeable