diff --git a/launcher/minecraft/ShortcutUtils.cpp b/launcher/minecraft/ShortcutUtils.cpp index cbf4f00e0..ea2a988be 100644 --- a/launcher/minecraft/ShortcutUtils.cpp +++ b/launcher/minecraft/ShortcutUtils.cpp @@ -54,6 +54,10 @@ void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) return; QString appPath = QApplication::applicationFilePath(); + auto icon = APPLICATION->icons()->icon(shortcut.iconKey.isEmpty() ? shortcut.instance->iconKey() : shortcut.iconKey); + if (icon == nullptr) { + icon = APPLICATION->icons()->icon("grass"); + } QString iconPath; QStringList args; #if defined(Q_OS_MACOS) @@ -63,11 +67,6 @@ void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) return; } - auto pIcon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); - if (pIcon == nullptr) { - pIcon = APPLICATION->icons()->icon("grass"); - } - iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "Icon.icns"); QFile iconFile(iconPath); @@ -76,9 +75,8 @@ void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) return; } - QIcon icon = pIcon->icon(); - - bool success = icon.pixmap(1024, 1024).save(iconPath, "ICNS"); + QIcon iconObj = icon->icon(); + bool success = iconObj.pixmap(1024, 1024).save(iconPath, "ICNS"); iconFile.close(); if (!success) { @@ -99,11 +97,6 @@ void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) } } - auto icon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); - if (icon == nullptr) { - icon = APPLICATION->icons()->icon("grass"); - } - iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "icon.png"); QFile iconFile(iconPath); @@ -126,11 +119,6 @@ void createInstanceShortcut(const Shortcut& shortcut, const QString& filePath) } #elif defined(Q_OS_WIN) - auto icon = APPLICATION->icons()->icon(shortcut.instance->iconKey()); - if (icon == nullptr) { - icon = APPLICATION->icons()->icon("grass"); - } - iconPath = FS::PathCombine(shortcut.instance->instanceRoot(), "icon.ico"); // part of fix for weird bug involving the window icon being replaced diff --git a/launcher/minecraft/ShortcutUtils.h b/launcher/minecraft/ShortcutUtils.h index a21ccf06a..e3d2e283a 100644 --- a/launcher/minecraft/ShortcutUtils.h +++ b/launcher/minecraft/ShortcutUtils.h @@ -48,6 +48,7 @@ struct Shortcut { QString targetString; QWidget* parent = nullptr; QStringList extraArgs = {}; + QString iconKey = ""; }; /// Create an instance shortcut on the specified file path diff --git a/launcher/ui/dialogs/CreateShortcutDialog.cpp b/launcher/ui/dialogs/CreateShortcutDialog.cpp index 38c22d861..83057619e 100644 --- a/launcher/ui/dialogs/CreateShortcutDialog.cpp +++ b/launcher/ui/dialogs/CreateShortcutDialog.cpp @@ -63,8 +63,22 @@ CreateShortcutDialog::CreateShortcutDialog(InstancePtr instance, QWidget* parent m_QuickJoinSupported = instance->traits().contains("feature:is_quick_play_singleplayer"); if (!m_QuickJoinSupported) { - // TODO: Remove radio box and add a single server address textbox instead + ui->worldTarget->hide(); + ui->worldSelectionBox->hide(); } + + // Populate save targets + if (!DesktopServices::isFlatpak()) { + QString desktopDir = FS::getDesktopDir(); + QString applicationDir = FS::getApplicationsDir(); + + if (!desktopDir.isEmpty()) + ui->saveTargetSelectionBox->addItem("Desktop", QVariant::fromValue(SaveTarget::Desktop)); + + if (!applicationDir.isEmpty()) + ui->saveTargetSelectionBox->addItem("Applications", QVariant::fromValue(SaveTarget::Applications)); + } + ui->saveTargetSelectionBox->addItem("Other...", QVariant::fromValue(SaveTarget::Other)); } CreateShortcutDialog::~CreateShortcutDialog() @@ -83,15 +97,17 @@ void CreateShortcutDialog::on_iconButton_clicked() } } -void CreateShortcutDialog::on_saveTargetSelectionBox_currentIndexChanged(int index) {} - -void CreateShortcutDialog::on_instNameTextBox_textChanged(const QString& arg1) {} - -void CreateShortcutDialog::on_overrideAccountCheckbox_stateChanged(int state) {} +void CreateShortcutDialog::on_overrideAccountCheckbox_stateChanged(int state) +{ + ui->accountOptionsGroup->setEnabled(state == Qt::Checked); +} void CreateShortcutDialog::on_accountSelectionBox_currentIndexChanged(int index) {} -void CreateShortcutDialog::on_targetCheckbox_stateChanged(int state) {} +void CreateShortcutDialog::on_targetCheckbox_stateChanged(int state) +{ + ui->targetOptionsGroup->setEnabled(state == Qt::Checked); +} void CreateShortcutDialog::on_worldSelectionBox_currentIndexChanged(int index) {} @@ -113,5 +129,13 @@ void CreateShortcutDialog::createShortcut() extraArgs = { "--server", /* server address */ }; } } - ShortcutUtils::createInstanceShortcutOnDesktop({ m_instance.get(), m_instance->name(), targetString, this, extraArgs }); + + auto target = ui->saveTargetSelectionBox->currentData().value(); + auto name = ui->instNameTextBox->text(); + if (target == SaveTarget::Desktop) + ShortcutUtils::createInstanceShortcutOnDesktop({ m_instance.get(), name, targetString, this, extraArgs, InstIconKey }); + else if (target == SaveTarget::Applications) + ShortcutUtils::createInstanceShortcutInApplications({ m_instance.get(), name, targetString, this, extraArgs, InstIconKey }); + else + ShortcutUtils::createInstanceShortcutInOther({ m_instance.get(), m_instance->name(), targetString, this, extraArgs, InstIconKey }); } diff --git a/launcher/ui/dialogs/CreateShortcutDialog.h b/launcher/ui/dialogs/CreateShortcutDialog.h index 7be6b339c..04849ebfa 100644 --- a/launcher/ui/dialogs/CreateShortcutDialog.h +++ b/launcher/ui/dialogs/CreateShortcutDialog.h @@ -36,8 +36,6 @@ class CreateShortcutDialog : public QDialog { private slots: // Icon, target and name void on_iconButton_clicked(); - void on_saveTargetSelectionBox_currentIndexChanged(int index); - void on_instNameTextBox_textChanged(const QString& arg1); // Override account void on_overrideAccountCheckbox_stateChanged(int state); @@ -57,4 +55,5 @@ class CreateShortcutDialog : public QDialog { bool m_QuickJoinSupported = false; // Index representations + enum class SaveTarget { Desktop, Applications, Other }; };