diff options
Diffstat (limited to 'launcher')
| -rw-r--r-- | launcher/Application.cpp | 21 | ||||
| -rw-r--r-- | launcher/Application.h | 13 | ||||
| -rw-r--r-- | launcher/BaseInstance.cpp | 5 | ||||
| -rw-r--r-- | launcher/BaseInstance.h | 14 | ||||
| -rw-r--r-- | launcher/LaunchController.cpp | 10 | ||||
| -rw-r--r-- | launcher/NullInstance.h | 6 | ||||
| -rw-r--r-- | launcher/minecraft/MinecraftInstance.cpp | 52 | ||||
| -rw-r--r-- | launcher/minecraft/MinecraftInstance.h | 4 | ||||
| -rw-r--r-- | launcher/ui/InstanceWindow.cpp | 122 | ||||
| -rw-r--r-- | launcher/ui/InstanceWindow.h | 16 | ||||
| -rw-r--r-- | launcher/ui/MainWindow.cpp | 101 | ||||
| -rw-r--r-- | launcher/ui/MainWindow.h | 8 | ||||
| -rw-r--r-- | launcher/ui/MainWindow.ui | 22 | ||||
| -rw-r--r-- | launcher/ui/pages/instance/ServersPage.cpp | 4 | 
14 files changed, 152 insertions, 246 deletions
| diff --git a/launcher/Application.cpp b/launcher/Application.cpp index aeea90f1..6772bedc 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1018,7 +1018,7 @@ void Application::performMainStartupAction()                  qDebug() << "   Launching with account" << m_profileToUse;              } -            launch(inst, true, false, nullptr, serverToJoin, accountToUse); +            launch(inst, true, false, serverToJoin, accountToUse);              return;          }      } @@ -1133,7 +1133,6 @@ void Application::messageReceived(const QByteArray& message)              instance,              true,              false, -            nullptr,              serverObject,              accountObject          ); @@ -1210,14 +1209,12 @@ bool Application::openJsonEditor(const QString& filename)      }  } -bool Application::launch( -        InstancePtr instance, -        bool online, -        bool demo, -        BaseProfilerFactory *profiler, -        MinecraftServerTargetPtr serverToJoin, -        MinecraftAccountPtr accountToUse -) { +bool Application::launch(InstancePtr instance, +                         bool online, +                         bool demo, +                         MinecraftServerTargetPtr serverToJoin, +                         MinecraftAccountPtr accountToUse) +{      if(m_updateRunning)      {          qDebug() << "Cannot launch instances while an update is running. Please try again when updates are completed."; @@ -1225,7 +1222,7 @@ bool Application::launch(      else if(instance->canLaunch())      {          auto & extras = m_instanceExtras[instance->id()]; -        auto & window = extras.window; +        auto window = extras.window;          if(window)          {              if(!window->saveAll()) @@ -1238,7 +1235,7 @@ bool Application::launch(          controller->setInstance(instance);          controller->setOnline(online);          controller->setDemo(demo); -        controller->setProfiler(profiler); +        controller->setProfiler(profilers().value(instance->settings()->get("Profiler").toString(), nullptr).get());          controller->setServerToJoin(serverToJoin);          controller->setAccountToUse(accountToUse);          if(window) diff --git a/launcher/Application.h b/launcher/Application.h index c0a980b2..769dc6a6 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -225,14 +225,11 @@ signals:  #endif  public slots: -    bool launch( -        InstancePtr instance, -        bool online = true, -        bool demo = false, -        BaseProfilerFactory *profiler = nullptr, -        MinecraftServerTargetPtr serverToJoin = nullptr, -        MinecraftAccountPtr accountToUse = nullptr -    ); +    bool launch(InstancePtr instance, +                bool online = true, +                bool demo = false, +                MinecraftServerTargetPtr serverToJoin = nullptr, +                MinecraftAccountPtr accountToUse = nullptr);      bool kill(InstancePtr instance);      void closeCurrentWindow(); diff --git a/launcher/BaseInstance.cpp b/launcher/BaseInstance.cpp index a8fce879..28b4cb5c 100644 --- a/launcher/BaseInstance.cpp +++ b/launcher/BaseInstance.cpp @@ -1,8 +1,9 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>   *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -101,6 +102,8 @@ BaseInstance::BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr s      m_settings->registerSetting("ManagedPackName", "");      m_settings->registerSetting("ManagedPackVersionID", "");      m_settings->registerSetting("ManagedPackVersionName", ""); + +    m_settings->registerSetting("Profiler", "");  }  QString BaseInstance::getPreLaunchCommand() diff --git a/launcher/BaseInstance.h b/launcher/BaseInstance.h index 83a8064f..7da4e20b 100644 --- a/launcher/BaseInstance.h +++ b/launcher/BaseInstance.h @@ -1,8 +1,9 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>   *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -37,11 +38,12 @@  #pragma once  #include <cassert> -#include <QObject> -#include "QObjectPtr.h"  #include <QDateTime> -#include <QSet> +#include <QMenu> +#include <QObject>  #include <QProcess> +#include <QSet> +#include "QObjectPtr.h"  #include "settings/SettingsObject.h" @@ -270,6 +272,8 @@ public:      virtual bool canEdit() const = 0;      virtual bool canExport() const = 0; +    virtual void populateLaunchMenu(QMenu* menu) = 0; +      bool reloadSettings();      /** @@ -306,6 +310,8 @@ signals:      void runningStatusChanged(bool running); +    void profilerChanged(); +      void statusChanged(Status from, Status to);  protected slots: diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 2b52cac0..b95742ec 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -1,7 +1,8 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -409,22 +410,21 @@ void LaunchController::readyForLaunch()      if (!m_profiler->check(&error))      {          m_launcher->abort(); -        QMessageBox::critical(m_parentWidget, tr("Error!"), tr("Couldn't start profiler: %1").arg(error));          emitFailed("Profiler startup failed!"); +        QMessageBox::critical(m_parentWidget, tr("Error!"), tr("Profiler check for %1 failed: %2").arg(m_profiler->name(), error));          return;      }      BaseProfiler *profilerInstance = m_profiler->createProfiler(m_launcher->instance(), this);      connect(profilerInstance, &BaseProfiler::readyToLaunch, [this](const QString & message)      { -        QMessageBox msg; +        QMessageBox msg(m_parentWidget);          msg.setText(tr("The game launch is delayed until you press the "                          "button. This is the right time to setup the profiler, as the "                          "profiler server is running now.\n\n%1").arg(message));          msg.setWindowTitle(tr("Waiting."));          msg.setIcon(QMessageBox::Information); -        msg.addButton(tr("Launch"), QMessageBox::AcceptRole); -        msg.setModal(true); +        msg.addButton(tr("&Launch"), QMessageBox::AcceptRole);          msg.exec();          m_launcher->proceed();      }); diff --git a/launcher/NullInstance.h b/launcher/NullInstance.h index 53edfa0b..b0ec89f4 100644 --- a/launcher/NullInstance.h +++ b/launcher/NullInstance.h @@ -1,7 +1,8 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -110,6 +111,9 @@ public:      {          return false;      } +    void populateLaunchMenu(QMenu* menu) override +    { +    }      QStringList verboseDescription(AuthSessionPtr session, MinecraftServerTargetPtr serverToJoin) override      {          QStringList out; diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 342e634f..9d8fac84 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -3,7 +3,7 @@   *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>   *  Copyright (C) 2022 Jamie Mansfield <jmansfield@cadixdev.org> - *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *  Copyright (c) 2023 seth <getchoo at tuta dot io>   *   *  This program is free software: you can redistribute it and/or modify @@ -89,6 +89,10 @@  #include "minecraft/gameoptions/GameOptions.h"  #include "minecraft/update/FoldersTask.h" +#include "tools/BaseProfiler.h" + +#include <QActionGroup> +  #ifdef Q_OS_LINUX  #include "MangoHud.h"  #endif @@ -239,6 +243,52 @@ QSet<QString> MinecraftInstance::traits() const      return profile->getTraits();  } +void MinecraftInstance::populateLaunchMenu(QMenu* menu) +{ +    QAction* normalLaunch = menu->addAction(tr("&Launch")); +    normalLaunch->setShortcut(QKeySequence::Open); +    QAction* normalLaunchOffline = menu->addAction(tr("Launch &Offline")); +    normalLaunchOffline->setShortcut(QKeySequence(tr("Ctrl+Shift+O"))); +    QAction* normalLaunchDemo = menu->addAction(tr("Launch &Demo")); +    normalLaunchDemo->setShortcut(QKeySequence(tr("Ctrl+Alt+O"))); + +    normalLaunchDemo->setEnabled(supportsDemo()); + +    connect(normalLaunch, &QAction::triggered, [this] { APPLICATION->launch(shared_from_this()); }); +    connect(normalLaunchOffline, &QAction::triggered, [this] { APPLICATION->launch(shared_from_this(), false, false); }); +    connect(normalLaunchDemo, &QAction::triggered, [this] { APPLICATION->launch(shared_from_this(), false, true); }); + +    QString profilersTitle = tr("Profilers"); +    menu->addSeparator()->setText(profilersTitle); + +    auto profilers = new QActionGroup(menu); +    profilers->setExclusive(true); +    connect(profilers, &QActionGroup::triggered, [this](QAction* action) { +        settings()->set("Profiler", action->data()); +        emit profilerChanged(); +    }); + +    QAction* noProfilerAction = menu->addAction(tr("&No Profiler")); +    noProfilerAction->setData(""); +    noProfilerAction->setCheckable(true); +    noProfilerAction->setChecked(true); +    profilers->addAction(noProfilerAction); + +    for (auto profiler = APPLICATION->profilers().begin(); profiler != APPLICATION->profilers().end(); profiler++) { +        QAction* profilerAction = menu->addAction(profiler.value()->name()); +        profilers->addAction(profilerAction); +        profilerAction->setData(profiler.key()); +        profilerAction->setCheckable(true); +        profilerAction->setChecked(settings()->get("Profiler").toString() == profiler.key()); + +        QString error; +        if (profiler.value()->check(&error)) +            profilerAction->setIcon(APPLICATION->getThemedIcon("status-good")); +        else +            profilerAction->setIcon(APPLICATION->getThemedIcon("status-bad")); +    } +} +  QString MinecraftInstance::gameRoot() const  {      QFileInfo mcDir(FS::PathCombine(instanceRoot(), "minecraft")); diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 068b3008..c5ebbb7c 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -2,7 +2,7 @@  /*   *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> - *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -77,6 +77,8 @@ public:          return true;      } +    void populateLaunchMenu(QMenu* menu) override; +      ////// Directories and files //////      QString jarModsDir() const;      QString resourcePacksDir() const; diff --git a/launcher/ui/InstanceWindow.cpp b/launcher/ui/InstanceWindow.cpp index c62b370f..ac8454c7 100644 --- a/launcher/ui/InstanceWindow.cpp +++ b/launcher/ui/InstanceWindow.cpp @@ -1,7 +1,8 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -43,8 +44,6 @@  #include <qlayoutitem.h>  #include <QCloseEvent> -#include "ui/dialogs/CustomMessageBox.h" -#include "ui/dialogs/ProgressDialog.h"  #include "ui/widgets/PageContainer.h"  #include "InstancePageProvider.h" @@ -76,40 +75,44 @@ InstanceWindow::InstanceWindow(InstancePtr instance, QWidget *parent)      // Add custom buttons to the page container layout.      { -        auto horizontalLayout = new QHBoxLayout(); +        auto horizontalLayout = new QHBoxLayout(this);          horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));          horizontalLayout->setContentsMargins(6, -1, 6, -1); -        auto btnHelp = new QPushButton(); +        auto btnHelp = new QPushButton(this);          btnHelp->setText(tr("Help"));          horizontalLayout->addWidget(btnHelp); -        connect(btnHelp, SIGNAL(clicked(bool)), m_container, SLOT(help())); +        connect(btnHelp, &QPushButton::clicked, m_container, &PageContainer::help);          auto spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);          horizontalLayout->addSpacerItem(spacer); -        m_killButton = new QPushButton(); -        horizontalLayout->addWidget(m_killButton); -        connect(m_killButton, SIGNAL(clicked(bool)), SLOT(on_btnKillMinecraft_clicked())); - -        m_launchOfflineButton = new QPushButton(); -        horizontalLayout->addWidget(m_launchOfflineButton); -        m_launchOfflineButton->setText(tr("Launch Offline")); +        m_launchButton = new QToolButton(this); +        m_launchButton->setText(tr("&Launch")); +        m_launchButton->setToolTip(tr("Launch the instance")); +        m_launchButton->setPopupMode(QToolButton::MenuButtonPopup); +        m_launchButton->setMinimumWidth(80); // HACK!! +        horizontalLayout->addWidget(m_launchButton); +        connect(m_launchButton, &QPushButton::clicked, this, [this] { APPLICATION->launch(m_instance); }); -        m_launchDemoButton = new QPushButton(); -        horizontalLayout->addWidget(m_launchDemoButton); -        m_launchDemoButton->setText(tr("Launch Demo")); +        m_killButton = new QPushButton(this); +        m_killButton->setText(tr("&Kill")); +        m_killButton->setToolTip(tr("Kill the running instance")); +        m_killButton->setShortcut(QKeySequence(tr("Ctrl+K"))); +        horizontalLayout->addWidget(m_killButton); +        connect(m_killButton, &QPushButton::clicked, this, [this] { APPLICATION->kill(m_instance); }); -        updateLaunchButtons(); -        connect(m_launchOfflineButton, SIGNAL(clicked(bool)), SLOT(on_btnLaunchMinecraftOffline_clicked())); -        connect(m_launchDemoButton, SIGNAL(clicked(bool)), SLOT(on_btnLaunchMinecraftDemo_clicked())); +        updateButtons(); -        m_closeButton = new QPushButton(); +        m_closeButton = new QPushButton(this);          m_closeButton->setText(tr("Close"));          horizontalLayout->addWidget(m_closeButton); -        connect(m_closeButton, SIGNAL(clicked(bool)), SLOT(on_closeButton_clicked())); +        connect(m_closeButton, &QPushButton::clicked, this, &QMainWindow::close);          m_container->addButtons(horizontalLayout); + +        connect(m_instance.get(), &BaseInstance::profilerChanged, this, &InstanceWindow::updateButtons); +        connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceWindow::updateButtons);      }      // restore window state @@ -150,52 +153,18 @@ void InstanceWindow::on_instanceStatusChanged(BaseInstance::Status, BaseInstance      }  } -void InstanceWindow::updateLaunchButtons() +void InstanceWindow::updateButtons()  { -    if(m_instance->isRunning()) -    { -        m_launchOfflineButton->setEnabled(false); -        m_launchDemoButton->setEnabled(false); -        m_killButton->setText(tr("Kill")); -        m_killButton->setObjectName("killButton"); -        m_killButton->setToolTip(tr("Kill the running instance")); -    } -    else if(!m_instance->canLaunch()) -    { -        m_launchOfflineButton->setEnabled(false); -        m_launchDemoButton->setEnabled(false); -        m_killButton->setText(tr("Launch")); -        m_killButton->setObjectName("launchButton"); -        m_killButton->setToolTip(tr("Launch the instance")); -        m_killButton->setEnabled(false); -    } -    else -    { -        m_launchOfflineButton->setEnabled(true); +    m_launchButton->setEnabled(m_instance->canLaunch()); +    m_killButton->setEnabled(m_instance->isRunning()); -        // Disable demo-mode if not available. -        auto instance = dynamic_cast<MinecraftInstance*>(m_instance.get()); -        if (instance) { -            m_launchDemoButton->setEnabled(instance->supportsDemo()); -        } - -        m_killButton->setText(tr("Launch")); -        m_killButton->setObjectName("launchButton"); -        m_killButton->setToolTip(tr("Launch the instance")); -    } -    // NOTE: this is a hack to force the button to recalculate its style -    m_killButton->setStyleSheet("/* */"); -    m_killButton->setStyleSheet(QString()); -} - -void InstanceWindow::on_btnLaunchMinecraftOffline_clicked() -{ -    APPLICATION->launch(m_instance, false, false, nullptr); -} - -void InstanceWindow::on_btnLaunchMinecraftDemo_clicked() -{ -    APPLICATION->launch(m_instance, false, true, nullptr); +    QMenu *launchMenu = m_launchButton->menu(); +    if (launchMenu) +        launchMenu->clear(); +    else +        launchMenu = new QMenu(this); +    m_instance->populateLaunchMenu(launchMenu); +    m_launchButton->setMenu(launchMenu);  }  void InstanceWindow::instanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc) @@ -205,18 +174,13 @@ void InstanceWindow::instanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> pr  void InstanceWindow::runningStateChanged(bool running)  { -    updateLaunchButtons(); +    updateButtons();      m_container->refreshContainer();      if(running) {          selectPage("log");      }  } -void InstanceWindow::on_closeButton_clicked() -{ -    close(); -} -  void InstanceWindow::closeEvent(QCloseEvent *event)  {      bool proceed = true; @@ -241,18 +205,6 @@ bool InstanceWindow::saveAll()      return m_container->saveAll();  } -void InstanceWindow::on_btnKillMinecraft_clicked() -{ -    if(m_instance->isRunning()) -    { -        APPLICATION->kill(m_instance); -    } -    else -    { -        APPLICATION->launch(m_instance, true, false, nullptr); -    } -} -  QString InstanceWindow::instanceId()  {      return m_instance->id(); @@ -268,10 +220,6 @@ void InstanceWindow::refreshContainer()      m_container->refreshContainer();  } -InstanceWindow::~InstanceWindow() -{ -} -  bool InstanceWindow::requestClose()  {      if(m_container->prepareToClose()) diff --git a/launcher/ui/InstanceWindow.h b/launcher/ui/InstanceWindow.h index 554c4c74..64d9a45e 100644 --- a/launcher/ui/InstanceWindow.h +++ b/launcher/ui/InstanceWindow.h @@ -1,7 +1,8 @@  // SPDX-License-Identifier: GPL-3.0-only  /* - *  PolyMC - Minecraft Launcher + *  Prism Launcher - Minecraft Launcher   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -37,6 +38,7 @@  #include <QMainWindow>  #include <QSystemTrayIcon> +#include <QToolButton>  #include "LaunchController.h"  #include "launch/LaunchTask.h" @@ -53,7 +55,7 @@ class InstanceWindow : public QMainWindow, public BasePageContainer  public:      explicit InstanceWindow(InstancePtr proc, QWidget *parent = 0); -    virtual ~InstanceWindow(); +    virtual ~InstanceWindow() = default;      bool selectPage(QString pageId) override;      void refreshContainer() override; @@ -71,11 +73,6 @@ signals:  private  slots: -    void on_closeButton_clicked(); -    void on_btnKillMinecraft_clicked(); -    void on_btnLaunchMinecraftOffline_clicked(); -    void on_btnLaunchMinecraftDemo_clicked(); -      void instanceLaunchTaskChanged(shared_qobject_ptr<LaunchTask> proc);      void runningStateChanged(bool running);      void on_instanceStatusChanged(BaseInstance::Status, BaseInstance::Status newStatus); @@ -84,7 +81,7 @@ protected:      void closeEvent(QCloseEvent *) override;  private: -    void updateLaunchButtons(); +    void updateButtons();  private:      shared_qobject_ptr<LaunchTask> m_proc; @@ -92,7 +89,6 @@ private:      bool m_doNotSave = false;      PageContainer *m_container = nullptr;      QPushButton *m_closeButton = nullptr; +    QToolButton *m_launchButton = nullptr;      QPushButton *m_killButton = nullptr; -    QPushButton *m_launchOfflineButton = nullptr; -    QPushButton *m_launchDemoButton = nullptr;  }; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index da572fc3..00f40365 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -549,71 +549,14 @@ void MainWindow::updateMainToolBar()      ui->mainToolBar->setVisible(ui->menuBar->isNativeMenuBar() || !APPLICATION->settings()->get("MenuBarInsteadOfToolBar").toBool());  } -void MainWindow::updateToolsMenu() +void MainWindow::updateLaunchButton()  { -    bool currentInstanceRunning = m_selectedInstance && m_selectedInstance->isRunning(); - -    ui->actionLaunchInstance->setDisabled(!m_selectedInstance || currentInstanceRunning); -    ui->actionLaunchInstanceOffline->setDisabled(!m_selectedInstance || currentInstanceRunning); -    ui->actionLaunchInstanceDemo->setDisabled(!m_selectedInstance || currentInstanceRunning); - -    QMenu* launchMenu = ui->actionLaunchInstance->menu(); -    if (launchMenu) { +    QMenu *launchMenu = ui->actionLaunchInstance->menu(); +    if (launchMenu)          launchMenu->clear(); -    } else { +    else          launchMenu = new QMenu(this); -    } -    QAction* normalLaunch = launchMenu->addAction(tr("Launch")); -    normalLaunch->setShortcut(QKeySequence::Open); -    QAction* normalLaunchOffline = launchMenu->addAction(tr("Launch Offline")); -    normalLaunchOffline->setShortcut(QKeySequence(tr("Ctrl+Shift+O"))); -    QAction* normalLaunchDemo = launchMenu->addAction(tr("Launch Demo")); -    normalLaunchDemo->setShortcut(QKeySequence(tr("Ctrl+Alt+O"))); -    if (m_selectedInstance) { -        normalLaunch->setEnabled(m_selectedInstance->canLaunch()); -        normalLaunchOffline->setEnabled(m_selectedInstance->canLaunch()); -        normalLaunchDemo->setEnabled(m_selectedInstance->canLaunch()); - -        connect(normalLaunch, &QAction::triggered, [this]() { APPLICATION->launch(m_selectedInstance, true, false); }); -        connect(normalLaunchOffline, &QAction::triggered, [this]() { APPLICATION->launch(m_selectedInstance, false, false); }); -        connect(normalLaunchDemo, &QAction::triggered, [this]() { APPLICATION->launch(m_selectedInstance, false, true); }); -    } else { -        normalLaunch->setDisabled(true); -        normalLaunchOffline->setDisabled(true); -        normalLaunchDemo->setDisabled(true); -    } - -    // Disable demo-mode if not available. -    auto instance = dynamic_cast<MinecraftInstance*>(m_selectedInstance.get()); -    if (instance) { -        normalLaunchDemo->setEnabled(instance->supportsDemo()); -    } - -    QString profilersTitle = tr("Profilers"); -    launchMenu->addSeparator()->setText(profilersTitle); -    for (auto profiler : APPLICATION->profilers().values()) { -        QAction* profilerAction = launchMenu->addAction(profiler->name()); -        QAction* profilerOfflineAction = launchMenu->addAction(tr("%1 Offline").arg(profiler->name())); -        QString error; -        if (!profiler->check(&error)) { -            profilerAction->setDisabled(true); -            profilerOfflineAction->setDisabled(true); -            QString profilerToolTip = tr("Profiler not setup correctly. Go into settings, \"External Tools\"."); -            profilerAction->setToolTip(profilerToolTip); -            profilerOfflineAction->setToolTip(profilerToolTip); -        } else if (m_selectedInstance) { -            profilerAction->setEnabled(m_selectedInstance->canLaunch()); -            profilerOfflineAction->setEnabled(m_selectedInstance->canLaunch()); - -            connect(profilerAction, &QAction::triggered, -                    [this, profiler]() { APPLICATION->launch(m_selectedInstance, true, false, profiler.get()); }); -            connect(profilerOfflineAction, &QAction::triggered, -                    [this, profiler]() { APPLICATION->launch(m_selectedInstance, false, false, profiler.get()); }); -        } else { -            profilerAction->setDisabled(true); -            profilerOfflineAction->setDisabled(true); -        } -    } +    m_selectedInstance->populateLaunchMenu(launchMenu);      ui->actionLaunchInstance->setMenu(launchMenu);  } @@ -1177,7 +1120,7 @@ void MainWindow::globalSettingsClosed()      proxymodel->invalidate();      proxymodel->sort(0);      updateMainToolBar(); -    updateToolsMenu(); +    updateLaunchButton();      updateThemeMenu();      updateStatusCenter();      // This needs to be done to prevent UI elements disappearing in the event the config is changed @@ -1418,20 +1361,6 @@ void MainWindow::activateInstance(InstancePtr instance)      APPLICATION->launch(instance);  } -void MainWindow::on_actionLaunchInstanceOffline_triggered() -{ -    if (m_selectedInstance) { -        APPLICATION->launch(m_selectedInstance, false); -    } -} - -void MainWindow::on_actionLaunchInstanceDemo_triggered() -{ -    if (m_selectedInstance) { -        APPLICATION->launch(m_selectedInstance, false, true); -    } -} -  void MainWindow::on_actionKillInstance_triggered()  {      if (m_selectedInstance && m_selectedInstance->isRunning()) { @@ -1605,6 +1534,7 @@ void MainWindow::instanceChanged(const QModelIndex& current, const QModelIndex&      }      if (m_selectedInstance) {          disconnect(m_selectedInstance.get(), &BaseInstance::runningStatusChanged, this, &MainWindow::refreshCurrentInstance); +        disconnect(m_selectedInstance.get(), &BaseInstance::profilerChanged, this, &MainWindow::refreshCurrentInstance);      }      QString id = current.data(InstanceList::InstanceIDRole).toString();      m_selectedInstance = APPLICATION->instances()->getInstanceById(id); @@ -1612,14 +1542,6 @@ void MainWindow::instanceChanged(const QModelIndex& current, const QModelIndex&          ui->instanceToolBar->setEnabled(true);          setInstanceActionsEnabled(true);          ui->actionLaunchInstance->setEnabled(m_selectedInstance->canLaunch()); -        ui->actionLaunchInstanceOffline->setEnabled(m_selectedInstance->canLaunch()); -        ui->actionLaunchInstanceDemo->setEnabled(m_selectedInstance->canLaunch()); - -        // Disable demo-mode if not available. -        auto instance = dynamic_cast<MinecraftInstance*>(m_selectedInstance.get()); -        if (instance) { -            ui->actionLaunchInstanceDemo->setEnabled(instance->supportsDemo()); -        }          ui->actionKillInstance->setEnabled(m_selectedInstance->isRunning());          ui->actionExportInstance->setEnabled(m_selectedInstance->canExport()); @@ -1628,17 +1550,16 @@ void MainWindow::instanceChanged(const QModelIndex& current, const QModelIndex&          updateStatusCenter();          updateInstanceToolIcon(m_selectedInstance->iconKey()); -        updateToolsMenu(); +        updateLaunchButton();          APPLICATION->settings()->set("SelectedInstance", m_selectedInstance->id());          connect(m_selectedInstance.get(), &BaseInstance::runningStatusChanged, this, &MainWindow::refreshCurrentInstance); +        connect(m_selectedInstance.get(), &BaseInstance::profilerChanged, this, &MainWindow::refreshCurrentInstance);      } else {          ui->instanceToolBar->setEnabled(false);          setInstanceActionsEnabled(false);          ui->actionLaunchInstance->setEnabled(false); -        ui->actionLaunchInstanceOffline->setEnabled(false); -        ui->actionLaunchInstanceDemo->setEnabled(false);          ui->actionKillInstance->setEnabled(false);          APPLICATION->settings()->set("SelectedInstance", QString());          selectionBad(); @@ -1668,7 +1589,7 @@ void MainWindow::selectionBad()      statusBar()->clearMessage();      ui->instanceToolBar->setEnabled(false);      setInstanceActionsEnabled(false); -    updateToolsMenu(); +    updateLaunchButton();      renameButton->setText(tr("Rename Instance"));      updateInstanceToolIcon("grass"); @@ -1731,7 +1652,7 @@ void MainWindow::setInstanceActionsEnabled(bool enabled)      ui->actionCreateInstanceShortcut->setEnabled(enabled);  } -void MainWindow::refreshCurrentInstance(bool running) +void MainWindow::refreshCurrentInstance()  {      auto current = view->selectionModel()->currentIndex();      instanceChanged(current, current); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index 27c2756f..cb6505ea 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -143,10 +143,6 @@ private slots:      void on_actionLaunchInstance_triggered(); -    void on_actionLaunchInstanceOffline_triggered(); - -    void on_actionLaunchInstanceDemo_triggered(); -      void on_actionKillInstance_triggered();      void on_actionDeleteInstance_triggered(); @@ -177,7 +173,7 @@ private slots:      void updateMainToolBar(); -    void updateToolsMenu(); +    void updateLaunchButton();      void updateThemeMenu(); @@ -212,7 +208,7 @@ private slots:      void keyReleaseEvent(QKeyEvent *event) override;  #endif -    void refreshCurrentInstance(bool running); +    void refreshCurrentInstance();  private:      void retranslateUi(); diff --git a/launcher/ui/MainWindow.ui b/launcher/ui/MainWindow.ui index e4421d40..b2d5343b 100644 --- a/launcher/ui/MainWindow.ui +++ b/launcher/ui/MainWindow.ui @@ -435,22 +435,6 @@      <string>Ctrl+D</string>     </property>    </action> -  <action name="actionLaunchInstanceOffline"> -   <property name="text"> -    <string>Launch &Offline</string> -   </property> -   <property name="toolTip"> -    <string>Launch the selected instance in offline mode.</string> -   </property> -  </action> -  <action name="actionLaunchInstanceDemo"> -   <property name="text"> -    <string>Launch &Demo</string> -   </property> -   <property name="toolTip"> -    <string>Launch the selected instance in demo mode.</string> -   </property> -  </action>    <action name="actionExportInstance">     <property name="icon">      <iconset theme="export"> @@ -465,7 +449,8 @@    </action>    <action name="actionExportInstanceZip">     <property name="icon"> -    <iconset theme="launcher"/> +    <iconset theme="launcher"> +     <normaloff>.</normaloff>.</iconset>     </property>     <property name="text">      <string>Prism Launcher (zip)</string> @@ -473,7 +458,8 @@    </action>    <action name="actionExportInstanceMrPack">     <property name="icon"> -    <iconset theme="modrinth"/> +    <iconset theme="modrinth"> +     <normaloff>.</normaloff>.</iconset>     </property>     <property name="text">      <string>Modrinth (mrpack)</string> diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index 4b1fa08a..5e899a11 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -3,7 +3,7 @@   *  Prism Launcher - Minecraft Launcher   *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>   *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> - *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> + *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>   *   *  This program is free software: you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -835,7 +835,7 @@ void ServersPage::on_actionMove_Down_triggered()  void ServersPage::on_actionJoin_triggered()  {      const auto &address = m_model->at(currentServer)->m_address; -    APPLICATION->launch(m_inst, true, false, nullptr, std::make_shared<MinecraftServerTarget>(MinecraftServerTarget::parse(address))); +    APPLICATION->launch(m_inst, true, false, std::make_shared<MinecraftServerTarget>(MinecraftServerTarget::parse(address)));  }  #include "ServersPage.moc" | 
