diff options
Diffstat (limited to 'archived/projt-launcher/launcher/Application.h')
| -rw-r--r-- | archived/projt-launcher/launcher/Application.h | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/Application.h b/archived/projt-launcher/launcher/Application.h new file mode 100644 index 0000000000..9367586361 --- /dev/null +++ b/archived/projt-launcher/launcher/Application.h @@ -0,0 +1,402 @@ +// SPDX-License-Identifier: GPL-3.0-only +// SPDX-FileCopyrightText: 2026 Project Tick +// SPDX-FileContributor: Project Tick Team +/* + * ProjT Launcher - Minecraft Launcher + * Copyright (C) 2026 Project Tick + * + * 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 + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +/* === Upstream License Block (Do Not Modify) ============================== + * + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> + * Copyright (C) 2022 Tayou <git@tayou.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 + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ +#pragma once + +#include <QApplication> +#include <QDateTime> +#include <QDebug> +#include <QFlag> +#include <QIcon> +#include <QMutex> +#include <QUrl> +#include <memory> + +#include <BaseInstance.h> + +#include "LaunchMode.h" +#include "launch/LaunchLogModel.hpp" +#include "minecraft/launch/MinecraftTarget.hpp" + +class LaunchController; +class LocalPeer; +class InstanceWindow; +class MainWindow; +class ViewLogWindow; +class SetupWizard; +class GenericPageProvider; +class QFile; +class HttpMetaCache; +class SettingsObject; +class InstanceList; +class AccountList; +namespace projt::icons +{ + class IconList; +} +class QNetworkAccessManager; +namespace projt::java +{ + class RuntimeCatalog; +} +class ExternalUpdater; +class BaseProfilerFactory; +class BaseDetachedToolFactory; +class TranslationsModel; +class Theme; +class MCEditTool; +class ThemeManager; +class IconTheme; + +namespace projt::meta +{ + class MetaIndex; +} + +#if defined(APPLICATION) +#undef APPLICATION +#endif +#define APPLICATION (static_cast<Application*>(QCoreApplication::instance())) + +// Used for checking if is a test +#if defined(APPLICATION_DYN) +#undef APPLICATION_DYN +#endif +#define APPLICATION_DYN (dynamic_cast<Application*>(QCoreApplication::instance())) + +class Application : public QApplication +{ + // friends for the purpose of limiting access to deprecated stuff + Q_OBJECT + public: + enum Status + { + StartingUp, + Failed, + Succeeded, + Initialized + }; + + enum Capability + { + None = 0, + + SupportsMSA = 1 << 0, + SupportsFlame = 1 << 1, + SupportsGameMode = 1 << 2, + SupportsMangoHud = 1 << 3, + }; + Q_DECLARE_FLAGS(Capabilities, Capability) + + public: + Application(int& argc, char** argv); + virtual ~Application(); + + bool event(QEvent* event) override; + + std::shared_ptr<SettingsObject> settings() const + { + return m_settings; + } + + qint64 timeSinceStart() const + { + return m_startTime.msecsTo(QDateTime::currentDateTime()); + } + + QIcon logo(); + + ThemeManager* themeManager() + { + return m_themeManager.get(); + } + + shared_qobject_ptr<ExternalUpdater> updater() + { + return m_updater; + } + + void triggerUpdateCheck(); + + std::shared_ptr<TranslationsModel> translations(); + + std::shared_ptr<projt::java::RuntimeCatalog> runtimeCatalog(); + + std::shared_ptr<InstanceList> instances() const + { + return m_instances; + } + + std::shared_ptr<projt::icons::IconList> icons() const + { + return m_icons; + } + + MCEditTool* mcedit() const + { + return m_mcedit.get(); + } + + shared_qobject_ptr<AccountList> accounts() const + { + return m_accounts; + } + + Status status() const + { + return m_status; + } + + const QMap<QString, std::shared_ptr<BaseProfilerFactory>>& profilers() const + { + return m_profilers; + } + + void updateProxySettings(QString proxyTypeStr, QString addr, int port, QString user, QString password); + + shared_qobject_ptr<QNetworkAccessManager> network(); + + shared_qobject_ptr<HttpMetaCache> metacache(); + + shared_qobject_ptr<projt::meta::MetaIndex> metadataIndex(); + + void updateCapabilities(); + + void detectLibraries(); + + /*! + * Finds and returns the full path to a jar file. + * Returns a null-string if it could not be found. + */ + QString getJarPath(QString jarFile); + + QString getMSAClientID(); + QString getFlameAPIKey(); + QString getModrinthAPIToken(); + QString getUserAgent(); + + /// this is the root of the 'installation'. Used for automatic updates + const QString& root() + { + return m_rootPath; + } + + /// the data path the application is using + const QString& dataRoot() + { + return m_dataPath; + } + + /// the java installed path the application is using + const QString javaPath(); + + bool isPortable() + { + return m_portable; + } + + const Capabilities capabilities() + { + return m_capabilities; + } + + /*! + * Opens a json file using either a system default editor, or, if not empty, the editor + * specified in the settings + */ + bool openJsonEditor(const QString& filename); + + InstanceWindow* showInstanceWindow(InstancePtr instance, QString page = QString()); + MainWindow* showMainWindow(bool minimized = false); + ViewLogWindow* showLogWindow(); + + void updateIsRunning(bool running); + bool updatesAreAllowed(); + + void ShowGlobalSettings(class QWidget* parent, QString open_page = QString()); + + bool updaterEnabled(); + QString updaterBinaryName(); + + QUrl normalizeImportUrl(QString const& url); + + signals: + void updateAllowedChanged(bool status); + void globalSettingsAboutToOpen(); + void globalSettingsApplied(); + int currentCatChanged(int index); + + void oauthReplyRecieved(QVariantMap); + +#ifdef Q_OS_MACOS + void clickedOnDock(); +#endif + + public slots: + bool launch(InstancePtr instance, + LaunchMode mode = LaunchMode::Normal, + MinecraftTarget::Ptr targetToJoin = nullptr, + MinecraftAccountPtr accountToUse = nullptr, + const QString& offlineName = QString()); + bool kill(InstancePtr instance); + void closeCurrentWindow(); + + private slots: + void on_windowClose(); + void messageReceived(const QByteArray& message); + void controllerSucceeded(); + void controllerFailed(const QString& error); + void setupWizardFinished(int status); + void continueLaunchAfterBackup(QString instanceId, LaunchMode mode, QString offlineName); + + private: + bool handleDataMigration(const QString& currentData, + const QString& oldData, + const QString& name, + const QString& configFile) const; + bool createSetupWizard(); + void performMainStartupAction(); + + // sets the fatal error message and m_status to Failed. + void showFatalErrorMessage(const QString& title, const QString& content); + + private: + void addRunningInstance(); + void subRunningInstance(); + bool shouldExitNow() const; + + /// Migrates legacy pastebin settings to new format + void migratePastebinSettings(); + + private: + QDateTime m_startTime; + + shared_qobject_ptr<QNetworkAccessManager> m_network; + + shared_qobject_ptr<ExternalUpdater> m_updater; + shared_qobject_ptr<AccountList> m_accounts; + + shared_qobject_ptr<HttpMetaCache> m_metacache; + shared_qobject_ptr<projt::meta::MetaIndex> m_metadataIndex; + + std::shared_ptr<SettingsObject> m_settings; + std::shared_ptr<InstanceList> m_instances; + std::shared_ptr<projt::icons::IconList> m_icons; + std::shared_ptr<projt::java::RuntimeCatalog> m_runtimeCatalog; + std::shared_ptr<TranslationsModel> m_translations; + std::shared_ptr<GenericPageProvider> m_globalSettingsProvider; + std::unique_ptr<MCEditTool> m_mcedit; + QSet<QString> m_features; + std::unique_ptr<ThemeManager> m_themeManager; + + QMap<QString, std::shared_ptr<BaseProfilerFactory>> m_profilers; + + QString m_rootPath; + QString m_dataPath; + Status m_status = Application::StartingUp; + Capabilities m_capabilities; + bool m_portable = false; + +#ifdef Q_OS_MACOS + Qt::ApplicationState m_prevAppState = Qt::ApplicationInactive; +#endif + +#if defined Q_OS_WIN32 + // used on Windows to attach the standard IO streams + bool consoleAttached = false; +#endif + + // main state variables + size_t m_openWindows = 0; + size_t m_runningInstances = 0; + bool m_updateRunning = false; + + // main window, if any + MainWindow* m_mainWindow = nullptr; + + // log window, if any + ViewLogWindow* m_viewLogWindow = nullptr; + + // peer launcher instance connector - used to implement single instance launcher and signalling + LocalPeer* m_peerInstance = nullptr; + + SetupWizard* m_setupWizard = nullptr; + + public: + QString m_detectedGLFWPath; + QString m_detectedOpenALPath; + QString m_instanceIdToLaunch; + QString m_serverToJoin; + QString m_worldToJoin; + QString m_profileToUse; + bool m_offline = false; + QString m_offlineName; + bool m_liveCheck = false; + QList<QUrl> m_urlsToImport; + QString m_instanceIdToShowWindowOf; + std::unique_ptr<QFile> logFile; + shared_qobject_ptr<projt::launch::LaunchLogModel> logModel; + + public: + void addQSavePath(QString); + void removeQSavePath(QString); + bool checkQSavePath(QString); + + private: + QHash<QString, int> m_qsaveResources; + mutable QMutex m_qsaveResourcesMutex; +}; |
