2017-01-08 09:28:05 +05:30
/* Copyright 2013-2017 MultiMC Contributors
2013-02-20 04:37:52 +05:30
*
* Authors : Andrew Okin
* Peterix
* Orochimarufan < orochimarufan . x3 @ gmail . com >
2013-01-09 23:52:22 +05:30
*
* 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-03-12 02:49:17 +05:30
*
2013-01-09 23:52:22 +05:30
* 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-11-04 07:23:05 +05:30
# include "MultiMC.h"
2014-04-06 07:29:37 +05:30
# include "BuildConfig.h"
2013-01-09 23:52:22 +05:30
2013-11-04 07:23:05 +05:30
# include "MainWindow.h"
2015-03-02 02:50:57 +05:30
# include <QtCore/QVariant>
2015-10-20 20:48:53 +05:30
# include <QtCore/QUrl>
# include <QtCore/QDir>
# include <QtCore/QFileInfo>
# include <QtGui/QKeyEvent>
2015-03-02 02:50:57 +05:30
# include <QtWidgets/QAction>
# include <QtWidgets/QApplication>
# include <QtWidgets/QButtonGroup>
# include <QtWidgets/QHBoxLayout>
# include <QtWidgets/QHeaderView>
# include <QtWidgets/QMainWindow>
# include <QtWidgets/QStatusBar>
# include <QtWidgets/QToolBar>
# include <QtWidgets/QWidget>
2015-10-20 20:48:53 +05:30
# include <QtWidgets/QMenu>
# include <QtWidgets/QMessageBox>
# include <QtWidgets/QInputDialog>
# include <QtWidgets/QLabel>
# include <QtWidgets/QToolButton>
# include <QtWidgets/QWidgetAction>
# include <QtWidgets/QProgressDialog>
# include <QtWidgets/QShortcut>
# include <BaseInstance.h>
# include <Env.h>
# include <InstanceList.h>
# include <MMCZip.h>
# include <icons/IconList.h>
# include <java/JavaUtils.h>
2016-01-02 05:05:54 +05:30
# include <java/JavaInstallList.h>
2015-10-20 20:48:53 +05:30
# include <launch/LaunchTask.h>
2016-02-28 00:28:40 +05:30
# include <minecraft/legacy/LwjglVersionList.h>
2016-08-11 04:14:01 +05:30
# include <minecraft/auth/MojangAccountList.h>
2016-04-10 07:59:29 +05:30
# include <SkinUtils.h>
2015-10-20 20:48:53 +05:30
# include <net/URLConstants.h>
# include <net/NetJob.h>
2016-05-28 23:24:17 +05:30
# include <net/Download.h>
2015-10-20 20:48:53 +05:30
# include <news/NewsChecker.h>
# include <notifications/NotificationChecker.h>
# include <tools/BaseProfiler.h>
# include <updater/DownloadTask.h>
# include <updater/UpdateChecker.h>
2016-01-05 12:02:52 +05:30
# include <DesktopServices.h>
2016-08-06 19:09:29 +05:30
# include "InstanceWindow.h"
2015-10-20 20:48:53 +05:30
# include "InstancePageProvider.h"
# include "InstanceProxyModel.h"
# include "JavaCommon.h"
2016-08-11 04:14:01 +05:30
# include "LaunchController.h"
2015-10-20 20:48:53 +05:30
# include "SettingsUI.h"
# include "groupview/GroupView.h"
# include "groupview/InstanceDelegate.h"
# include "widgets/LabeledToolButton.h"
# include "widgets/ServerStatus.h"
# include "dialogs/NewInstanceDialog.h"
# include "dialogs/ProgressDialog.h"
# include "dialogs/AboutDialog.h"
# include "dialogs/VersionSelectDialog.h"
# include "dialogs/CustomMessageBox.h"
# include "dialogs/IconPickerDialog.h"
# include "dialogs/CopyInstanceDialog.h"
# include "dialogs/UpdateDialog.h"
# include "dialogs/EditAccountDialog.h"
# include "dialogs/NotificationDialog.h"
# include "dialogs/ExportInstanceDialog.h"
2016-10-03 04:25:54 +05:30
# include <FolderInstanceProvider.h>
# include <InstanceImportTask.h>
2016-11-18 20:34:08 +05:30
# include "UpdateController.h"
2015-10-20 20:48:53 +05:30
class MainWindow : : Ui
2015-03-02 02:50:57 +05:30
{
public :
QAction * actionAddInstance ;
QAction * actionViewInstanceFolder ;
QAction * actionRefresh ;
QAction * actionViewCentralModsFolder ;
QAction * actionCheckUpdate ;
QAction * actionSettings ;
QAction * actionReportBug ;
QAction * actionPatreon ;
QAction * actionMoreNews ;
QAction * actionAbout ;
QAction * actionLaunchInstance ;
QAction * actionRenameInstance ;
QAction * actionChangeInstGroup ;
QAction * actionChangeInstIcon ;
QAction * actionEditInstNotes ;
QAction * actionEditInstance ;
2016-11-02 07:03:55 +05:30
QAction * actionWorlds ;
2015-03-02 02:50:57 +05:30
QAction * actionViewSelectedInstFolder ;
QAction * actionDeleteInstance ;
QAction * actionConfig_Folder ;
QAction * actionCAT ;
2015-09-16 02:32:21 +05:30
QAction * actionREDDIT ;
2016-01-09 06:09:51 +05:30
QAction * actionDISCORD ;
2015-03-02 02:50:57 +05:30
QAction * actionCopyInstance ;
QAction * actionManageAccounts ;
QAction * actionLaunchInstanceOffline ;
QAction * actionScreenshots ;
QAction * actionInstanceSettings ;
QAction * actionExportInstance ;
QWidget * centralWidget ;
QHBoxLayout * horizontalLayout ;
QToolBar * mainToolBar ;
QStatusBar * statusBar ;
QToolBar * instanceToolBar ;
QToolBar * newsToolBar ;
2016-11-26 22:36:08 +05:30
bool m_kill = false ;
void updateLaunchAction ( )
{
if ( m_kill )
{
actionLaunchInstance - > setText ( tr ( " Kill " ) ) ;
actionLaunchInstance - > setToolTip ( tr ( " Kill the running instance " ) ) ;
}
else
{
actionLaunchInstance - > setText ( tr ( " Launch " ) ) ;
actionLaunchInstance - > setToolTip ( tr ( " Launch the selected instance. " ) ) ;
}
}
void setLaunchAction ( bool kill )
{
m_kill = kill ;
updateLaunchAction ( ) ;
}
2015-03-02 02:50:57 +05:30
void setupUi ( QMainWindow * MainWindow )
{
if ( MainWindow - > objectName ( ) . isEmpty ( ) )
{
MainWindow - > setObjectName ( QStringLiteral ( " MainWindow " ) ) ;
}
MainWindow - > resize ( 694 , 563 ) ;
MainWindow - > setWindowIcon ( MMC - > getThemedIcon ( " multimc " ) ) ;
actionAddInstance = new QAction ( MainWindow ) ;
actionAddInstance - > setObjectName ( QStringLiteral ( " actionAddInstance " ) ) ;
actionAddInstance - > setIcon ( MMC - > getThemedIcon ( " new " ) ) ;
actionViewInstanceFolder = new QAction ( MainWindow ) ;
actionViewInstanceFolder - > setObjectName ( QStringLiteral ( " actionViewInstanceFolder " ) ) ;
actionViewInstanceFolder - > setIcon ( MMC - > getThemedIcon ( " viewfolder " ) ) ;
actionRefresh = new QAction ( MainWindow ) ;
actionRefresh - > setObjectName ( QStringLiteral ( " actionRefresh " ) ) ;
actionRefresh - > setIcon ( MMC - > getThemedIcon ( " refresh " ) ) ;
actionViewCentralModsFolder = new QAction ( MainWindow ) ;
actionViewCentralModsFolder - > setObjectName ( QStringLiteral ( " actionViewCentralModsFolder " ) ) ;
actionViewCentralModsFolder - > setIcon ( MMC - > getThemedIcon ( " centralmods " ) ) ;
2015-12-28 09:15:49 +05:30
if ( BuildConfig . UPDATER_ENABLED )
{
actionCheckUpdate = new QAction ( MainWindow ) ;
actionCheckUpdate - > setObjectName ( QStringLiteral ( " actionCheckUpdate " ) ) ;
actionCheckUpdate - > setIcon ( MMC - > getThemedIcon ( " checkupdate " ) ) ;
}
2015-03-02 02:50:57 +05:30
actionSettings = new QAction ( MainWindow ) ;
actionSettings - > setObjectName ( QStringLiteral ( " actionSettings " ) ) ;
actionSettings - > setIcon ( MMC - > getThemedIcon ( " settings " ) ) ;
actionSettings - > setMenuRole ( QAction : : PreferencesRole ) ;
actionReportBug = new QAction ( MainWindow ) ;
actionReportBug - > setObjectName ( QStringLiteral ( " actionReportBug " ) ) ;
actionReportBug - > setIcon ( MMC - > getThemedIcon ( " bug " ) ) ;
actionPatreon = new QAction ( MainWindow ) ;
actionPatreon - > setObjectName ( QStringLiteral ( " actionPatreon " ) ) ;
actionPatreon - > setIcon ( MMC - > getThemedIcon ( " patreon " ) ) ;
actionMoreNews = new QAction ( MainWindow ) ;
actionMoreNews - > setObjectName ( QStringLiteral ( " actionMoreNews " ) ) ;
actionMoreNews - > setIcon ( MMC - > getThemedIcon ( " news " ) ) ;
actionAbout = new QAction ( MainWindow ) ;
actionAbout - > setObjectName ( QStringLiteral ( " actionAbout " ) ) ;
actionAbout - > setIcon ( MMC - > getThemedIcon ( " about " ) ) ;
actionAbout - > setMenuRole ( QAction : : AboutRole ) ;
actionLaunchInstance = new QAction ( MainWindow ) ;
actionLaunchInstance - > setObjectName ( QStringLiteral ( " actionLaunchInstance " ) ) ;
actionRenameInstance = new QAction ( MainWindow ) ;
actionRenameInstance - > setObjectName ( QStringLiteral ( " actionRenameInstance " ) ) ;
actionChangeInstGroup = new QAction ( MainWindow ) ;
actionChangeInstGroup - > setObjectName ( QStringLiteral ( " actionChangeInstGroup " ) ) ;
actionChangeInstIcon = new QAction ( MainWindow ) ;
actionChangeInstIcon - > setObjectName ( QStringLiteral ( " actionChangeInstIcon " ) ) ;
actionChangeInstIcon - > setEnabled ( true ) ;
actionChangeInstIcon - > setIcon ( QIcon ( " :/icons/instances/infinity " ) ) ;
actionChangeInstIcon - > setIconVisibleInMenu ( true ) ;
actionEditInstNotes = new QAction ( MainWindow ) ;
actionEditInstNotes - > setObjectName ( QStringLiteral ( " actionEditInstNotes " ) ) ;
actionEditInstance = new QAction ( MainWindow ) ;
actionEditInstance - > setObjectName ( QStringLiteral ( " actionEditInstance " ) ) ;
2016-11-02 07:03:55 +05:30
actionWorlds = new QAction ( MainWindow ) ;
actionWorlds - > setObjectName ( QStringLiteral ( " actionWorlds " ) ) ;
2015-03-02 02:50:57 +05:30
actionViewSelectedInstFolder = new QAction ( MainWindow ) ;
actionViewSelectedInstFolder - > setObjectName ( QStringLiteral ( " actionViewSelectedInstFolder " ) ) ;
actionDeleteInstance = new QAction ( MainWindow ) ;
actionDeleteInstance - > setObjectName ( QStringLiteral ( " actionDeleteInstance " ) ) ;
actionConfig_Folder = new QAction ( MainWindow ) ;
actionConfig_Folder - > setObjectName ( QStringLiteral ( " actionConfig_Folder " ) ) ;
actionCAT = new QAction ( MainWindow ) ;
actionCAT - > setObjectName ( QStringLiteral ( " actionCAT " ) ) ;
actionCAT - > setCheckable ( true ) ;
actionCAT - > setIcon ( MMC - > getThemedIcon ( " cat " ) ) ;
2015-09-16 02:32:21 +05:30
actionREDDIT = new QAction ( MainWindow ) ;
actionREDDIT - > setObjectName ( QStringLiteral ( " actionREDDIT " ) ) ;
actionREDDIT - > setIcon ( MMC - > getThemedIcon ( " reddit-alien " ) ) ;
2016-01-09 06:09:51 +05:30
actionDISCORD = new QAction ( MainWindow ) ;
actionDISCORD - > setObjectName ( QStringLiteral ( " actionDISCORD " ) ) ;
actionDISCORD - > setIcon ( MMC - > getThemedIcon ( " discord " ) ) ;
2015-03-02 02:50:57 +05:30
actionCopyInstance = new QAction ( MainWindow ) ;
actionCopyInstance - > setObjectName ( QStringLiteral ( " actionCopyInstance " ) ) ;
actionCopyInstance - > setIcon ( MMC - > getThemedIcon ( " copy " ) ) ;
actionManageAccounts = new QAction ( MainWindow ) ;
actionManageAccounts - > setObjectName ( QStringLiteral ( " actionManageAccounts " ) ) ;
actionLaunchInstanceOffline = new QAction ( MainWindow ) ;
actionLaunchInstanceOffline - > setObjectName ( QStringLiteral ( " actionLaunchInstanceOffline " ) ) ;
actionScreenshots = new QAction ( MainWindow ) ;
actionScreenshots - > setObjectName ( QStringLiteral ( " actionScreenshots " ) ) ;
actionInstanceSettings = new QAction ( MainWindow ) ;
actionInstanceSettings - > setObjectName ( QStringLiteral ( " actionInstanceSettings " ) ) ;
actionExportInstance = new QAction ( MainWindow ) ;
actionExportInstance - > setObjectName ( QStringLiteral ( " actionExportInstance " ) ) ;
centralWidget = new QWidget ( MainWindow ) ;
centralWidget - > setObjectName ( QStringLiteral ( " centralWidget " ) ) ;
horizontalLayout = new QHBoxLayout ( centralWidget ) ;
horizontalLayout - > setSpacing ( 0 ) ;
horizontalLayout - > setContentsMargins ( 11 , 11 , 11 , 11 ) ;
horizontalLayout - > setObjectName ( QStringLiteral ( " horizontalLayout " ) ) ;
horizontalLayout - > setSizeConstraint ( QLayout : : SetDefaultConstraint ) ;
horizontalLayout - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
MainWindow - > setCentralWidget ( centralWidget ) ;
mainToolBar = new QToolBar ( MainWindow ) ;
mainToolBar - > setObjectName ( QStringLiteral ( " mainToolBar " ) ) ;
mainToolBar - > setMovable ( false ) ;
mainToolBar - > setAllowedAreas ( Qt : : TopToolBarArea ) ;
mainToolBar - > setToolButtonStyle ( Qt : : ToolButtonIconOnly ) ;
mainToolBar - > setFloatable ( false ) ;
MainWindow - > addToolBar ( Qt : : TopToolBarArea , mainToolBar ) ;
statusBar = new QStatusBar ( MainWindow ) ;
statusBar - > setObjectName ( QStringLiteral ( " statusBar " ) ) ;
MainWindow - > setStatusBar ( statusBar ) ;
instanceToolBar = new QToolBar ( MainWindow ) ;
instanceToolBar - > setObjectName ( QStringLiteral ( " instanceToolBar " ) ) ;
instanceToolBar - > setEnabled ( true ) ;
2015-10-20 20:52:13 +05:30
instanceToolBar - > setAllowedAreas ( Qt : : LeftToolBarArea | Qt : : RightToolBarArea ) ;
2015-03-02 02:50:57 +05:30
instanceToolBar - > setIconSize ( QSize ( 80 , 80 ) ) ;
instanceToolBar - > setToolButtonStyle ( Qt : : ToolButtonIconOnly ) ;
instanceToolBar - > setFloatable ( false ) ;
MainWindow - > addToolBar ( Qt : : RightToolBarArea , instanceToolBar ) ;
newsToolBar = new QToolBar ( MainWindow ) ;
newsToolBar - > setObjectName ( QStringLiteral ( " newsToolBar " ) ) ;
newsToolBar - > setMovable ( false ) ;
newsToolBar - > setAllowedAreas ( Qt : : BottomToolBarArea ) ;
newsToolBar - > setIconSize ( QSize ( 16 , 16 ) ) ;
newsToolBar - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
newsToolBar - > setFloatable ( false ) ;
MainWindow - > addToolBar ( Qt : : BottomToolBarArea , newsToolBar ) ;
mainToolBar - > addAction ( actionAddInstance ) ;
mainToolBar - > addAction ( actionCopyInstance ) ;
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionViewInstanceFolder ) ;
mainToolBar - > addAction ( actionViewCentralModsFolder ) ;
mainToolBar - > addAction ( actionRefresh ) ;
mainToolBar - > addSeparator ( ) ;
2015-12-28 09:15:49 +05:30
if ( BuildConfig . UPDATER_ENABLED )
{
mainToolBar - > addAction ( actionCheckUpdate ) ;
}
2015-03-02 02:50:57 +05:30
mainToolBar - > addAction ( actionSettings ) ;
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionReportBug ) ;
mainToolBar - > addAction ( actionAbout ) ;
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionPatreon ) ;
2015-09-16 02:32:21 +05:30
mainToolBar - > addAction ( actionREDDIT ) ;
2016-01-09 06:09:51 +05:30
mainToolBar - > addAction ( actionDISCORD ) ;
2015-03-02 02:50:57 +05:30
mainToolBar - > addAction ( actionCAT ) ;
instanceToolBar - > addAction ( actionChangeInstIcon ) ;
instanceToolBar - > addAction ( actionLaunchInstance ) ;
instanceToolBar - > addAction ( actionLaunchInstanceOffline ) ;
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionEditInstance ) ;
instanceToolBar - > addAction ( actionInstanceSettings ) ;
instanceToolBar - > addAction ( actionEditInstNotes ) ;
2016-11-02 07:03:55 +05:30
instanceToolBar - > addAction ( actionWorlds ) ;
2015-03-02 02:50:57 +05:30
instanceToolBar - > addAction ( actionScreenshots ) ;
2016-11-26 22:36:08 +05:30
instanceToolBar - > addAction ( actionChangeInstGroup ) ;
2015-03-02 02:50:57 +05:30
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionViewSelectedInstFolder ) ;
instanceToolBar - > addAction ( actionConfig_Folder ) ;
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionExportInstance ) ;
instanceToolBar - > addAction ( actionDeleteInstance ) ;
newsToolBar - > addAction ( actionMoreNews ) ;
retranslateUi ( MainWindow ) ;
QMetaObject : : connectSlotsByName ( MainWindow ) ;
} // setupUi
void retranslateUi ( QMainWindow * MainWindow )
{
2016-03-23 03:58:47 +05:30
MainWindow - > setWindowTitle ( " MultiMC 5 " ) ;
2016-11-02 05:47:19 +05:30
actionAddInstance - > setText ( tr ( " Add Instance " ) ) ;
actionAddInstance - > setToolTip ( tr ( " Add a new instance. " ) ) ;
actionViewInstanceFolder - > setText ( tr ( " View Instance Folder " ) ) ;
actionViewInstanceFolder - > setToolTip ( tr ( " Open the instance folder in a file browser. " ) ) ;
actionRefresh - > setText ( tr ( " Refresh " ) ) ;
actionRefresh - > setToolTip ( tr ( " Reload the instance list. " ) ) ;
actionViewCentralModsFolder - > setText ( tr ( " View Central Mods Folder " ) ) ;
actionViewCentralModsFolder - > setToolTip ( tr ( " Open the central mods folder in a file browser. " ) ) ;
2015-12-28 09:15:49 +05:30
if ( BuildConfig . UPDATER_ENABLED )
{
2016-11-02 05:47:19 +05:30
actionCheckUpdate - > setText ( tr ( " Check for Updates " ) ) ;
actionCheckUpdate - > setToolTip ( tr ( " Check for new updates for MultiMC. " ) ) ;
2015-12-28 09:15:49 +05:30
}
2016-11-02 05:47:19 +05:30
actionSettings - > setText ( tr ( " Settings " ) ) ;
actionSettings - > setToolTip ( tr ( " Change settings. " ) ) ;
actionReportBug - > setText ( tr ( " Report a Bug " ) ) ;
actionReportBug - > setToolTip ( tr ( " Open the bug tracker to report a bug with MultiMC. " ) ) ;
actionPatreon - > setText ( tr ( " Support us on Patreon! " ) ) ;
actionPatreon - > setToolTip ( tr ( " Open the MultiMC Patreon page. " ) ) ;
actionMoreNews - > setText ( tr ( " More news... " ) ) ;
actionMoreNews - > setToolTip ( tr ( " Open the MultiMC development blog to read more news about MultiMC. " ) ) ;
actionAbout - > setText ( tr ( " About MultiMC " ) ) ;
actionAbout - > setToolTip ( tr ( " View information about MultiMC. " ) ) ;
2016-11-26 22:36:08 +05:30
updateLaunchAction ( ) ;
2016-11-02 05:47:19 +05:30
actionRenameInstance - > setText ( tr ( " Instance Name " ) ) ;
actionRenameInstance - > setToolTip ( tr ( " Rename the selected instance. " ) ) ;
actionChangeInstGroup - > setText ( tr ( " Change Group " ) ) ;
actionChangeInstGroup - > setToolTip ( tr ( " Change the selected instance's group. " ) ) ;
actionChangeInstIcon - > setText ( tr ( " Change Icon " ) ) ;
actionChangeInstIcon - > setToolTip ( tr ( " Change the selected instance's icon. " ) ) ;
actionEditInstNotes - > setText ( tr ( " Edit Notes " ) ) ;
actionEditInstNotes - > setToolTip ( tr ( " Edit the notes for the selected instance. " ) ) ;
2016-11-02 07:03:55 +05:30
actionWorlds - > setText ( tr ( " View Worlds " ) ) ;
actionWorlds - > setToolTip ( tr ( " View the worlds of this instance. " ) ) ;
2016-11-02 05:47:19 +05:30
actionEditInstance - > setText ( tr ( " Edit Instance " ) ) ;
actionEditInstance - > setToolTip ( tr ( " Change the instance settings, mods and versions. " ) ) ;
actionViewSelectedInstFolder - > setText ( tr ( " Instance Folder " ) ) ;
actionViewSelectedInstFolder - > setToolTip ( tr ( " Open the selected instance's root folder in a file browser. " ) ) ;
actionDeleteInstance - > setText ( tr ( " Delete " ) ) ;
actionDeleteInstance - > setToolTip ( tr ( " Delete the selected instance. " ) ) ;
actionConfig_Folder - > setText ( tr ( " Config Folder " ) ) ;
actionConfig_Folder - > setToolTip ( tr ( " Open the instance's config folder. " ) ) ;
actionCAT - > setText ( tr ( " Meow " ) ) ;
actionCAT - > setToolTip ( tr ( " It's a fluffy kitty :3 " ) ) ;
actionREDDIT - > setText ( tr ( " Reddit " ) ) ;
actionREDDIT - > setToolTip ( tr ( " Open MultiMC subreddit. " ) ) ;
actionDISCORD - > setText ( tr ( " Discord " ) ) ;
actionDISCORD - > setToolTip ( tr ( " Open MultiMC discord voice chat. " ) ) ;
actionCopyInstance - > setText ( tr ( " Copy Instance " ) ) ;
actionCopyInstance - > setToolTip ( tr ( " Copy the selected instance. " ) ) ;
actionManageAccounts - > setText ( tr ( " Manage Accounts " ) ) ;
actionManageAccounts - > setToolTip ( tr ( " Manage your Mojang or Minecraft accounts. " ) ) ;
2016-11-26 22:36:08 +05:30
actionLaunchInstanceOffline - > setText ( tr ( " Launch Offline " ) ) ;
2016-11-02 05:47:19 +05:30
actionLaunchInstanceOffline - > setToolTip ( tr ( " Launch the selected instance in offline mode. " ) ) ;
actionScreenshots - > setText ( tr ( " Manage Screenshots " ) ) ;
actionScreenshots - > setToolTip ( tr ( " View and upload screenshots for this instance. " ) ) ;
actionInstanceSettings - > setText ( tr ( " Instance Settings " ) ) ;
actionInstanceSettings - > setToolTip ( tr ( " Change the settings specific to the instance. " ) ) ;
actionExportInstance - > setText ( tr ( " Export Instance " ) ) ;
mainToolBar - > setWindowTitle ( tr ( " Main Toolbar " ) ) ;
instanceToolBar - > setWindowTitle ( tr ( " Instance Toolbar " ) ) ;
newsToolBar - > setWindowTitle ( tr ( " News Toolbar " ) ) ;
2015-03-02 02:50:57 +05:30
} // retranslateUi
} ;
2015-10-20 20:48:53 +05:30
MainWindow : : MainWindow ( QWidget * parent ) : QMainWindow ( parent ) , ui ( new MainWindow : : Ui )
2013-01-09 23:52:22 +05:30
{
2013-10-06 04:43:40 +05:30
ui - > setupUi ( this ) ;
2014-01-09 05:32:15 +05:30
2015-10-20 20:48:53 +05:30
QString winTitle = tr ( " MultiMC 5 - Version %1 " ) . arg ( BuildConfig . printableVersionString ( ) ) ;
2014-04-06 02:28:47 +05:30
if ( ! BuildConfig . BUILD_PLATFORM . isEmpty ( ) )
2015-10-20 20:48:53 +05:30
{
2016-01-03 20:33:49 +05:30
winTitle + = tr ( " on %1 " , " on platform, as in operating system " ) . arg ( BuildConfig . BUILD_PLATFORM ) ;
2015-10-20 20:48:53 +05:30
}
2014-01-09 05:32:15 +05:30
setWindowTitle ( winTitle ) ;
2013-10-06 04:43:40 +05:30
2013-08-27 20:20:42 +05:30
// OSX magic.
2014-10-19 21:49:37 +05:30
setUnifiedTitleAndToolBarOnMac ( true ) ;
2013-10-06 04:43:40 +05:30
2014-04-17 18:19:03 +05:30
// Global shortcuts
{
2014-06-28 03:35:00 +05:30
// FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
2014-04-17 18:19:03 +05:30
auto q = new QShortcut ( QKeySequence : : Quit , this ) ;
2014-04-22 01:18:58 +05:30
connect ( q , SIGNAL ( activated ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
2014-04-17 18:19:03 +05:30
}
2013-08-26 10:39:54 +05:30
// The instance action toolbar customizations
{
2013-11-04 01:58:04 +05:30
// disabled until we have an instance selected
2013-08-26 10:39:54 +05:30
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-11-04 01:58:04 +05:30
2013-08-26 10:39:54 +05:30
// the rename label is inside the rename tool button
renameButton = new LabeledToolButton ( ) ;
renameButton - > setText ( " Instance Name " ) ;
2013-08-27 09:09:49 +05:30
renameButton - > setToolTip ( ui - > actionRenameInstance - > toolTip ( ) ) ;
2013-08-26 10:39:54 +05:30
connect ( renameButton , SIGNAL ( clicked ( bool ) ) , SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
ui - > instanceToolBar - > insertWidget ( ui - > actionLaunchInstance , renameButton ) ;
ui - > instanceToolBar - > insertSeparator ( ui - > actionLaunchInstance ) ;
2013-10-06 04:43:40 +05:30
renameButton - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
2013-08-26 10:39:54 +05:30
}
2013-10-06 04:43:40 +05:30
2014-01-03 00:55:38 +05:30
// Add the news label to the news toolbar.
{
2015-10-20 20:48:53 +05:30
m_newsChecker . reset ( new NewsChecker ( BuildConfig . NEWS_RSS_URL ) ) ;
2014-01-03 00:55:38 +05:30
newsLabel = new QToolButton ( ) ;
2015-03-02 02:50:57 +05:30
newsLabel - > setIcon ( MMC - > getThemedIcon ( " news " ) ) ;
2014-01-03 00:55:38 +05:30
newsLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
newsLabel - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
ui - > newsToolBar - > insertWidget ( ui - > actionMoreNews , newsLabel ) ;
2015-10-20 20:52:13 +05:30
QObject : : connect ( newsLabel , & QAbstractButton : : clicked , this , & MainWindow : : newsButtonClicked ) ;
QObject : : connect ( m_newsChecker . get ( ) , & NewsChecker : : newsLoaded , this , & MainWindow : : updateNewsLabel ) ;
2014-01-03 00:55:38 +05:30
updateNewsLabel ( ) ;
}
2013-08-26 10:39:54 +05:30
// Create the instance list widget
{
2014-02-04 06:10:51 +05:30
view = new GroupView ( ui - > centralWidget ) ;
2013-10-06 04:43:40 +05:30
view - > setSelectionMode ( QAbstractItemView : : SingleSelection ) ;
2016-08-19 12:34:58 +05:30
// FIXME: leaks ListViewDelegate
view - > setItemDelegate ( new ListViewDelegate ( this ) ) ;
2015-10-20 20:48:53 +05:30
view - > setFrameShape ( QFrame : : NoFrame ) ;
2013-08-27 20:20:42 +05:30
// do not show ugly blue border on the mac
2013-08-27 19:50:32 +05:30
view - > setAttribute ( Qt : : WA_MacShowFocusRect , false ) ;
2013-10-06 04:43:40 +05:30
2013-08-26 10:39:54 +05:30
view - > installEventFilter ( this ) ;
2015-10-20 20:48:53 +05:30
view - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( view , & QWidget : : customContextMenuRequested , this , & MainWindow : : showInstanceContextMenu ) ;
2013-03-12 02:49:17 +05:30
2013-10-06 04:43:40 +05:30
proxymodel = new InstanceProxyModel ( this ) ;
proxymodel - > setSourceModel ( MMC - > instances ( ) . get ( ) ) ;
proxymodel - > sort ( 0 ) ;
2015-10-20 20:48:53 +05:30
connect ( proxymodel , & InstanceProxyModel : : dataChanged , this , & MainWindow : : instanceDataChanged ) ;
2014-01-05 05:36:59 +05:30
2015-10-20 20:48:53 +05:30
view - > setModel ( proxymodel ) ;
2013-10-06 04:43:40 +05:30
ui - > horizontalLayout - > addWidget ( view ) ;
2013-08-26 10:39:54 +05:30
}
// The cat background
{
2013-09-07 07:30:58 +05:30
bool cat_enable = MMC - > settings ( ) - > get ( " TheCat " ) . toBool ( ) ;
2013-08-26 10:39:54 +05:30
ui - > actionCAT - > setChecked ( cat_enable ) ;
connect ( ui - > actionCAT , SIGNAL ( toggled ( bool ) ) , SLOT ( onCatToggled ( bool ) ) ) ;
setCatBackground ( cat_enable ) ;
}
// start instance when double-clicked
2015-10-20 20:48:53 +05:30
connect ( view , & GroupView : : doubleClicked , this , & MainWindow : : instanceActivated ) ;
2013-08-26 10:39:54 +05:30
// track the selection -- update the instance toolbar
2015-10-20 20:48:53 +05:30
connect ( view - > selectionModel ( ) , & QItemSelectionModel : : currentChanged , this , & MainWindow : : instanceChanged ) ;
2013-12-31 05:54:28 +05:30
// track icon changes and update the toolbar!
2016-04-10 07:59:29 +05:30
connect ( MMC - > icons ( ) . get ( ) , & IconList : : iconUpdated , this , & MainWindow : : iconUpdated ) ;
2013-12-31 05:54:28 +05:30
2013-08-26 10:39:54 +05:30
// model reset -> selection is invalid. All the instance pointers are wrong.
2015-10-20 20:48:53 +05:30
connect ( MMC - > instances ( ) . get ( ) , & InstanceList : : dataIsInvalid , this , & MainWindow : : selectionBad ) ;
2013-10-06 04:43:40 +05:30
2014-01-03 01:17:34 +05:30
m_statusLeft = new QLabel ( tr ( " No instance selected " ) , this ) ;
2014-05-16 02:02:54 +05:30
m_statusRight = new ServerStatus ( this ) ;
2013-10-26 06:58:50 +05:30
statusBar ( ) - > addPermanentWidget ( m_statusLeft , 1 ) ;
2014-01-12 23:58:42 +05:30
statusBar ( ) - > addPermanentWidget ( m_statusRight , 0 ) ;
2013-10-26 06:58:50 +05:30
2013-11-27 22:26:15 +05:30
// Add "manage accounts" button, right align
2013-12-15 22:40:51 +05:30
QWidget * spacer = new QWidget ( ) ;
2013-11-27 22:26:15 +05:30
spacer - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Expanding ) ;
ui - > mainToolBar - > addWidget ( spacer ) ;
2013-11-28 04:09:49 +05:30
accountMenu = new QMenu ( this ) ;
2013-11-29 03:16:04 +05:30
manageAccountsAction = new QAction ( tr ( " Manage Accounts " ) , this ) ;
2013-11-28 04:09:49 +05:30
manageAccountsAction - > setCheckable ( false ) ;
2015-10-20 20:48:53 +05:30
manageAccountsAction - > setIcon ( MMC - > getThemedIcon ( " accounts " ) ) ;
2015-10-20 20:52:13 +05:30
connect ( manageAccountsAction , SIGNAL ( triggered ( bool ) ) , this , SLOT ( on_actionManageAccounts_triggered ( ) ) ) ;
2013-11-28 04:09:49 +05:30
repopulateAccountsMenu ( ) ;
accountMenuButton = new QToolButton ( this ) ;
2015-08-14 05:57:01 +05:30
accountMenuButton - > setText ( tr ( " Profiles " ) ) ;
2013-11-28 04:09:49 +05:30
accountMenuButton - > setMenu ( accountMenu ) ;
accountMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
accountMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
2015-03-02 02:50:57 +05:30
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-28 04:09:49 +05:30
QWidgetAction * accountMenuButtonAction = new QWidgetAction ( this ) ;
accountMenuButtonAction - > setDefaultWidget ( accountMenuButton ) ;
ui - > mainToolBar - > addAction ( accountMenuButtonAction ) ;
2013-11-27 22:26:15 +05:30
2013-11-29 03:16:04 +05:30
// Update the menu when the active account changes.
2013-12-15 22:40:51 +05:30
// Shouldn't have to use lambdas here like this, but if I don't, the compiler throws a fit.
// Template hell sucks...
connect ( MMC - > accounts ( ) . get ( ) , & MojangAccountList : : activeAccountChanged , [ this ]
2015-10-20 20:52:13 +05:30
{
activeAccountChanged ( ) ;
} ) ;
2013-12-15 22:40:51 +05:30
connect ( MMC - > accounts ( ) . get ( ) , & MojangAccountList : : listChanged , [ this ]
2015-10-20 20:52:13 +05:30
{
repopulateAccountsMenu ( ) ;
} ) ;
2013-11-29 03:16:04 +05:30
2014-01-11 05:52:08 +05:30
// Show initial account
activeAccountChanged ( ) ;
auto accounts = MMC - > accounts ( ) ;
2013-11-28 00:15:29 +05:30
2016-05-28 23:24:17 +05:30
QList < Net : : Download : : Ptr > skin_dls ;
2013-12-15 22:40:51 +05:30
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-28 04:17:15 +05:30
{
2014-01-11 05:52:08 +05:30
auto account = accounts - > at ( i ) ;
2015-10-20 20:48:53 +05:30
if ( ! account )
2013-11-28 00:15:29 +05:30
{
2015-10-20 20:48:53 +05:30
qWarning ( ) < < " Null account at index " < < i ;
continue ;
}
for ( auto profile : account - > profiles ( ) )
{
auto meta = Env : : getInstance ( ) . metacache ( ) - > resolveEntry ( " skins " , profile . id + " .png " ) ;
2016-05-28 23:24:17 +05:30
auto action = Net : : Download : : makeCached ( QUrl ( " https:// " + URLConstants : : SKINS_BASE + profile . id + " .png " ) , meta ) ;
2015-10-20 20:48:53 +05:30
skin_dls . append ( action ) ;
2016-03-26 21:26:57 +05:30
meta - > setStale ( true ) ;
2013-11-28 04:17:15 +05:30
}
2013-11-28 00:15:29 +05:30
}
2014-06-28 03:35:00 +05:30
if ( ! skin_dls . isEmpty ( ) )
{
auto job = new NetJob ( " Startup player skins download " ) ;
2015-04-26 17:17:14 +05:30
connect ( job , & NetJob : : succeeded , this , & MainWindow : : skinJobFinished ) ;
connect ( job , & NetJob : : failed , this , & MainWindow : : skinJobFinished ) ;
2014-06-28 03:35:00 +05:30
for ( auto action : skin_dls )
2015-01-12 02:34:31 +05:30
{
2014-06-28 03:35:00 +05:30
job - > addNetAction ( action ) ;
2015-01-12 02:34:31 +05:30
}
2014-06-28 03:35:00 +05:30
skin_download_job . reset ( job ) ;
job - > start ( ) ;
}
2013-11-27 22:26:15 +05:30
2017-03-18 06:52:36 +05:30
// load the news
2013-05-17 22:23:22 +05:30
{
2015-01-28 03:01:07 +05:30
m_newsChecker - > reloadNews ( ) ;
2014-01-03 00:55:38 +05:30
updateNewsLabel ( ) ;
2015-12-28 09:15:49 +05:30
}
2013-12-16 02:18:58 +05:30
2015-12-28 09:15:49 +05:30
if ( BuildConfig . UPDATER_ENABLED )
{
2013-12-02 05:25:24 +05:30
// set up the updater object.
2013-12-05 00:04:12 +05:30
auto updater = MMC - > updateChecker ( ) ;
2015-10-20 20:52:13 +05:30
connect ( updater . get ( ) , & UpdateChecker : : updateAvailable , this , & MainWindow : : updateAvailable ) ;
connect ( updater . get ( ) , & UpdateChecker : : noUpdateFound , this , & MainWindow : : updateNotAvailable ) ;
2013-12-02 05:25:24 +05:30
// if automatic update checks are allowed, start one.
2013-12-15 22:40:51 +05:30
if ( MMC - > settings ( ) - > get ( " AutoUpdate " ) . toBool ( ) )
2014-07-14 04:41:52 +05:30
{
2015-01-31 21:29:03 +05:30
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , false ) ;
2014-07-14 04:41:52 +05:30
}
2015-12-28 09:15:49 +05:30
}
{
2015-02-07 17:25:18 +05:30
auto checker = new NotificationChecker ( ) ;
checker - > setNotificationsUrl ( QUrl ( BuildConfig . NOTIFICATION_URL ) ) ;
checker - > setApplicationChannel ( BuildConfig . VERSION_CHANNEL ) ;
checker - > setApplicationPlatform ( BuildConfig . BUILD_PLATFORM ) ;
checker - > setApplicationFullVersion ( BuildConfig . FULL_VERSION_STR ) ;
m_notificationChecker . reset ( checker ) ;
2015-10-20 20:52:13 +05:30
connect ( m_notificationChecker . get ( ) , & NotificationChecker : : notificationCheckFinished , this , & MainWindow : : notificationsChanged ) ;
2015-02-07 17:25:18 +05:30
checker - > checkForNotifications ( ) ;
2013-05-17 22:23:22 +05:30
}
2013-11-27 19:30:44 +05:30
2014-01-06 14:31:40 +05:30
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-11-27 19:30:44 +05:30
// removing this looks stupid
view - > setFocus ( ) ;
2013-01-09 23:52:22 +05:30
}
MainWindow : : ~ MainWindow ( )
{
2013-03-12 02:49:17 +05:30
}
2014-03-30 23:41:05 +05:30
void MainWindow : : skinJobFinished ( )
{
2014-06-28 03:35:00 +05:30
activeAccountChanged ( ) ;
skin_download_job . reset ( ) ;
2014-03-30 23:41:05 +05:30
}
2014-01-27 07:30:49 +05:30
void MainWindow : : showInstanceContextMenu ( const QPoint & pos )
2014-01-05 05:36:59 +05:30
{
2014-04-08 03:46:49 +05:30
QList < QAction * > actions ;
QAction * actionSep = new QAction ( " " , this ) ;
actionSep - > setSeparator ( true ) ;
bool onInstance = view - > indexAt ( pos ) . isValid ( ) ;
if ( onInstance )
2014-01-05 05:36:59 +05:30
{
2014-04-08 03:46:49 +05:30
actions = ui - > instanceToolBar - > actions ( ) ;
QAction * actionVoid = new QAction ( m_selectedInstance - > name ( ) , this ) ;
actionVoid - > setEnabled ( false ) ;
QAction * actionRename = new QAction ( tr ( " Rename " ) , this ) ;
actionRename - > setToolTip ( ui - > actionRenameInstance - > toolTip ( ) ) ;
2014-01-05 05:36:59 +05:30
2014-04-08 03:46:49 +05:30
QAction * actionCopyInstance = new QAction ( tr ( " Copy instance " ) , this ) ;
actionCopyInstance - > setToolTip ( ui - > actionCopyInstance - > toolTip ( ) ) ;
2014-01-05 05:36:59 +05:30
2015-10-20 20:52:13 +05:30
connect ( actionRename , SIGNAL ( triggered ( bool ) ) , SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
connect ( actionCopyInstance , SIGNAL ( triggered ( bool ) ) , SLOT ( on_actionCopyInstance_triggered ( ) ) ) ;
2014-01-05 05:36:59 +05:30
2014-04-08 03:46:49 +05:30
actions . replace ( 1 , actionRename ) ;
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCopyInstance ) ;
}
else
{
2016-04-11 05:00:50 +05:30
auto group = view - > groupNameAt ( pos ) ;
2016-03-23 03:58:47 +05:30
QAction * actionVoid = new QAction ( " MultiMC " , this ) ;
2014-04-08 03:46:49 +05:30
actionVoid - > setEnabled ( false ) ;
QAction * actionCreateInstance = new QAction ( tr ( " Create instance " ) , this ) ;
actionCreateInstance - > setToolTip ( ui - > actionAddInstance - > toolTip ( ) ) ;
2016-04-11 05:00:50 +05:30
if ( ! group . isNull ( ) )
{
QVariantMap data ;
data [ " group " ] = group ;
actionCreateInstance - > setData ( data ) ;
}
2014-01-05 05:36:59 +05:30
2015-10-20 20:52:13 +05:30
connect ( actionCreateInstance , SIGNAL ( triggered ( bool ) ) , SLOT ( on_actionAddInstance_triggered ( ) ) ) ;
2014-04-08 03:46:49 +05:30
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCreateInstance ) ;
2016-04-11 05:00:50 +05:30
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 ( on_actionDeleteGroup_triggered ( ) ) ) ;
actions . append ( actionDeleteGroup ) ;
}
2014-04-08 03:46:49 +05:30
}
2014-01-05 05:36:59 +05:30
QMenu myMenu ;
myMenu . addActions ( actions ) ;
2014-06-28 03:35:00 +05:30
if ( onInstance )
2014-04-08 03:46:49 +05:30
myMenu . setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2014-01-05 05:36:59 +05:30
myMenu . exec ( view - > mapToGlobal ( pos ) ) ;
}
2014-02-16 16:19:55 +05:30
void MainWindow : : updateToolsMenu ( )
{
2016-11-02 04:03:20 +05:30
QToolButton * launchButton = dynamic_cast < QToolButton * > ( ui - > instanceToolBar - > widgetForAction ( ui - > actionLaunchInstance ) ) ;
2016-12-07 05:49:03 +05:30
if ( ! m_selectedInstance | | m_selectedInstance - > isRunning ( ) )
2016-11-26 22:36:08 +05:30
{
ui - > actionLaunchInstance - > setMenu ( nullptr ) ;
launchButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
return ;
}
QMenu * launchMenu = ui - > actionLaunchInstance - > menu ( ) ;
2016-11-02 04:03:20 +05:30
launchButton - > setPopupMode ( QToolButton : : MenuButtonPopup ) ;
2015-10-20 20:52:13 +05:30
if ( launchMenu )
2014-02-16 16:19:55 +05:30
{
2015-05-02 15:37:18 +05:30
launchMenu - > clear ( ) ;
2014-02-16 16:19:55 +05:30
}
2015-05-02 15:37:18 +05:30
else
{
launchMenu = new QMenu ( this ) ;
}
2014-02-16 16:19:55 +05:30
QAction * normalLaunch = launchMenu - > addAction ( tr ( " Launch " ) ) ;
2014-06-28 03:35:00 +05:30
connect ( normalLaunch , & QAction : : triggered , [ this ] ( )
2015-10-20 20:52:13 +05:30
{
2016-10-30 07:07:38 +05:30
MMC - > launch ( m_selectedInstance ) ;
2015-10-20 20:52:13 +05:30
} ) ;
2014-02-16 16:19:55 +05:30
launchMenu - > addSeparator ( ) - > setText ( tr ( " Profilers " ) ) ;
for ( auto profiler : MMC - > profilers ( ) . values ( ) )
{
QAction * profilerAction = launchMenu - > addAction ( profiler - > name ( ) ) ;
QString error ;
if ( ! profiler - > check ( & error ) )
{
profilerAction - > setDisabled ( true ) ;
2015-10-20 20:52:13 +05:30
profilerAction - > setToolTip ( tr ( " Profiler not setup correctly. Go into settings, \" External Tools \" . " ) ) ;
2014-02-16 16:19:55 +05:30
}
else
{
2014-06-28 03:35:00 +05:30
connect ( profilerAction , & QAction : : triggered , [ this , profiler ] ( )
2015-10-20 20:52:13 +05:30
{
2016-10-30 07:07:38 +05:30
MMC - > launch ( m_selectedInstance , true , profiler . get ( ) ) ;
2015-10-20 20:52:13 +05:30
} ) ;
2014-02-16 16:19:55 +05:30
}
}
ui - > actionLaunchInstance - > setMenu ( launchMenu ) ;
}
2016-11-15 13:48:55 +05:30
QString profileInUseFilter ( const QString & profile , bool used )
{
if ( used )
{
return profile + QObject : : tr ( " (in use) " ) ;
}
else
{
return profile ;
}
}
2013-11-28 04:09:49 +05:30
void MainWindow : : repopulateAccountsMenu ( )
{
accountMenu - > clear ( ) ;
std : : shared_ptr < MojangAccountList > accounts = MMC - > accounts ( ) ;
2013-11-28 05:09:36 +05:30
MojangAccountPtr active_account = accounts - > activeAccount ( ) ;
2013-11-28 04:09:49 +05:30
2013-11-28 05:09:36 +05:30
QString active_username = " " ;
2013-11-29 03:16:04 +05:30
if ( active_account ! = nullptr )
2013-11-28 04:09:49 +05:30
{
2016-11-15 13:48:55 +05:30
active_username = active_account - > username ( ) ;
const AccountProfile * profile = active_account - > currentProfile ( ) ;
// this can be called before accountMenuButton exists
if ( profile ! = nullptr & & accountMenuButton )
{
auto profileLabel = profileInUseFilter ( profile - > name , active_account - > isInUse ( ) ) ;
accountMenuButton - > setText ( profileLabel ) ;
}
2013-11-28 04:09:49 +05:30
}
2013-11-29 03:16:04 +05:30
if ( accounts - > count ( ) < = 0 )
2013-11-28 04:09:49 +05:30
{
QAction * action = new QAction ( tr ( " No accounts added! " ) , this ) ;
action - > setEnabled ( false ) ;
accountMenu - > addAction ( action ) ;
}
else
{
// TODO: Nicer way to iterate?
2013-11-29 03:16:04 +05:30
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-28 04:09:49 +05:30
{
MojangAccountPtr account = accounts - > at ( i ) ;
2013-12-05 07:09:52 +05:30
for ( auto profile : account - > profiles ( ) )
2013-11-28 04:09:49 +05:30
{
2016-11-15 13:48:55 +05:30
auto profileLabel = profileInUseFilter ( profile . name , account - > isInUse ( ) ) ;
2016-11-15 07:21:22 +05:30
QAction * action = new QAction ( profileLabel , this ) ;
2013-11-28 04:09:49 +05:30
action - > setData ( account - > username ( ) ) ;
action - > setCheckable ( true ) ;
2013-12-15 22:40:51 +05:30
if ( active_username = = account - > username ( ) )
2013-11-28 04:09:49 +05:30
{
action - > setChecked ( true ) ;
}
2015-09-29 02:13:57 +05:30
action - > setIcon ( SkinUtils : : getFaceFromCache ( profile . id ) ) ;
2013-11-28 04:09:49 +05:30
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
}
}
}
2015-08-14 05:57:01 +05:30
accountMenu - > addSeparator ( ) ;
2013-11-29 03:16:04 +05:30
QAction * action = new QAction ( tr ( " No Default Account " ) , this ) ;
2013-11-28 05:09:36 +05:30
action - > setCheckable ( true ) ;
2015-03-02 02:50:57 +05:30
action - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-28 05:09:36 +05:30
action - > setData ( " " ) ;
2013-12-15 22:40:51 +05:30
if ( active_username . isEmpty ( ) )
2013-11-28 05:09:36 +05:30
{
action - > setChecked ( true ) ;
}
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
accountMenu - > addSeparator ( ) ;
2013-11-28 04:09:49 +05:30
accountMenu - > addAction ( manageAccountsAction ) ;
}
/*
* Assumes the sender is a QAction
*/
void MainWindow : : changeActiveAccount ( )
{
2013-12-15 22:40:51 +05:30
QAction * sAction = ( QAction * ) sender ( ) ;
2013-11-28 04:09:49 +05:30
// Profile's associated Mojang username
2013-11-29 03:16:04 +05:30
// Will need to change when profiles are properly implemented
2013-12-15 22:40:51 +05:30
if ( sAction - > data ( ) . type ( ) ! = QVariant : : Type : : String )
return ;
2013-11-28 04:09:49 +05:30
2013-11-28 05:09:36 +05:30
QVariant data = sAction - > data ( ) ;
QString id = " " ;
2013-11-29 03:16:04 +05:30
if ( ! data . isNull ( ) )
2013-11-28 04:09:49 +05:30
{
2013-11-28 05:09:36 +05:30
id = data . toString ( ) ;
2013-11-28 04:09:49 +05:30
}
2013-11-28 05:09:36 +05:30
MMC - > accounts ( ) - > setActiveAccount ( id ) ;
2013-11-28 04:09:49 +05:30
activeAccountChanged ( ) ;
}
2013-11-27 22:26:15 +05:30
void MainWindow : : activeAccountChanged ( )
{
2013-11-28 04:09:49 +05:30
repopulateAccountsMenu ( ) ;
2013-11-27 22:26:15 +05:30
MojangAccountPtr account = MMC - > accounts ( ) - > activeAccount ( ) ;
2013-11-29 03:16:04 +05:30
if ( account ! = nullptr & & account - > username ( ) ! = " " )
2013-11-27 22:26:15 +05:30
{
2013-11-28 00:15:29 +05:30
const AccountProfile * profile = account - > currentProfile ( ) ;
2013-11-29 03:16:04 +05:30
if ( profile ! = nullptr )
2013-11-28 00:15:29 +05:30
{
2016-11-15 13:48:55 +05:30
auto profileLabel = profileInUseFilter ( profile - > name , account - > isInUse ( ) ) ;
2015-09-29 02:13:57 +05:30
accountMenuButton - > setIcon ( SkinUtils : : getFaceFromCache ( profile - > id ) ) ;
2016-11-15 13:48:55 +05:30
accountMenuButton - > setText ( profileLabel ) ;
2013-11-28 04:09:49 +05:30
return ;
2013-11-28 00:15:29 +05:30
}
2013-11-27 22:26:15 +05:30
}
2013-11-28 04:09:49 +05:30
2013-11-29 03:16:04 +05:30
// Set the icon to the "no account" icon.
2015-03-02 02:50:57 +05:30
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2015-08-14 05:57:01 +05:30
accountMenuButton - > setText ( tr ( " Profiles " ) ) ;
2013-11-27 22:26:15 +05:30
}
2013-10-06 04:43:40 +05:30
bool MainWindow : : eventFilter ( QObject * obj , QEvent * ev )
2013-08-12 04:09:19 +05:30
{
2013-10-06 04:43:40 +05:30
if ( obj = = view )
2013-08-12 04:09:19 +05:30
{
if ( ev - > type ( ) = = QEvent : : KeyPress )
{
2013-10-06 04:43:40 +05:30
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( ev ) ;
switch ( keyEvent - > key ( ) )
2013-08-12 04:09:19 +05:30
{
2013-10-06 04:43:40 +05:30
case Qt : : Key_Enter :
case Qt : : Key_Return :
2016-11-26 22:36:08 +05:30
activateInstance ( m_selectedInstance ) ;
2013-10-06 04:43:40 +05:30
return true ;
case Qt : : Key_Delete :
on_actionDeleteInstance_triggered ( ) ;
return true ;
case Qt : : Key_F5 :
on_actionRefresh_triggered ( ) ;
return true ;
case Qt : : Key_F2 :
on_actionRenameInstance_triggered ( ) ;
return true ;
default :
break ;
2013-08-12 04:09:19 +05:30
}
}
}
2013-10-06 04:43:40 +05:30
return QMainWindow : : eventFilter ( obj , ev ) ;
2013-08-12 04:09:19 +05:30
}
2014-01-03 00:55:38 +05:30
void MainWindow : : updateNewsLabel ( )
{
2015-01-28 03:01:07 +05:30
if ( m_newsChecker - > isLoadingNews ( ) )
2014-01-03 00:55:38 +05:30
{
newsLabel - > setText ( tr ( " Loading news... " ) ) ;
newsLabel - > setEnabled ( false ) ;
}
else
{
2015-01-28 03:01:07 +05:30
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-03 00:55:38 +05:30
if ( entries . length ( ) > 0 )
{
newsLabel - > setText ( entries [ 0 ] - > title ) ;
newsLabel - > setEnabled ( true ) ;
}
else
{
newsLabel - > setText ( tr ( " No news available. " ) ) ;
newsLabel - > setEnabled ( false ) ;
}
}
}
2015-02-08 22:26:14 +05:30
void MainWindow : : updateAvailable ( GoUpdate : : Status status )
2013-12-02 05:25:24 +05:30
{
UpdateDialog dlg ;
2013-12-15 22:40:51 +05:30
UpdateAction action = ( UpdateAction ) dlg . exec ( ) ;
switch ( action )
2013-12-02 05:25:24 +05:30
{
2013-12-15 22:40:51 +05:30
case UPDATE_LATER :
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Update will be installed later. " ;
2013-12-15 22:40:51 +05:30
break ;
case UPDATE_NOW :
2015-02-08 22:26:14 +05:30
downloadUpdates ( status ) ;
2013-12-15 22:40:51 +05:30
break ;
2013-12-02 05:25:24 +05:30
}
}
2014-07-14 04:27:54 +05:30
void MainWindow : : updateNotAvailable ( )
{
UpdateDialog dlg ( false ) ;
dlg . exec ( ) ;
}
2014-01-03 23:49:27 +05:30
QList < int > stringToIntList ( const QString & string )
{
QStringList split = string . split ( ' , ' , QString : : SkipEmptyParts ) ;
QList < int > out ;
for ( int i = 0 ; i < split . size ( ) ; + + i )
{
out . append ( split . at ( i ) . toInt ( ) ) ;
}
return out ;
}
QString intListToString ( const QList < int > & list )
{
QStringList slist ;
for ( int i = 0 ; i < list . size ( ) ; + + i )
{
slist . append ( QString : : number ( list . at ( i ) ) ) ;
}
return slist . join ( ' , ' ) ;
}
void MainWindow : : notificationsChanged ( )
{
2015-10-20 20:52:13 +05:30
QList < NotificationChecker : : NotificationEntry > entries = m_notificationChecker - > notificationEntries ( ) ;
QList < int > shownNotifications = stringToIntList ( MMC - > settings ( ) - > get ( " ShownNotifications " ) . toString ( ) ) ;
2014-01-03 23:49:27 +05:30
for ( auto it = entries . begin ( ) ; it ! = entries . end ( ) ; + + it )
{
NotificationChecker : : NotificationEntry entry = * it ;
2015-02-07 17:25:18 +05:30
if ( ! shownNotifications . contains ( entry . id ) )
2014-01-03 23:49:27 +05:30
{
2014-03-15 18:48:29 +05:30
NotificationDialog dialog ( entry , this ) ;
if ( dialog . exec ( ) = = NotificationDialog : : DontShowAgain )
2014-01-04 01:35:03 +05:30
{
shownNotifications . append ( entry . id ) ;
}
2014-01-03 23:49:27 +05:30
}
}
MMC - > settings ( ) - > set ( " ShownNotifications " , intListToString ( shownNotifications ) ) ;
}
2015-06-08 03:12:22 +05:30
void MainWindow : : downloadUpdates ( GoUpdate : : Status status )
2013-12-07 00:29:58 +05:30
{
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Downloading updates. " ;
2013-12-07 00:29:58 +05:30
ProgressDialog updateDlg ( this ) ;
2016-10-30 07:07:38 +05:30
status . rootPath = MMC - > root ( ) ;
2015-02-08 22:26:14 +05:30
2015-10-05 05:17:27 +05:30
auto dlPath = FS : : PathCombine ( MMC - > root ( ) , " update " , " XXXXXX " ) ;
2015-10-20 20:52:13 +05:30
if ( ! FS : : ensureFilePathExists ( dlPath ) )
2015-06-10 04:16:45 +05:30
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , tr ( " Couldn't create folder for update downloads: \n %1 " ) . arg ( dlPath ) , QMessageBox : : Warning ) - > show ( ) ;
}
2015-06-10 02:53:46 +05:30
GoUpdate : : DownloadTask updateTask ( status , dlPath , & updateDlg ) ;
2013-12-07 00:29:58 +05:30
// If the task succeeds, install the updates.
2015-09-26 07:34:09 +05:30
if ( updateDlg . execWithTask ( & updateTask ) )
2013-12-07 00:29:58 +05:30
{
2016-11-18 20:34:08 +05:30
UpdateController update ( this , MMC - > root ( ) , updateTask . updateFilesDir ( ) , updateTask . operations ( ) ) ;
update . installUpdates ( ) ;
2013-12-07 00:29:58 +05:30
}
2015-05-05 11:45:56 +05:30
else
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , updateTask . failReason ( ) , QMessageBox : : Warning ) - > show ( ) ;
}
2013-12-07 00:29:58 +05:30
}
2013-10-06 04:43:40 +05:30
void MainWindow : : onCatToggled ( bool state )
2013-08-26 02:18:41 +05:30
{
setCatBackground ( state ) ;
2013-09-07 07:30:58 +05:30
MMC - > settings ( ) - > set ( " TheCat " , state ) ;
2013-08-26 02:18:41 +05:30
}
2013-10-06 04:43:40 +05:30
void MainWindow : : setCatBackground ( bool enabled )
2013-08-26 02:18:41 +05:30
{
2013-10-06 04:43:40 +05:30
if ( enabled )
2013-08-26 02:18:41 +05:30
{
2014-02-10 03:25:44 +05:30
view - > setStyleSheet ( " GroupView "
2013-10-06 04:43:40 +05:30
" { "
" background-image: url(:/backgrounds/kitteh); "
" background-attachment: fixed; "
" background-clip: padding; "
" background-position: top right; "
" background-repeat: none; "
" background-color:palette(base); "
" } " ) ;
2013-08-26 02:18:41 +05:30
}
else
{
view - > setStyleSheet ( QString ( ) ) ;
}
}
2016-10-03 04:25:54 +05:30
void MainWindow : : runModalTask ( Task * task )
2015-01-28 03:01:07 +05:30
{
2016-10-03 04:25:54 +05:30
connect ( task , & Task : : failed , [ this ] ( QString reason )
2015-02-13 02:31:20 +05:30
{
2016-10-03 04:25:54 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , reason , QMessageBox : : Warning ) - > show ( ) ;
} ) ;
ProgressDialog loadDialog ( this ) ;
loadDialog . setSkipButton ( true , tr ( " Abort " ) ) ;
loadDialog . execWithTask ( task ) ;
}
2015-02-13 02:31:20 +05:30
2016-10-03 04:25:54 +05:30
void MainWindow : : instanceFromZipPack ( QString instName , QString instGroup , QString instIcon , QUrl url )
{
std : : unique_ptr < Task > task ( MMC - > folderProvider ( ) - > zipImportTask ( url , instName , instGroup , instIcon ) ) ;
runModalTask ( task . get ( ) ) ;
2015-02-13 02:31:20 +05:30
2016-10-03 04:25:54 +05:30
// FIXME: handle instance selection after creation
// finalizeInstance(newInstance);
}
2015-02-13 02:31:20 +05:30
2016-10-03 04:25:54 +05:30
void MainWindow : : instanceFromVersion ( QString instName , QString instGroup , QString instIcon , BaseVersionPtr version )
{
std : : unique_ptr < Task > task ( MMC - > folderProvider ( ) - > creationTask ( version , instName , instGroup , instIcon ) ) ;
runModalTask ( task . get ( ) ) ;
// FIXME: handle instance selection after creation
// finalizeInstance(newInstance);
2015-01-28 03:01:07 +05:30
}
2016-10-03 04:25:54 +05:30
void MainWindow : : on_actionCopyInstance_triggered ( )
2015-01-28 03:01:07 +05:30
{
2016-10-03 04:25:54 +05:30
if ( ! m_selectedInstance )
return ;
2015-02-01 07:38:25 +05:30
2016-10-03 04:25:54 +05:30
CopyInstanceDialog copyInstDlg ( m_selectedInstance , this ) ;
if ( ! copyInstDlg . exec ( ) )
return ;
2015-01-28 03:01:07 +05:30
2016-10-03 04:25:54 +05:30
std : : unique_ptr < Task > task ( MMC - > folderProvider ( ) - > copyTask ( m_selectedInstance , copyInstDlg . instName ( ) , copyInstDlg . instGroup ( ) ,
copyInstDlg . iconKey ( ) , copyInstDlg . shouldCopySaves ( ) ) ) ;
runModalTask ( task . get ( ) ) ;
2013-12-10 05:43:35 +05:30
2016-10-03 04:25:54 +05:30
// FIXME: handle instance selection after creation
// finalizeInstance(newInstance);
2015-01-28 03:01:07 +05:30
}
2015-02-13 02:31:20 +05:30
2015-01-28 03:01:07 +05:30
void MainWindow : : finalizeInstance ( InstancePtr inst )
{
2015-09-16 03:51:50 +05:30
view - > updateGeometries ( ) ;
setSelectedInstanceById ( inst - > id ( ) ) ;
2013-12-15 22:40:51 +05:30
if ( MMC - > accounts ( ) - > anyAccountIsValid ( ) )
2013-12-10 05:43:35 +05:30
{
ProgressDialog loadDialog ( this ) ;
2015-07-10 03:36:05 +05:30
auto update = inst - > createUpdateTask ( ) ;
2013-12-15 22:40:51 +05:30
connect ( update . get ( ) , & Task : : failed , [ this ] ( QString reason )
2015-10-20 20:52:13 +05:30
{
QString error = QString ( " Instance load failed: %1 " ) . arg ( reason ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , error , QMessageBox : : Warning ) - > show ( ) ;
} ) ;
2016-04-28 03:25:18 +05:30
if ( update )
{
2016-08-14 06:03:31 +05:30
loadDialog . setSkipButton ( true , tr ( " Abort " ) ) ;
2016-04-28 03:25:18 +05:30
loadDialog . execWithTask ( update . get ( ) ) ;
}
2013-12-10 05:43:35 +05:30
}
2013-12-16 01:12:17 +05:30
else
{
2015-10-20 20:52:13 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , tr ( " MultiMC 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 ( ) ;
2013-12-16 01:12:17 +05:30
}
2013-01-09 23:52:22 +05:30
}
2015-01-28 03:01:07 +05:30
void MainWindow : : on_actionAddInstance_triggered ( )
{
2016-04-11 05:00:50 +05:30
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 ( ) )
{
groupName = MMC - > settings ( ) - > get ( " LastUsedGroupForNewInstance " ) . toString ( ) ;
}
NewInstanceDialog newInstDlg ( groupName , this ) ;
2015-01-28 03:01:07 +05:30
if ( ! newInstDlg . exec ( ) )
return ;
MMC - > settings ( ) - > set ( " LastUsedGroupForNewInstance " , newInstDlg . instGroup ( ) ) ;
const QUrl modpackUrl = newInstDlg . modpackUrl ( ) ;
if ( modpackUrl . isValid ( ) )
{
instanceFromZipPack ( newInstDlg . instName ( ) , newInstDlg . instGroup ( ) , newInstDlg . iconKey ( ) , modpackUrl ) ;
}
else
{
instanceFromVersion ( newInstDlg . instName ( ) , newInstDlg . instGroup ( ) , newInstDlg . iconKey ( ) , newInstDlg . selectedVersion ( ) ) ;
}
}
2015-09-16 02:32:21 +05:30
void MainWindow : : on_actionREDDIT_triggered ( )
{
2016-01-05 12:02:52 +05:30
DesktopServices : : openUrl ( QUrl ( " https://www.reddit.com/r/MultiMC/ " ) ) ;
2015-09-16 02:32:21 +05:30
}
2016-01-09 06:09:51 +05:30
void MainWindow : : on_actionDISCORD_triggered ( )
{
DesktopServices : : openUrl ( QUrl ( " https://discord.gg/0k2zsXGNHs0fE4Wm " ) ) ;
}
2013-08-10 22:04:08 +05:30
void MainWindow : : on_actionChangeInstIcon_triggered ( )
2013-03-19 10:54:34 +05:30
{
2013-10-06 04:43:40 +05:30
if ( ! m_selectedInstance )
2013-08-10 22:04:08 +05:30
return ;
2013-10-06 04:43:40 +05:30
2013-08-10 22:04:08 +05:30
IconPickerDialog dlg ( this ) ;
2015-09-26 07:34:09 +05:30
dlg . execWithSelection ( m_selectedInstance - > iconKey ( ) ) ;
2013-10-06 04:43:40 +05:30
if ( dlg . result ( ) = = QDialog : : Accepted )
2013-03-19 10:54:34 +05:30
{
2013-08-25 05:02:42 +05:30
m_selectedInstance - > setIconKey ( dlg . selectedIconKey ) ;
2016-04-10 07:59:29 +05:30
auto ico = MMC - > icons ( ) - > getBigIcon ( dlg . selectedIconKey ) ;
2013-08-25 05:02:42 +05:30
ui - > actionChangeInstIcon - > setIcon ( ico ) ;
2013-03-19 10:54:34 +05:30
}
}
2013-12-31 05:54:28 +05:30
void MainWindow : : iconUpdated ( QString icon )
{
2014-01-27 07:30:49 +05:30
if ( icon = = m_currentInstIcon )
2013-12-31 05:54:28 +05:30
{
2016-04-10 07:59:29 +05:30
ui - > actionChangeInstIcon - > setIcon ( MMC - > icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-03-19 10:54:34 +05:30
}
}
2013-12-31 05:54:28 +05:30
void MainWindow : : updateInstanceToolIcon ( QString new_icon )
{
m_currentInstIcon = new_icon ;
2016-04-10 07:59:29 +05:30
ui - > actionChangeInstIcon - > setIcon ( MMC - > icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-12-31 05:54:28 +05:30
}
2014-01-06 14:31:40 +05:30
void MainWindow : : setSelectedInstanceById ( const QString & id )
{
2014-05-11 23:02:17 +05:30
if ( id . isNull ( ) )
return ;
const QModelIndex index = MMC - > instances ( ) - > getInstanceIndexById ( id ) ;
if ( index . isValid ( ) )
2014-01-06 14:31:40 +05:30
{
2014-05-11 23:02:17 +05:30
QModelIndex selectionIndex = proxymodel - > mapFromSource ( index ) ;
view - > selectionModel ( ) - > setCurrentIndex ( selectionIndex , QItemSelectionModel : : ClearAndSelect ) ;
2014-01-06 14:31:40 +05:30
}
}
2013-08-10 22:04:08 +05:30
void MainWindow : : on_actionChangeInstGroup_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( ! m_selectedInstance )
2013-08-10 22:04:08 +05:30
return ;
2013-10-06 04:43:40 +05:30
2013-08-10 22:04:08 +05:30
bool ok = false ;
2013-10-06 04:43:40 +05:30
QString name ( m_selectedInstance - > group ( ) ) ;
2013-12-15 22:40:51 +05:30
auto groups = MMC - > instances ( ) - > getGroups ( ) ;
2013-12-16 01:12:17 +05:30
groups . insert ( 0 , " " ) ;
2013-12-15 22:40:51 +05:30
groups . sort ( Qt : : CaseInsensitive ) ;
int foo = groups . indexOf ( name ) ;
2015-10-20 20:52:13 +05:30
name = QInputDialog : : getItem ( this , tr ( " Group name " ) , tr ( " Enter a new group name. " ) , groups , foo , true , & ok ) ;
2013-12-15 22:40:51 +05:30
name = name . simplified ( ) ;
2013-10-06 04:43:40 +05:30
if ( ok )
2013-08-26 02:18:41 +05:30
m_selectedInstance - > setGroupPost ( name ) ;
2013-08-10 22:04:08 +05:30
}
2016-04-11 05:00:50 +05:30
void MainWindow : : on_actionDeleteGroup_triggered ( )
{
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 ( ) )
{
MMC - > instances ( ) - > deleteGroup ( groupName ) ;
}
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionViewInstanceFolder_triggered ( )
{
2013-10-06 04:43:40 +05:30
QString str = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2016-01-05 12:02:52 +05:30
DesktopServices : : openDirectory ( str ) ;
2013-01-09 23:52:22 +05:30
}
void MainWindow : : on_actionRefresh_triggered ( )
{
2016-10-03 04:25:54 +05:30
MMC - > instances ( ) - > loadList ( true ) ;
2013-01-09 23:52:22 +05:30
}
void MainWindow : : on_actionViewCentralModsFolder_triggered ( )
{
2016-01-05 12:02:52 +05:30
DesktopServices : : openDirectory ( MMC - > settings ( ) - > get ( " CentralModsDir " ) . toString ( ) , true ) ;
2013-01-09 23:52:22 +05:30
}
2013-08-25 05:02:42 +05:30
void MainWindow : : on_actionConfig_Folder_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-08-25 05:02:42 +05:30
{
QString str = m_selectedInstance - > instanceConfigFolder ( ) ;
2016-01-05 12:02:52 +05:30
DesktopServices : : openDirectory ( QDir ( str ) . absolutePath ( ) ) ;
2013-08-25 05:02:42 +05:30
}
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionCheckUpdate_triggered ( )
{
2015-12-28 09:15:49 +05:30
if ( BuildConfig . UPDATER_ENABLED )
{
auto updater = MMC - > updateChecker ( ) ;
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , true ) ;
}
else
{
qWarning ( ) < < " Updater not set up. Cannot check for updates. " ;
}
2013-01-09 23:52:22 +05:30
}
2014-07-16 03:43:40 +05:30
void MainWindow : : on_actionSettings_triggered ( )
{
2015-07-05 05:59:41 +05:30
SettingsUI : : ShowPageDialog ( MMC - > globalSettingsPages ( ) , this , " global-settings " ) ;
2014-07-16 03:43:40 +05:30
// FIXME: quick HACK to make this work. improve, optimize.
proxymodel - > invalidate ( ) ;
proxymodel - > sort ( 0 ) ;
updateToolsMenu ( ) ;
2015-01-29 01:26:23 +05:30
update ( ) ;
2014-07-16 03:43:40 +05:30
}
2014-06-18 04:45:01 +05:30
void MainWindow : : on_actionInstanceSettings_triggered ( )
{
2016-10-30 07:07:38 +05:30
MMC - > showInstanceWindow ( m_selectedInstance , " settings " ) ;
2014-06-18 04:45:01 +05:30
}
void MainWindow : : on_actionEditInstNotes_triggered ( )
{
2016-10-30 07:07:38 +05:30
MMC - > showInstanceWindow ( m_selectedInstance , " notes " ) ;
2014-06-18 04:45:01 +05:30
}
2016-11-02 07:03:55 +05:30
void MainWindow : : on_actionWorlds_triggered ( )
{
MMC - > showInstanceWindow ( m_selectedInstance , " worlds " ) ;
}
2014-06-18 04:45:01 +05:30
void MainWindow : : on_actionEditInstance_triggered ( )
{
2016-10-30 07:07:38 +05:30
MMC - > showInstanceWindow ( m_selectedInstance ) ;
2014-06-18 04:45:01 +05:30
}
2014-06-28 20:37:08 +05:30
void MainWindow : : on_actionScreenshots_triggered ( )
{
2016-10-30 07:07:38 +05:30
MMC - > showInstanceWindow ( m_selectedInstance , " screenshots " ) ;
2014-06-28 20:37:08 +05:30
}
2013-11-20 23:50:35 +05:30
void MainWindow : : on_actionManageAccounts_triggered ( )
{
2015-07-05 05:59:41 +05:30
SettingsUI : : ShowPageDialog ( MMC - > globalSettingsPages ( ) , this , " accounts " ) ;
2013-11-20 23:50:35 +05:30
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionReportBug_triggered ( )
{
2016-01-05 12:02:52 +05:30
DesktopServices : : openUrl ( QUrl ( " https://github.com/MultiMC/MultiMC5/issues " ) ) ;
2013-01-09 23:52:22 +05:30
}
2014-04-11 07:29:30 +05:30
void MainWindow : : on_actionPatreon_triggered ( )
{
2016-01-05 12:02:52 +05:30
DesktopServices : : openUrl ( QUrl ( " http://www.patreon.com/multimc " ) ) ;
2014-04-11 07:29:30 +05:30
}
2014-01-03 00:55:38 +05:30
void MainWindow : : on_actionMoreNews_triggered ( )
2013-01-09 23:52:22 +05:30
{
2016-01-05 12:02:52 +05:30
DesktopServices : : openUrl ( QUrl ( " http://multimc.org/posts.html " ) ) ;
2013-01-09 23:52:22 +05:30
}
2014-01-03 02:07:56 +05:30
void MainWindow : : newsButtonClicked ( )
{
2015-01-28 03:01:07 +05:30
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-03 02:07:56 +05:30
if ( entries . count ( ) > 0 )
2016-01-05 12:02:52 +05:30
{
DesktopServices : : openUrl ( QUrl ( entries [ 0 ] - > link ) ) ;
}
2014-01-03 02:07:56 +05:30
else
2016-01-05 12:02:52 +05:30
{
DesktopServices : : openUrl ( QUrl ( " http://multimc.org/posts.html " ) ) ;
}
2014-01-03 02:07:56 +05:30
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionAbout_triggered ( )
{
2013-10-06 04:43:40 +05:30
AboutDialog dialog ( this ) ;
2013-03-12 02:49:17 +05:30
dialog . exec ( ) ;
2013-01-09 23:52:22 +05:30
}
2013-01-30 11:22:37 +05:30
2013-10-06 04:43:40 +05:30
void MainWindow : : on_mainToolBar_visibilityChanged ( bool )
2013-01-30 11:22:37 +05:30
{
// Don't allow hiding the main toolbar.
// This is the only way I could find to prevent it... :/
2013-10-06 04:43:40 +05:30
ui - > mainToolBar - > setVisible ( true ) ;
2013-01-30 11:22:37 +05:30
}
2013-06-24 01:40:32 +05:30
void MainWindow : : on_actionDeleteInstance_triggered ( )
{
2015-10-20 20:48:53 +05:30
if ( ! m_selectedInstance )
2013-07-05 04:09:41 +05:30
{
2015-10-20 20:48:53 +05:30
return ;
}
auto response = CustomMessageBox : : selectable ( this , tr ( " CAREFUL! " ) , tr ( " About to delete: %1 \n This is permanent and will completely erase "
" all data, even for tracked instances! \n Are you sure? " )
. arg ( m_selectedInstance - > name ( ) ) ,
QMessageBox : : Warning , QMessageBox : : Yes | QMessageBox : : No )
- > exec ( ) ;
if ( response = = QMessageBox : : Yes )
{
m_selectedInstance - > nuke ( ) ;
2013-07-05 04:09:41 +05:30
}
2013-06-24 01:40:32 +05:30
}
2015-02-13 02:31:20 +05:30
void MainWindow : : on_actionExportInstance_triggered ( )
{
if ( m_selectedInstance )
{
2015-04-19 07:49:29 +05:30
ExportInstanceDialog dlg ( m_selectedInstance , this ) ;
dlg . exec ( ) ;
2015-02-13 02:31:20 +05:30
}
}
2013-06-24 01:40:32 +05:30
void MainWindow : : on_actionRenameInstance_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-06-24 01:40:32 +05:30
{
bool ok = false ;
2013-10-06 04:43:40 +05:30
QString name ( m_selectedInstance - > name ( ) ) ;
2015-10-20 20:52:13 +05:30
name = QInputDialog : : getText ( this , tr ( " Instance name " ) , tr ( " Enter a new instance name. " ) , QLineEdit : : Normal , name , & ok ) ;
2013-10-06 04:43:40 +05:30
2016-05-04 04:01:27 +05:30
name = name . trimmed ( ) ;
2013-07-07 07:41:24 +05:30
if ( name . length ( ) > 0 )
{
2013-10-06 04:43:40 +05:30
if ( ok & & name . length ( ) )
2013-08-29 01:22:19 +05:30
{
2013-08-25 05:02:42 +05:30
m_selectedInstance - > setName ( name ) ;
2013-08-29 01:22:19 +05:30
renameButton - > setText ( name ) ;
}
2013-07-07 07:41:24 +05:30
}
2013-06-24 01:40:32 +05:30
}
}
void MainWindow : : on_actionViewSelectedInstFolder_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-06-24 01:40:32 +05:30
{
2013-08-25 05:02:42 +05:30
QString str = m_selectedInstance - > instanceRoot ( ) ;
2016-01-05 12:02:52 +05:30
DesktopServices : : openDirectory ( QDir ( str ) . absolutePath ( ) ) ;
2013-06-24 01:40:32 +05:30
}
}
2013-10-06 04:43:40 +05:30
void MainWindow : : closeEvent ( QCloseEvent * event )
2013-01-30 11:22:37 +05:30
{
2016-11-07 03:31:08 +05:30
if ( MMC - > numRunningInstances ( ) )
{
auto resBtn = QMessageBox : : question (
this ,
tr ( " Do you want to close MultiMC? " ) ,
tr ( " <p>You still have instances running.</p><p>Closing MultiMC will result in inaccurate time tracking and no Minecraft crash handling.</p><p>Are you sure?</p> " ) ,
QMessageBox : : No | QMessageBox : : Yes ,
QMessageBox : : Yes
) ;
if ( resBtn ! = QMessageBox : : Yes )
{
event - > ignore ( ) ;
return ;
}
}
2013-11-03 06:15:25 +05:30
2016-11-07 03:31:08 +05:30
// no running instances or user said yes.
event - > accept ( ) ;
// Save the window state and geometry.
2013-11-03 06:15:25 +05:30
MMC - > settings ( ) - > set ( " MainWindowState " , saveState ( ) . toBase64 ( ) ) ;
MMC - > settings ( ) - > set ( " MainWindowGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
2013-10-26 13:08:21 +05:30
QApplication : : exit ( ) ;
2013-01-30 11:22:37 +05:30
}
2013-03-12 02:49:17 +05:30
2016-12-05 06:59:08 +05:30
void MainWindow : : changeEvent ( QEvent * event )
{
if ( event - > type ( ) = = QEvent : : LanguageChange )
{
ui - > retranslateUi ( this ) ;
}
QMainWindow : : changeEvent ( event ) ;
}
2013-10-22 01:55:50 +05:30
void MainWindow : : instanceActivated ( QModelIndex index )
{
if ( ! index . isValid ( ) )
return ;
2014-06-28 03:35:00 +05:30
QString id = index . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
2014-03-30 23:41:05 +05:30
InstancePtr inst = MMC - > instances ( ) - > getInstanceById ( id ) ;
2014-06-28 03:35:00 +05:30
if ( ! inst )
return ;
2013-10-22 01:55:50 +05:30
2016-11-26 22:36:08 +05:30
activateInstance ( inst ) ;
2013-10-22 01:55:50 +05:30
}
2013-02-06 04:04:20 +05:30
void MainWindow : : on_actionLaunchInstance_triggered ( )
{
2016-11-26 22:36:08 +05:30
if ( ! m_selectedInstance )
{
return ;
}
if ( m_selectedInstance - > isRunning ( ) )
{
MMC - > kill ( m_selectedInstance ) ;
}
else
2013-03-12 02:49:17 +05:30
{
2016-10-30 07:07:38 +05:30
MMC - > launch ( m_selectedInstance ) ;
2013-03-12 02:49:17 +05:30
}
2013-02-06 04:04:20 +05:30
}
2016-11-26 22:36:08 +05:30
void MainWindow : : activateInstance ( InstancePtr instance )
{
MMC - > launch ( instance ) ;
}
2014-01-27 07:30:49 +05:30
void MainWindow : : on_actionLaunchInstanceOffline_triggered ( )
{
if ( m_selectedInstance )
{
2016-10-30 07:07:38 +05:30
MMC - > launch ( m_selectedInstance , false ) ;
2016-03-18 19:32:54 +05:30
}
2015-07-04 23:32:43 +05:30
}
2013-08-09 03:56:35 +05:30
void MainWindow : : taskEnd ( )
2013-05-07 03:49:20 +05:30
{
2013-08-09 03:56:35 +05:30
QObject * sender = QObject : : sender ( ) ;
if ( sender = = m_versionLoadTask )
2013-05-07 03:49:20 +05:30
m_versionLoadTask = NULL ;
2013-10-06 04:43:40 +05:30
2013-08-09 03:56:35 +05:30
sender - > deleteLater ( ) ;
2013-05-07 03:49:20 +05:30
}
void MainWindow : : startTask ( Task * task )
{
2013-08-09 03:56:35 +05:30
connect ( task , SIGNAL ( succeeded ( ) ) , SLOT ( taskEnd ( ) ) ) ;
connect ( task , SIGNAL ( failed ( QString ) ) , SLOT ( taskEnd ( ) ) ) ;
2013-09-18 03:30:35 +05:30
task - > start ( ) ;
2013-05-07 03:49:20 +05:30
}
2013-10-06 04:43:40 +05:30
void MainWindow : : instanceChanged ( const QModelIndex & current , const QModelIndex & previous )
2013-08-25 05:02:42 +05:30
{
2015-10-20 20:52:13 +05:30
if ( ! current . isValid ( ) )
2014-05-11 23:02:17 +05:30
{
MMC - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
selectionBad ( ) ;
return ;
}
QString id = current . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
m_selectedInstance = MMC - > instances ( ) - > getInstanceById ( id ) ;
2015-10-20 20:52:13 +05:30
if ( m_selectedInstance )
2013-08-25 05:02:42 +05:30
{
2016-03-18 19:32:54 +05:30
ui - > instanceToolBar - > setEnabled ( true ) ;
2016-11-26 22:36:08 +05:30
if ( m_selectedInstance - > isRunning ( ) )
{
ui - > actionLaunchInstance - > setEnabled ( true ) ;
ui - > setLaunchAction ( true ) ;
}
else
{
ui - > actionLaunchInstance - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
ui - > setLaunchAction ( false ) ;
}
2016-03-18 19:32:54 +05:30
ui - > actionLaunchInstanceOffline - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2016-04-28 03:34:37 +05:30
ui - > actionExportInstance - > setEnabled ( m_selectedInstance - > canExport ( ) ) ;
2013-08-26 02:18:41 +05:30
renameButton - > setText ( m_selectedInstance - > name ( ) ) ;
2013-10-26 06:58:50 +05:30
m_statusLeft - > setText ( m_selectedInstance - > getStatusbarDescription ( ) ) ;
2013-12-31 05:54:28 +05:30
updateInstanceToolIcon ( m_selectedInstance - > iconKey ( ) ) ;
2013-11-27 19:30:44 +05:30
2014-02-16 16:19:55 +05:30
updateToolsMenu ( ) ;
2014-02-16 02:56:44 +05:30
2013-11-27 19:30:44 +05:30
MMC - > settings ( ) - > set ( " SelectedInstance " , m_selectedInstance - > id ( ) ) ;
2013-08-25 05:02:42 +05:30
}
else
{
2016-03-18 19:32:54 +05:30
ui - > instanceToolBar - > setEnabled ( false ) ;
2014-05-11 23:02:17 +05:30
MMC - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
selectionBad ( ) ;
return ;
2013-08-25 05:02:42 +05:30
}
2013-08-26 10:00:11 +05:30
}
2015-10-20 20:52:13 +05:30
void MainWindow : : instanceDataChanged ( const QModelIndex & topLeft , const QModelIndex & bottomRight )
2015-04-07 04:51:03 +05:30
{
auto current = view - > selectionModel ( ) - > currentIndex ( ) ;
QItemSelection test ( topLeft , bottomRight ) ;
2015-10-20 20:52:13 +05:30
if ( test . contains ( current ) )
2015-04-07 04:51:03 +05:30
{
instanceChanged ( current , current ) ;
}
}
2013-08-26 10:00:11 +05:30
void MainWindow : : selectionBad ( )
{
2014-01-06 14:31:40 +05:30
// start by reseting everything...
2013-08-26 10:00:11 +05:30
m_selectedInstance = nullptr ;
2013-12-31 05:54:28 +05:30
2013-08-26 10:00:11 +05:30
statusBar ( ) - > clearMessage ( ) ;
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-09-08 21:43:09 +05:30
renameButton - > setText ( tr ( " Rename Instance " ) ) ;
2013-12-31 05:54:28 +05:30
updateInstanceToolIcon ( " infinity " ) ;
2014-01-06 14:31:40 +05:30
// ...and then see if we can enable the previously selected instance
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-07-15 01:31:30 +05:30
}
2013-08-26 02:18:41 +05:30
2014-07-27 19:20:03 +05:30
void MainWindow : : checkInstancePathForProblems ( )
{
QString instanceFolder = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2015-10-05 05:17:27 +05:30
if ( FS : : checkProblemticPathJava ( QDir ( instanceFolder ) ) )
2014-07-27 19:20:03 +05:30
{
2015-04-26 03:31:41 +05:30
QMessageBox warning ( this ) ;
2015-10-20 20:52:13 +05:30
warning . setText ( tr ( " Your instance folder contains \' ! \' and this is known to cause Java problems! " ) ) ;
warning . setInformativeText ( tr ( " You have now two options: <br/> "
" - change the instance folder in the settings <br/> "
" - move this installation of MultiMC5 to a different folder " ) ) ;
2014-07-27 19:20:03 +05:30
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2015-04-26 03:31:41 +05:30
auto tempFolderText = tr ( " This is a problem: <br/> "
2015-10-20 20:52:13 +05:30
" - MultiMC will likely be deleted without warning by the operating system <br/> "
" - close MultiMC now and extract it to a real location, not a temporary folder " ) ;
2015-04-26 03:31:41 +05:30
QString pathfoldername = QDir ( instanceFolder ) . absolutePath ( ) ;
2015-10-20 20:52:13 +05:30
if ( pathfoldername . contains ( " Rar$ " , Qt : : CaseInsensitive ) )
2015-04-26 03:31:41 +05:30
{
QMessageBox warning ( this ) ;
2015-10-20 20:52:13 +05:30
warning . setText ( tr ( " Your instance folder contains \' Rar$ \' - that means you haven't extracted the MultiMC zip! " ) ) ;
2015-04-26 03:31:41 +05:30
warning . setInformativeText ( tempFolderText ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2015-10-20 20:52:13 +05:30
else if ( pathfoldername . contains ( QDir : : tempPath ( ) ) )
2015-04-26 03:31:41 +05:30
{
QMessageBox warning ( this ) ;
2015-10-20 20:52:13 +05:30
warning . setText ( tr ( " Your instance folder is in a temporary folder: \' %1 \' ! " ) . arg ( QDir : : tempPath ( ) ) ) ;
2015-04-26 03:31:41 +05:30
warning . setInformativeText ( tempFolderText ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2014-07-27 19:20:03 +05:30
}