From dbdc9bea7a53ac0e26e69476d7a016f92afb8dff Mon Sep 17 00:00:00 2001 From: Yihe Li Date: Sun, 11 May 2025 19:16:37 +0800 Subject: [PATCH] Add create shortcut button for servers Signed-off-by: Yihe Li --- launcher/minecraft/ShortcutUtils.cpp | 1 - launcher/ui/pages/instance/ServersPage.cpp | 75 ++++++++++++++++++++++ launcher/ui/pages/instance/ServersPage.h | 4 ++ launcher/ui/pages/instance/ServersPage.ui | 45 ++++++++++++- 4 files changed, 123 insertions(+), 2 deletions(-) diff --git a/launcher/minecraft/ShortcutUtils.cpp b/launcher/minecraft/ShortcutUtils.cpp index 7d4faf231..c579368c2 100644 --- a/launcher/minecraft/ShortcutUtils.cpp +++ b/launcher/minecraft/ShortcutUtils.cpp @@ -170,7 +170,6 @@ void createInstanceShortcut(BaseInstance* instance, iconFile.remove(); #endif QMessageBox::critical(parent, QObject::tr("Create Shortcut"), QObject::tr("Failed to create %1 shortcut!").arg(targetString)); - return; } } diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index 245bbffe2..88b21a787 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -40,8 +40,10 @@ #include "ui/dialogs/CustomMessageBox.h" #include "ui_ServersPage.h" +#include #include #include +#include #include #include #include @@ -102,6 +104,38 @@ struct Server { } } + void createServerShortcut(BaseInstance* instance, QWidget* parent = nullptr) const + { + if (!instance) + return; + + if (DesktopServices::isFlatpak()) + createServerShortcutInOther(instance, parent); + else + createServerShortcutOnDesktop(instance, parent); + } + + void createServerShortcutOnDesktop(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::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); + } + + 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); + } + // Data - persistent and user changeable QString m_name; QString m_address; @@ -696,6 +730,27 @@ void ServersPage::updateState() } ui->actionAdd->setDisabled(m_locked); + + QList shortcutActions = { ui->actionCreateServerShortcutOther }; + if (!DesktopServices::isFlatpak()) { + QString desktopDir = FS::getDesktopDir(); + QString applicationDir = FS::getApplicationsDir(); + + if (!applicationDir.isEmpty()) + shortcutActions.push_front(ui->actionCreateServerShortcutApplications); + + if (!desktopDir.isEmpty()) + shortcutActions.push_front(ui->actionCreateServerShortcutDesktop); + } + + if (shortcutActions.length() > 1) { + auto shortcutInstanceMenu = new QMenu(this); + + for (auto action : shortcutActions) + shortcutInstanceMenu->addAction(action); + ui->actionCreateServerShortcut->setMenu(shortcutInstanceMenu); + } + ui->actionCreateServerShortcut->setEnabled(serverEditEnabled); } void ServersPage::openedImpl() @@ -767,6 +822,26 @@ void ServersPage::on_actionJoin_triggered() APPLICATION->launch(m_inst, true, false, std::make_shared(MinecraftTarget::parse(address, false))); } +void ServersPage::on_actionCreateServerShortcut_triggered() +{ + m_model->at(currentServer)->createServerShortcut(m_inst.get(), this); +} + +void ServersPage::on_actionCreateServerShortcutDesktop_triggered() +{ + m_model->at(currentServer)->createServerShortcutOnDesktop(m_inst.get(), this); +} + +void ServersPage::on_actionCreateServerShortcutApplications_triggered() +{ + m_model->at(currentServer)->createServerShortcutInApplications(m_inst.get(), this); +} + +void ServersPage::on_actionCreateServerShortcutOther_triggered() +{ + m_model->at(currentServer)->createServerShortcutInOther(m_inst.get(), this); +} + void ServersPage::on_actionRefresh_triggered() { m_model->queryServersStatus(); diff --git a/launcher/ui/pages/instance/ServersPage.h b/launcher/ui/pages/instance/ServersPage.h index 77710d6cc..94baaa004 100644 --- a/launcher/ui/pages/instance/ServersPage.h +++ b/launcher/ui/pages/instance/ServersPage.h @@ -85,6 +85,10 @@ class ServersPage : public QMainWindow, public BasePage { void on_actionMove_Up_triggered(); void on_actionMove_Down_triggered(); void on_actionJoin_triggered(); + void on_actionCreateServerShortcut_triggered(); + void on_actionCreateServerShortcutDesktop_triggered(); + void on_actionCreateServerShortcutApplications_triggered(); + void on_actionCreateServerShortcutOther_triggered(); void on_actionRefresh_triggered(); void runningStateChanged(bool running); diff --git a/launcher/ui/pages/instance/ServersPage.ui b/launcher/ui/pages/instance/ServersPage.ui index d330835c8..e26152242 100644 --- a/launcher/ui/pages/instance/ServersPage.ui +++ b/launcher/ui/pages/instance/ServersPage.ui @@ -145,10 +145,12 @@ false + + - + @@ -177,6 +179,47 @@ Join + + + Create Shortcut + + + Creates a shortcut on a selected folder to join the selected server. + + + + + Desktop + + + Creates a shortcut to this server on your desktop + + + QAction::TextHeuristicRole + + + + + Applications + + + Create a shortcut of this server on your start menu + + + QAction::TextHeuristicRole + + + + + Other... + + + Creates a shortcut in a folder selected by you + + + QAction::TextHeuristicRole + + Refresh