2022-06-12 12:50:58 +01:00
// SPDX-License-Identifier: GPL-3.0-only
/*
2022-12-14 15:02:04 +00:00
* Prism Launcher - Minecraft Launcher
2022-06-12 12:50:58 +01:00
* Copyright ( C ) 2022 Sefa Eyeoglu < contact @ scrumplex . net >
2022-12-14 15:02:04 +00:00
* Copyright ( C ) 2022 TheKodeToad < TheKodeToad @ proton . me >
2013-02-19 23:07:52 +00:00
*
2022-06-12 12:50:58 +01:00
* 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.
2013-01-09 18:22:22 +00:00
*
2022-06-12 12:50:58 +01:00
* 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 .
2013-03-11 21:19:17 +00:00
*
2022-06-12 12:50:58 +01:00
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
2013-01-09 18:22:22 +00:00
*
2022-06-12 12:50:58 +01:00
* This file incorporates work covered by the following copyright and
* permission notice :
2013-02-19 23:07:52 +00:00
*
2022-06-12 12:50:58 +01:00
* Copyright 2013 - 2021 MultiMC Contributors
2013-01-09 18:22:22 +00:00
*
2022-06-12 12:50:58 +01:00
* Authors : Andrew Okin
* Peterix
* Orochimarufan < orochimarufan . x3 @ gmail . com >
2013-03-11 21:19:17 +00:00
*
2022-06-12 12:50:58 +01:00
* 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
2013-01-09 18:22:22 +00:00
*
2022-06-12 12:50:58 +01:00
* 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 .
2013-01-09 18:22:22 +00:00
*/
2022-06-12 12:50:58 +01:00
2021-11-20 15:22:22 +00:00
# include "Application.h"
2014-04-06 02:59:37 +01:00
# include "BuildConfig.h"
2022-10-22 15:56:27 +01:00
# include "FileSystem.h"
2013-01-09 18:22:22 +00:00
2013-11-04 01:53:05 +00:00
# include "MainWindow.h"
2015-03-01 21:20:57 +00:00
2022-05-02 18:10:45 +01:00
# include <QVariant>
# include <QUrl>
# include <QDir>
# include <QFileInfo>
# include <QKeyEvent>
# include <QAction>
2022-11-15 08:19:46 +00:00
# include <QActionGroup>
2022-05-02 18:10:45 +01:00
# include <QApplication>
# include <QButtonGroup>
# include <QHBoxLayout>
# include <QHeaderView>
# include <QMainWindow>
# include <QStatusBar>
# include <QToolBar>
# include <QWidget>
# include <QMenu>
# include <QMenuBar>
# include <QMessageBox>
2022-10-19 14:53:57 +01:00
# include <QFileDialog>
2022-05-02 18:10:45 +01:00
# include <QInputDialog>
# include <QLabel>
# include <QToolButton>
# include <QWidgetAction>
# include <QProgressDialog>
# include <QShortcut>
2015-10-20 16:18:53 +01:00
# include <BaseInstance.h>
# include <InstanceList.h>
2022-11-19 16:31:58 +00:00
# include <minecraft/MinecraftInstance.h>
2015-10-20 16:18:53 +01:00
# include <MMCZip.h>
# include <icons/IconList.h>
# include <java/JavaUtils.h>
2016-01-01 23:35:54 +00:00
# include <java/JavaInstallList.h>
2015-10-20 16:18:53 +01:00
# include <launch/LaunchTask.h>
2021-07-26 20:44:11 +01:00
# include <minecraft/auth/AccountList.h>
2016-04-10 03:29:29 +01:00
# include <SkinUtils.h>
2020-07-18 15:18:02 +01:00
# include <BuildConfig.h>
2015-10-20 16:18:53 +01:00
# include <net/NetJob.h>
2016-05-28 18:54:17 +01:00
# include <net/Download.h>
2022-02-10 11:55:07 +00:00
# include <news/NewsChecker.h>
2015-10-20 16:18:53 +01:00
# include <tools/BaseProfiler.h>
# include <updater/DownloadTask.h>
# include <updater/UpdateChecker.h>
2016-01-05 06:32:52 +00:00
# include <DesktopServices.h>
2016-08-06 14:39:29 +01:00
# include "InstanceWindow.h"
2015-10-20 16:18:53 +01:00
# include "InstancePageProvider.h"
# include "JavaCommon.h"
2016-08-10 23:44:01 +01:00
# include "LaunchController.h"
2021-11-22 02:55:16 +00:00
# include "ui/instanceview/InstanceProxyModel.h"
# include "ui/instanceview/InstanceView.h"
# include "ui/instanceview/InstanceDelegate.h"
# include "ui/widgets/LabeledToolButton.h"
# include "ui/dialogs/NewInstanceDialog.h"
2022-06-26 00:15:16 +01:00
# include "ui/dialogs/NewsDialog.h"
2021-11-22 02:55:16 +00:00
# include "ui/dialogs/ProgressDialog.h"
# include "ui/dialogs/AboutDialog.h"
# include "ui/dialogs/VersionSelectDialog.h"
# include "ui/dialogs/CustomMessageBox.h"
# include "ui/dialogs/IconPickerDialog.h"
# include "ui/dialogs/CopyInstanceDialog.h"
# include "ui/dialogs/UpdateDialog.h"
# include "ui/dialogs/EditAccountDialog.h"
# include "ui/dialogs/ExportInstanceDialog.h"
2022-12-31 01:06:17 +00:00
# include "ui/dialogs/ImportResourceDialog.h"
2022-11-14 22:59:26 +00:00
# include "ui/themes/ITheme.h"
2021-11-22 02:55:16 +00:00
2022-12-31 01:06:17 +00:00
# include "minecraft/mod/tasks/LocalResourceParse.h"
# include "minecraft/mod/ModFolderModel.h"
# include "minecraft/WorldList.h"
2022-11-19 16:28:35 +00:00
2016-11-18 15:04:08 +00:00
# include "UpdateController.h"
2018-03-15 08:27:45 +00:00
# include "KonamiCode.h"
2021-11-22 02:55:16 +00:00
# include "InstanceImportTask.h"
# include "InstanceCopyTask.h"
2021-09-28 23:20:34 +01:00
# include "MMCTime.h"
2015-10-20 16:18:53 +01:00
2021-07-26 20:44:11 +01:00
namespace {
QString profileInUseFilter ( const QString & profile , bool used )
{
if ( used )
{
return QObject : : tr ( " %1 (in use) " ) . arg ( profile ) ;
}
else
{
return profile ;
}
}
}
2017-10-08 01:02:34 +01:00
// WHY: to hold the pre-translation strings together with the T pointer, so it can be retranslated without a lot of ugly code
2017-10-04 01:35:28 +01:00
template < typename T >
class Translated
2017-10-01 23:55:34 +01:00
{
public :
2018-07-15 13:51:05 +01:00
Translated ( ) { }
Translated ( QWidget * parent )
{
m_contained = new T ( parent ) ;
}
void setTooltipId ( const char * tooltip )
{
m_tooltip = tooltip ;
}
void setTextId ( const char * text )
{
m_text = text ;
}
operator T * ( )
{
return m_contained ;
}
T * operator - > ( )
{
return m_contained ;
}
void retranslate ( )
{
if ( m_text )
{
2021-10-17 23:47:02 +01:00
QString result ;
result = QApplication : : translate ( " MainWindow " , m_text ) ;
if ( result . contains ( " %1 " ) ) {
2022-10-18 08:50:27 +01:00
result = result . arg ( BuildConfig . LAUNCHER_DISPLAYNAME ) ;
2021-10-17 23:47:02 +01:00
}
m_contained - > setText ( result ) ;
2018-07-15 13:51:05 +01:00
}
if ( m_tooltip )
{
2021-10-17 23:47:02 +01:00
QString result ;
result = QApplication : : translate ( " MainWindow " , m_tooltip ) ;
if ( result . contains ( " %1 " ) ) {
2022-10-18 08:50:27 +01:00
result = result . arg ( BuildConfig . LAUNCHER_DISPLAYNAME ) ;
2021-10-17 23:47:02 +01:00
}
m_contained - > setToolTip ( result ) ;
2018-07-15 13:51:05 +01:00
}
}
2017-10-01 23:55:34 +01:00
private :
2018-07-15 13:51:05 +01:00
T * m_contained = nullptr ;
const char * m_text = nullptr ;
const char * m_tooltip = nullptr ;
2017-10-01 23:55:34 +01:00
} ;
2017-10-04 01:35:28 +01:00
using TranslatedAction = Translated < QAction > ;
using TranslatedToolButton = Translated < QToolButton > ;
2017-10-01 23:55:34 +01:00
class TranslatedToolbar
{
public :
2018-07-15 13:51:05 +01:00
TranslatedToolbar ( ) { }
TranslatedToolbar ( QWidget * parent )
{
m_contained = new QToolBar ( parent ) ;
}
void setWindowTitleId ( const char * title )
{
m_title = title ;
}
operator QToolBar * ( )
{
return m_contained ;
}
QToolBar * operator - > ( )
{
return m_contained ;
}
void retranslate ( )
{
if ( m_title )
{
m_contained - > setWindowTitle ( QApplication : : translate ( " MainWindow " , m_title ) ) ;
}
}
2017-10-01 23:55:34 +01:00
private :
2018-07-15 13:51:05 +01:00
QToolBar * m_contained = nullptr ;
const char * m_title = nullptr ;
2017-10-01 23:55:34 +01:00
} ;
2015-10-20 16:18:53 +01:00
class MainWindow : : Ui
2015-03-01 21:20:57 +00:00
{
public :
2018-07-15 13:51:05 +01:00
TranslatedAction actionAddInstance ;
//TranslatedAction actionRefresh;
TranslatedAction actionCheckUpdate ;
TranslatedAction actionSettings ;
2022-02-10 11:55:07 +00:00
TranslatedAction actionMoreNews ;
2018-07-15 13:51:05 +01:00
TranslatedAction actionManageAccounts ;
TranslatedAction actionLaunchInstance ;
2022-06-19 19:33:34 +01:00
TranslatedAction actionKillInstance ;
2018-07-15 13:51:05 +01:00
TranslatedAction actionRenameInstance ;
TranslatedAction actionChangeInstGroup ;
TranslatedAction actionChangeInstIcon ;
TranslatedAction actionEditInstance ;
TranslatedAction actionViewSelectedInstFolder ;
TranslatedAction actionDeleteInstance ;
TranslatedAction actionCAT ;
TranslatedAction actionCopyInstance ;
TranslatedAction actionLaunchInstanceOffline ;
2022-07-11 19:46:11 +01:00
TranslatedAction actionLaunchInstanceDemo ;
2018-07-15 13:51:05 +01:00
TranslatedAction actionExportInstance ;
2022-10-22 13:39:53 +01:00
TranslatedAction actionCreateInstanceShortcut ;
2018-07-15 13:51:05 +01:00
QVector < TranslatedAction * > all_actions ;
LabeledToolButton * renameButton = nullptr ;
LabeledToolButton * changeIconButton = nullptr ;
QMenu * foldersMenu = nullptr ;
TranslatedToolButton foldersMenuButton ;
TranslatedAction actionViewInstanceFolder ;
TranslatedAction actionViewCentralModsFolder ;
2022-07-30 18:42:33 +01:00
QMenu * editMenu = nullptr ;
TranslatedAction actionUndoTrashInstance ;
2018-07-15 13:51:05 +01:00
QMenu * helpMenu = nullptr ;
TranslatedToolButton helpMenuButton ;
2022-10-10 11:45:44 +01:00
TranslatedAction actionClearMetadata ;
2022-11-05 14:31:07 +00:00
# ifdef Q_OS_MAC
2022-10-19 14:53:57 +01:00
TranslatedAction actionAddToPATH ;
2022-11-05 14:31:07 +00:00
# endif
2018-07-15 13:51:05 +01:00
TranslatedAction actionReportBug ;
TranslatedAction actionDISCORD ;
2022-03-08 17:41:23 +00:00
TranslatedAction actionMATRIX ;
2018-07-15 13:51:05 +01:00
TranslatedAction actionREDDIT ;
TranslatedAction actionAbout ;
2022-05-09 04:19:23 +01:00
TranslatedAction actionNoAccountsAdded ;
TranslatedAction actionNoDefaultAccount ;
2022-10-25 23:22:11 +01:00
TranslatedAction actionLockToolbars ;
2022-11-14 19:33:25 +00:00
TranslatedAction actionChangeTheme ;
2018-07-15 13:51:05 +01:00
QVector < TranslatedToolButton * > all_toolbuttons ;
QWidget * centralWidget = nullptr ;
QHBoxLayout * horizontalLayout = nullptr ;
QStatusBar * statusBar = nullptr ;
2022-04-08 20:37:18 +01:00
QMenuBar * menuBar = nullptr ;
QMenu * fileMenu ;
2022-04-16 08:32:08 +01:00
QMenu * viewMenu ;
2022-04-08 20:37:18 +01:00
QMenu * profileMenu ;
2022-04-16 08:32:08 +01:00
2022-04-16 18:35:13 +01:00
TranslatedAction actionCloseWindow ;
2022-04-16 08:32:08 +01:00
2022-04-16 18:35:13 +01:00
TranslatedAction actionOpenWiki ;
TranslatedAction actionNewsMenuBar ;
2022-04-08 20:37:18 +01:00
2018-07-15 13:51:05 +01:00
TranslatedToolbar mainToolBar ;
TranslatedToolbar instanceToolBar ;
2022-02-10 11:55:07 +00:00
TranslatedToolbar newsToolBar ;
2018-07-15 13:51:05 +01:00
QVector < TranslatedToolbar * > all_toolbars ;
2022-04-21 03:34:13 +01:00
void createMainToolbarActions ( MainWindow * MainWindow )
2018-07-15 13:51:05 +01:00
{
actionAddInstance = TranslatedAction ( MainWindow ) ;
actionAddInstance - > setObjectName ( QStringLiteral ( " actionAddInstance " ) ) ;
2021-11-20 15:22:22 +00:00
actionAddInstance - > setIcon ( APPLICATION - > getThemedIcon ( " new " ) ) ;
2022-04-16 08:32:08 +01:00
actionAddInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Add Instanc&e... " ) ) ;
2018-07-15 13:51:05 +01:00
actionAddInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Add a new instance. " ) ) ;
2022-04-16 08:32:08 +01:00
actionAddInstance - > setShortcut ( QKeySequence : : New ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionAddInstance ) ;
actionViewInstanceFolder = TranslatedAction ( MainWindow ) ;
actionViewInstanceFolder - > setObjectName ( QStringLiteral ( " actionViewInstanceFolder " ) ) ;
2021-11-20 15:22:22 +00:00
actionViewInstanceFolder - > setIcon ( APPLICATION - > getThemedIcon ( " viewfolder " ) ) ;
2022-04-21 23:31:03 +01:00
actionViewInstanceFolder . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &View Instance Folder " ) ) ;
2018-07-15 13:51:05 +01:00
actionViewInstanceFolder . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the instance folder in a file browser. " ) ) ;
all_actions . append ( & actionViewInstanceFolder ) ;
actionViewCentralModsFolder = TranslatedAction ( MainWindow ) ;
actionViewCentralModsFolder - > setObjectName ( QStringLiteral ( " actionViewCentralModsFolder " ) ) ;
2021-11-20 15:22:22 +00:00
actionViewCentralModsFolder - > setIcon ( APPLICATION - > getThemedIcon ( " centralmods " ) ) ;
2022-04-21 23:31:03 +01:00
actionViewCentralModsFolder . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " View &Central Mods Folder " ) ) ;
2018-07-15 13:51:05 +01:00
actionViewCentralModsFolder . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the central mods folder in a file browser. " ) ) ;
all_actions . append ( & actionViewCentralModsFolder ) ;
2022-04-16 08:32:08 +01:00
foldersMenu = new QMenu ( MainWindow ) ;
foldersMenu - > setTitle ( tr ( " F&olders " ) ) ;
foldersMenu - > setToolTipsVisible ( true ) ;
foldersMenu - > addAction ( actionViewInstanceFolder ) ;
2018-07-15 13:51:05 +01:00
foldersMenu - > addAction ( actionViewCentralModsFolder ) ;
foldersMenuButton = TranslatedToolButton ( MainWindow ) ;
2022-04-16 08:32:08 +01:00
foldersMenuButton . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " F&olders " ) ) ;
2018-07-15 13:51:05 +01:00
foldersMenuButton . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open one of the folders shared between instances. " ) ) ;
foldersMenuButton - > setMenu ( foldersMenu ) ;
foldersMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
foldersMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
2021-11-20 15:22:22 +00:00
foldersMenuButton - > setIcon ( APPLICATION - > getThemedIcon ( " viewfolder " ) ) ;
2019-07-21 20:12:05 +01:00
foldersMenuButton - > setFocusPolicy ( Qt : : NoFocus ) ;
2018-07-15 13:51:05 +01:00
all_toolbuttons . append ( & foldersMenuButton ) ;
actionSettings = TranslatedAction ( MainWindow ) ;
actionSettings - > setObjectName ( QStringLiteral ( " actionSettings " ) ) ;
2021-11-20 15:22:22 +00:00
actionSettings - > setIcon ( APPLICATION - > getThemedIcon ( " settings " ) ) ;
2018-07-15 13:51:05 +01:00
actionSettings - > setMenuRole ( QAction : : PreferencesRole ) ;
2022-04-21 23:31:03 +01:00
actionSettings . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Setti&ngs... " ) ) ;
2018-07-15 13:51:05 +01:00
actionSettings . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Change settings. " ) ) ;
2022-04-16 08:32:08 +01:00
actionSettings - > setShortcut ( QKeySequence : : Preferences ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionSettings ) ;
2022-07-30 18:42:33 +01:00
actionUndoTrashInstance = TranslatedAction ( MainWindow ) ;
actionUndoTrashInstance - > setObjectName ( QStringLiteral ( " actionUndoTrashInstance " ) ) ;
actionUndoTrashInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Undo Last Instance Deletion " ) ) ;
actionUndoTrashInstance - > setEnabled ( APPLICATION - > instances ( ) - > trashedSomething ( ) ) ;
2022-10-30 18:08:02 +00:00
actionUndoTrashInstance - > setShortcut ( QKeySequence : : Undo ) ;
2022-07-30 18:42:33 +01:00
all_actions . append ( & actionUndoTrashInstance ) ;
2022-10-10 11:45:44 +01:00
actionClearMetadata = TranslatedAction ( MainWindow ) ;
actionClearMetadata - > setObjectName ( QStringLiteral ( " actionClearMetadata " ) ) ;
actionClearMetadata - > setIcon ( APPLICATION - > getThemedIcon ( " refresh " ) ) ;
actionClearMetadata . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Clear Metadata Cache " ) ) ;
actionClearMetadata . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Clear cached metadata " ) ) ;
all_actions . append ( & actionClearMetadata ) ;
2022-10-19 14:53:57 +01:00
# ifdef Q_OS_MAC
actionAddToPATH = TranslatedAction ( MainWindow ) ;
actionAddToPATH - > setObjectName ( QStringLiteral ( " actionAddToPATH " ) ) ;
2022-11-14 11:21:47 +00:00
actionAddToPATH . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Install to &PATH " ) ) ;
actionAddToPATH . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Install a prismlauncher symlink to /usr/local/bin " ) ) ;
2022-10-19 14:53:57 +01:00
all_actions . append ( & actionAddToPATH ) ;
# endif
2021-06-18 12:24:20 +01:00
if ( ! BuildConfig . BUG_TRACKER_URL . isEmpty ( ) ) {
actionReportBug = TranslatedAction ( MainWindow ) ;
actionReportBug - > setObjectName ( QStringLiteral ( " actionReportBug " ) ) ;
2021-11-20 15:22:22 +00:00
actionReportBug - > setIcon ( APPLICATION - > getThemedIcon ( " bug " ) ) ;
2022-04-16 08:32:08 +01:00
actionReportBug . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Report a &Bug... " ) ) ;
2021-10-17 23:47:02 +01:00
actionReportBug . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the bug tracker to report a bug with %1. " ) ) ;
2021-06-18 12:24:20 +01:00
all_actions . append ( & actionReportBug ) ;
}
2022-04-16 08:32:08 +01:00
2022-03-08 17:41:23 +00:00
if ( ! BuildConfig . MATRIX_URL . isEmpty ( ) ) {
actionMATRIX = TranslatedAction ( MainWindow ) ;
actionMATRIX - > setObjectName ( QStringLiteral ( " actionMATRIX " ) ) ;
actionMATRIX - > setIcon ( APPLICATION - > getThemedIcon ( " matrix " ) ) ;
2022-04-16 08:32:08 +01:00
actionMATRIX . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Matrix Space " ) ) ;
2022-03-08 17:41:23 +00:00
actionMATRIX . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open %1 Matrix space " ) ) ;
all_actions . append ( & actionMATRIX ) ;
}
2021-06-18 12:24:20 +01:00
if ( ! BuildConfig . DISCORD_URL . isEmpty ( ) ) {
actionDISCORD = TranslatedAction ( MainWindow ) ;
actionDISCORD - > setObjectName ( QStringLiteral ( " actionDISCORD " ) ) ;
2021-11-20 15:22:22 +00:00
actionDISCORD - > setIcon ( APPLICATION - > getThemedIcon ( " discord " ) ) ;
2022-04-16 08:32:08 +01:00
actionDISCORD . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Discord Guild " ) ) ;
2022-03-08 17:41:23 +00:00
actionDISCORD . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open %1 Discord guild. " ) ) ;
2021-06-18 12:24:20 +01:00
all_actions . append ( & actionDISCORD ) ;
}
if ( ! BuildConfig . SUBREDDIT_URL . isEmpty ( ) ) {
actionREDDIT = TranslatedAction ( MainWindow ) ;
actionREDDIT - > setObjectName ( QStringLiteral ( " actionREDDIT " ) ) ;
2021-11-20 15:22:22 +00:00
actionREDDIT - > setIcon ( APPLICATION - > getThemedIcon ( " reddit-alien " ) ) ;
2022-04-16 08:32:08 +01:00
actionREDDIT . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Sub&reddit " ) ) ;
2021-10-17 23:47:02 +01:00
actionREDDIT . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open %1 subreddit. " ) ) ;
2021-06-18 12:24:20 +01:00
all_actions . append ( & actionREDDIT ) ;
}
2018-07-15 13:51:05 +01:00
actionAbout = TranslatedAction ( MainWindow ) ;
actionAbout - > setObjectName ( QStringLiteral ( " actionAbout " ) ) ;
2021-11-20 15:22:22 +00:00
actionAbout - > setIcon ( APPLICATION - > getThemedIcon ( " about " ) ) ;
2018-07-15 13:51:05 +01:00
actionAbout - > setMenuRole ( QAction : : AboutRole ) ;
2022-04-16 08:32:08 +01:00
actionAbout . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &About %1 " ) ) ;
2021-10-17 23:47:02 +01:00
actionAbout . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " View information about %1. " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionAbout ) ;
if ( BuildConfig . UPDATER_ENABLED )
{
actionCheckUpdate = TranslatedAction ( MainWindow ) ;
actionCheckUpdate - > setObjectName ( QStringLiteral ( " actionCheckUpdate " ) ) ;
2021-11-20 15:22:22 +00:00
actionCheckUpdate - > setIcon ( APPLICATION - > getThemedIcon ( " checkupdate " ) ) ;
2022-04-16 08:32:08 +01:00
actionCheckUpdate . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Update... " ) ) ;
2021-10-17 23:47:02 +01:00
actionCheckUpdate . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Check for new updates for %1. " ) ) ;
2022-04-16 08:32:08 +01:00
actionCheckUpdate - > setMenuRole ( QAction : : ApplicationSpecificRole ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionCheckUpdate ) ;
}
actionCAT = TranslatedAction ( MainWindow ) ;
actionCAT - > setObjectName ( QStringLiteral ( " actionCAT " ) ) ;
actionCAT - > setCheckable ( true ) ;
2021-11-20 15:22:22 +00:00
actionCAT - > setIcon ( APPLICATION - > getThemedIcon ( " cat " ) ) ;
2022-04-16 08:32:08 +01:00
actionCAT . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Meow " ) ) ;
2018-07-15 13:51:05 +01:00
actionCAT . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " It's a fluffy kitty :3 " ) ) ;
actionCAT - > setPriority ( QAction : : LowPriority ) ;
all_actions . append ( & actionCAT ) ;
// profile menu and its actions
actionManageAccounts = TranslatedAction ( MainWindow ) ;
actionManageAccounts - > setObjectName ( QStringLiteral ( " actionManageAccounts " ) ) ;
2022-04-16 08:32:08 +01:00
actionManageAccounts . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Manage Accounts... " ) ) ;
2018-07-15 13:51:05 +01:00
// FIXME: no tooltip!
actionManageAccounts - > setCheckable ( false ) ;
2021-11-20 15:22:22 +00:00
actionManageAccounts - > setIcon ( APPLICATION - > getThemedIcon ( " accounts " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionManageAccounts ) ;
2022-10-25 23:22:11 +01:00
actionLockToolbars = TranslatedAction ( MainWindow ) ;
actionLockToolbars - > setObjectName ( QStringLiteral ( " actionLockToolbars " ) ) ;
actionLockToolbars . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Lock Toolbars " ) ) ;
actionLockToolbars - > setCheckable ( true ) ;
all_actions . append ( & actionLockToolbars ) ;
2022-11-14 19:33:25 +00:00
actionChangeTheme = TranslatedAction ( MainWindow ) ;
actionChangeTheme - > setObjectName ( QStringLiteral ( " actionChangeTheme " ) ) ;
actionChangeTheme . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Themes " ) ) ;
all_actions . append ( & actionChangeTheme ) ;
2022-04-16 08:32:08 +01:00
}
void createMainToolbar ( QMainWindow * MainWindow )
{
mainToolBar = TranslatedToolbar ( MainWindow ) ;
mainToolBar - > setVisible ( menuBar - > isNativeMenuBar ( ) | | ! APPLICATION - > settings ( ) - > get ( " MenuBarInsteadOfToolBar " ) . toBool ( ) ) ;
mainToolBar - > setObjectName ( QStringLiteral ( " mainToolBar " ) ) ;
mainToolBar - > setAllowedAreas ( Qt : : TopToolBarArea | Qt : : BottomToolBarArea ) ;
mainToolBar - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
mainToolBar - > setFloatable ( false ) ;
mainToolBar . setWindowTitleId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Main Toolbar " ) ) ;
mainToolBar - > addAction ( actionAddInstance ) ;
mainToolBar - > addSeparator ( ) ;
QWidgetAction * foldersButtonAction = new QWidgetAction ( MainWindow ) ;
foldersButtonAction - > setDefaultWidget ( foldersMenuButton ) ;
mainToolBar - > addAction ( foldersButtonAction ) ;
mainToolBar - > addAction ( actionSettings ) ;
helpMenu = new QMenu ( MainWindow ) ;
helpMenu - > setToolTipsVisible ( true ) ;
2022-10-10 11:45:44 +01:00
helpMenu - > addAction ( actionClearMetadata ) ;
2022-10-19 14:53:57 +01:00
# ifdef Q_OS_MAC
helpMenu - > addAction ( actionAddToPATH ) ;
# endif
2022-04-16 08:32:08 +01:00
if ( ! BuildConfig . BUG_TRACKER_URL . isEmpty ( ) ) {
helpMenu - > addAction ( actionReportBug ) ;
}
2022-12-14 15:02:04 +00:00
2022-04-16 08:32:08 +01:00
if ( ! BuildConfig . MATRIX_URL . isEmpty ( ) ) {
helpMenu - > addAction ( actionMATRIX ) ;
}
if ( ! BuildConfig . DISCORD_URL . isEmpty ( ) ) {
helpMenu - > addAction ( actionDISCORD ) ;
}
if ( ! BuildConfig . SUBREDDIT_URL . isEmpty ( ) ) {
helpMenu - > addAction ( actionREDDIT ) ;
}
helpMenu - > addAction ( actionAbout ) ;
helpMenuButton = TranslatedToolButton ( MainWindow ) ;
helpMenuButton . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Help " ) ) ;
helpMenuButton . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Get help with %1 or Minecraft. " ) ) ;
helpMenuButton - > setMenu ( helpMenu ) ;
helpMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
helpMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
helpMenuButton - > setIcon ( APPLICATION - > getThemedIcon ( " help " ) ) ;
helpMenuButton - > setFocusPolicy ( Qt : : NoFocus ) ;
all_toolbuttons . append ( & helpMenuButton ) ;
QWidgetAction * helpButtonAction = new QWidgetAction ( MainWindow ) ;
helpButtonAction - > setDefaultWidget ( helpMenuButton ) ;
mainToolBar - > addAction ( helpButtonAction ) ;
if ( BuildConfig . UPDATER_ENABLED )
{
mainToolBar - > addAction ( actionCheckUpdate ) ;
}
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionCAT ) ;
2018-07-15 13:51:05 +01:00
all_toolbars . append ( & mainToolBar ) ;
MainWindow - > addToolBar ( Qt : : TopToolBarArea , mainToolBar ) ;
}
2022-04-16 18:35:13 +01:00
void createMenuBar ( QMainWindow * MainWindow )
2022-04-08 20:37:18 +01:00
{
menuBar = new QMenuBar ( MainWindow ) ;
2022-04-15 23:25:37 +01:00
menuBar - > setVisible ( APPLICATION - > settings ( ) - > get ( " MenuBarInsteadOfToolBar " ) . toBool ( ) ) ;
2022-04-08 20:37:18 +01:00
fileMenu = menuBar - > addMenu ( tr ( " &File " ) ) ;
2022-06-22 05:19:20 +01:00
// Workaround for QTBUG-94802 (https://bugreports.qt.io/browse/QTBUG-94802); also present for other menus
fileMenu - > setSeparatorsCollapsible ( false ) ;
2022-04-16 08:32:08 +01:00
fileMenu - > addAction ( actionAddInstance ) ;
fileMenu - > addAction ( actionLaunchInstance ) ;
2022-06-19 19:33:34 +01:00
fileMenu - > addAction ( actionKillInstance ) ;
2022-04-16 08:32:08 +01:00
fileMenu - > addAction ( actionCloseWindow ) ;
2022-04-08 20:37:18 +01:00
fileMenu - > addSeparator ( ) ;
2022-04-16 08:32:08 +01:00
fileMenu - > addAction ( actionEditInstance ) ;
fileMenu - > addAction ( actionChangeInstGroup ) ;
fileMenu - > addAction ( actionViewSelectedInstFolder ) ;
fileMenu - > addAction ( actionExportInstance ) ;
fileMenu - > addAction ( actionCopyInstance ) ;
2022-12-07 15:51:35 +00:00
fileMenu - > addAction ( actionDeleteInstance ) ;
fileMenu - > addAction ( actionCreateInstanceShortcut ) ;
2022-04-08 20:37:18 +01:00
fileMenu - > addSeparator ( ) ;
2022-04-16 18:17:34 +01:00
fileMenu - > addAction ( actionSettings ) ;
2022-04-16 08:32:08 +01:00
2022-07-30 18:42:33 +01:00
editMenu = menuBar - > addMenu ( tr ( " &Edit " ) ) ;
editMenu - > addAction ( actionUndoTrashInstance ) ;
2022-04-16 08:32:08 +01:00
viewMenu = menuBar - > addMenu ( tr ( " &View " ) ) ;
2022-06-22 05:19:20 +01:00
viewMenu - > setSeparatorsCollapsible ( false ) ;
2022-11-14 19:33:25 +00:00
viewMenu - > addAction ( actionChangeTheme ) ;
viewMenu - > addSeparator ( ) ;
2022-04-16 08:32:08 +01:00
viewMenu - > addAction ( actionCAT ) ;
viewMenu - > addSeparator ( ) ;
2022-10-25 23:22:11 +01:00
viewMenu - > addAction ( actionLockToolbars ) ;
2022-04-16 08:32:08 +01:00
menuBar - > addMenu ( foldersMenu ) ;
2022-04-08 20:37:18 +01:00
2022-10-30 21:55:15 +00:00
profileMenu = menuBar - > addMenu ( tr ( " &Accounts " ) ) ;
2022-06-22 05:19:20 +01:00
profileMenu - > setSeparatorsCollapsible ( false ) ;
2022-04-16 08:32:08 +01:00
profileMenu - > addAction ( actionManageAccounts ) ;
2022-04-08 20:37:18 +01:00
helpMenu = menuBar - > addMenu ( tr ( " &Help " ) ) ;
2022-06-22 05:19:20 +01:00
helpMenu - > setSeparatorsCollapsible ( false ) ;
2022-10-10 11:45:44 +01:00
helpMenu - > addAction ( actionClearMetadata ) ;
2022-10-19 14:53:57 +01:00
# ifdef Q_OS_MAC
helpMenu - > addAction ( actionAddToPATH ) ;
# endif
2022-10-10 11:45:44 +01:00
helpMenu - > addSeparator ( ) ;
2022-04-16 08:32:08 +01:00
helpMenu - > addAction ( actionAbout ) ;
2022-04-16 18:17:34 +01:00
helpMenu - > addAction ( actionOpenWiki ) ;
2022-04-16 08:32:08 +01:00
helpMenu - > addAction ( actionNewsMenuBar ) ;
helpMenu - > addSeparator ( ) ;
if ( ! BuildConfig . BUG_TRACKER_URL . isEmpty ( ) )
helpMenu - > addAction ( actionReportBug ) ;
if ( ! BuildConfig . MATRIX_URL . isEmpty ( ) )
helpMenu - > addAction ( actionMATRIX ) ;
if ( ! BuildConfig . DISCORD_URL . isEmpty ( ) )
helpMenu - > addAction ( actionDISCORD ) ;
if ( ! BuildConfig . SUBREDDIT_URL . isEmpty ( ) )
helpMenu - > addAction ( actionREDDIT ) ;
if ( BuildConfig . UPDATER_ENABLED )
2022-11-15 13:56:41 +00:00
{
helpMenu - > addSeparator ( ) ;
2022-04-16 08:32:08 +01:00
helpMenu - > addAction ( actionCheckUpdate ) ;
2022-11-15 13:56:41 +00:00
}
2022-04-08 20:37:18 +01:00
MainWindow - > setMenuBar ( menuBar ) ;
}
void createMenuActions ( MainWindow * MainWindow )
{
2022-04-16 18:35:13 +01:00
actionCloseWindow = TranslatedAction ( MainWindow ) ;
actionCloseWindow - > setObjectName ( QStringLiteral ( " actionCloseWindow " ) ) ;
actionCloseWindow . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Close &Window " ) ) ;
actionCloseWindow . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Close the current window " ) ) ;
2022-04-16 08:32:08 +01:00
actionCloseWindow - > setShortcut ( QKeySequence : : Close ) ;
connect ( actionCloseWindow , & QAction : : triggered , APPLICATION , & Application : : closeCurrentWindow ) ;
2022-04-16 18:35:13 +01:00
all_actions . append ( & actionCloseWindow ) ;
2022-04-16 08:32:08 +01:00
2022-04-16 18:35:13 +01:00
actionOpenWiki = TranslatedAction ( MainWindow ) ;
actionOpenWiki - > setObjectName ( QStringLiteral ( " actionOpenWiki " ) ) ;
2022-04-21 23:31:03 +01:00
actionOpenWiki . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " %1 &Help " ) ) ;
2022-04-16 18:35:13 +01:00
actionOpenWiki . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the %1 wiki " ) ) ;
2022-11-15 13:56:41 +00:00
actionOpenWiki - > setIcon ( APPLICATION - > getThemedIcon ( " help " ) ) ;
2022-04-16 18:17:34 +01:00
connect ( actionOpenWiki , & QAction : : triggered , MainWindow , & MainWindow : : on_actionOpenWiki_triggered ) ;
2022-04-16 18:35:13 +01:00
all_actions . append ( & actionOpenWiki ) ;
2022-04-16 08:32:08 +01:00
2022-04-16 18:35:13 +01:00
actionNewsMenuBar = TranslatedAction ( MainWindow ) ;
actionNewsMenuBar - > setObjectName ( QStringLiteral ( " actionNewsMenuBar " ) ) ;
actionNewsMenuBar . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " %1 &News " ) ) ;
actionNewsMenuBar . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the %1 wiki " ) ) ;
2022-11-15 13:56:41 +00:00
actionNewsMenuBar - > setIcon ( APPLICATION - > getThemedIcon ( " news " ) ) ;
2022-04-16 08:32:08 +01:00
connect ( actionNewsMenuBar , & QAction : : triggered , MainWindow , & MainWindow : : on_actionMoreNews_triggered ) ;
2022-04-16 18:35:13 +01:00
all_actions . append ( & actionNewsMenuBar ) ;
2022-04-08 20:37:18 +01:00
}
2022-04-15 20:55:03 +01:00
// "Instance actions" are actions that require an instance to be selected (i.e. "new instance" is not here)
2022-06-19 19:33:34 +01:00
// Actions that also require other conditions (e.g. a running instance) won't be changed.
2022-04-16 08:32:08 +01:00
void setInstanceActionsEnabled ( bool enabled )
2022-04-15 20:55:03 +01:00
{
2022-04-16 08:32:08 +01:00
actionEditInstance - > setEnabled ( enabled ) ;
actionChangeInstGroup - > setEnabled ( enabled ) ;
actionViewSelectedInstFolder - > setEnabled ( enabled ) ;
actionExportInstance - > setEnabled ( enabled ) ;
actionDeleteInstance - > setEnabled ( enabled ) ;
actionCopyInstance - > setEnabled ( enabled ) ;
2022-10-22 13:39:53 +01:00
actionCreateInstanceShortcut - > setEnabled ( enabled ) ;
2022-04-15 20:55:03 +01:00
}
2018-07-15 13:51:05 +01:00
void createStatusBar ( QMainWindow * MainWindow )
{
statusBar = new QStatusBar ( MainWindow ) ;
statusBar - > setObjectName ( QStringLiteral ( " statusBar " ) ) ;
MainWindow - > setStatusBar ( statusBar ) ;
}
2022-02-10 11:55:07 +00:00
void createNewsToolbar ( QMainWindow * MainWindow )
{
newsToolBar = TranslatedToolbar ( MainWindow ) ;
newsToolBar - > setObjectName ( QStringLiteral ( " newsToolBar " ) ) ;
2022-03-19 20:59:00 +00:00
newsToolBar - > setAllowedAreas ( Qt : : TopToolBarArea | Qt : : BottomToolBarArea ) ;
2022-02-10 11:55:07 +00:00
newsToolBar - > setIconSize ( QSize ( 16 , 16 ) ) ;
newsToolBar - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
newsToolBar - > setFloatable ( false ) ;
newsToolBar - > setWindowTitle ( QT_TRANSLATE_NOOP ( " MainWindow " , " News Toolbar " ) ) ;
actionMoreNews = TranslatedAction ( MainWindow ) ;
actionMoreNews - > setObjectName ( QStringLiteral ( " actionMoreNews " ) ) ;
actionMoreNews - > setIcon ( APPLICATION - > getThemedIcon ( " news " ) ) ;
actionMoreNews . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " More news... " ) ) ;
actionMoreNews . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the development blog to read more news about %1. " ) ) ;
all_actions . append ( & actionMoreNews ) ;
newsToolBar - > addAction ( actionMoreNews ) ;
all_toolbars . append ( & newsToolBar ) ;
MainWindow - > addToolBar ( Qt : : BottomToolBarArea , newsToolBar ) ;
}
2022-04-16 08:32:08 +01:00
void createInstanceActions ( QMainWindow * MainWindow )
2018-07-15 13:51:05 +01:00
{
// NOTE: not added to toolbar, but used for instance context menu (right click)
actionChangeInstIcon = TranslatedAction ( MainWindow ) ;
actionChangeInstIcon - > setObjectName ( QStringLiteral ( " actionChangeInstIcon " ) ) ;
2021-10-15 23:42:01 +01:00
actionChangeInstIcon - > setIcon ( QIcon ( " :/icons/instances/grass " ) ) ;
2018-07-15 13:51:05 +01:00
actionChangeInstIcon - > setIconVisibleInMenu ( true ) ;
actionChangeInstIcon . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Change Icon " ) ) ;
actionChangeInstIcon . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Change the selected instance's icon. " ) ) ;
all_actions . append ( & actionChangeInstIcon ) ;
changeIconButton = new LabeledToolButton ( MainWindow ) ;
changeIconButton - > setObjectName ( QStringLiteral ( " changeIconButton " ) ) ;
2021-11-20 15:22:22 +00:00
changeIconButton - > setIcon ( APPLICATION - > getThemedIcon ( " news " ) ) ;
2018-07-15 13:51:05 +01:00
changeIconButton - > setToolTip ( actionChangeInstIcon - > toolTip ( ) ) ;
changeIconButton - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
// NOTE: not added to toolbar, but used for instance context menu (right click)
actionRenameInstance = TranslatedAction ( MainWindow ) ;
actionRenameInstance - > setObjectName ( QStringLiteral ( " actionRenameInstance " ) ) ;
actionRenameInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Rename " ) ) ;
actionRenameInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Rename the selected instance. " ) ) ;
2022-10-20 21:48:57 +01:00
actionRenameInstance - > setIcon ( APPLICATION - > getThemedIcon ( " rename " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionRenameInstance ) ;
// the rename label is inside the rename tool button
renameButton = new LabeledToolButton ( MainWindow ) ;
renameButton - > setObjectName ( QStringLiteral ( " renameButton " ) ) ;
renameButton - > setToolTip ( actionRenameInstance - > toolTip ( ) ) ;
renameButton - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
actionLaunchInstance = TranslatedAction ( MainWindow ) ;
actionLaunchInstance - > setObjectName ( QStringLiteral ( " actionLaunchInstance " ) ) ;
2022-04-17 17:44:24 +01:00
actionLaunchInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Launch " ) ) ;
actionLaunchInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Launch the selected instance. " ) ) ;
2022-10-23 15:34:49 +01:00
actionLaunchInstance - > setIcon ( APPLICATION - > getThemedIcon ( " launch " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionLaunchInstance ) ;
actionLaunchInstanceOffline = TranslatedAction ( MainWindow ) ;
actionLaunchInstanceOffline - > setObjectName ( QStringLiteral ( " actionLaunchInstanceOffline " ) ) ;
2022-04-16 08:32:08 +01:00
actionLaunchInstanceOffline . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Launch &Offline " ) ) ;
2018-07-15 13:51:05 +01:00
actionLaunchInstanceOffline . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Launch the selected instance in offline mode. " ) ) ;
all_actions . append ( & actionLaunchInstanceOffline ) ;
2022-07-11 19:46:11 +01:00
actionLaunchInstanceDemo = TranslatedAction ( MainWindow ) ;
actionLaunchInstanceDemo - > setObjectName ( QStringLiteral ( " actionLaunchInstanceDemo " ) ) ;
actionLaunchInstanceDemo . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Launch &Demo " ) ) ;
actionLaunchInstanceDemo . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Launch the selected instance in demo mode. " ) ) ;
all_actions . append ( & actionLaunchInstanceDemo ) ;
2022-06-19 19:33:34 +01:00
actionKillInstance = TranslatedAction ( MainWindow ) ;
actionKillInstance - > setObjectName ( QStringLiteral ( " actionKillInstance " ) ) ;
actionKillInstance - > setDisabled ( true ) ;
actionKillInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Kill " ) ) ;
actionKillInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Kill the running instance " ) ) ;
actionKillInstance - > setShortcut ( QKeySequence ( tr ( " Ctrl+K " ) ) ) ;
2022-10-20 21:48:57 +01:00
actionKillInstance - > setIcon ( APPLICATION - > getThemedIcon ( " status-bad " ) ) ;
2022-06-19 19:33:34 +01:00
all_actions . append ( & actionKillInstance ) ;
2018-07-15 13:51:05 +01:00
actionEditInstance = TranslatedAction ( MainWindow ) ;
actionEditInstance - > setObjectName ( QStringLiteral ( " actionEditInstance " ) ) ;
2022-10-12 13:17:34 +01:00
actionEditInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Edit... " ) ) ;
2018-07-15 13:51:05 +01:00
actionEditInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Change the instance settings, mods and versions. " ) ) ;
2022-04-16 08:32:08 +01:00
actionEditInstance - > setShortcut ( QKeySequence ( tr ( " Ctrl+I " ) ) ) ;
2022-10-20 21:48:57 +01:00
actionEditInstance - > setIcon ( APPLICATION - > getThemedIcon ( " settings-configure " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionEditInstance ) ;
actionChangeInstGroup = TranslatedAction ( MainWindow ) ;
actionChangeInstGroup - > setObjectName ( QStringLiteral ( " actionChangeInstGroup " ) ) ;
2022-04-16 08:32:08 +01:00
actionChangeInstGroup . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Change Group... " ) ) ;
2018-07-15 13:51:05 +01:00
actionChangeInstGroup . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Change the selected instance's group. " ) ) ;
2022-04-16 08:32:08 +01:00
actionChangeInstGroup - > setShortcut ( QKeySequence ( tr ( " Ctrl+G " ) ) ) ;
2022-10-20 21:48:57 +01:00
actionChangeInstGroup - > setIcon ( APPLICATION - > getThemedIcon ( " tag " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionChangeInstGroup ) ;
2018-07-27 22:57:09 +01:00
actionViewSelectedInstFolder = TranslatedAction ( MainWindow ) ;
actionViewSelectedInstFolder - > setObjectName ( QStringLiteral ( " actionViewSelectedInstFolder " ) ) ;
2022-10-12 13:17:34 +01:00
actionViewSelectedInstFolder . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " &Folder " ) ) ;
2018-07-27 22:57:09 +01:00
actionViewSelectedInstFolder . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Open the selected instance's root folder in a file browser. " ) ) ;
2022-10-20 21:48:57 +01:00
actionViewSelectedInstFolder - > setIcon ( APPLICATION - > getThemedIcon ( " viewfolder " ) ) ;
2018-07-27 22:57:09 +01:00
all_actions . append ( & actionViewSelectedInstFolder ) ;
2018-07-15 13:51:05 +01:00
actionExportInstance = TranslatedAction ( MainWindow ) ;
actionExportInstance - > setObjectName ( QStringLiteral ( " actionExportInstance " ) ) ;
2022-10-12 13:17:34 +01:00
actionExportInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " E&xport... " ) ) ;
2022-02-03 17:09:12 +00:00
actionExportInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Export the selected instance as a zip file. " ) ) ;
2022-04-16 08:32:08 +01:00
actionExportInstance - > setShortcut ( QKeySequence ( tr ( " Ctrl+E " ) ) ) ;
2022-10-20 21:48:57 +01:00
actionExportInstance - > setIcon ( APPLICATION - > getThemedIcon ( " export " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionExportInstance ) ;
actionDeleteInstance = TranslatedAction ( MainWindow ) ;
actionDeleteInstance - > setObjectName ( QStringLiteral ( " actionDeleteInstance " ) ) ;
2022-10-12 13:17:34 +01:00
actionDeleteInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Dele&te " ) ) ;
2018-07-15 13:51:05 +01:00
actionDeleteInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Delete the selected instance. " ) ) ;
2022-04-16 08:32:08 +01:00
actionDeleteInstance - > setShortcuts ( { QKeySequence ( tr ( " Backspace " ) ) , QKeySequence : : Delete } ) ;
2022-07-30 18:42:33 +01:00
actionDeleteInstance - > setAutoRepeat ( false ) ;
2022-10-20 21:48:57 +01:00
actionDeleteInstance - > setIcon ( APPLICATION - > getThemedIcon ( " delete " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionDeleteInstance ) ;
actionCopyInstance = TranslatedAction ( MainWindow ) ;
actionCopyInstance - > setObjectName ( QStringLiteral ( " actionCopyInstance " ) ) ;
2022-10-12 13:17:34 +01:00
actionCopyInstance . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Cop&y... " ) ) ;
2018-07-15 13:51:05 +01:00
actionCopyInstance . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Copy the selected instance. " ) ) ;
2022-04-16 08:32:08 +01:00
actionCopyInstance - > setShortcut ( QKeySequence ( tr ( " Ctrl+D " ) ) ) ;
2022-10-20 21:48:57 +01:00
actionCopyInstance - > setIcon ( APPLICATION - > getThemedIcon ( " copy " ) ) ;
2018-07-15 13:51:05 +01:00
all_actions . append ( & actionCopyInstance ) ;
2022-04-16 08:32:08 +01:00
2022-10-22 13:39:53 +01:00
actionCreateInstanceShortcut = TranslatedAction ( MainWindow ) ;
actionCreateInstanceShortcut - > setObjectName ( QStringLiteral ( " actionCreateInstanceShortcut " ) ) ;
2022-10-22 15:56:27 +01:00
actionCreateInstanceShortcut . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Create Shortcut " ) ) ;
2022-10-22 13:39:53 +01:00
actionCreateInstanceShortcut . setTooltipId ( QT_TRANSLATE_NOOP ( " MainWindow " , " Creates a shortcut on your desktop to launch the selected instance. " ) ) ;
2022-11-14 19:02:31 +00:00
actionCreateInstanceShortcut - > setIcon ( APPLICATION - > getThemedIcon ( " shortcut " ) ) ;
2022-10-22 13:39:53 +01:00
all_actions . append ( & actionCreateInstanceShortcut ) ;
2022-04-17 17:44:24 +01:00
setInstanceActionsEnabled ( false ) ;
2022-04-16 08:32:08 +01:00
}
void createInstanceToolbar ( QMainWindow * MainWindow )
{
instanceToolBar = TranslatedToolbar ( MainWindow ) ;
instanceToolBar - > setObjectName ( QStringLiteral ( " instanceToolBar " ) ) ;
// disabled until we have an instance selected
instanceToolBar - > setEnabled ( false ) ;
2022-05-08 00:42:19 +01:00
// Qt doesn't like vertical moving toolbars, so we have to force them...
// See https://github.com/PolyMC/PolyMC/issues/493
connect ( instanceToolBar , & QToolBar : : orientationChanged , [ = ] ( Qt : : Orientation ) { instanceToolBar - > setOrientation ( Qt : : Vertical ) ; } ) ;
2022-04-16 08:32:08 +01:00
instanceToolBar - > setAllowedAreas ( Qt : : LeftToolBarArea | Qt : : RightToolBarArea ) ;
2022-10-23 15:34:49 +01:00
instanceToolBar - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
instanceToolBar - > setIconSize ( QSize ( 16 , 16 ) ) ;
2022-04-16 08:32:08 +01:00
instanceToolBar - > setFloatable ( false ) ;
instanceToolBar - > setWindowTitle ( QT_TRANSLATE_NOOP ( " MainWindow " , " Instance Toolbar " ) ) ;
instanceToolBar - > addWidget ( changeIconButton ) ;
instanceToolBar - > addWidget ( renameButton ) ;
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionLaunchInstance ) ;
2022-06-19 19:33:34 +01:00
instanceToolBar - > addAction ( actionKillInstance ) ;
2022-04-16 08:32:08 +01:00
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionEditInstance ) ;
instanceToolBar - > addAction ( actionChangeInstGroup ) ;
instanceToolBar - > addAction ( actionViewSelectedInstFolder ) ;
instanceToolBar - > addAction ( actionExportInstance ) ;
2018-07-15 13:51:05 +01:00
instanceToolBar - > addAction ( actionCopyInstance ) ;
2022-10-23 15:34:49 +01:00
instanceToolBar - > addAction ( actionDeleteInstance ) ;
2022-11-09 19:56:46 +00:00
instanceToolBar - > addAction ( actionCreateInstanceShortcut ) ; // TODO find better position for this
2022-10-23 15:34:49 +01:00
QLayout * lay = instanceToolBar - > layout ( ) ;
for ( int i = 0 ; i < lay - > count ( ) ; i + + )
{
QLayoutItem * item = lay - > itemAt ( i ) ;
if ( item - > widget ( ) - > metaObject ( ) - > className ( ) = = QString ( " QToolButton " ) )
{
item - > setAlignment ( Qt : : AlignLeft ) ;
}
}
2018-07-15 13:51:05 +01:00
all_toolbars . append ( & instanceToolBar ) ;
MainWindow - > addToolBar ( Qt : : RightToolBarArea , instanceToolBar ) ;
}
2022-04-17 17:44:24 +01:00
void setupUi ( MainWindow * MainWindow )
2018-07-15 13:51:05 +01:00
{
if ( MainWindow - > objectName ( ) . isEmpty ( ) )
{
MainWindow - > setObjectName ( QStringLiteral ( " MainWindow " ) ) ;
}
2019-09-15 03:15:51 +01:00
MainWindow - > resize ( 800 , 600 ) ;
2021-11-20 15:22:22 +00:00
MainWindow - > setWindowIcon ( APPLICATION - > getThemedIcon ( " logo " ) ) ;
2022-06-18 13:00:54 +01:00
MainWindow - > setWindowTitle ( APPLICATION - > applicationDisplayName ( ) ) ;
2020-05-30 14:32:38 +01:00
# ifndef QT_NO_ACCESSIBILITY
2022-10-18 08:50:27 +01:00
MainWindow - > setAccessibleName ( BuildConfig . LAUNCHER_DISPLAYNAME ) ;
2020-05-30 14:32:38 +01:00
# endif
2018-07-15 13:51:05 +01:00
2022-04-16 08:32:08 +01:00
createMainToolbarActions ( MainWindow ) ;
2022-04-17 17:44:24 +01:00
createMenuActions ( MainWindow ) ;
2022-04-16 08:32:08 +01:00
createInstanceActions ( MainWindow ) ;
2022-04-16 18:35:13 +01:00
createMenuBar ( MainWindow ) ;
2022-04-08 20:37:18 +01:00
2022-04-15 23:25:37 +01:00
createMainToolbar ( MainWindow ) ;
2018-07-15 13:51:05 +01:00
centralWidget = new QWidget ( MainWindow ) ;
centralWidget - > setObjectName ( QStringLiteral ( " centralWidget " ) ) ;
horizontalLayout = new QHBoxLayout ( centralWidget ) ;
horizontalLayout - > setSpacing ( 0 ) ;
horizontalLayout - > setObjectName ( QStringLiteral ( " horizontalLayout " ) ) ;
horizontalLayout - > setSizeConstraint ( QLayout : : SetDefaultConstraint ) ;
horizontalLayout - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
MainWindow - > setCentralWidget ( centralWidget ) ;
createStatusBar ( MainWindow ) ;
2022-02-10 11:55:07 +00:00
createNewsToolbar ( MainWindow ) ;
2018-07-15 13:51:05 +01:00
createInstanceToolbar ( MainWindow ) ;
2022-04-17 17:44:24 +01:00
MainWindow - > updateToolsMenu ( ) ;
2022-11-14 19:33:25 +00:00
MainWindow - > updateThemeMenu ( ) ;
2022-04-17 17:44:24 +01:00
2018-07-15 13:51:05 +01:00
retranslateUi ( MainWindow ) ;
QMetaObject : : connectSlotsByName ( MainWindow ) ;
} // setupUi
2022-05-09 04:42:37 +01:00
void retranslateUi ( MainWindow * MainWindow )
2018-07-15 13:51:05 +01:00
{
// all the actions
for ( auto * item : all_actions )
{
item - > retranslate ( ) ;
}
for ( auto * item : all_toolbars )
{
item - > retranslate ( ) ;
}
for ( auto * item : all_toolbuttons )
{
item - > retranslate ( ) ;
}
// submenu buttons
foldersMenuButton - > setText ( tr ( " Folders " ) ) ;
helpMenuButton - > setText ( tr ( " Help " ) ) ;
2022-05-09 04:42:37 +01:00
// playtime counter
if ( MainWindow - > m_statusCenter )
{
MainWindow - > updateStatusCenter ( ) ;
}
2018-07-15 13:51:05 +01:00
} // retranslateUi
2015-03-01 21:20:57 +00:00
} ;
2015-10-20 16:18:53 +01:00
MainWindow : : MainWindow ( QWidget * parent ) : QMainWindow ( parent ) , ui ( new MainWindow : : Ui )
2013-01-09 18:22:22 +00:00
{
2018-07-15 13:51:05 +01:00
ui - > setupUi ( this ) ;
// OSX magic.
setUnifiedTitleAndToolBarOnMac ( true ) ;
// Global shortcuts
{
// FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
auto q = new QShortcut ( QKeySequence : : Quit , this ) ;
connect ( q , SIGNAL ( activated ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
}
// Konami Code
{
secretEventFilter = new KonamiCode ( this ) ;
connect ( secretEventFilter , & KonamiCode : : triggered , this , & MainWindow : : konamiTriggered ) ;
}
2022-02-10 11:55:07 +00:00
// Add the news label to the news toolbar.
{
m_newsChecker . reset ( new NewsChecker ( APPLICATION - > network ( ) , BuildConfig . NEWS_RSS_URL ) ) ;
newsLabel = new QToolButton ( ) ;
newsLabel - > setIcon ( APPLICATION - > getThemedIcon ( " news " ) ) ;
newsLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
newsLabel - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
newsLabel - > setFocusPolicy ( Qt : : NoFocus ) ;
ui - > newsToolBar - > insertWidget ( ui - > actionMoreNews , newsLabel ) ;
QObject : : connect ( newsLabel , & QAbstractButton : : clicked , this , & MainWindow : : newsButtonClicked ) ;
QObject : : connect ( m_newsChecker . get ( ) , & NewsChecker : : newsLoaded , this , & MainWindow : : updateNewsLabel ) ;
updateNewsLabel ( ) ;
}
2018-07-15 13:51:05 +01:00
// Create the instance list widget
{
2021-10-25 22:51:42 +01:00
view = new InstanceView ( ui - > centralWidget ) ;
2018-07-15 13:51:05 +01:00
view - > setSelectionMode ( QAbstractItemView : : SingleSelection ) ;
// FIXME: leaks ListViewDelegate
view - > setItemDelegate ( new ListViewDelegate ( this ) ) ;
view - > setFrameShape ( QFrame : : NoFrame ) ;
// do not show ugly blue border on the mac
view - > setAttribute ( Qt : : WA_MacShowFocusRect , false ) ;
view - > installEventFilter ( this ) ;
view - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( view , & QWidget : : customContextMenuRequested , this , & MainWindow : : showInstanceContextMenu ) ;
2022-12-31 01:06:17 +00:00
connect ( view , & InstanceView : : droppedURLs , this , & MainWindow : : processURLs , Qt : : QueuedConnection ) ;
2018-07-15 13:51:05 +01:00
proxymodel = new InstanceProxyModel ( this ) ;
2021-11-20 15:22:22 +00:00
proxymodel - > setSourceModel ( APPLICATION - > instances ( ) . get ( ) ) ;
2018-07-15 13:51:05 +01:00
proxymodel - > sort ( 0 ) ;
connect ( proxymodel , & InstanceProxyModel : : dataChanged , this , & MainWindow : : instanceDataChanged ) ;
view - > setModel ( proxymodel ) ;
2019-08-20 01:58:27 +01:00
view - > setSourceOfGroupCollapseStatus ( [ ] ( const QString & groupName ) - > bool {
2021-11-20 15:22:22 +00:00
return APPLICATION - > instances ( ) - > isGroupCollapsed ( groupName ) ;
2019-08-20 01:58:27 +01:00
} ) ;
2021-11-20 15:22:22 +00:00
connect ( view , & InstanceView : : groupStateChanged , APPLICATION - > instances ( ) . get ( ) , & InstanceList : : on_GroupStateChanged ) ;
2018-07-15 13:51:05 +01:00
ui - > horizontalLayout - > addWidget ( view ) ;
}
// The cat background
{
2021-11-20 15:22:22 +00:00
bool cat_enable = APPLICATION - > settings ( ) - > get ( " TheCat " ) . toBool ( ) ;
2018-07-15 13:51:05 +01:00
ui - > actionCAT - > setChecked ( cat_enable ) ;
2018-11-01 22:30:13 +00:00
// NOTE: calling the operator like that is an ugly hack to appease ancient gcc...
connect ( ui - > actionCAT . operator - > ( ) , SIGNAL ( toggled ( bool ) ) , SLOT ( onCatToggled ( bool ) ) ) ;
2018-07-15 13:51:05 +01:00
setCatBackground ( cat_enable ) ;
}
2022-10-25 23:22:11 +01:00
// Lock toolbars
{
bool toolbarsLocked = APPLICATION - > settings ( ) - > get ( " ToolbarsLocked " ) . toBool ( ) ;
ui - > actionLockToolbars - > setChecked ( toolbarsLocked ) ;
2022-11-05 21:10:36 +00:00
connect ( ui - > actionLockToolbars , & QAction : : toggled , this , & MainWindow : : lockToolbars ) ;
2022-10-25 23:22:11 +01:00
lockToolbars ( toolbarsLocked ) ;
}
2018-07-15 13:51:05 +01:00
// start instance when double-clicked
2021-10-25 22:51:42 +01:00
connect ( view , & InstanceView : : activated , this , & MainWindow : : instanceActivated ) ;
2018-07-15 13:51:05 +01:00
// track the selection -- update the instance toolbar
connect ( view - > selectionModel ( ) , & QItemSelectionModel : : currentChanged , this , & MainWindow : : instanceChanged ) ;
// track icon changes and update the toolbar!
2021-11-20 15:22:22 +00:00
connect ( APPLICATION - > icons ( ) . get ( ) , & IconList : : iconUpdated , this , & MainWindow : : iconUpdated ) ;
2018-07-15 13:51:05 +01:00
// model reset -> selection is invalid. All the instance pointers are wrong.
2021-11-20 15:22:22 +00:00
connect ( APPLICATION - > instances ( ) . get ( ) , & InstanceList : : dataIsInvalid , this , & MainWindow : : selectionBad ) ;
2018-07-15 13:51:05 +01:00
2019-06-17 15:13:52 +01:00
// handle newly added instances
2021-11-20 15:22:22 +00:00
connect ( APPLICATION - > instances ( ) . get ( ) , & InstanceList : : instanceSelectRequest , this , & MainWindow : : instanceSelectRequest ) ;
2019-06-17 15:13:52 +01:00
2019-06-01 11:28:53 +01:00
// When the global settings page closes, we want to know about it and update our state
2021-11-20 15:22:22 +00:00
connect ( APPLICATION , & Application : : globalSettingsClosed , this , & MainWindow : : globalSettingsClosed ) ;
2019-06-01 11:28:53 +01:00
2018-07-15 13:51:05 +01:00
m_statusLeft = new QLabel ( tr ( " No instance selected " ) , this ) ;
2021-10-01 23:20:25 +01:00
m_statusCenter = new QLabel ( tr ( " Total playtime: 0s " ) , this ) ;
2018-07-15 13:51:05 +01:00
statusBar ( ) - > addPermanentWidget ( m_statusLeft , 1 ) ;
2021-10-10 00:25:31 +01:00
statusBar ( ) - > addPermanentWidget ( m_statusCenter , 0 ) ;
2018-07-15 13:51:05 +01:00
// Add "manage accounts" button, right align
QWidget * spacer = new QWidget ( ) ;
spacer - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Expanding ) ;
ui - > mainToolBar - > addWidget ( spacer ) ;
accountMenu = new QMenu ( this ) ;
2022-05-09 08:20:53 +01:00
// Use undocumented property... https://stackoverflow.com/questions/7121718/create-a-scrollbar-in-a-submenu-qt
accountMenu - > setStyleSheet ( " QMenu { menu-scrollable: 1; } " ) ;
2018-07-15 13:51:05 +01:00
repopulateAccountsMenu ( ) ;
accountMenuButton = new QToolButton ( this ) ;
accountMenuButton - > setMenu ( accountMenu ) ;
accountMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
accountMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
2021-11-20 15:22:22 +00:00
accountMenuButton - > setIcon ( APPLICATION - > getThemedIcon ( " noaccount " ) ) ;
2018-07-15 13:51:05 +01:00
QWidgetAction * accountMenuButtonAction = new QWidgetAction ( this ) ;
accountMenuButtonAction - > setDefaultWidget ( accountMenuButton ) ;
ui - > mainToolBar - > addAction ( accountMenuButtonAction ) ;
// Update the menu when the active account changes.
// Shouldn't have to use lambdas here like this, but if I don't, the compiler throws a fit.
// Template hell sucks...
2021-07-26 20:44:11 +01:00
connect (
2021-11-20 15:22:22 +00:00
APPLICATION - > accounts ( ) . get ( ) ,
& AccountList : : defaultAccountChanged ,
2021-07-26 20:44:11 +01:00
[ this ] {
2021-11-20 15:22:22 +00:00
defaultAccountChanged ( ) ;
2021-07-26 20:44:11 +01:00
}
) ;
connect (
2021-11-20 15:22:22 +00:00
APPLICATION - > accounts ( ) . get ( ) ,
2021-07-26 20:44:11 +01:00
& AccountList : : listChanged ,
[ this ]
{
repopulateAccountsMenu ( ) ;
}
) ;
2018-07-15 13:51:05 +01:00
// Show initial account
2021-11-20 15:22:22 +00:00
defaultAccountChanged ( ) ;
2018-07-15 13:51:05 +01:00
2021-07-26 20:44:11 +01:00
// TODO: refresh accounts here?
2021-11-20 15:22:22 +00:00
// auto accounts = APPLICATION->accounts();
2018-07-15 13:51:05 +01:00
2022-02-10 11:55:07 +00:00
// load the news
{
m_newsChecker - > reloadNews ( ) ;
updateNewsLabel ( ) ;
}
2018-07-15 13:51:05 +01:00
if ( BuildConfig . UPDATER_ENABLED )
{
2021-11-20 15:22:22 +00:00
bool updatesAllowed = APPLICATION - > updatesAreAllowed ( ) ;
2018-07-15 13:51:05 +01:00
updatesAllowedChanged ( updatesAllowed ) ;
2018-11-01 22:30:13 +00:00
// NOTE: calling the operator like that is an ugly hack to appease ancient gcc...
connect ( ui - > actionCheckUpdate . operator - > ( ) , & QAction : : triggered , this , & MainWindow : : checkForUpdates ) ;
2018-07-15 13:51:05 +01:00
// set up the updater object.
2021-11-20 15:22:22 +00:00
auto updater = APPLICATION - > updateChecker ( ) ;
2018-07-15 13:51:05 +01:00
connect ( updater . get ( ) , & UpdateChecker : : updateAvailable , this , & MainWindow : : updateAvailable ) ;
connect ( updater . get ( ) , & UpdateChecker : : noUpdateFound , this , & MainWindow : : updateNotAvailable ) ;
// if automatic update checks are allowed, start one.
2021-11-20 15:22:22 +00:00
if ( APPLICATION - > settings ( ) - > get ( " AutoUpdate " ) . toBool ( ) & & updatesAllowed )
2018-07-15 13:51:05 +01:00
{
2021-11-20 15:22:22 +00:00
updater - > checkForUpdate ( APPLICATION - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , false ) ;
2018-07-15 13:51:05 +01:00
}
2022-04-21 03:34:13 +01:00
2022-04-26 00:33:17 +01:00
if ( APPLICATION - > updateChecker ( ) - > getExternalUpdater ( ) )
{
connect ( APPLICATION - > updateChecker ( ) - > getExternalUpdater ( ) ,
& ExternalUpdater : : canCheckForUpdatesChanged ,
this ,
& MainWindow : : updatesAllowedChanged ) ;
}
2018-07-15 13:51:05 +01:00
}
2022-10-30 18:08:02 +00:00
connect ( ui - > actionUndoTrashInstance . operator - > ( ) , & QAction : : triggered , this , & MainWindow : : undoTrashInstance ) ;
2021-11-20 15:22:22 +00:00
setSelectedInstanceById ( APPLICATION - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2018-07-15 13:51:05 +01:00
// removing this looks stupid
view - > setFocus ( ) ;
2021-06-19 00:12:54 +01:00
retranslateUi ( ) ;
}
2022-04-08 21:21:52 +01:00
// macOS always has a native menu bar, so these fixes are not applicable
// Other systems may or may not have a native menu bar (most do not - it seems like only Ubuntu Unity does)
2022-04-08 22:00:42 +01:00
# ifndef Q_OS_MAC
2022-04-08 21:21:52 +01:00
void MainWindow : : keyReleaseEvent ( QKeyEvent * event )
{
2022-04-15 23:25:37 +01:00
if ( event - > key ( ) = = Qt : : Key_Alt & & ! APPLICATION - > settings ( ) - > get ( " MenuBarInsteadOfToolBar " ) . toBool ( ) )
2022-04-08 21:21:52 +01:00
ui - > menuBar - > setVisible ( ! ui - > menuBar - > isVisible ( ) ) ;
2022-04-08 22:00:42 +01:00
else
QMainWindow : : keyReleaseEvent ( event ) ;
2022-04-08 21:21:52 +01:00
}
# endif
2021-06-19 00:12:54 +01:00
void MainWindow : : retranslateUi ( )
{
2021-11-20 15:22:22 +00:00
auto accounts = APPLICATION - > accounts ( ) ;
MinecraftAccountPtr defaultAccount = accounts - > defaultAccount ( ) ;
if ( defaultAccount ) {
auto profileLabel = profileInUseFilter ( defaultAccount - > profileName ( ) , defaultAccount - > isInUse ( ) ) ;
2021-07-26 20:44:11 +01:00
accountMenuButton - > setText ( profileLabel ) ;
}
else {
2022-10-30 21:55:15 +00:00
accountMenuButton - > setText ( tr ( " Accounts " ) ) ;
2021-07-26 20:44:11 +01:00
}
2021-06-19 00:12:54 +01:00
if ( m_selectedInstance ) {
m_statusLeft - > setText ( m_selectedInstance - > getStatusbarDescription ( ) ) ;
} else {
m_statusLeft - > setText ( tr ( " No instance selected " ) ) ;
}
ui - > retranslateUi ( this ) ;
2013-01-09 18:22:22 +00:00
}
MainWindow : : ~ MainWindow ( )
{
2013-03-11 21:19:17 +00:00
}
2019-07-16 00:30:09 +01:00
QMenu * MainWindow : : createPopupMenu ( )
{
QMenu * filteredMenu = QMainWindow : : createPopupMenu ( ) ;
filteredMenu - > removeAction ( ui - > mainToolBar - > toggleViewAction ( ) ) ;
2022-10-25 23:22:11 +01:00
filteredMenu - > addAction ( ui - > actionLockToolbars ) ;
2019-07-16 00:30:09 +01:00
return filteredMenu ;
}
2022-10-25 23:22:11 +01:00
void MainWindow : : lockToolbars ( bool state )
{
ui - > mainToolBar - > setMovable ( ! state ) ;
ui - > instanceToolBar - > setMovable ( ! state ) ;
ui - > newsToolBar - > setMovable ( ! state ) ;
APPLICATION - > settings ( ) - > set ( " ToolbarsLocked " , state ) ;
}
2019-07-16 00:30:09 +01:00
2018-03-15 08:27:45 +00:00
void MainWindow : : konamiTriggered ( )
{
2018-07-15 13:51:05 +01:00
qDebug ( ) < < " Super Secret Mode ACTIVATED! " ;
2018-03-15 08:27:45 +00:00
}
2014-01-27 02:00:49 +00:00
void MainWindow : : showInstanceContextMenu ( const QPoint & pos )
2014-01-05 00:06:59 +00:00
{
2018-07-15 13:51:05 +01:00
QList < QAction * > actions ;
QAction * actionSep = new QAction ( " " , this ) ;
actionSep - > setSeparator ( true ) ;
bool onInstance = view - > indexAt ( pos ) . isValid ( ) ;
if ( onInstance )
{
actions = ui - > instanceToolBar - > actions ( ) ;
// replace the change icon widget with an actual action
actions . replace ( 0 , ui - > actionChangeInstIcon ) ;
// replace the rename widget with an actual action
actions . replace ( 1 , ui - > actionRenameInstance ) ;
// add header
actions . prepend ( actionSep ) ;
QAction * actionVoid = new QAction ( m_selectedInstance - > name ( ) , this ) ;
actionVoid - > setEnabled ( false ) ;
actions . prepend ( actionVoid ) ;
}
else
{
auto group = view - > groupNameAt ( pos ) ;
2022-10-18 08:50:27 +01:00
QAction * actionVoid = new QAction ( BuildConfig . LAUNCHER_DISPLAYNAME , this ) ;
2018-07-15 13:51:05 +01:00
actionVoid - > setEnabled ( false ) ;
QAction * actionCreateInstance = new QAction ( tr ( " Create instance " ) , this ) ;
actionCreateInstance - > setToolTip ( ui - > actionAddInstance - > toolTip ( ) ) ;
if ( ! group . isNull ( ) )
{
QVariantMap data ;
data [ " group " ] = group ;
actionCreateInstance - > setData ( data ) ;
}
connect ( actionCreateInstance , SIGNAL ( triggered ( bool ) ) , SLOT ( on_actionAddInstance_triggered ( ) ) ) ;
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCreateInstance ) ;
if ( ! group . isNull ( ) )
{
QAction * actionDeleteGroup = new QAction ( tr ( " Delete group '%1' " ) . arg ( group ) , this ) ;
QVariantMap data ;
data [ " group " ] = group ;
actionDeleteGroup - > setData ( data ) ;
connect ( actionDeleteGroup , SIGNAL ( triggered ( bool ) ) , SLOT ( deleteGroup ( ) ) ) ;
actions . append ( actionDeleteGroup ) ;
}
}
QMenu myMenu ;
myMenu . addActions ( actions ) ;
/*
if ( onInstance )
myMenu . setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
*/
myMenu . exec ( view - > mapToGlobal ( pos ) ) ;
2014-01-05 00:06:59 +00:00
}
2022-04-15 23:25:37 +01:00
void MainWindow : : updateMainToolBar ( )
{
ui - > menuBar - > setVisible ( APPLICATION - > settings ( ) - > get ( " MenuBarInsteadOfToolBar " ) . toBool ( ) ) ;
ui - > mainToolBar - > setVisible ( ui - > menuBar - > isNativeMenuBar ( ) | | ! APPLICATION - > settings ( ) - > get ( " MenuBarInsteadOfToolBar " ) . toBool ( ) ) ;
}
2014-02-16 10:49:55 +00:00
void MainWindow : : updateToolsMenu ( )
{
2018-07-15 13:51:05 +01:00
QToolButton * launchButton = dynamic_cast < QToolButton * > ( ui - > instanceToolBar - > widgetForAction ( ui - > actionLaunchInstance ) ) ;
2019-04-14 23:42:06 +01:00
2022-06-19 19:33:34 +01:00
bool currentInstanceRunning = m_selectedInstance & & m_selectedInstance - > isRunning ( ) ;
ui - > actionLaunchInstance - > setDisabled ( ! m_selectedInstance | | currentInstanceRunning ) ;
ui - > actionLaunchInstanceOffline - > setDisabled ( ! m_selectedInstance | | currentInstanceRunning ) ;
2022-07-11 19:46:11 +01:00
ui - > actionLaunchInstanceDemo - > setDisabled ( ! m_selectedInstance | | currentInstanceRunning ) ;
2018-07-15 13:51:05 +01:00
QMenu * launchMenu = ui - > actionLaunchInstance - > menu ( ) ;
launchButton - > setPopupMode ( QToolButton : : MenuButtonPopup ) ;
if ( launchMenu )
{
launchMenu - > clear ( ) ;
}
else
{
launchMenu = new QMenu ( this ) ;
}
QAction * normalLaunch = launchMenu - > addAction ( tr ( " Launch " ) ) ;
2022-04-16 08:32:08 +01:00
normalLaunch - > setShortcut ( QKeySequence : : Open ) ;
2022-10-10 22:20:21 +01:00
QAction * normalLaunchOffline = launchMenu - > addAction ( tr ( " Launch Offline " ) ) ;
2022-04-16 08:32:08 +01:00
normalLaunchOffline - > setShortcut ( QKeySequence ( tr ( " Ctrl+Shift+O " ) ) ) ;
2022-10-10 22:20:21 +01:00
QAction * normalLaunchDemo = launchMenu - > addAction ( tr ( " Launch Demo " ) ) ;
2022-07-13 21:53:36 +01:00
normalLaunchDemo - > setShortcut ( QKeySequence ( tr ( " Ctrl+Alt+O " ) ) ) ;
2022-04-17 17:44:24 +01:00
if ( m_selectedInstance )
{
2022-06-19 19:33:34 +01:00
normalLaunch - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
normalLaunchOffline - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2022-07-11 19:46:11 +01:00
normalLaunchDemo - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2022-06-19 19:33:34 +01:00
2022-04-17 17:44:24 +01:00
connect ( normalLaunch , & QAction : : triggered , [ this ] ( ) {
2022-07-11 19:46:11 +01:00
APPLICATION - > launch ( m_selectedInstance , true , false ) ;
2022-04-17 17:44:24 +01:00
} ) ;
connect ( normalLaunchOffline , & QAction : : triggered , [ this ] ( ) {
2022-07-11 19:46:11 +01:00
APPLICATION - > launch ( m_selectedInstance , false , false ) ;
} ) ;
connect ( normalLaunchDemo , & QAction : : triggered , [ this ] ( ) {
APPLICATION - > launch ( m_selectedInstance , false , true ) ;
2022-04-17 17:44:24 +01:00
} ) ;
}
else
{
normalLaunch - > setDisabled ( true ) ;
normalLaunchOffline - > setDisabled ( true ) ;
2022-07-11 19:46:11 +01:00
normalLaunchDemo - > setDisabled ( true ) ;
2022-04-17 17:44:24 +01:00
}
2022-09-15 23:23:58 +01:00
// Disable demo-mode if not available.
auto instance = dynamic_cast < MinecraftInstance * > ( m_selectedInstance . get ( ) ) ;
if ( instance ) {
normalLaunchDemo - > setEnabled ( instance - > supportsDemo ( ) ) ;
}
2019-04-14 22:02:01 +01:00
QString profilersTitle = tr ( " Profilers " ) ;
launchMenu - > addSeparator ( ) - > setText ( profilersTitle ) ;
2021-11-20 15:22:22 +00:00
for ( auto profiler : APPLICATION - > profilers ( ) . values ( ) )
2018-07-15 13:51:05 +01:00
{
QAction * profilerAction = launchMenu - > addAction ( profiler - > name ( ) ) ;
2022-10-11 13:58:34 +01:00
QAction * profilerOfflineAction = launchMenu - > addAction ( tr ( " %1 Offline " ) . arg ( profiler - > name ( ) ) ) ;
2018-07-15 13:51:05 +01:00
QString error ;
if ( ! profiler - > check ( & error ) )
{
profilerAction - > setDisabled ( true ) ;
2019-04-14 23:42:06 +01:00
profilerOfflineAction - > setDisabled ( true ) ;
2019-04-14 22:02:01 +01:00
QString profilerToolTip = tr ( " Profiler not setup correctly. Go into settings, \" External Tools \" . " ) ;
profilerAction - > setToolTip ( profilerToolTip ) ;
profilerOfflineAction - > setToolTip ( profilerToolTip ) ;
2018-07-15 13:51:05 +01:00
}
2022-04-17 17:44:24 +01:00
else if ( m_selectedInstance )
2018-07-15 13:51:05 +01:00
{
2022-06-19 19:33:34 +01:00
profilerAction - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
profilerOfflineAction - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2018-07-15 13:51:05 +01:00
connect ( profilerAction , & QAction : : triggered , [ this , profiler ] ( )
{
2022-07-11 19:46:11 +01:00
APPLICATION - > launch ( m_selectedInstance , true , false , profiler . get ( ) ) ;
2018-07-15 13:51:05 +01:00
} ) ;
2019-04-14 23:42:06 +01:00
connect ( profilerOfflineAction , & QAction : : triggered , [ this , profiler ] ( )
{
2022-07-11 19:46:11 +01:00
APPLICATION - > launch ( m_selectedInstance , false , false , profiler . get ( ) ) ;
} ) ;
2018-07-15 13:51:05 +01:00
}
2022-04-17 17:44:24 +01:00
else
{
profilerAction - > setDisabled ( true ) ;
profilerOfflineAction - > setDisabled ( true ) ;
}
2018-07-15 13:51:05 +01:00
}
ui - > actionLaunchInstance - > setMenu ( launchMenu ) ;
2014-02-16 10:49:55 +00:00
}
2022-11-14 19:33:25 +00:00
void MainWindow : : updateThemeMenu ( )
{
QMenu * themeMenu = ui - > actionChangeTheme - > menu ( ) ;
2022-11-15 08:38:31 +00:00
if ( themeMenu ) {
2022-11-14 19:33:25 +00:00
themeMenu - > clear ( ) ;
2022-11-15 08:38:31 +00:00
} else {
2022-11-14 19:33:25 +00:00
themeMenu = new QMenu ( this ) ;
}
2022-11-14 22:59:26 +00:00
auto themes = APPLICATION - > getValidApplicationThemes ( ) ;
2022-11-17 09:20:53 +00:00
QActionGroup * themesGroup = new QActionGroup ( this ) ;
2022-11-14 22:59:26 +00:00
2022-11-16 15:24:28 +00:00
for ( auto * theme : themes ) {
2022-11-14 22:59:26 +00:00
QAction * themeAction = themeMenu - > addAction ( theme - > name ( ) ) ;
themeAction - > setCheckable ( true ) ;
2022-11-15 08:38:31 +00:00
if ( APPLICATION - > settings ( ) - > get ( " ApplicationTheme " ) . toString ( ) = = theme - > id ( ) ) {
themeAction - > setChecked ( true ) ;
}
2022-11-17 09:39:05 +00:00
themeAction - > setActionGroup ( themesGroup ) ;
2022-11-14 22:59:26 +00:00
connect ( themeAction , & QAction : : triggered , [ theme ] ( ) {
2022-11-15 09:09:13 +00:00
APPLICATION - > setApplicationTheme ( theme - > id ( ) , false ) ;
APPLICATION - > settings ( ) - > set ( " ApplicationTheme " , theme - > id ( ) ) ;
2022-11-14 22:59:26 +00:00
} ) ;
}
2022-11-14 19:33:25 +00:00
ui - > actionChangeTheme - > setMenu ( themeMenu ) ;
}
2013-11-27 22:39:49 +00:00
void MainWindow : : repopulateAccountsMenu ( )
{
2018-07-15 13:51:05 +01:00
accountMenu - > clear ( ) ;
2022-04-16 00:55:49 +01:00
ui - > profileMenu - > clear ( ) ;
2018-07-15 13:51:05 +01:00
2021-11-20 15:22:22 +00:00
auto accounts = APPLICATION - > accounts ( ) ;
MinecraftAccountPtr defaultAccount = accounts - > defaultAccount ( ) ;
2018-07-15 13:51:05 +01:00
2021-07-26 20:44:11 +01:00
QString active_profileId = " " ;
2021-11-20 15:22:22 +00:00
if ( defaultAccount )
2018-07-15 13:51:05 +01:00
{
// this can be called before accountMenuButton exists
2021-07-26 20:44:11 +01:00
if ( accountMenuButton )
2018-07-15 13:51:05 +01:00
{
2021-11-20 15:22:22 +00:00
auto profileLabel = profileInUseFilter ( defaultAccount - > profileName ( ) , defaultAccount - > isInUse ( ) ) ;
2018-07-15 13:51:05 +01:00
accountMenuButton - > setText ( profileLabel ) ;
}
}
if ( accounts - > count ( ) < = 0 )
{
2022-05-09 04:19:23 +01:00
ui - > all_actions . removeAll ( & ui - > actionNoAccountsAdded ) ;
ui - > actionNoAccountsAdded = TranslatedAction ( this ) ;
ui - > actionNoAccountsAdded - > setObjectName ( QStringLiteral ( " actionNoAccountsAdded " ) ) ;
ui - > actionNoAccountsAdded . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " No accounts added! " ) ) ;
ui - > actionNoAccountsAdded - > setEnabled ( false ) ;
accountMenu - > addAction ( ui - > actionNoAccountsAdded ) ;
ui - > profileMenu - > addAction ( ui - > actionNoAccountsAdded ) ;
ui - > all_actions . append ( & ui - > actionNoAccountsAdded ) ;
2018-07-15 13:51:05 +01:00
}
else
{
// TODO: Nicer way to iterate?
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
{
2021-07-26 20:44:11 +01:00
MinecraftAccountPtr account = accounts - > at ( i ) ;
auto profileLabel = profileInUseFilter ( account - > profileName ( ) , account - > isInUse ( ) ) ;
QAction * action = new QAction ( profileLabel , this ) ;
2021-11-10 02:02:51 +00:00
action - > setData ( i ) ;
2021-07-26 20:44:11 +01:00
action - > setCheckable ( true ) ;
2021-11-20 15:22:22 +00:00
if ( defaultAccount = = account )
2018-07-15 13:51:05 +01:00
{
2021-07-26 20:44:11 +01:00
action - > setChecked ( true ) ;
2018-07-15 13:51:05 +01:00
}
2021-07-26 20:44:11 +01:00
2021-11-10 02:02:51 +00:00
auto face = account - > getFace ( ) ;
if ( ! face . isNull ( ) ) {
action - > setIcon ( face ) ;
}
else {
2021-11-20 15:22:22 +00:00
action - > setIcon ( APPLICATION - > getThemedIcon ( " noaccount " ) ) ;
2021-11-10 02:02:51 +00:00
}
2022-04-16 00:55:49 +01:00
const int highestNumberKey = 9 ;
if ( i < highestNumberKey )
{
action - > setShortcut ( QKeySequence ( tr ( " Ctrl+%1 " ) . arg ( i + 1 ) ) ) ;
}
2021-07-26 20:44:11 +01:00
accountMenu - > addAction ( action ) ;
2022-04-16 00:55:49 +01:00
ui - > profileMenu - > addAction ( action ) ;
2021-07-26 20:44:11 +01:00
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
2018-07-15 13:51:05 +01:00
}
}
accountMenu - > addSeparator ( ) ;
2022-04-16 00:55:49 +01:00
ui - > profileMenu - > addSeparator ( ) ;
2018-07-15 13:51:05 +01:00
2022-05-09 04:19:23 +01:00
ui - > all_actions . removeAll ( & ui - > actionNoDefaultAccount ) ;
ui - > actionNoDefaultAccount = TranslatedAction ( this ) ;
ui - > actionNoDefaultAccount - > setObjectName ( QStringLiteral ( " actionNoDefaultAccount " ) ) ;
ui - > actionNoDefaultAccount . setTextId ( QT_TRANSLATE_NOOP ( " MainWindow " , " No Default Account " ) ) ;
ui - > actionNoDefaultAccount - > setCheckable ( true ) ;
ui - > actionNoDefaultAccount - > setIcon ( APPLICATION - > getThemedIcon ( " noaccount " ) ) ;
ui - > actionNoDefaultAccount - > setData ( - 1 ) ;
ui - > actionNoDefaultAccount - > setShortcut ( QKeySequence ( tr ( " Ctrl+0 " ) ) ) ;
2021-11-20 15:22:22 +00:00
if ( ! defaultAccount ) {
2022-05-09 04:19:23 +01:00
ui - > actionNoDefaultAccount - > setChecked ( true ) ;
2018-07-15 13:51:05 +01:00
}
2022-05-09 04:19:23 +01:00
accountMenu - > addAction ( ui - > actionNoDefaultAccount ) ;
ui - > profileMenu - > addAction ( ui - > actionNoDefaultAccount ) ;
connect ( ui - > actionNoDefaultAccount , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
ui - > all_actions . append ( & ui - > actionNoDefaultAccount ) ;
ui - > actionNoDefaultAccount . retranslate ( ) ;
2018-07-15 13:51:05 +01:00
accountMenu - > addSeparator ( ) ;
2022-04-16 00:55:49 +01:00
ui - > profileMenu - > addSeparator ( ) ;
2018-07-15 13:51:05 +01:00
accountMenu - > addAction ( ui - > actionManageAccounts ) ;
2022-04-16 08:32:08 +01:00
ui - > profileMenu - > addAction ( ui - > actionManageAccounts ) ;
2013-11-27 22:39:49 +00:00
}
2017-05-02 00:43:18 +01:00
void MainWindow : : updatesAllowedChanged ( bool allowed )
{
2018-07-15 13:51:05 +01:00
if ( ! BuildConfig . UPDATER_ENABLED )
{
return ;
}
ui - > actionCheckUpdate - > setEnabled ( allowed ) ;
2017-05-02 00:43:18 +01:00
}
2013-11-27 22:39:49 +00:00
/*
* Assumes the sender is a QAction
*/
void MainWindow : : changeActiveAccount ( )
{
2018-07-15 13:51:05 +01:00
QAction * sAction = ( QAction * ) sender ( ) ;
2021-11-10 02:02:51 +00:00
2018-07-15 13:51:05 +01:00
// Profile's associated Mojang username
2021-11-10 02:02:51 +00:00
if ( sAction - > data ( ) . type ( ) ! = QVariant : : Type : : Int )
2018-07-15 13:51:05 +01:00
return ;
2013-11-27 22:39:49 +00:00
2018-07-15 13:51:05 +01:00
QVariant data = sAction - > data ( ) ;
2021-11-10 02:02:51 +00:00
bool valid = false ;
int index = data . toInt ( & valid ) ;
if ( ! valid ) {
index = - 1 ;
2018-07-15 13:51:05 +01:00
}
2021-11-20 15:22:22 +00:00
auto accounts = APPLICATION - > accounts ( ) ;
accounts - > setDefaultAccount ( index = = - 1 ? nullptr : accounts - > at ( index ) ) ;
defaultAccountChanged ( ) ;
2013-11-27 22:39:49 +00:00
}
2021-11-20 15:22:22 +00:00
void MainWindow : : defaultAccountChanged ( )
2013-11-27 16:56:15 +00:00
{
2018-07-15 13:51:05 +01:00
repopulateAccountsMenu ( ) ;
2013-11-27 22:39:49 +00:00
2021-11-20 15:22:22 +00:00
MinecraftAccountPtr account = APPLICATION - > accounts ( ) - > defaultAccount ( ) ;
2013-11-27 16:56:15 +00:00
2021-07-26 20:44:11 +01:00
// FIXME: this needs adjustment for MSA
2021-11-20 15:22:22 +00:00
if ( account & & account - > profileName ( ) ! = " " )
2018-07-15 13:51:05 +01:00
{
2021-07-26 20:44:11 +01:00
auto profileLabel = profileInUseFilter ( account - > profileName ( ) , account - > isInUse ( ) ) ;
accountMenuButton - > setText ( profileLabel ) ;
2021-11-10 02:02:51 +00:00
auto face = account - > getFace ( ) ;
if ( face . isNull ( ) ) {
2021-11-20 15:22:22 +00:00
accountMenuButton - > setIcon ( APPLICATION - > getThemedIcon ( " noaccount " ) ) ;
2021-11-10 02:02:51 +00:00
}
else {
accountMenuButton - > setIcon ( face ) ;
}
2021-07-26 20:44:11 +01:00
return ;
2018-07-15 13:51:05 +01:00
}
2013-11-27 22:39:49 +00:00
2018-07-15 13:51:05 +01:00
// Set the icon to the "no account" icon.
2021-11-20 15:22:22 +00:00
accountMenuButton - > setIcon ( APPLICATION - > getThemedIcon ( " noaccount " ) ) ;
2022-10-30 21:55:15 +00:00
accountMenuButton - > setText ( tr ( " Accounts " ) ) ;
2013-11-27 16:56:15 +00:00
}
2013-10-06 00:13:40 +01:00
bool MainWindow : : eventFilter ( QObject * obj , QEvent * ev )
2013-08-11 23:39:19 +01:00
{
2018-07-15 13:51:05 +01:00
if ( obj = = view )
{
if ( ev - > type ( ) = = QEvent : : KeyPress )
{
secretEventFilter - > input ( ev ) ;
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( ev ) ;
switch ( keyEvent - > key ( ) )
{
2018-11-22 00:50:32 +00:00
/*
2018-07-15 13:51:05 +01:00
case Qt : : Key_Enter :
case Qt : : Key_Return :
activateInstance ( m_selectedInstance ) ;
return true ;
2018-11-22 00:50:32 +00:00
*/
2018-07-15 13:51:05 +01:00
case Qt : : Key_Delete :
on_actionDeleteInstance_triggered ( ) ;
return true ;
case Qt : : Key_F5 :
refreshInstances ( ) ;
return true ;
case Qt : : Key_F2 :
on_actionRenameInstance_triggered ( ) ;
return true ;
default :
break ;
}
}
}
return QMainWindow : : eventFilter ( obj , ev ) ;
2013-08-11 23:39:19 +01:00
}
2022-02-10 11:55:07 +00:00
void MainWindow : : updateNewsLabel ( )
{
if ( m_newsChecker - > isLoadingNews ( ) )
{
newsLabel - > setText ( tr ( " Loading news... " ) ) ;
newsLabel - > setEnabled ( false ) ;
2022-08-12 21:33:10 +01:00
ui - > actionMoreNews - > setVisible ( false ) ;
2022-02-10 11:55:07 +00:00
}
else
{
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
if ( entries . length ( ) > 0 )
{
newsLabel - > setText ( entries [ 0 ] - > title ) ;
newsLabel - > setEnabled ( true ) ;
2022-08-12 21:33:10 +01:00
ui - > actionMoreNews - > setVisible ( true ) ;
2022-02-10 11:55:07 +00:00
}
else
{
newsLabel - > setText ( tr ( " No news available. " ) ) ;
newsLabel - > setEnabled ( false ) ;
2022-08-12 21:33:10 +01:00
ui - > actionMoreNews - > setVisible ( false ) ;
2022-02-10 11:55:07 +00:00
}
}
}
2015-02-08 16:56:14 +00:00
void MainWindow : : updateAvailable ( GoUpdate : : Status status )
2013-12-01 23:55:24 +00:00
{
2021-11-20 15:22:22 +00:00
if ( ! APPLICATION - > updatesAreAllowed ( ) )
2018-07-15 13:51:05 +01:00
{
updateNotAvailable ( ) ;
return ;
}
UpdateDialog dlg ( true , this ) ;
UpdateAction action = ( UpdateAction ) dlg . exec ( ) ;
switch ( action )
{
case UPDATE_LATER :
qDebug ( ) < < " Update will be installed later. " ;
break ;
case UPDATE_NOW :
downloadUpdates ( status ) ;
break ;
}
2013-12-01 23:55:24 +00:00
}
2014-07-13 23:57:54 +01:00
void MainWindow : : updateNotAvailable ( )
{
2018-07-15 13:51:05 +01:00
UpdateDialog dlg ( false , this ) ;
dlg . exec ( ) ;
2014-07-13 23:57:54 +01:00
}
2014-01-03 18:19:27 +00:00
QList < int > stringToIntList ( const QString & string )
{
2022-05-02 18:10:45 +01:00
# if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
QStringList split = string . split ( ' , ' , Qt : : SkipEmptyParts ) ;
# else
2018-07-15 13:51:05 +01:00
QStringList split = string . split ( ' , ' , QString : : SkipEmptyParts ) ;
2022-05-02 18:10:45 +01:00
# endif
2018-07-15 13:51:05 +01:00
QList < int > out ;
for ( int i = 0 ; i < split . size ( ) ; + + i )
{
out . append ( split . at ( i ) . toInt ( ) ) ;
}
return out ;
2014-01-03 18:19:27 +00:00
}
QString intListToString ( const QList < int > & list )
{
2018-07-15 13:51:05 +01:00
QStringList slist ;
for ( int i = 0 ; i < list . size ( ) ; + + i )
{
slist . append ( QString : : number ( list . at ( i ) ) ) ;
}
return slist . join ( ' , ' ) ;
2014-01-03 18:19:27 +00:00
}
2015-06-07 22:42:22 +01:00
void MainWindow : : downloadUpdates ( GoUpdate : : Status status )
2013-12-06 18:59:58 +00:00
{
2021-11-20 15:22:22 +00:00
if ( ! APPLICATION - > updatesAreAllowed ( ) )
2018-07-15 13:51:05 +01:00
{
return ;
}
qDebug ( ) < < " Downloading updates. " ;
ProgressDialog updateDlg ( this ) ;
2021-11-20 15:22:22 +00:00
status . rootPath = APPLICATION - > root ( ) ;
2018-07-15 13:51:05 +01:00
2021-11-20 15:22:22 +00:00
auto dlPath = FS : : PathCombine ( APPLICATION - > root ( ) , " update " , " XXXXXX " ) ;
2018-07-15 13:51:05 +01:00
if ( ! FS : : ensureFilePathExists ( dlPath ) )
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , tr ( " Couldn't create folder for update downloads: \n %1 " ) . arg ( dlPath ) , QMessageBox : : Warning ) - > show ( ) ;
}
2021-11-21 22:21:12 +00:00
GoUpdate : : DownloadTask updateTask ( APPLICATION - > network ( ) , status , dlPath , & updateDlg ) ;
2018-07-15 13:51:05 +01:00
// If the task succeeds, install the updates.
if ( updateDlg . execWithTask ( & updateTask ) )
{
/**
* NOTE : This disables launching instances until the update either succeeds ( and this process exits )
* or the update fails ( and the control leaves this scope ) .
*/
2021-11-20 15:22:22 +00:00
APPLICATION - > updateIsRunning ( true ) ;
UpdateController update ( this , APPLICATION - > root ( ) , updateTask . updateFilesDir ( ) , updateTask . operations ( ) ) ;
2018-07-15 13:51:05 +01:00
update . installUpdates ( ) ;
2021-11-20 15:22:22 +00:00
APPLICATION - > updateIsRunning ( false ) ;
2018-07-15 13:51:05 +01:00
}
else
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , updateTask . failReason ( ) , QMessageBox : : Warning ) - > show ( ) ;
}
2013-12-06 18:59:58 +00:00
}
2013-10-06 00:13:40 +01:00
void MainWindow : : onCatToggled ( bool state )
2013-08-25 21:48:41 +01:00
{
2018-07-15 13:51:05 +01:00
setCatBackground ( state ) ;
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " TheCat " , state ) ;
2013-08-25 21:48:41 +01:00
}
2018-12-24 13:49:53 +00:00
namespace {
template < typename T >
T non_stupid_abs ( T in )
{
if ( in < 0 )
return - in ;
return in ;
}
}
2013-10-06 00:13:40 +01:00
void MainWindow : : setCatBackground ( bool enabled )
2013-08-25 21:48:41 +01:00
{
2018-07-15 13:51:05 +01:00
if ( enabled )
{
2018-12-24 02:26:14 +00:00
QDateTime now = QDateTime : : currentDateTime ( ) ;
2021-12-05 22:26:04 +00:00
QDateTime birthday ( QDate ( now . date ( ) . year ( ) , 11 , 30 ) , QTime ( 0 , 0 ) ) ;
2018-12-24 02:26:14 +00:00
QDateTime xmas ( QDate ( now . date ( ) . year ( ) , 12 , 25 ) , QTime ( 0 , 0 ) ) ;
2022-11-04 18:09:57 +00:00
QDateTime halloween ( QDate ( now . date ( ) . year ( ) , 10 , 31 ) , QTime ( 0 , 0 ) ) ;
2022-11-01 22:06:27 +00:00
QString cat = APPLICATION - > settings ( ) - > get ( " BackgroundCat " ) . toString ( ) ;
2022-11-04 18:09:57 +00:00
if ( non_stupid_abs ( now . daysTo ( xmas ) ) < = 4 ) {
2022-11-01 22:06:27 +00:00
cat + = " -xmas " ;
2022-11-05 23:04:43 +00:00
} else if ( non_stupid_abs ( now . daysTo ( halloween ) ) < = 4 ) {
2022-11-05 23:47:33 +00:00
cat + = " -spooky " ;
2022-11-04 18:09:57 +00:00
} else if ( non_stupid_abs ( now . daysTo ( birthday ) ) < = 12 ) {
2022-11-01 22:06:27 +00:00
cat + = " -bday " ;
2021-12-05 22:26:04 +00:00
}
2018-12-24 02:26:14 +00:00
view - > setStyleSheet ( QString ( R " (
2021-10-25 22:51:42 +01:00
InstanceView
2018-07-23 23:42:18 +01:00
{
2018-12-24 02:26:14 +00:00
background - image : url ( : / backgrounds / % 1 ) ;
2018-07-23 23:42:18 +01:00
background - attachment : fixed ;
background - clip : padding ;
2022-12-14 07:36:35 +00:00
background - position : bottom right ;
2018-07-23 23:42:18 +01:00
background - repeat : none ;
background - color : palette ( base ) ;
2022-11-01 22:06:27 +00:00
} ) " )
. arg ( cat ) ) ;
2018-07-15 13:51:05 +01:00
}
else
{
view - > setStyleSheet ( QString ( ) ) ;
}
2013-08-25 21:48:41 +01:00
}
2016-10-02 23:55:54 +01:00
void MainWindow : : runModalTask ( Task * task )
2015-01-27 21:31:07 +00:00
{
2018-07-15 13:51:05 +01:00
connect ( task , & Task : : failed , [ this ] ( QString reason )
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , reason , QMessageBox : : Critical ) - > show ( ) ;
} ) ;
connect ( task , & Task : : succeeded , [ this , task ] ( )
{
QStringList warnings = task - > warnings ( ) ;
if ( warnings . count ( ) )
{
CustomMessageBox : : selectable ( this , tr ( " Warnings " ) , warnings . join ( ' \n ' ) , QMessageBox : : Warning ) - > show ( ) ;
}
} ) ;
2022-07-28 19:58:04 +01:00
connect ( task , & Task : : aborted , [ this ]
{
CustomMessageBox : : selectable ( this , tr ( " Task aborted " ) , tr ( " The task has been aborted by the user. " ) , QMessageBox : : Information ) - > show ( ) ;
} ) ;
2018-07-15 13:51:05 +01:00
ProgressDialog loadDialog ( this ) ;
loadDialog . setSkipButton ( true , tr ( " Abort " ) ) ;
loadDialog . execWithTask ( task ) ;
2016-10-02 23:55:54 +01:00
}
2015-02-12 21:01:20 +00:00
2018-03-19 01:36:12 +00:00
void MainWindow : : instanceFromInstanceTask ( InstanceTask * rawTask )
2016-10-02 23:55:54 +01:00
{
2021-11-20 15:22:22 +00:00
unique_qobject_ptr < Task > task ( APPLICATION - > instances ( ) - > wrapInstanceTask ( rawTask ) ) ;
2018-07-15 13:51:05 +01:00
runModalTask ( task . get ( ) ) ;
2018-02-28 18:42:30 +00:00
}
2016-10-02 23:55:54 +01:00
void MainWindow : : on_actionCopyInstance_triggered ( )
2015-01-27 21:31:07 +00:00
{
2018-07-15 13:51:05 +01:00
if ( ! m_selectedInstance )
return ;
2015-02-01 02:08:25 +00:00
2018-07-15 13:51:05 +01:00
CopyInstanceDialog copyInstDlg ( m_selectedInstance , this ) ;
if ( ! copyInstDlg . exec ( ) )
return ;
2015-01-27 21:31:07 +00:00
2022-10-23 04:04:36 +01:00
auto copyTask = new InstanceCopyTask ( m_selectedInstance , copyInstDlg . getChosenOptions ( ) ) ;
2018-07-15 13:51:05 +01:00
copyTask - > setName ( copyInstDlg . instName ( ) ) ;
copyTask - > setGroup ( copyInstDlg . instGroup ( ) ) ;
copyTask - > setIcon ( copyInstDlg . iconKey ( ) ) ;
2021-11-20 15:22:22 +00:00
unique_qobject_ptr < Task > task ( APPLICATION - > instances ( ) - > wrapInstanceTask ( copyTask ) ) ;
2018-07-15 13:51:05 +01:00
runModalTask ( task . get ( ) ) ;
2015-01-27 21:31:07 +00:00
}
2015-02-12 21:01:20 +00:00
2015-01-27 21:31:07 +00:00
void MainWindow : : finalizeInstance ( InstancePtr inst )
{
2018-07-15 13:51:05 +01:00
view - > updateGeometries ( ) ;
setSelectedInstanceById ( inst - > id ( ) ) ;
2021-11-20 15:22:22 +00:00
if ( APPLICATION - > accounts ( ) - > anyAccountIsValid ( ) )
2018-07-15 13:51:05 +01:00
{
ProgressDialog loadDialog ( this ) ;
auto update = inst - > createUpdateTask ( Net : : Mode : : Online ) ;
connect ( update . get ( ) , & Task : : failed , [ this ] ( QString reason )
{
QString error = QString ( " Instance load failed: %1 " ) . arg ( reason ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , error , QMessageBox : : Warning ) - > show ( ) ;
} ) ;
if ( update )
{
loadDialog . setSkipButton ( true , tr ( " Abort " ) ) ;
loadDialog . execWithTask ( update . get ( ) ) ;
}
}
else
{
2021-10-17 23:47:02 +01:00
CustomMessageBox : : selectable (
this ,
tr ( " Error " ) ,
tr ( " The launcher cannot download Minecraft or update instances unless you have at least "
" one account added. \n Please add your Mojang or Minecraft account. " ) ,
QMessageBox : : Warning
) - > show ( ) ;
2018-07-15 13:51:05 +01:00
}
2013-01-09 18:22:22 +00:00
}
2017-04-22 05:11:26 +01:00
void MainWindow : : addInstance ( QString url )
2015-01-27 21:31:07 +00:00
{
2018-07-15 13:51:05 +01:00
QString groupName ;
do
{
QObject * obj = sender ( ) ;
if ( ! obj )
break ;
QAction * action = qobject_cast < QAction * > ( obj ) ;
if ( ! action )
break ;
auto map = action - > data ( ) . toMap ( ) ;
if ( ! map . contains ( " group " ) )
break ;
groupName = map [ " group " ] . toString ( ) ;
} while ( 0 ) ;
if ( groupName . isEmpty ( ) )
{
2021-11-20 15:22:22 +00:00
groupName = APPLICATION - > settings ( ) - > get ( " LastUsedGroupForNewInstance " ) . toString ( ) ;
2018-07-15 13:51:05 +01:00
}
NewInstanceDialog newInstDlg ( groupName , url , this ) ;
if ( ! newInstDlg . exec ( ) )
return ;
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " LastUsedGroupForNewInstance " , newInstDlg . instGroup ( ) ) ;
2018-07-15 13:51:05 +01:00
InstanceTask * creationTask = newInstDlg . extractTask ( ) ;
if ( creationTask )
{
instanceFromInstanceTask ( creationTask ) ;
}
2015-01-27 21:31:07 +00:00
}
2017-04-22 05:11:26 +01:00
void MainWindow : : on_actionAddInstance_triggered ( )
{
2018-07-15 13:51:05 +01:00
addInstance ( ) ;
2017-04-22 05:11:26 +01:00
}
2022-12-31 01:06:17 +00:00
void MainWindow : : processURLs ( QList < QUrl > urls )
2017-04-22 05:11:26 +01:00
{
2022-11-27 17:38:56 +00:00
// NOTE: This loop only processes one dropped file!
2022-11-19 16:28:35 +00:00
for ( auto & url : urls ) {
2022-12-31 01:06:17 +00:00
qDebug ( ) < < " Processing : " < < url ;
2022-12-02 01:54:03 +00:00
// The isLocalFile() check below doesn't work as intended without an explicit scheme.
if ( url . scheme ( ) . isEmpty ( ) )
url . setScheme ( " file " ) ;
2022-11-27 17:38:56 +00:00
if ( ! url . isLocalFile ( ) ) { // probably instance/modpack
2018-07-15 13:51:05 +01:00
addInstance ( url . toString ( ) ) ;
2022-11-27 17:38:56 +00:00
break ;
2018-07-15 13:51:05 +01:00
}
2022-11-19 16:28:35 +00:00
2022-11-27 17:38:56 +00:00
auto localFileName = url . toLocalFile ( ) ;
QFileInfo localFileInfo ( localFileName ) ;
2022-12-31 01:06:17 +00:00
auto type = ResourceUtils : : identify ( localFileInfo ) ;
// bool is_resource = type;
2022-11-27 17:38:56 +00:00
2022-12-31 01:06:17 +00:00
if ( ! ( ResourceUtils : : ValidResourceTypes . count ( type ) > 0 ) ) { // probably instance/modpack
2022-11-27 17:38:56 +00:00
addInstance ( localFileName ) ;
2022-12-31 01:06:17 +00:00
continue ;
2022-11-27 17:38:56 +00:00
}
2022-12-31 01:06:17 +00:00
ImportResourceDialog dlg ( localFileName , type , this ) ;
2022-11-27 17:38:56 +00:00
if ( dlg . exec ( ) ! = QDialog : : Accepted )
2022-12-31 01:06:17 +00:00
continue ;
2022-11-27 17:38:56 +00:00
2022-12-31 01:06:17 +00:00
qDebug ( ) < < " Adding resource " < < localFileName < < " to " < < dlg . selectedInstanceKey ;
2022-11-27 17:38:56 +00:00
auto inst = APPLICATION - > instances ( ) - > getInstanceById ( dlg . selectedInstanceKey ) ;
auto minecraftInst = std : : dynamic_pointer_cast < MinecraftInstance > ( inst ) ;
2022-12-31 01:06:17 +00:00
switch ( type ) {
case PackedResourceType : : ResourcePack :
2022-12-31 02:27:26 +00:00
minecraftInst - > resourcePackList ( ) - > installResource ( localFileName ) ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : TexturePack :
2022-12-31 02:27:26 +00:00
minecraftInst - > texturePackList ( ) - > installResource ( localFileName ) ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : DataPack :
2022-12-31 02:27:26 +00:00
qWarning ( ) < < " Importing of Data Packs not supported at this time. Ignoring " < < localFileName ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : Mod :
2022-12-31 02:27:26 +00:00
minecraftInst - > loaderModList ( ) - > installMod ( localFileName ) ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : ShaderPack :
2022-12-31 02:27:26 +00:00
minecraftInst - > shaderPackList ( ) - > installResource ( localFileName ) ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : WorldSave :
2022-12-31 02:27:26 +00:00
minecraftInst - > worldList ( ) - > installWorld ( localFileInfo ) ;
break ;
2022-12-31 01:06:17 +00:00
case PackedResourceType : : UNKNOWN :
default :
2022-12-31 02:27:26 +00:00
qDebug ( ) < < " Can't Identify " < < localFileName < < " Ignoring it. " ;
break ;
2022-12-31 01:06:17 +00:00
}
2018-07-15 13:51:05 +01:00
}
2017-04-22 05:11:26 +01:00
}
2015-09-15 22:02:21 +01:00
void MainWindow : : on_actionREDDIT_triggered ( )
{
2021-06-18 12:24:20 +01:00
DesktopServices : : openUrl ( QUrl ( BuildConfig . SUBREDDIT_URL ) ) ;
2015-09-15 22:02:21 +01:00
}
2016-01-09 00:39:51 +00:00
void MainWindow : : on_actionDISCORD_triggered ( )
{
2021-06-18 12:24:20 +01:00
DesktopServices : : openUrl ( QUrl ( BuildConfig . DISCORD_URL ) ) ;
2016-01-09 00:39:51 +00:00
}
2022-03-08 17:41:23 +00:00
void MainWindow : : on_actionMATRIX_triggered ( )
{
DesktopServices : : openUrl ( QUrl ( BuildConfig . MATRIX_URL ) ) ;
}
2013-08-10 17:34:08 +01:00
void MainWindow : : on_actionChangeInstIcon_triggered ( )
2013-03-19 05:24:34 +00:00
{
2018-07-15 13:51:05 +01:00
if ( ! m_selectedInstance )
return ;
2013-10-06 00:13:40 +01:00
2018-07-15 13:51:05 +01:00
IconPickerDialog dlg ( this ) ;
dlg . execWithSelection ( m_selectedInstance - > iconKey ( ) ) ;
if ( dlg . result ( ) = = QDialog : : Accepted )
{
m_selectedInstance - > setIconKey ( dlg . selectedIconKey ) ;
2021-11-20 15:22:22 +00:00
auto icon = APPLICATION - > icons ( ) - > getIcon ( dlg . selectedIconKey ) ;
2018-07-15 13:51:05 +01:00
ui - > actionChangeInstIcon - > setIcon ( icon ) ;
ui - > changeIconButton - > setIcon ( icon ) ;
}
2013-03-19 05:24:34 +00:00
}
2013-12-31 00:24:28 +00:00
void MainWindow : : iconUpdated ( QString icon )
{
2018-07-15 13:51:05 +01:00
if ( icon = = m_currentInstIcon )
{
2021-11-20 15:22:22 +00:00
auto icon = APPLICATION - > icons ( ) - > getIcon ( m_currentInstIcon ) ;
2018-07-15 13:51:05 +01:00
ui - > actionChangeInstIcon - > setIcon ( icon ) ;
ui - > changeIconButton - > setIcon ( icon ) ;
}
2013-03-19 05:24:34 +00:00
}
2013-12-31 00:24:28 +00:00
void MainWindow : : updateInstanceToolIcon ( QString new_icon )
{
2018-07-15 13:51:05 +01:00
m_currentInstIcon = new_icon ;
2021-11-20 15:22:22 +00:00
auto icon = APPLICATION - > icons ( ) - > getIcon ( m_currentInstIcon ) ;
2018-07-15 13:51:05 +01:00
ui - > actionChangeInstIcon - > setIcon ( icon ) ;
ui - > changeIconButton - > setIcon ( icon ) ;
2013-12-31 00:24:28 +00:00
}
2014-01-06 09:01:40 +00:00
void MainWindow : : setSelectedInstanceById ( const QString & id )
{
2018-07-15 13:51:05 +01:00
if ( id . isNull ( ) )
return ;
2021-11-20 15:22:22 +00:00
const QModelIndex index = APPLICATION - > instances ( ) - > getInstanceIndexById ( id ) ;
2018-07-15 13:51:05 +01:00
if ( index . isValid ( ) )
{
QModelIndex selectionIndex = proxymodel - > mapFromSource ( index ) ;
view - > selectionModel ( ) - > setCurrentIndex ( selectionIndex , QItemSelectionModel : : ClearAndSelect ) ;
2019-07-10 03:23:24 +01:00
updateStatusCenter ( ) ;
2018-07-15 13:51:05 +01:00
}
2014-01-06 09:01:40 +00:00
}
2013-08-10 17:34:08 +01:00
void MainWindow : : on_actionChangeInstGroup_triggered ( )
{
2018-07-15 13:51:05 +01:00
if ( ! m_selectedInstance )
return ;
2013-10-06 00:13:40 +01:00
2018-07-15 13:51:05 +01:00
bool ok = false ;
2018-07-31 00:54:08 +01:00
InstanceId instId = m_selectedInstance - > id ( ) ;
2021-11-20 15:22:22 +00:00
QString name ( APPLICATION - > instances ( ) - > getInstanceGroup ( instId ) ) ;
auto groups = APPLICATION - > instances ( ) - > getGroups ( ) ;
2018-07-15 13:51:05 +01:00
groups . insert ( 0 , " " ) ;
groups . sort ( Qt : : CaseInsensitive ) ;
int foo = groups . indexOf ( name ) ;
2013-12-15 17:10:51 +00:00
2018-07-15 13:51:05 +01:00
name = QInputDialog : : getItem ( this , tr ( " Group name " ) , tr ( " Enter a new group name. " ) , groups , foo , true , & ok ) ;
name = name . simplified ( ) ;
if ( ok )
2018-07-31 00:54:08 +01:00
{
2021-11-20 15:22:22 +00:00
APPLICATION - > instances ( ) - > setInstanceGroup ( instId , name ) ;
2018-07-31 00:54:08 +01:00
}
2013-08-10 17:34:08 +01:00
}
2017-12-13 23:29:00 +00:00
void MainWindow : : deleteGroup ( )
2016-04-11 00:30:50 +01:00
{
2018-07-15 13:51:05 +01:00
QObject * obj = sender ( ) ;
if ( ! obj )
return ;
QAction * action = qobject_cast < QAction * > ( obj ) ;
if ( ! action )
return ;
auto map = action - > data ( ) . toMap ( ) ;
if ( ! map . contains ( " group " ) )
return ;
QString groupName = map [ " group " ] . toString ( ) ;
if ( ! groupName . isEmpty ( ) )
{
2022-03-18 12:19:09 +00:00
auto reply = QMessageBox : : question ( this , tr ( " Delete group " ) , tr ( " Are you sure you want to delete the group %1? " )
2018-11-08 16:30:30 +00:00
. arg ( groupName ) , QMessageBox : : Yes | QMessageBox : : No ) ;
if ( reply = = QMessageBox : : Yes )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > instances ( ) - > deleteGroup ( groupName ) ;
2018-11-08 16:30:30 +00:00
}
2018-07-15 13:51:05 +01:00
}
2016-04-11 00:30:50 +01:00
}
2022-07-30 18:42:33 +01:00
void MainWindow : : undoTrashInstance ( )
{
APPLICATION - > instances ( ) - > undoTrashInstance ( ) ;
2022-10-30 17:37:03 +00:00
ui - > actionUndoTrashInstance - > setEnabled ( APPLICATION - > instances ( ) - > trashedSomething ( ) ) ;
2022-07-30 18:42:33 +01:00
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionViewInstanceFolder_triggered ( )
{
2021-11-20 15:22:22 +00:00
QString str = APPLICATION - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2018-07-15 13:51:05 +01:00
DesktopServices : : openDirectory ( str ) ;
2013-01-09 18:22:22 +00:00
}
2017-12-13 23:29:00 +00:00
void MainWindow : : refreshInstances ( )
2013-01-09 18:22:22 +00:00
{
2021-11-20 15:22:22 +00:00
APPLICATION - > instances ( ) - > loadList ( ) ;
2013-01-09 18:22:22 +00:00
}
void MainWindow : : on_actionViewCentralModsFolder_triggered ( )
{
2021-11-20 15:22:22 +00:00
DesktopServices : : openDirectory ( APPLICATION - > settings ( ) - > get ( " CentralModsDir " ) . toString ( ) , true ) ;
2013-01-09 18:22:22 +00:00
}
2017-12-13 23:29:00 +00:00
void MainWindow : : checkForUpdates ( )
2013-01-09 18:22:22 +00:00
{
2018-07-15 13:51:05 +01:00
if ( BuildConfig . UPDATER_ENABLED )
{
2021-11-20 15:22:22 +00:00
auto updater = APPLICATION - > updateChecker ( ) ;
updater - > checkForUpdate ( APPLICATION - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , true ) ;
2018-07-15 13:51:05 +01:00
}
else
{
qWarning ( ) < < " Updater not set up. Cannot check for updates. " ;
}
2013-01-09 18:22:22 +00:00
}
2014-07-15 23:13:40 +01:00
void MainWindow : : on_actionSettings_triggered ( )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > ShowGlobalSettings ( this , " global-settings " ) ;
2019-06-01 11:28:53 +01:00
}
void MainWindow : : globalSettingsClosed ( )
{
2018-07-15 13:51:05 +01:00
// FIXME: quick HACK to make this work. improve, optimize.
2021-11-20 15:22:22 +00:00
APPLICATION - > instances ( ) - > loadList ( ) ;
2018-07-15 13:51:05 +01:00
proxymodel - > invalidate ( ) ;
proxymodel - > sort ( 0 ) ;
2022-04-15 23:25:37 +01:00
updateMainToolBar ( ) ;
2018-07-15 13:51:05 +01:00
updateToolsMenu ( ) ;
2022-11-15 08:46:24 +00:00
updateThemeMenu ( ) ;
2021-10-13 22:14:02 +01:00
updateStatusCenter ( ) ;
2022-05-17 00:21:57 +01:00
// This needs to be done to prevent UI elements disappearing in the event the config is changed
2022-10-18 15:37:04 +01:00
// but Prism Launcher exits abnormally, causing the window state to never be saved:
2022-05-17 00:21:57 +01:00
APPLICATION - > settings ( ) - > set ( " MainWindowState " , saveState ( ) . toBase64 ( ) ) ;
2018-07-15 13:51:05 +01:00
update ( ) ;
2014-07-15 23:13:40 +01:00
}
2014-06-18 00:15:01 +01:00
void MainWindow : : on_actionEditInstance_triggered ( )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > showInstanceWindow ( m_selectedInstance ) ;
2014-06-18 00:15:01 +01:00
}
2013-11-20 18:20:35 +00:00
void MainWindow : : on_actionManageAccounts_triggered ( )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > ShowGlobalSettings ( this , " accounts " ) ;
2013-11-20 18:20:35 +00:00
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionReportBug_triggered ( )
{
2021-06-18 12:24:20 +01:00
DesktopServices : : openUrl ( QUrl ( BuildConfig . BUG_TRACKER_URL ) ) ;
2013-01-09 18:22:22 +00:00
}
2022-10-10 11:45:44 +01:00
void MainWindow : : on_actionClearMetadata_triggered ( )
{
APPLICATION - > metacache ( ) - > evictAll ( ) ;
2022-11-06 00:05:10 +00:00
APPLICATION - > metacache ( ) - > SaveNow ( ) ;
2022-10-10 11:45:44 +01:00
}
2022-11-05 14:31:07 +00:00
# ifdef Q_OS_MAC
2022-11-14 17:37:24 +00:00
void MainWindow : : on_actionAddToPATH_triggered ( )
{
2022-11-05 14:15:31 +00:00
auto binaryPath = APPLICATION - > applicationFilePath ( ) ;
2022-11-14 17:37:24 +00:00
auto targetPath = QString ( " /usr/local/bin/%1 " ) . arg ( BuildConfig . LAUNCHER_APP_BINARY_NAME ) ;
qDebug ( ) < < " Symlinking " < < binaryPath < < " to " < < targetPath ;
QStringList args ;
args < < " -e " ;
args < < QString ( " do shell script \" mkdir -p /usr/local/bin && ln -sf '%1' '%2' \" with administrator privileges " )
. arg ( binaryPath , targetPath ) ;
auto outcome = QProcess : : execute ( " /usr/bin/osascript " , args ) ;
2022-10-19 14:53:57 +01:00
if ( ! outcome ) {
2022-11-14 17:37:24 +00:00
QMessageBox : : information ( this , tr ( " Successfully added %1 to PATH " ) . arg ( BuildConfig . LAUNCHER_DISPLAYNAME ) ,
tr ( " %1 was successfully added to your PATH. You can now start it by running `%2`. " )
. arg ( BuildConfig . LAUNCHER_DISPLAYNAME , BuildConfig . LAUNCHER_APP_BINARY_NAME ) ) ;
2022-10-19 14:53:57 +01:00
} else {
2022-11-14 17:37:24 +00:00
QMessageBox : : critical ( this , tr ( " Failed to add %1 to PATH " ) . arg ( BuildConfig . LAUNCHER_DISPLAYNAME ) ,
tr ( " An error occurred while trying to add %1 to PATH " ) . arg ( BuildConfig . LAUNCHER_DISPLAYNAME ) ) ;
2022-10-19 14:53:57 +01:00
}
}
2022-11-05 14:31:07 +00:00
# endif
2022-10-19 14:53:57 +01:00
2022-04-08 20:37:18 +01:00
void MainWindow : : on_actionOpenWiki_triggered ( )
{
2022-04-15 21:44:27 +01:00
DesktopServices : : openUrl ( QUrl ( BuildConfig . HELP_URL . arg ( " " ) ) ) ;
2022-04-08 20:37:18 +01:00
}
2022-02-10 11:55:07 +00:00
void MainWindow : : on_actionMoreNews_triggered ( )
{
2022-06-26 00:15:16 +01:00
auto entries = m_newsChecker - > getNewsEntries ( ) ;
NewsDialog news_dialog ( entries , this ) ;
news_dialog . exec ( ) ;
2022-02-10 11:55:07 +00:00
}
void MainWindow : : newsButtonClicked ( )
{
2022-06-26 00:15:16 +01:00
auto entries = m_newsChecker - > getNewsEntries ( ) ;
NewsDialog news_dialog ( entries , this ) ;
news_dialog . toggleArticleList ( ) ;
news_dialog . exec ( ) ;
2022-02-10 11:55:07 +00:00
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionAbout_triggered ( )
{
2018-07-15 13:51:05 +01:00
AboutDialog dialog ( this ) ;
dialog . exec ( ) ;
2013-01-09 18:22:22 +00:00
}
2013-01-30 05:52:37 +00:00
2013-06-23 21:10:32 +01:00
void MainWindow : : on_actionDeleteInstance_triggered ( )
{
2022-12-03 13:54:41 +00:00
if ( ! m_selectedInstance ) {
2018-07-15 13:51:05 +01:00
return ;
}
2022-07-30 18:42:33 +01:00
2019-06-17 15:45:32 +01:00
auto id = m_selectedInstance - > id ( ) ;
2022-12-03 13:54:41 +00:00
2022-12-17 09:26:06 +00:00
auto response = CustomMessageBox : : selectable ( this , tr ( " Confirm Deletion " ) ,
2022-12-26 14:33:50 +00:00
tr ( " You are about to delete \" %1 \" . \n "
2022-12-14 15:02:04 +00:00
" This may be permanent and will completely delete the instance. \n \n "
" Are you sure? " )
. arg ( m_selectedInstance - > name ( ) ) ,
QMessageBox : : Warning , QMessageBox : : Yes | QMessageBox : : No , QMessageBox : : No )
- > exec ( ) ;
2022-12-03 13:54:41 +00:00
2022-12-14 15:02:04 +00:00
if ( response ! = QMessageBox : : Yes )
return ;
2022-12-03 13:54:41 +00:00
2022-12-14 15:02:04 +00:00
if ( APPLICATION - > instances ( ) - > trashInstance ( id ) ) {
ui - > actionUndoTrashInstance - > setEnabled ( APPLICATION - > instances ( ) - > trashedSomething ( ) ) ;
return ;
2018-07-15 13:51:05 +01:00
}
2022-12-14 15:02:04 +00:00
APPLICATION - > instances ( ) - > deleteInstance ( id ) ;
2013-06-23 21:10:32 +01:00
}
2015-02-12 21:01:20 +00:00
void MainWindow : : on_actionExportInstance_triggered ( )
{
2018-07-15 13:51:05 +01:00
if ( m_selectedInstance )
{
ExportInstanceDialog dlg ( m_selectedInstance , this ) ;
dlg . exec ( ) ;
}
2015-02-12 21:01:20 +00:00
}
2013-06-23 21:10:32 +01:00
void MainWindow : : on_actionRenameInstance_triggered ( )
{
2018-07-15 13:51:05 +01:00
if ( m_selectedInstance )
{
2018-11-22 00:50:32 +00:00
view - > edit ( view - > currentIndex ( ) ) ;
2018-07-15 13:51:05 +01:00
}
2013-06-23 21:10:32 +01:00
}
void MainWindow : : on_actionViewSelectedInstFolder_triggered ( )
{
2018-07-15 13:51:05 +01:00
if ( m_selectedInstance )
{
QString str = m_selectedInstance - > instanceRoot ( ) ;
DesktopServices : : openDirectory ( QDir ( str ) . absolutePath ( ) ) ;
}
2013-06-23 21:10:32 +01:00
}
2013-10-06 00:13:40 +01:00
void MainWindow : : closeEvent ( QCloseEvent * event )
2013-01-30 05:52:37 +00:00
{
2018-07-15 13:51:05 +01:00
// Save the window state and geometry.
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " MainWindowState " , saveState ( ) . toBase64 ( ) ) ;
APPLICATION - > settings ( ) - > set ( " MainWindowGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
2018-07-15 13:51:05 +01:00
event - > accept ( ) ;
emit isClosing ( ) ;
2013-01-30 05:52:37 +00:00
}
2013-03-11 21:19:17 +00:00
2016-12-05 01:29:08 +00:00
void MainWindow : : changeEvent ( QEvent * event )
{
2018-07-15 13:51:05 +01:00
if ( event - > type ( ) = = QEvent : : LanguageChange )
{
2021-06-19 00:12:54 +01:00
retranslateUi ( ) ;
2018-07-15 13:51:05 +01:00
}
QMainWindow : : changeEvent ( event ) ;
2016-12-05 01:29:08 +00:00
}
2013-10-21 21:25:50 +01:00
void MainWindow : : instanceActivated ( QModelIndex index )
{
2018-07-15 13:51:05 +01:00
if ( ! index . isValid ( ) )
return ;
QString id = index . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
2021-11-20 15:22:22 +00:00
InstancePtr inst = APPLICATION - > instances ( ) - > getInstanceById ( id ) ;
2018-07-15 13:51:05 +01:00
if ( ! inst )
return ;
2013-10-21 21:25:50 +01:00
2018-07-15 13:51:05 +01:00
activateInstance ( inst ) ;
2013-10-21 21:25:50 +01:00
}
2013-02-05 22:34:20 +00:00
void MainWindow : : on_actionLaunchInstance_triggered ( )
{
2022-06-19 19:33:34 +01:00
if ( m_selectedInstance & & ! m_selectedInstance - > isRunning ( ) )
2018-07-15 13:51:05 +01:00
{
2021-11-20 15:22:22 +00:00
APPLICATION - > launch ( m_selectedInstance ) ;
2018-07-15 13:51:05 +01:00
}
2013-02-05 22:34:20 +00:00
}
2016-11-26 17:06:08 +00:00
void MainWindow : : activateInstance ( InstancePtr instance )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > launch ( instance ) ;
2016-11-26 17:06:08 +00:00
}
2014-01-27 02:00:49 +00:00
void MainWindow : : on_actionLaunchInstanceOffline_triggered ( )
{
2018-07-15 13:51:05 +01:00
if ( m_selectedInstance )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > launch ( m_selectedInstance , false ) ;
2018-07-15 13:51:05 +01:00
}
2015-07-04 19:02:43 +01:00
}
2022-07-11 19:46:11 +01:00
void MainWindow : : on_actionLaunchInstanceDemo_triggered ( )
{
if ( m_selectedInstance )
{
APPLICATION - > launch ( m_selectedInstance , false , true ) ;
}
}
2022-06-19 19:33:34 +01:00
void MainWindow : : on_actionKillInstance_triggered ( )
{
if ( m_selectedInstance & & m_selectedInstance - > isRunning ( ) )
{
APPLICATION - > kill ( m_selectedInstance ) ;
}
}
2022-10-22 13:39:53 +01:00
void MainWindow : : on_actionCreateInstanceShortcut_triggered ( )
{
if ( m_selectedInstance )
{
2022-10-22 15:56:27 +01:00
auto desktopPath = FS : : getDesktopDir ( ) ;
if ( desktopPath . isEmpty ( ) ) {
2022-10-22 13:39:53 +01:00
// TODO come up with an alternative solution (open "save file" dialog)
2022-10-22 15:56:27 +01:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Couldn't find desktop?! " ) ) ;
2022-10-22 13:39:53 +01:00
return ;
}
2022-11-12 18:41:52 +00:00
# if defined(Q_OS_MACOS)
2022-11-13 13:47:37 +00:00
QString appPath = QApplication : : applicationFilePath ( ) ;
2022-11-13 15:51:29 +00:00
if ( appPath . startsWith ( " /private/var/ " ) ) {
2022-11-13 13:47:37 +00:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " The launcher is in the folder it was extracted from, therefore it cannot create shortcuts. " ) ) ;
return ;
2022-11-13 13:49:28 +00:00
}
2022-11-12 18:36:49 +00:00
2022-11-12 18:41:52 +00:00
if ( FS : : createShortcut ( FS : : PathCombine ( desktopPath , m_selectedInstance - > name ( ) ) ,
2022-11-13 15:51:29 +00:00
appPath , { " --launch " , m_selectedInstance - > id ( ) } ,
m_selectedInstance - > name ( ) , " " ) ) {
2022-11-12 18:36:49 +00:00
QMessageBox : : information ( this , tr ( " Create instance shortcut " ) , tr ( " Created a shortcut to this instance on your desktop! " ) ) ;
}
else
{
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create instance shortcut! " ) ) ;
}
2022-11-12 18:41:52 +00:00
# elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
2022-11-13 15:51:29 +00:00
QString appPath = QApplication : : applicationFilePath ( ) ;
if ( appPath . startsWith ( " /tmp/.mount_ " ) ) {
// AppImage!
appPath = QProcessEnvironment : : systemEnvironment ( ) . value ( QStringLiteral ( " APPIMAGE " ) ) ;
if ( appPath . isEmpty ( ) )
{
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Launcher is running as misconfigured AppImage? ($APPIMAGE environment variable is missing) " ) ) ;
}
else if ( appPath . endsWith ( " / " ) )
{
appPath . chop ( 1 ) ;
}
}
2022-10-25 15:37:30 +01:00
auto icon = APPLICATION - > icons ( ) - > icon ( m_selectedInstance - > iconKey ( ) ) ;
2022-11-13 18:18:51 +00:00
if ( icon = = nullptr )
{
icon = APPLICATION - > icons ( ) - > icon ( " grass " ) ;
}
2022-11-13 15:51:29 +00:00
QString iconPath = FS : : PathCombine ( m_selectedInstance - > instanceRoot ( ) , " icon.png " ) ;
2022-12-14 15:02:04 +00:00
2022-11-13 15:51:29 +00:00
QFile iconFile ( iconPath ) ;
if ( ! iconFile . open ( QFile : : WriteOnly ) )
{
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create icon for shortcut. " ) ) ;
return ;
}
bool success = icon - > icon ( ) . pixmap ( 64 , 64 ) . save ( & iconFile , " PNG " ) ;
iconFile . close ( ) ;
2022-12-14 15:02:04 +00:00
2022-11-13 15:51:29 +00:00
if ( ! success )
{
iconFile . remove ( ) ;
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create icon for shortcut. " ) ) ;
return ;
}
2022-12-08 13:46:58 +00:00
QString desktopFilePath = FS : : PathCombine ( desktopPath , m_selectedInstance - > name ( ) + " .desktop " ) ;
QStringList args ;
if ( DesktopServices : : isFlatpak ( ) ) {
QFileDialog fileDialog ;
// workaround to make sure the portal file dialog opens in the desktop directory
fileDialog . setDirectoryUrl ( desktopPath ) ;
desktopFilePath = fileDialog . getSaveFileName (
this , tr ( " Create Shortcut " ) , desktopFilePath ,
tr ( " Desktop Entries (*.desktop) " ) ) ;
if ( desktopFilePath . isEmpty ( ) )
return ; // file dialog canceled by user
appPath = " flatpak " ;
QString flatpakAppId = BuildConfig . LAUNCHER_DESKTOPFILENAME ;
flatpakAppId . remove ( " .desktop " ) ;
args . append ( { " run " , flatpakAppId } ) ;
}
args . append ( { " --launch " , m_selectedInstance - > id ( ) } ) ;
if ( FS : : createShortcut ( desktopFilePath , appPath , args , m_selectedInstance - > name ( ) , iconPath ) ) {
2022-11-12 18:41:52 +00:00
QMessageBox : : information ( this , tr ( " Create instance shortcut " ) , tr ( " Created a shortcut to this instance on your desktop! " ) ) ;
}
else
{
2022-11-13 15:51:29 +00:00
iconFile . remove ( ) ;
2022-11-12 18:41:52 +00:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create instance shortcut! " ) ) ;
}
# elif defined(Q_OS_WIN)
auto icon = APPLICATION - > icons ( ) - > icon ( m_selectedInstance - > iconKey ( ) ) ;
2022-11-13 18:18:51 +00:00
if ( icon = = nullptr )
{
icon = APPLICATION - > icons ( ) - > icon ( " grass " ) ;
}
2022-11-12 18:41:52 +00:00
QString iconPath = FS : : PathCombine ( m_selectedInstance - > instanceRoot ( ) , " icon.ico " ) ;
2022-12-14 15:02:04 +00:00
2022-10-28 19:11:51 +01:00
// part of fix for weird bug involving the window icon being replaced
// dunno why it happens, but this 2-line fix seems to be enough, so w/e
2022-11-09 19:55:13 +00:00
auto appIcon = APPLICATION - > getThemedIcon ( " logo " ) ;
2022-10-28 19:11:51 +01:00
2022-10-28 15:42:29 +01:00
QFile iconFile ( iconPath ) ;
if ( ! iconFile . open ( QFile : : WriteOnly ) )
{
2022-11-13 15:51:29 +00:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create icon for shortcut. " ) ) ;
2022-10-28 15:42:29 +01:00
return ;
}
2022-11-09 19:55:13 +00:00
bool success = icon - > icon ( ) . pixmap ( 64 , 64 ) . save ( & iconFile , " ICO " ) ;
iconFile . close ( ) ;
// restore original window icon
QGuiApplication : : setWindowIcon ( appIcon ) ;
2022-10-28 15:42:29 +01:00
2022-11-12 18:41:52 +00:00
if ( ! success )
2022-10-28 15:42:29 +01:00
{
iconFile . remove ( ) ;
2022-11-13 15:51:29 +00:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create icon for shortcut. " ) ) ;
2022-10-28 15:42:29 +01:00
return ;
}
2022-12-14 15:02:04 +00:00
2022-10-22 15:56:27 +01:00
if ( FS : : createShortcut ( FS : : PathCombine ( desktopPath , m_selectedInstance - > name ( ) ) ,
2022-11-13 15:51:29 +00:00
QApplication : : applicationFilePath ( ) , { " --launch " , m_selectedInstance - > id ( ) } ,
m_selectedInstance - > name ( ) , iconPath ) ) {
2022-10-22 15:56:27 +01:00
QMessageBox : : information ( this , tr ( " Create instance shortcut " ) , tr ( " Created a shortcut to this instance on your desktop! " ) ) ;
}
else
{
2022-11-12 18:43:58 +00:00
iconFile . remove ( ) ;
2022-10-22 15:56:27 +01:00
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Failed to create instance shortcut! " ) ) ;
}
2022-11-12 18:41:52 +00:00
# else
QMessageBox : : critical ( this , tr ( " Create instance shortcut " ) , tr ( " Not supported on your platform! " ) ) ;
# endif
2022-10-22 13:39:53 +01:00
}
}
2013-08-08 23:26:35 +01:00
void MainWindow : : taskEnd ( )
2013-05-06 23:19:20 +01:00
{
2018-07-15 13:51:05 +01:00
QObject * sender = QObject : : sender ( ) ;
if ( sender = = m_versionLoadTask )
m_versionLoadTask = NULL ;
2013-10-06 00:13:40 +01:00
2018-07-15 13:51:05 +01:00
sender - > deleteLater ( ) ;
2013-05-06 23:19:20 +01:00
}
void MainWindow : : startTask ( Task * task )
{
2018-07-15 13:51:05 +01:00
connect ( task , SIGNAL ( succeeded ( ) ) , SLOT ( taskEnd ( ) ) ) ;
connect ( task , SIGNAL ( failed ( QString ) ) , SLOT ( taskEnd ( ) ) ) ;
task - > start ( ) ;
2013-05-06 23:19:20 +01:00
}
2013-10-06 00:13:40 +01:00
void MainWindow : : instanceChanged ( const QModelIndex & current , const QModelIndex & previous )
2013-08-25 00:32:42 +01:00
{
2018-07-15 13:51:05 +01:00
if ( ! current . isValid ( ) )
{
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
2018-07-15 13:51:05 +01:00
selectionBad ( ) ;
return ;
}
2022-06-10 03:25:13 +01:00
if ( m_selectedInstance ) {
2022-06-10 08:48:18 +01:00
disconnect ( m_selectedInstance . get ( ) , & BaseInstance : : runningStatusChanged , this , & MainWindow : : refreshCurrentInstance ) ;
2022-06-10 03:25:13 +01:00
}
2018-07-15 13:51:05 +01:00
QString id = current . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
2021-11-20 15:22:22 +00:00
m_selectedInstance = APPLICATION - > instances ( ) - > getInstanceById ( id ) ;
2018-07-15 13:51:05 +01:00
if ( m_selectedInstance )
{
ui - > instanceToolBar - > setEnabled ( true ) ;
2022-04-15 20:55:03 +01:00
ui - > setInstanceActionsEnabled ( true ) ;
2022-06-19 19:33:34 +01:00
ui - > actionLaunchInstance - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2018-07-15 13:51:05 +01:00
ui - > actionLaunchInstanceOffline - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2022-07-11 19:46:11 +01:00
ui - > actionLaunchInstanceDemo - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2022-09-15 23:23:58 +01:00
// Disable demo-mode if not available.
auto instance = dynamic_cast < MinecraftInstance * > ( m_selectedInstance . get ( ) ) ;
if ( instance ) {
ui - > actionLaunchInstanceDemo - > setEnabled ( instance - > supportsDemo ( ) ) ;
}
2022-06-19 19:33:34 +01:00
ui - > actionKillInstance - > setEnabled ( m_selectedInstance - > isRunning ( ) ) ;
2018-07-15 13:51:05 +01:00
ui - > actionExportInstance - > setEnabled ( m_selectedInstance - > canExport ( ) ) ;
ui - > renameButton - > setText ( m_selectedInstance - > name ( ) ) ;
m_statusLeft - > setText ( m_selectedInstance - > getStatusbarDescription ( ) ) ;
2019-07-10 03:23:24 +01:00
updateStatusCenter ( ) ;
2018-07-15 13:51:05 +01:00
updateInstanceToolIcon ( m_selectedInstance - > iconKey ( ) ) ;
updateToolsMenu ( ) ;
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " SelectedInstance " , m_selectedInstance - > id ( ) ) ;
2022-06-10 03:25:13 +01:00
2022-06-10 08:48:18 +01:00
connect ( m_selectedInstance . get ( ) , & BaseInstance : : runningStatusChanged , this , & MainWindow : : refreshCurrentInstance ) ;
2018-07-15 13:51:05 +01:00
}
else
{
ui - > instanceToolBar - > setEnabled ( false ) ;
2022-04-15 20:55:03 +01:00
ui - > setInstanceActionsEnabled ( false ) ;
2022-06-19 19:33:34 +01:00
ui - > actionLaunchInstance - > setEnabled ( false ) ;
ui - > actionLaunchInstanceOffline - > setEnabled ( false ) ;
2022-07-11 19:46:11 +01:00
ui - > actionLaunchInstanceDemo - > setEnabled ( false ) ;
2022-06-19 19:33:34 +01:00
ui - > actionKillInstance - > setEnabled ( false ) ;
2021-11-20 15:22:22 +00:00
APPLICATION - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
2018-07-15 13:51:05 +01:00
selectionBad ( ) ;
return ;
}
2013-08-26 05:30:11 +01:00
}
2019-06-23 13:54:17 +01:00
void MainWindow : : instanceSelectRequest ( QString id )
2019-06-17 15:13:52 +01:00
{
setSelectedInstanceById ( id ) ;
}
2015-10-20 16:22:13 +01:00
void MainWindow : : instanceDataChanged ( const QModelIndex & topLeft , const QModelIndex & bottomRight )
2015-04-07 00:21:03 +01:00
{
2018-07-15 13:51:05 +01:00
auto current = view - > selectionModel ( ) - > currentIndex ( ) ;
QItemSelection test ( topLeft , bottomRight ) ;
if ( test . contains ( current ) )
{
instanceChanged ( current , current ) ;
}
2015-04-07 00:21:03 +01:00
}
2013-08-26 05:30:11 +01:00
void MainWindow : : selectionBad ( )
{
2018-07-15 13:51:05 +01:00
// start by reseting everything...
m_selectedInstance = nullptr ;
2013-12-31 00:24:28 +00:00
2018-07-15 13:51:05 +01:00
statusBar ( ) - > clearMessage ( ) ;
ui - > instanceToolBar - > setEnabled ( false ) ;
2022-04-15 20:55:03 +01:00
ui - > setInstanceActionsEnabled ( false ) ;
2022-06-19 20:00:51 +01:00
updateToolsMenu ( ) ;
2018-07-15 13:51:05 +01:00
ui - > renameButton - > setText ( tr ( " Rename Instance " ) ) ;
2021-10-15 23:42:01 +01:00
updateInstanceToolIcon ( " grass " ) ;
2014-01-06 09:01:40 +00:00
2018-07-15 13:51:05 +01:00
// ...and then see if we can enable the previously selected instance
2021-11-20 15:22:22 +00:00
setSelectedInstanceById ( APPLICATION - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-07-14 21:01:30 +01:00
}
2013-08-25 21:48:41 +01:00
2014-07-27 14:50:03 +01:00
void MainWindow : : checkInstancePathForProblems ( )
{
2021-11-20 15:22:22 +00:00
QString instanceFolder = APPLICATION - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2018-07-15 13:51:05 +01:00
if ( FS : : checkProblemticPathJava ( QDir ( instanceFolder ) ) )
{
QMessageBox warning ( this ) ;
warning . setText ( tr ( " Your instance folder contains \' ! \' and this is known to cause Java problems! " ) ) ;
2021-10-17 23:47:02 +01:00
warning . setInformativeText (
tr (
" You have now two options: <br/> "
" - change the instance folder in the settings <br/> "
" - move this installation of %1 to a different folder "
2022-10-18 08:50:27 +01:00
) . arg ( BuildConfig . LAUNCHER_DISPLAYNAME )
2021-10-17 23:47:02 +01:00
) ;
2018-07-15 13:51:05 +01:00
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
auto tempFolderText = tr ( " This is a problem: <br/> "
2021-10-17 23:47:02 +01:00
" - The launcher will likely be deleted without warning by the operating system <br/> "
" - close the launcher now and extract it to a real location, not a temporary folder " ) ;
2018-07-15 13:51:05 +01:00
QString pathfoldername = QDir ( instanceFolder ) . absolutePath ( ) ;
if ( pathfoldername . contains ( " Rar$ " , Qt : : CaseInsensitive ) )
{
QMessageBox warning ( this ) ;
2021-10-17 23:47:02 +01:00
warning . setText ( tr ( " Your instance folder contains \' Rar$ \' - that means you haven't extracted the launcher archive! " ) ) ;
2018-07-15 13:51:05 +01:00
warning . setInformativeText ( tempFolderText ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2019-08-04 20:14:59 +01:00
else if ( pathfoldername . startsWith ( QDir : : tempPath ( ) ) | | pathfoldername . contains ( " /TempState/ " ) )
2018-07-15 13:51:05 +01:00
{
QMessageBox warning ( this ) ;
warning . setText ( tr ( " Your instance folder is in a temporary folder: \' %1 \' ! " ) . arg ( QDir : : tempPath ( ) ) ) ;
warning . setInformativeText ( tempFolderText ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2014-07-27 14:50:03 +01:00
}
2019-07-10 03:23:24 +01:00
void MainWindow : : updateStatusCenter ( )
{
2021-11-20 15:22:22 +00:00
m_statusCenter - > setVisible ( APPLICATION - > settings ( ) - > get ( " ShowGlobalGameTime " ) . toBool ( ) ) ;
2021-10-13 22:14:02 +01:00
2021-11-20 15:22:22 +00:00
int timePlayed = APPLICATION - > instances ( ) - > getTotalPlayTime ( ) ;
2021-09-28 23:20:34 +01:00
if ( timePlayed > 0 ) {
m_statusCenter - > setText ( tr ( " Total playtime: %1 " ) . arg ( Time : : prettifyDuration ( timePlayed ) ) ) ;
}
2019-07-10 03:23:24 +01:00
}
2022-06-10 03:25:13 +01:00
2022-06-10 08:48:18 +01:00
void MainWindow : : refreshCurrentInstance ( bool running )
2022-06-10 03:25:13 +01:00
{
auto current = view - > selectionModel ( ) - > currentIndex ( ) ;
instanceChanged ( current , current ) ;
}