2015-02-02 22:25:30 +00:00
/* Copyright 2013-2015 MultiMC Contributors
2013-02-19 23:07:52 +00:00
*
* Authors : Andrew Okin
* Peterix
* Orochimarufan < orochimarufan . x3 @ gmail . com >
2013-01-09 18:22:22 +00: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-03-11 21:19:17 +00:00
*
2013-01-09 18:22:22 +00: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-11-04 01:53:05 +00:00
# include "MultiMC.h"
2014-04-06 02:59:37 +01:00
# include "BuildConfig.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
# include <QtCore/QVariant>
# 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>
class Ui_MainWindow
{
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 ;
QAction * actionViewSelectedInstFolder ;
QAction * actionDeleteInstance ;
QAction * actionConfig_Folder ;
QAction * actionCAT ;
QAction * actionCopyInstance ;
QAction * actionManageAccounts ;
QAction * actionLaunchInstanceOffline ;
QAction * actionScreenshots ;
QAction * actionInstanceSettings ;
QAction * actionExportInstance ;
QWidget * centralWidget ;
QHBoxLayout * horizontalLayout ;
QToolBar * mainToolBar ;
QStatusBar * statusBar ;
QToolBar * instanceToolBar ;
QToolBar * newsToolBar ;
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 " ) ) ;
actionCheckUpdate = new QAction ( MainWindow ) ;
actionCheckUpdate - > setObjectName ( QStringLiteral ( " actionCheckUpdate " ) ) ;
actionCheckUpdate - > setIcon ( MMC - > getThemedIcon ( " checkupdate " ) ) ;
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 " ) ) ;
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 " ) ) ;
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 ) ;
instanceToolBar - > setAllowedAreas ( Qt : : LeftToolBarArea | Qt : : RightToolBarArea ) ;
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 ( ) ;
mainToolBar - > addAction ( actionCheckUpdate ) ;
mainToolBar - > addAction ( actionSettings ) ;
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionReportBug ) ;
mainToolBar - > addAction ( actionAbout ) ;
mainToolBar - > addSeparator ( ) ;
mainToolBar - > addAction ( actionPatreon ) ;
mainToolBar - > addAction ( actionCAT ) ;
instanceToolBar - > addAction ( actionChangeInstIcon ) ;
instanceToolBar - > addAction ( actionLaunchInstance ) ;
instanceToolBar - > addAction ( actionLaunchInstanceOffline ) ;
instanceToolBar - > addAction ( actionChangeInstGroup ) ;
instanceToolBar - > addSeparator ( ) ;
instanceToolBar - > addAction ( actionEditInstance ) ;
instanceToolBar - > addAction ( actionInstanceSettings ) ;
instanceToolBar - > addAction ( actionEditInstNotes ) ;
instanceToolBar - > addAction ( actionScreenshots ) ;
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 )
{
MainWindow - > setWindowTitle ( QApplication : : translate ( " MainWindow " , " MultiMC 5 " , 0 ) ) ;
actionAddInstance - > setText ( QApplication : : translate ( " MainWindow " , " Add Instance " , 0 ) ) ;
actionAddInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Add a new instance. " , 0 ) ) ;
actionAddInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Add a new instance. " , 0 ) ) ;
actionViewInstanceFolder - > setText ( QApplication : : translate ( " MainWindow " , " View Instance Folder " , 0 ) ) ;
actionViewInstanceFolder - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the instance folder in a file browser. " , 0 ) ) ;
actionViewInstanceFolder - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the instance folder in a file browser. " , 0 ) ) ;
actionRefresh - > setText ( QApplication : : translate ( " MainWindow " , " Refresh " , 0 ) ) ;
actionRefresh - > setToolTip ( QApplication : : translate ( " MainWindow " , " Reload the instance list. " , 0 ) ) ;
actionRefresh - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Reload the instance list. " , 0 ) ) ;
actionViewCentralModsFolder - > setText ( QApplication : : translate ( " MainWindow " , " View Central Mods Folder " , 0 ) ) ;
actionViewCentralModsFolder - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the central mods folder in a file browser. " , 0 ) ) ;
actionViewCentralModsFolder - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the central mods folder in a file browser. " , 0 ) ) ;
actionCheckUpdate - > setText ( QApplication : : translate ( " MainWindow " , " Check for Updates " , 0 ) ) ;
actionCheckUpdate - > setToolTip ( QApplication : : translate ( " MainWindow " , " Check for new updates for MultiMC " , 0 ) ) ;
actionCheckUpdate - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Check for new updates for MultiMC " , 0 ) ) ;
actionSettings - > setText ( QApplication : : translate ( " MainWindow " , " Settings " , 0 ) ) ;
actionSettings - > setToolTip ( QApplication : : translate ( " MainWindow " , " Change settings. " , 0 ) ) ;
actionSettings - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Change settings. " , 0 ) ) ;
actionReportBug - > setText ( QApplication : : translate ( " MainWindow " , " Report a Bug " , 0 ) ) ;
actionReportBug - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the bug tracker to report a bug with MultiMC. " , 0 ) ) ;
actionReportBug - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the bug tracker to report a bug with MultiMC. " , 0 ) ) ;
actionPatreon - > setText ( QApplication : : translate ( " MainWindow " , " Support us on Patreon! " , 0 ) ) ;
actionPatreon - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the MultiMC Patreon page. " , 0 ) ) ;
actionPatreon - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the MultiMC Patreon page. " , 0 ) ) ;
actionMoreNews - > setText ( QApplication : : translate ( " MainWindow " , " More News " , 0 ) ) ;
actionMoreNews - > setIconText ( QApplication : : translate ( " MainWindow " , " More news... " , 0 ) ) ;
actionMoreNews - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the MultiMC development blog to read more news about MultiMC. " , 0 ) ) ;
actionMoreNews - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the MultiMC development blog to read more news about MultiMC. " , 0 ) ) ;
actionAbout - > setText ( QApplication : : translate ( " MainWindow " , " About MultiMC " , 0 ) ) ;
actionAbout - > setToolTip ( QApplication : : translate ( " MainWindow " , " View information about MultiMC. " , 0 ) ) ;
actionAbout - > setStatusTip ( QApplication : : translate ( " MainWindow " , " About MultiMC " , 0 ) ) ;
actionLaunchInstance - > setText ( QApplication : : translate ( " MainWindow " , " Play " , 0 ) ) ;
actionLaunchInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Launch the selected instance. " , 0 ) ) ;
actionLaunchInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Launch the selected instance. " , 0 ) ) ;
actionRenameInstance - > setText ( QApplication : : translate ( " MainWindow " , " Instance Name " , 0 ) ) ;
actionRenameInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Rename the selected instance. " , 0 ) ) ;
actionRenameInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Rename the selected instance. " , 0 ) ) ;
actionChangeInstGroup - > setText ( QApplication : : translate ( " MainWindow " , " Change Group " , 0 ) ) ;
actionChangeInstGroup - > setToolTip ( QApplication : : translate ( " MainWindow " , " Change the selected instance's group. " , 0 ) ) ;
actionChangeInstGroup - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Change the selected instance's group. " , 0 ) ) ;
actionChangeInstIcon - > setText ( QApplication : : translate ( " MainWindow " , " Change Icon " , 0 ) ) ;
actionChangeInstIcon - > setToolTip ( QApplication : : translate ( " MainWindow " , " Change the selected instance's icon. " , 0 ) ) ;
actionChangeInstIcon - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Change the selected instance's icon. " , 0 ) ) ;
actionEditInstNotes - > setText ( QApplication : : translate ( " MainWindow " , " Edit Notes " , 0 ) ) ;
actionEditInstNotes - > setToolTip ( QApplication : : translate ( " MainWindow " , " Edit the notes for the selected instance. " , 0 ) ) ;
actionEditInstNotes - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Edit the notes for the selected instance. " , 0 ) ) ;
actionEditInstance - > setText ( QApplication : : translate ( " MainWindow " , " Edit Instance " , 0 ) ) ;
actionEditInstance - > setIconText ( QApplication : : translate ( " MainWindow " , " Edit Instance " , 0 ) ) ;
actionEditInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Change the instance settings, mods and versions. " , 0 ) ) ;
actionEditInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Change the instance settings, mods and versions. " , 0 ) ) ;
actionViewSelectedInstFolder - > setText ( QApplication : : translate ( " MainWindow " , " Instance Folder " , 0 ) ) ;
actionViewSelectedInstFolder - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the selected instance's root folder in a file browser. " , 0 ) ) ;
actionViewSelectedInstFolder - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Open the selected instance's root folder in a file browser. " , 0 ) ) ;
actionDeleteInstance - > setText ( QApplication : : translate ( " MainWindow " , " Delete " , 0 ) ) ;
actionDeleteInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Delete the selected instance. " , 0 ) ) ;
actionDeleteInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Delete the selected instance. " , 0 ) ) ;
actionConfig_Folder - > setText ( QApplication : : translate ( " MainWindow " , " Config Folder " , 0 ) ) ;
actionConfig_Folder - > setToolTip ( QApplication : : translate ( " MainWindow " , " Open the instance's config folder " , 0 ) ) ;
actionCAT - > setText ( QApplication : : translate ( " MainWindow " , " Meow " , 0 ) ) ;
actionCAT - > setToolTip ( QApplication : : translate ( " MainWindow " , " <html><head/><body><p align= \" center \" >It's a fluffy kitty :3</p></body></html> " , 0 ) ) ;
actionCopyInstance - > setText ( QApplication : : translate ( " MainWindow " , " Copy Instance " , 0 ) ) ;
actionCopyInstance - > setToolTip ( QApplication : : translate ( " MainWindow " , " Copy the selected instance. " , 0 ) ) ;
actionCopyInstance - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Add a new instance. " , 0 ) ) ;
actionManageAccounts - > setText ( QApplication : : translate ( " MainWindow " , " Manage Accounts " , 0 ) ) ;
actionManageAccounts - > setToolTip ( QApplication : : translate ( " MainWindow " , " Manage your Mojang or Minecraft accounts. " , 0 ) ) ;
actionLaunchInstanceOffline - > setText ( QApplication : : translate ( " MainWindow " , " Play Offline " , 0 ) ) ;
actionLaunchInstanceOffline - > setToolTip ( QApplication : : translate ( " MainWindow " , " Launch the selected instance in offline mode. " , 0 ) ) ;
actionLaunchInstanceOffline - > setStatusTip ( QApplication : : translate ( " MainWindow " , " Launch the selected instance. " , 0 ) ) ;
actionScreenshots - > setText ( QApplication : : translate ( " MainWindow " , " Manage Screenshots " , 0 ) ) ;
actionScreenshots - > setToolTip ( QApplication : : translate ( " MainWindow " , " <html><head/><body><p>View and upload screenshots for this instance</p></body></html> " , 0 ) ) ;
actionInstanceSettings - > setText ( QApplication : : translate ( " MainWindow " , " Instance Settings " , 0 ) ) ;
actionInstanceSettings - > setToolTip ( QApplication : : translate ( " MainWindow " , " Change the settings specific to the instance " , 0 ) ) ;
actionExportInstance - > setText ( QApplication : : translate ( " MainWindow " , " Export Instance " , 0 ) ) ;
mainToolBar - > setWindowTitle ( QApplication : : translate ( " MainWindow " , " Main Toolbar " , 0 ) ) ;
instanceToolBar - > setWindowTitle ( QApplication : : translate ( " MainWindow " , " Instance Toolbar " , 0 ) ) ;
newsToolBar - > setWindowTitle ( QApplication : : translate ( " MainWindow " , " News Toolbar " , 0 ) ) ;
} // retranslateUi
} ;
namespace Ui {
class MainWindow : public Ui_MainWindow { } ;
} // namespace Ui
2013-01-09 18:22:22 +00:00
2013-01-31 20:31:16 +00:00
# include <QMenu>
2013-02-01 19:07:36 +00:00
# include <QMessageBox>
2013-02-13 03:03:15 +00:00
# include <QInputDialog>
2013-09-07 03:00:58 +01:00
2013-01-09 18:22:22 +00:00
# include <QDesktopServices>
2014-02-04 00:40:51 +00:00
# include <QKeyEvent>
2013-01-09 18:22:22 +00:00
# include <QUrl>
2013-02-19 23:07:52 +00:00
# include <QDir>
2013-02-21 01:10:09 +00:00
# include <QFileInfo>
2013-08-25 00:32:42 +01:00
# include <QLabel>
# include <QToolButton>
2013-11-27 22:39:49 +00:00
# include <QWidgetAction>
2014-02-15 13:19:35 +00:00
# include <QProgressDialog>
2014-04-17 13:49:03 +01:00
# include <QShortcut>
2015-02-12 21:01:20 +00:00
# include <QFileDialog>
2015-04-12 21:50:52 +01:00
# include <MMCZip.h>
2013-01-09 18:22:22 +00:00
2013-02-21 01:10:09 +00:00
# include "osutils.h"
2013-02-21 19:40:32 +00:00
# include "userutils.h"
# include "pathutils.h"
2013-02-01 19:07:36 +00:00
2015-02-09 00:51:14 +00:00
# include "groupview/GroupView.h"
# include "groupview/InstanceDelegate.h"
# include "InstanceProxyModel.h"
2013-08-17 12:40:51 +01:00
2015-02-09 00:51:14 +00:00
# include "Platform.h"
2013-11-04 01:53:05 +00:00
2015-02-09 00:51:14 +00:00
# include "widgets/LabeledToolButton.h"
2014-05-15 21:32:54 +01:00
# include "widgets/ServerStatus.h"
2013-11-04 01:53:05 +00:00
2015-02-09 00:51:14 +00:00
# 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/AccountSelectDialog.h"
# include "dialogs/UpdateDialog.h"
# include "dialogs/EditAccountDialog.h"
# include "dialogs/NotificationDialog.h"
2015-04-19 03:19:29 +01:00
# include "dialogs/ExportInstanceDialog.h"
2015-02-09 00:51:14 +00:00
# include "pages/global/MultiMCPage.h"
# include "pages/global/ExternalToolsPage.h"
# include "pages/global/AccountListPage.h"
# include "pages/global/ProxyPage.h"
# include "pages/global/JavaPage.h"
# include "pages/global/MinecraftPage.h"
# include "ConsoleWindow.h"
2014-06-01 23:49:53 +01:00
# include "pagedialog/PageDialog.h"
2013-02-01 19:07:36 +00:00
2015-02-09 00:51:14 +00:00
# include "InstanceList.h"
# include "minecraft/MinecraftVersionList.h"
# include "minecraft/LwjglVersionList.h"
# include "icons/IconList.h"
# include "java/JavaVersionList.h"
2013-09-07 03:00:58 +01:00
2015-02-09 00:51:14 +00:00
# include "auth/flows/AuthenticateTask.h"
# include "auth/flows/RefreshTask.h"
2013-11-29 02:45:52 +00:00
2015-02-09 00:51:14 +00:00
# include "updater/DownloadTask.h"
2013-12-05 19:52:55 +00:00
2015-02-09 00:51:14 +00:00
# include "news/NewsChecker.h"
2013-12-15 20:48:58 +00:00
2015-02-09 00:51:14 +00:00
# include "net/URLConstants.h"
# include "net/NetJob.h"
# include "Env.h"
2013-12-13 14:58:11 +00:00
2015-02-09 00:51:14 +00:00
# include "BaseInstance.h"
# include "BaseProcess.h"
# include "java/JavaUtils.h"
2015-05-04 00:20:48 +01:00
# include "JavaCommon.h"
2015-02-07 09:43:09 +00:00
# include "InstancePageProvider.h"
2015-02-09 00:51:14 +00:00
# include "minecraft/SkinUtils.h"
2013-09-07 03:00:58 +01:00
2015-02-09 00:51:14 +00:00
//#include "minecraft/LegacyInstance.h"
2013-03-11 21:19:17 +00:00
2015-02-09 00:51:14 +00:00
# include <updater/UpdateChecker.h>
# include <notifications/NotificationChecker.h>
# include <tasks/ThreadTask.h>
# include <net/CacheDownload.h>
2013-12-08 02:58:44 +00:00
2015-02-09 00:51:14 +00:00
# include "tools/BaseProfiler.h"
2014-02-15 13:19:35 +00:00
2013-10-06 00:13:40 +01:00
MainWindow : : MainWindow ( QWidget * parent ) : QMainWindow ( parent ) , ui ( new Ui : : MainWindow )
2013-01-09 18:22:22 +00:00
{
2013-10-20 21:28:31 +01:00
MultiMCPlatform : : fixWM_CLASS ( this ) ;
2013-10-06 00:13:40 +01:00
ui - > setupUi ( this ) ;
2014-01-09 00:02:15 +00:00
2015-01-27 21:31:07 +00:00
// initialize the news checker
m_newsChecker . reset ( new NewsChecker ( BuildConfig . NEWS_RSS_URL ) ) ;
2014-06-27 23:05:00 +01:00
QString winTitle =
QString ( " MultiMC 5 - Version %1 " ) . arg ( BuildConfig . printableVersionString ( ) ) ;
2014-04-05 21:58:47 +01:00
if ( ! BuildConfig . BUILD_PLATFORM . isEmpty ( ) )
winTitle + = " on " + BuildConfig . BUILD_PLATFORM ;
2014-01-09 00:02:15 +00:00
setWindowTitle ( winTitle ) ;
2013-10-06 00:13:40 +01:00
2013-08-27 15:50:42 +01:00
// OSX magic.
2014-10-19 17:19:37 +01:00
setUnifiedTitleAndToolBarOnMac ( true ) ;
2013-10-06 00:13:40 +01:00
2014-04-17 13:49:03 +01:00
// Global shortcuts
{
2014-06-27 23:05:00 +01:00
// FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
2014-04-17 13:49:03 +01:00
auto q = new QShortcut ( QKeySequence : : Quit , this ) ;
2014-04-21 20:48:58 +01:00
connect ( q , SIGNAL ( activated ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
2014-04-17 13:49:03 +01:00
}
2013-08-26 06:09:54 +01:00
// The instance action toolbar customizations
{
2013-11-03 20:28:04 +00:00
// disabled until we have an instance selected
2013-08-26 06:09:54 +01:00
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-11-03 20:28:04 +00:00
2013-08-26 06:09:54 +01:00
// the rename label is inside the rename tool button
renameButton = new LabeledToolButton ( ) ;
renameButton - > setText ( " Instance Name " ) ;
2013-08-27 04:39:49 +01:00
renameButton - > setToolTip ( ui - > actionRenameInstance - > toolTip ( ) ) ;
2013-08-26 06:09:54 +01:00
connect ( renameButton , SIGNAL ( clicked ( bool ) ) , SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
ui - > instanceToolBar - > insertWidget ( ui - > actionLaunchInstance , renameButton ) ;
ui - > instanceToolBar - > insertSeparator ( ui - > actionLaunchInstance ) ;
2013-10-06 00:13:40 +01:00
renameButton - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
2013-08-26 06:09:54 +01:00
}
2013-10-06 00:13:40 +01:00
2014-01-02 19:25:38 +00:00
// Add the news label to the news toolbar.
{
newsLabel = new QToolButton ( ) ;
2015-03-01 21:20:57 +00:00
newsLabel - > setIcon ( MMC - > getThemedIcon ( " news " ) ) ;
2014-01-02 19:25:38 +00:00
newsLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
newsLabel - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
ui - > newsToolBar - > insertWidget ( ui - > actionMoreNews , newsLabel ) ;
2014-01-27 02:00:49 +00:00
QObject : : connect ( newsLabel , & QAbstractButton : : clicked , this ,
& MainWindow : : newsButtonClicked ) ;
2015-01-27 21:31:07 +00:00
QObject : : connect ( m_newsChecker . get ( ) , & NewsChecker : : newsLoaded , this ,
2014-01-27 02:00:49 +00:00
& MainWindow : : updateNewsLabel ) ;
2014-01-02 19:25:38 +00:00
updateNewsLabel ( ) ;
}
2013-08-26 06:09:54 +01:00
// Create the instance list widget
{
2014-02-04 00:40:51 +00:00
view = new GroupView ( ui - > centralWidget ) ;
2013-10-06 00:13:40 +01:00
view - > setSelectionMode ( QAbstractItemView : : SingleSelection ) ;
2014-02-04 00:40:51 +00:00
// view->setCategoryDrawer(drawer);
// view->setCollapsibleBlocks(true);
// view->setViewMode(QListView::IconMode);
// view->setFlow(QListView::LeftToRight);
// view->setWordWrap(true);
// view->setMouseTracking(true);
// view->viewport()->setAttribute(Qt::WA_Hover);
2013-08-26 06:09:54 +01:00
auto delegate = new ListViewDelegate ( ) ;
view - > setItemDelegate ( delegate ) ;
2014-02-04 00:40:51 +00:00
// view->setSpacing(10);
// view->setUniformItemWidths(true);
2013-10-06 00:13:40 +01:00
2013-08-27 15:50:42 +01:00
// do not show ugly blue border on the mac
2013-08-27 15:20:32 +01:00
view - > setAttribute ( Qt : : WA_MacShowFocusRect , false ) ;
2013-10-06 00:13:40 +01:00
2013-08-26 06:09:54 +01:00
view - > installEventFilter ( this ) ;
2013-03-11 21:19:17 +00:00
2013-10-06 00:13:40 +01:00
proxymodel = new InstanceProxyModel ( this ) ;
2013-11-12 08:23:39 +00:00
// proxymodel->setSortRole(KCategorizedSortFilterProxyModel::CategorySortRole);
// proxymodel->setFilterRole(KCategorizedSortFilterProxyModel::CategorySortRole);
2013-10-06 00:13:40 +01:00
// proxymodel->setDynamicSortFilter ( true );
// FIXME: instList should be global-ish, or at least not tied to the main window...
// maybe the application itself?
proxymodel - > setSourceModel ( MMC - > instances ( ) . get ( ) ) ;
proxymodel - > sort ( 0 ) ;
view - > setFrameShape ( QFrame : : NoFrame ) ;
view - > setModel ( proxymodel ) ;
2015-04-07 00:21:03 +01:00
connect ( proxymodel , SIGNAL ( dataChanged ( QModelIndex , QModelIndex , QVector < int > ) ) , SLOT ( instanceDataChanged ( QModelIndex , QModelIndex ) ) ) ;
2014-01-05 00:06:59 +00:00
view - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
2014-01-27 02:00:49 +00:00
connect ( view , SIGNAL ( customContextMenuRequested ( const QPoint & ) ) , this ,
SLOT ( showInstanceContextMenu ( const QPoint & ) ) ) ;
2014-01-05 00:06:59 +00:00
2013-10-06 00:13:40 +01:00
ui - > horizontalLayout - > addWidget ( view ) ;
2013-08-26 06:09:54 +01:00
}
// The cat background
{
2013-09-07 03:00:58 +01:00
bool cat_enable = MMC - > settings ( ) - > get ( " TheCat " ) . toBool ( ) ;
2013-08-26 06:09:54 +01:00
ui - > actionCAT - > setChecked ( cat_enable ) ;
connect ( ui - > actionCAT , SIGNAL ( toggled ( bool ) ) , SLOT ( onCatToggled ( bool ) ) ) ;
setCatBackground ( cat_enable ) ;
}
// start instance when double-clicked
2013-10-06 00:13:40 +01:00
connect ( view , SIGNAL ( doubleClicked ( const QModelIndex & ) ) , this ,
SLOT ( instanceActivated ( const QModelIndex & ) ) ) ;
2013-08-26 06:09:54 +01:00
// track the selection -- update the instance toolbar
2013-10-06 00:13:40 +01:00
connect ( view - > selectionModel ( ) ,
SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ) , this ,
SLOT ( instanceChanged ( const QModelIndex & , const QModelIndex & ) ) ) ;
2013-12-31 00:24:28 +00:00
// track icon changes and update the toolbar!
2015-02-01 10:44:47 +00:00
connect ( ENV . icons ( ) . get ( ) , SIGNAL ( iconUpdated ( QString ) ) , SLOT ( iconUpdated ( QString ) ) ) ;
2013-12-31 00:24:28 +00:00
2013-08-26 06:09:54 +01:00
// model reset -> selection is invalid. All the instance pointers are wrong.
// FIXME: stop using POINTERS everywhere
2013-10-06 00:13:40 +01:00
connect ( MMC - > instances ( ) . get ( ) , SIGNAL ( dataIsInvalid ( ) ) , SLOT ( selectionBad ( ) ) ) ;
2014-01-02 19:47:34 +00:00
m_statusLeft = new QLabel ( tr ( " No instance selected " ) , this ) ;
2014-05-15 21:32:54 +01:00
m_statusRight = new ServerStatus ( this ) ;
2013-10-26 02:28:50 +01:00
statusBar ( ) - > addPermanentWidget ( m_statusLeft , 1 ) ;
2014-01-12 18:28:42 +00:00
statusBar ( ) - > addPermanentWidget ( m_statusRight , 0 ) ;
2013-10-26 02:28:50 +01:00
2013-11-27 16:56:15 +00:00
// Add "manage accounts" button, right align
2013-12-15 17:10:51 +00:00
QWidget * spacer = new QWidget ( ) ;
2013-11-27 16:56:15 +00:00
spacer - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Expanding ) ;
ui - > mainToolBar - > addWidget ( spacer ) ;
2013-11-27 22:39:49 +00:00
accountMenu = new QMenu ( this ) ;
2013-11-28 21:46:04 +00:00
manageAccountsAction = new QAction ( tr ( " Manage Accounts " ) , this ) ;
2013-11-27 22:39:49 +00:00
manageAccountsAction - > setCheckable ( false ) ;
2013-12-15 17:10:51 +00:00
connect ( manageAccountsAction , SIGNAL ( triggered ( bool ) ) , this ,
SLOT ( on_actionManageAccounts_triggered ( ) ) ) ;
2013-11-27 22:39:49 +00:00
repopulateAccountsMenu ( ) ;
accountMenuButton = new QToolButton ( this ) ;
accountMenuButton - > setText ( tr ( " Accounts " ) ) ;
accountMenuButton - > setMenu ( accountMenu ) ;
accountMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
accountMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
2015-03-01 21:20:57 +00:00
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-27 22:39:49 +00:00
QWidgetAction * accountMenuButtonAction = new QWidgetAction ( this ) ;
accountMenuButtonAction - > setDefaultWidget ( accountMenuButton ) ;
ui - > mainToolBar - > addAction ( accountMenuButtonAction ) ;
2013-11-27 16:56:15 +00:00
2014-07-15 23:13:40 +01:00
// set up global pages dialog
{
m_globalSettingsProvider = std : : make_shared < GenericPageProvider > ( tr ( " Settings " ) ) ;
2014-07-20 22:47:46 +01:00
m_globalSettingsProvider - > addPage < MultiMCPage > ( ) ;
m_globalSettingsProvider - > addPage < MinecraftPage > ( ) ;
m_globalSettingsProvider - > addPage < JavaPage > ( ) ;
m_globalSettingsProvider - > addPage < ProxyPage > ( ) ;
2014-07-15 23:13:40 +01:00
m_globalSettingsProvider - > addPage < ExternalToolsPage > ( ) ;
2014-07-20 22:47:46 +01:00
m_globalSettingsProvider - > addPage < AccountListPage > ( ) ;
2014-07-15 23:13:40 +01:00
}
2013-11-28 21:46:04 +00:00
// Update the menu when the active account changes.
2013-12-15 17:10:51 +00:00
// 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 ]
{ activeAccountChanged ( ) ; } ) ;
connect ( MMC - > accounts ( ) . get ( ) , & MojangAccountList : : listChanged , [ this ]
{ repopulateAccountsMenu ( ) ; } ) ;
2013-11-28 21:46:04 +00:00
2014-01-11 00:22:08 +00:00
// Show initial account
activeAccountChanged ( ) ;
auto accounts = MMC - > accounts ( ) ;
2013-11-27 18:45:29 +00:00
2014-06-27 23:05:00 +01:00
QList < CacheDownloadPtr > skin_dls ;
2013-12-15 17:10:51 +00:00
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-27 22:47:15 +00:00
{
2014-01-11 00:22:08 +00:00
auto account = accounts - > at ( i ) ;
2013-12-15 17:10:51 +00:00
if ( account ! = nullptr )
2013-11-27 18:45:29 +00:00
{
2014-01-11 00:22:08 +00:00
for ( auto profile : account - > profiles ( ) )
2013-11-27 22:47:15 +00:00
{
2015-01-31 15:59:03 +00:00
auto meta = Env : : getInstance ( ) . metacache ( ) - > resolveEntry ( " skins " , profile . name + " .png " ) ;
2013-11-27 22:47:15 +00:00
auto action = CacheDownload : : make (
2013-12-15 17:10:51 +00:00
QUrl ( " http:// " + URLConstants : : SKINS_BASE + profile . name + " .png " ) , meta ) ;
2014-06-27 23:05:00 +01:00
skin_dls . append ( action ) ;
2013-11-27 22:47:15 +00:00
meta - > stale = true ;
}
}
2013-11-27 18:45:29 +00:00
}
2014-06-27 23:05:00 +01:00
if ( ! skin_dls . isEmpty ( ) )
{
auto job = new NetJob ( " Startup player skins download " ) ;
2015-04-26 12:47:14 +01:00
connect ( job , & NetJob : : succeeded , this , & MainWindow : : skinJobFinished ) ;
connect ( job , & NetJob : : failed , this , & MainWindow : : skinJobFinished ) ;
2014-06-27 23:05:00 +01:00
for ( auto action : skin_dls )
2015-01-11 21:04:31 +00:00
{
2014-06-27 23:05:00 +01:00
job - > addNetAction ( action ) ;
2015-01-11 21:04:31 +00:00
}
2014-06-27 23:05:00 +01:00
skin_download_job . reset ( job ) ;
job - > start ( ) ;
}
2013-11-27 16:56:15 +00:00
2013-08-26 06:09:54 +01:00
// run the things that load and download other things... FIXME: this is NOT the place
// FIXME: invisible actions in the background = NOPE.
2013-05-17 17:53:22 +01:00
{
2013-09-15 23:54:39 +01:00
if ( ! MMC - > minecraftlist ( ) - > isLoaded ( ) )
2013-08-26 06:09:54 +01:00
{
2013-09-15 23:54:39 +01:00
m_versionLoadTask = MMC - > minecraftlist ( ) - > getLoadTask ( ) ;
2013-08-26 06:09:54 +01:00
startTask ( m_versionLoadTask ) ;
}
2013-09-15 23:54:39 +01:00
if ( ! MMC - > lwjgllist ( ) - > isLoaded ( ) )
2013-08-26 06:09:54 +01:00
{
2013-09-15 23:54:39 +01:00
MMC - > lwjgllist ( ) - > loadList ( ) ;
2013-08-26 06:09:54 +01:00
}
2013-11-17 11:08:07 +00:00
2015-01-27 21:31:07 +00:00
m_newsChecker - > reloadNews ( ) ;
2014-01-02 19:25:38 +00:00
updateNewsLabel ( ) ;
2013-12-15 20:48:58 +00:00
2013-12-01 23:55:24 +00:00
// set up the updater object.
2013-12-04 18:34:12 +00:00
auto updater = MMC - > updateChecker ( ) ;
2013-12-25 01:46:06 +00:00
connect ( updater . get ( ) , & UpdateChecker : : updateAvailable , this ,
& MainWindow : : updateAvailable ) ;
2014-07-13 23:57:54 +01:00
connect ( updater . get ( ) , & UpdateChecker : : noUpdateFound , this ,
& MainWindow : : updateNotAvailable ) ;
2013-12-01 23:55:24 +00:00
// if automatic update checks are allowed, start one.
2013-12-15 17:10:51 +00:00
if ( MMC - > settings ( ) - > get ( " AutoUpdate " ) . toBool ( ) )
2014-07-14 00:11:52 +01:00
{
auto updater = MMC - > updateChecker ( ) ;
2015-01-31 15:59:03 +00:00
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , false ) ;
2014-07-14 00:11:52 +01:00
}
2015-02-07 11:55:18 +00:00
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-01-29 08:03:11 +00:00
connect ( m_notificationChecker . get ( ) ,
2014-01-27 02:00:49 +00:00
& NotificationChecker : : notificationCheckFinished , this ,
& MainWindow : : notificationsChanged ) ;
2015-02-07 11:55:18 +00:00
checker - > checkForNotifications ( ) ;
2013-05-17 17:53:22 +01:00
}
2013-11-27 14:00:44 +00:00
2014-01-06 09:01:40 +00:00
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-11-27 14:00:44 +00:00
// removing this looks stupid
view - > setFocus ( ) ;
2013-01-09 18:22:22 +00:00
}
MainWindow : : ~ MainWindow ( )
{
delete ui ;
2013-03-11 21:19:17 +00:00
delete proxymodel ;
}
2014-03-30 19:11:05 +01:00
void MainWindow : : skinJobFinished ( )
{
2014-06-27 23:05:00 +01:00
activeAccountChanged ( ) ;
skin_download_job . reset ( ) ;
2014-03-30 19:11:05 +01:00
}
2014-01-27 02:00:49 +00:00
void MainWindow : : showInstanceContextMenu ( const QPoint & pos )
2014-01-05 00:06:59 +00:00
{
2014-04-07 23:16:49 +01:00
QList < QAction * > actions ;
QAction * actionSep = new QAction ( " " , this ) ;
actionSep - > setSeparator ( true ) ;
bool onInstance = view - > indexAt ( pos ) . isValid ( ) ;
if ( onInstance )
2014-01-05 00:06:59 +00:00
{
2014-04-07 23:16:49 +01:00
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 00:06:59 +00:00
2014-04-07 23:16:49 +01:00
QAction * actionCopyInstance = new QAction ( tr ( " Copy instance " ) , this ) ;
actionCopyInstance - > setToolTip ( ui - > actionCopyInstance - > toolTip ( ) ) ;
2014-01-05 00:06:59 +00:00
2014-06-27 23:05:00 +01:00
connect ( actionRename , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
connect ( actionCopyInstance , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionCopyInstance_triggered ( ) ) ) ;
2014-01-05 00:06:59 +00:00
2014-04-07 23:16:49 +01:00
actions . replace ( 1 , actionRename ) ;
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCopyInstance ) ;
}
else
{
QAction * actionVoid = new QAction ( tr ( " MultiMC " ) , this ) ;
actionVoid - > setEnabled ( false ) ;
QAction * actionCreateInstance = new QAction ( tr ( " Create instance " ) , this ) ;
actionCreateInstance - > setToolTip ( ui - > actionAddInstance - > toolTip ( ) ) ;
2014-01-05 00:06:59 +00:00
2014-06-27 23:05:00 +01:00
connect ( actionCreateInstance , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionAddInstance_triggered ( ) ) ) ;
2014-04-07 23:16:49 +01:00
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCreateInstance ) ;
}
2014-01-05 00:06:59 +00:00
QMenu myMenu ;
myMenu . addActions ( actions ) ;
2014-06-27 23:05:00 +01:00
if ( onInstance )
2014-04-07 23:16:49 +01:00
myMenu . setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2014-01-05 00:06:59 +00:00
myMenu . exec ( view - > mapToGlobal ( pos ) ) ;
}
2014-02-16 10:49:55 +00:00
void MainWindow : : updateToolsMenu ( )
{
2015-05-02 11:07:18 +01:00
QMenu * launchMenu = ui - > actionLaunchInstance - > menu ( ) ;
if ( launchMenu )
2014-02-16 10:49:55 +00:00
{
2015-05-02 11:07:18 +01:00
launchMenu - > clear ( ) ;
2014-02-16 10:49:55 +00:00
}
2015-05-02 11:07:18 +01:00
else
{
launchMenu = new QMenu ( this ) ;
}
2014-02-16 10:49:55 +00:00
QAction * normalLaunch = launchMenu - > addAction ( tr ( " Launch " ) ) ;
2014-06-27 23:05:00 +01:00
connect ( normalLaunch , & QAction : : triggered , [ this ] ( )
{ doLaunch ( ) ; } ) ;
2014-02-16 10:49:55 +00:00
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 ) ;
2014-06-27 23:05:00 +01:00
profilerAction - > setToolTip (
tr ( " Profiler not setup correctly. Go into settings, \" External Tools \" . " ) ) ;
2014-02-16 10:49:55 +00:00
}
else
{
2014-06-27 23:05:00 +01:00
connect ( profilerAction , & QAction : : triggered , [ this , profiler ] ( )
{ doLaunch ( true , profiler . get ( ) ) ; } ) ;
2014-02-16 10:49:55 +00:00
}
}
launchMenu - > addSeparator ( ) - > setText ( tr ( " Tools " ) ) ;
for ( auto tool : MMC - > tools ( ) . values ( ) )
{
QAction * toolAction = launchMenu - > addAction ( tool - > name ( ) ) ;
QString error ;
if ( ! tool - > check ( & error ) )
{
toolAction - > setDisabled ( true ) ;
2014-06-27 23:05:00 +01:00
toolAction - > setToolTip (
tr ( " Tool not setup correctly. Go into settings, \" External Tools \" . " ) ) ;
2014-02-16 10:49:55 +00:00
}
else
{
connect ( toolAction , & QAction : : triggered , [ this , tool ] ( )
2014-06-27 23:05:00 +01:00
{ tool - > createDetachedTool ( m_selectedInstance , this ) - > run ( ) ; } ) ;
2014-02-16 10:49:55 +00:00
}
}
ui - > actionLaunchInstance - > setMenu ( launchMenu ) ;
}
2013-11-27 22:39:49 +00:00
void MainWindow : : repopulateAccountsMenu ( )
{
accountMenu - > clear ( ) ;
std : : shared_ptr < MojangAccountList > accounts = MMC - > accounts ( ) ;
2013-11-27 23:39:36 +00:00
MojangAccountPtr active_account = accounts - > activeAccount ( ) ;
2013-11-27 22:39:49 +00:00
2013-11-27 23:39:36 +00:00
QString active_username = " " ;
2013-11-28 21:46:04 +00:00
if ( active_account ! = nullptr )
2013-11-27 22:39:49 +00:00
{
active_username = accounts - > activeAccount ( ) - > username ( ) ;
}
2013-11-28 21:46:04 +00:00
if ( accounts - > count ( ) < = 0 )
2013-11-27 22:39:49 +00:00
{
QAction * action = new QAction ( tr ( " No accounts added! " ) , this ) ;
action - > setEnabled ( false ) ;
accountMenu - > addAction ( action ) ;
accountMenu - > addSeparator ( ) ;
}
else
{
// TODO: Nicer way to iterate?
2013-11-28 21:46:04 +00:00
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-27 22:39:49 +00:00
{
MojangAccountPtr account = accounts - > at ( i ) ;
// Styling hack
QAction * section = new QAction ( account - > username ( ) , this ) ;
section - > setEnabled ( false ) ;
accountMenu - > addAction ( section ) ;
2013-12-05 01:39:52 +00:00
for ( auto profile : account - > profiles ( ) )
2013-11-27 22:39:49 +00:00
{
2013-12-05 01:39:52 +00:00
QAction * action = new QAction ( profile . name , this ) ;
2013-11-27 22:39:49 +00:00
action - > setData ( account - > username ( ) ) ;
action - > setCheckable ( true ) ;
2013-12-15 17:10:51 +00:00
if ( active_username = = account - > username ( ) )
2013-11-27 22:39:49 +00:00
{
action - > setChecked ( true ) ;
}
2013-12-05 01:39:52 +00:00
action - > setIcon ( SkinUtils : : getFaceFromCache ( profile . name ) ) ;
2013-11-27 22:39:49 +00:00
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
}
accountMenu - > addSeparator ( ) ;
}
}
2013-11-28 21:46:04 +00:00
QAction * action = new QAction ( tr ( " No Default Account " ) , this ) ;
2013-11-27 23:39:36 +00:00
action - > setCheckable ( true ) ;
2015-03-01 21:20:57 +00:00
action - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-27 23:39:36 +00:00
action - > setData ( " " ) ;
2013-12-15 17:10:51 +00:00
if ( active_username . isEmpty ( ) )
2013-11-27 23:39:36 +00:00
{
action - > setChecked ( true ) ;
}
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
accountMenu - > addSeparator ( ) ;
2013-11-27 22:39:49 +00:00
accountMenu - > addAction ( manageAccountsAction ) ;
}
/*
* Assumes the sender is a QAction
*/
void MainWindow : : changeActiveAccount ( )
{
2013-12-15 17:10:51 +00:00
QAction * sAction = ( QAction * ) sender ( ) ;
2013-11-27 22:39:49 +00:00
// Profile's associated Mojang username
2013-11-28 21:46:04 +00:00
// Will need to change when profiles are properly implemented
2013-12-15 17:10:51 +00:00
if ( sAction - > data ( ) . type ( ) ! = QVariant : : Type : : String )
return ;
2013-11-27 22:39:49 +00:00
2013-11-27 23:39:36 +00:00
QVariant data = sAction - > data ( ) ;
QString id = " " ;
2013-11-28 21:46:04 +00:00
if ( ! data . isNull ( ) )
2013-11-27 22:39:49 +00:00
{
2013-11-27 23:39:36 +00:00
id = data . toString ( ) ;
2013-11-27 22:39:49 +00:00
}
2013-11-27 23:39:36 +00:00
MMC - > accounts ( ) - > setActiveAccount ( id ) ;
2013-11-27 22:39:49 +00:00
activeAccountChanged ( ) ;
}
2013-11-27 16:56:15 +00:00
void MainWindow : : activeAccountChanged ( )
{
2013-11-27 22:39:49 +00:00
repopulateAccountsMenu ( ) ;
2013-11-27 16:56:15 +00:00
MojangAccountPtr account = MMC - > accounts ( ) - > activeAccount ( ) ;
2013-11-28 21:46:04 +00:00
if ( account ! = nullptr & & account - > username ( ) ! = " " )
2013-11-27 16:56:15 +00:00
{
2013-11-27 18:45:29 +00:00
const AccountProfile * profile = account - > currentProfile ( ) ;
2013-11-28 21:46:04 +00:00
if ( profile ! = nullptr )
2013-11-27 18:45:29 +00:00
{
2013-12-05 01:39:52 +00:00
accountMenuButton - > setIcon ( SkinUtils : : getFaceFromCache ( profile - > name ) ) ;
2013-11-27 22:39:49 +00:00
return ;
2013-11-27 18:45:29 +00:00
}
2013-11-27 16:56:15 +00:00
}
2013-11-27 22:39:49 +00:00
2013-11-28 21:46:04 +00:00
// Set the icon to the "no account" icon.
2015-03-01 21:20:57 +00:00
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
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
{
2013-10-06 00:13:40 +01:00
if ( obj = = view )
2013-08-11 23:39:19 +01:00
{
if ( ev - > type ( ) = = QEvent : : KeyPress )
{
2013-10-06 00:13:40 +01:00
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( ev ) ;
switch ( keyEvent - > key ( ) )
2013-08-11 23:39:19 +01:00
{
2013-10-06 00:13:40 +01:00
case Qt : : Key_Enter :
case Qt : : Key_Return :
on_actionLaunchInstance_triggered ( ) ;
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-11 23:39:19 +01:00
}
}
}
2013-10-06 00:13:40 +01:00
return QMainWindow : : eventFilter ( obj , ev ) ;
2013-08-11 23:39:19 +01:00
}
2014-01-02 19:25:38 +00:00
void MainWindow : : updateNewsLabel ( )
{
2015-01-27 21:31:07 +00:00
if ( m_newsChecker - > isLoadingNews ( ) )
2014-01-02 19:25:38 +00:00
{
newsLabel - > setText ( tr ( " Loading news... " ) ) ;
newsLabel - > setEnabled ( false ) ;
}
else
{
2015-01-27 21:31:07 +00:00
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-02 19:25:38 +00:00
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 16:56:14 +00:00
void MainWindow : : updateAvailable ( GoUpdate : : Status status )
2013-12-01 23:55:24 +00:00
{
UpdateDialog dlg ;
2013-12-15 17:10:51 +00:00
UpdateAction action = ( UpdateAction ) dlg . exec ( ) ;
switch ( action )
2013-12-01 23:55:24 +00:00
{
2013-12-15 17:10:51 +00:00
case UPDATE_LATER :
2015-02-02 01:14:14 +00:00
qDebug ( ) < < " Update will be installed later. " ;
2013-12-15 17:10:51 +00:00
break ;
case UPDATE_NOW :
2015-02-08 16:56:14 +00:00
downloadUpdates ( status ) ;
2013-12-15 17:10:51 +00:00
break ;
case UPDATE_ONEXIT :
2015-02-08 16:56:14 +00:00
downloadUpdates ( status , true ) ;
2013-12-15 17:10:51 +00:00
break ;
2013-12-01 23:55:24 +00:00
}
}
2014-07-13 23:57:54 +01:00
void MainWindow : : updateNotAvailable ( )
{
UpdateDialog dlg ( false ) ;
dlg . exec ( ) ;
}
2014-01-03 18:19:27 +00:00
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 ( )
{
QList < NotificationChecker : : NotificationEntry > entries =
2015-01-29 08:03:11 +00:00
m_notificationChecker - > notificationEntries ( ) ;
2014-01-03 18:19:27 +00:00
QList < int > shownNotifications =
stringToIntList ( MMC - > settings ( ) - > get ( " ShownNotifications " ) . toString ( ) ) ;
for ( auto it = entries . begin ( ) ; it ! = entries . end ( ) ; + + it )
{
NotificationChecker : : NotificationEntry entry = * it ;
2015-02-07 11:55:18 +00:00
if ( ! shownNotifications . contains ( entry . id ) )
2014-01-03 18:19:27 +00:00
{
2014-03-15 13:18:29 +00:00
NotificationDialog dialog ( entry , this ) ;
if ( dialog . exec ( ) = = NotificationDialog : : DontShowAgain )
2014-01-03 20:05:03 +00:00
{
shownNotifications . append ( entry . id ) ;
}
2014-01-03 18:19:27 +00:00
}
}
MMC - > settings ( ) - > set ( " ShownNotifications " , intListToString ( shownNotifications ) ) ;
}
2015-02-08 16:56:14 +00:00
void MainWindow : : downloadUpdates ( GoUpdate : : Status status , bool installOnExit )
2013-12-06 18:59:58 +00:00
{
2015-02-02 01:14:14 +00:00
qDebug ( ) < < " Downloading updates. " ;
2013-12-15 17:10:51 +00:00
// TODO: If the user chooses to update on exit, we should download updates in the
// background.
// Doing so is a bit complicated, because we'd have to make sure it finished downloading
// before actually exiting MultiMC.
2013-12-06 18:59:58 +00:00
ProgressDialog updateDlg ( this ) ;
2015-02-08 16:56:14 +00:00
status . rootPath = MMC - > rootPath ;
GoUpdate : : DownloadTask updateTask ( status , & updateDlg ) ;
2013-12-06 18:59:58 +00:00
// If the task succeeds, install the updates.
if ( updateDlg . exec ( & updateTask ) )
{
2014-01-05 12:17:42 +00:00
UpdateFlags baseFlags = None ;
2014-06-27 23:05:00 +01:00
if ( BuildConfig . UPDATER_DRY_RUN )
2014-04-05 21:58:47 +01:00
baseFlags | = DryRun ;
2013-12-06 18:59:58 +00:00
if ( installOnExit )
2014-01-05 12:17:42 +00:00
MMC - > installUpdates ( updateTask . updateFilesDir ( ) , baseFlags | OnExit ) ;
2013-12-06 18:59:58 +00:00
else
2014-01-05 12:17:42 +00:00
MMC - > installUpdates ( updateTask . updateFilesDir ( ) , baseFlags | RestartOnFinish ) ;
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
{
setCatBackground ( state ) ;
2013-09-07 03:00:58 +01:00
MMC - > settings ( ) - > set ( " TheCat " , state ) ;
2013-08-25 21:48:41 +01:00
}
2013-10-06 00:13:40 +01:00
void MainWindow : : setCatBackground ( bool enabled )
2013-08-25 21:48:41 +01:00
{
2013-10-06 00:13:40 +01:00
if ( enabled )
2013-08-25 21:48:41 +01:00
{
2014-02-09 21:55:44 +00:00
view - > setStyleSheet ( " GroupView "
2013-10-06 00:13:40 +01:00
" { "
" background-image: url(:/backgrounds/kitteh); "
" background-attachment: fixed; "
" background-clip: padding; "
" background-position: top right; "
" background-repeat: none; "
" background-color:palette(base); "
" } " ) ;
2013-08-25 21:48:41 +01:00
}
else
{
view - > setStyleSheet ( QString ( ) ) ;
}
}
2015-02-12 21:01:20 +00:00
static QFileInfo findRecursive ( const QString & dir , const QString & name )
{
for ( const auto info : QDir ( dir ) . entryInfoList ( QDir : : NoDotAndDotDot | QDir : : Dirs | QDir : : Files , QDir : : DirsLast ) )
{
if ( info . isFile ( ) & & info . fileName ( ) = = name )
{
return info ;
}
else if ( info . isDir ( ) )
{
const QFileInfo res = findRecursive ( info . absoluteFilePath ( ) , name ) ;
if ( res . isFile ( ) & & res . exists ( ) )
{
return res ;
}
}
}
return QFileInfo ( ) ;
}
2015-01-27 21:31:07 +00:00
// FIXME: eliminate, should not be needed
void MainWindow : : waitForMinecraftVersions ( )
2013-01-09 18:22:22 +00:00
{
2013-10-06 00:13:40 +01:00
if ( ! MMC - > minecraftlist ( ) - > isLoaded ( ) & & m_versionLoadTask & &
m_versionLoadTask - > isRunning ( ) )
2013-05-06 23:19:20 +01:00
{
QEventLoop waitLoop ;
2013-08-08 23:26:35 +01:00
waitLoop . connect ( m_versionLoadTask , SIGNAL ( failed ( QString ) ) , SLOT ( quit ( ) ) ) ;
waitLoop . connect ( m_versionLoadTask , SIGNAL ( succeeded ( ) ) , SLOT ( quit ( ) ) ) ;
2013-05-06 23:19:20 +01:00
waitLoop . exec ( ) ;
}
2015-01-27 21:31:07 +00:00
}
2013-10-06 00:13:40 +01:00
2015-01-27 21:31:07 +00:00
void MainWindow : : instanceFromZipPack ( QString instName , QString instGroup , QString instIcon , QUrl url )
{
2014-03-30 19:11:05 +01:00
InstancePtr newInstance ;
2013-10-06 00:13:40 +01:00
2013-11-03 20:28:04 +00:00
QString instancesDir = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2015-01-27 21:31:07 +00:00
QString instDirName = DirNameFromString ( instName , instancesDir ) ;
2013-11-03 20:28:04 +00:00
QString instDir = PathCombine ( instancesDir , instDirName ) ;
2015-02-01 02:08:25 +00:00
2015-01-27 21:31:07 +00:00
QString archivePath ;
if ( url . isLocalFile ( ) )
2013-04-22 23:15:18 +01:00
{
2015-01-27 21:31:07 +00:00
archivePath = url . toLocalFile ( ) ;
}
else
{
const QString path = url . host ( ) + ' / ' + url . path ( ) ;
2015-01-31 15:59:03 +00:00
auto entry = ENV . metacache ( ) - > resolveEntry ( " general " , path ) ;
2015-01-27 21:31:07 +00:00
CacheDownloadPtr dl = CacheDownload : : make ( url , entry ) ;
NetJob job ( tr ( " Modpack download " ) ) ;
job . addNetAction ( dl ) ;
2013-10-06 00:13:40 +01:00
2015-01-27 21:31:07 +00:00
// FIXME: possibly causes endless loop problems
ProgressDialog dlDialog ( this ) ;
if ( dlDialog . exec ( & job ) ! = QDialog : : Accepted )
2015-02-12 21:01:20 +00:00
{
return ;
}
2015-01-27 21:31:07 +00:00
archivePath = entry - > getFullPath ( ) ;
}
2015-02-12 21:01:20 +00:00
2015-01-27 21:31:07 +00:00
QTemporaryDir extractTmpDir ;
QDir extractDir ( extractTmpDir . path ( ) ) ;
2015-02-02 01:14:14 +00:00
qDebug ( ) < < " Attempting to create instance from " < < archivePath ;
2015-04-12 21:50:52 +01:00
if ( MMCZip : : extractDir ( archivePath , extractDir . absolutePath ( ) ) . isEmpty ( ) )
2015-01-27 21:31:07 +00:00
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) ,
tr ( " Failed to extract modpack " ) , QMessageBox : : Warning ) - > show ( ) ;
return ;
2013-04-22 23:15:18 +01:00
}
2015-01-27 21:31:07 +00:00
const QFileInfo instanceCfgFile = findRecursive ( extractDir . absolutePath ( ) , " instance.cfg " ) ;
if ( ! instanceCfgFile . isFile ( ) | | ! instanceCfgFile . exists ( ) )
2015-02-12 21:01:20 +00:00
{
2015-01-27 21:31:07 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error " ) , tr ( " Archive does not contain instance.cfg " ) ) - > show ( ) ;
return ;
}
if ( ! copyPath ( instanceCfgFile . absoluteDir ( ) . absolutePath ( ) , instDir ) )
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) , tr ( " Unable to copy instance " ) ) - > show ( ) ;
return ;
}
2015-02-12 21:01:20 +00:00
2015-02-01 02:08:25 +00:00
auto error = MMC - > instances ( ) - > loadInstance ( newInstance , instDir ) ;
2015-01-27 21:31:07 +00:00
QString errorMsg = tr ( " Failed to load instance %1: " ) . arg ( instDirName ) ;
switch ( error )
{
2015-02-01 02:08:25 +00:00
case InstanceList : : UnknownLoadError :
2015-01-27 21:31:07 +00:00
errorMsg + = tr ( " Unkown error " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
2015-02-01 02:08:25 +00:00
case InstanceList : : NotAnInstance :
2015-01-27 21:31:07 +00:00
errorMsg + = tr ( " Not an instance " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
}
2015-02-12 21:01:20 +00:00
2015-01-27 21:31:07 +00:00
newInstance - > setName ( instName ) ;
newInstance - > setIconKey ( instIcon ) ;
newInstance - > setGroupInitial ( instGroup ) ;
MMC - > instances ( ) - > add ( InstancePtr ( newInstance ) ) ;
MMC - > instances ( ) - > saveGroupList ( ) ;
finalizeInstance ( newInstance ) ;
}
void MainWindow : : instanceFromVersion ( QString instName , QString instGroup , QString instIcon , BaseVersionPtr version )
{
InstancePtr newInstance ;
QString instancesDir = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
QString instDirName = DirNameFromString ( instName , instancesDir ) ;
QString instDir = PathCombine ( instancesDir , instDirName ) ;
2015-02-01 02:08:25 +00:00
auto error = MMC - > instances ( ) - > createInstance ( newInstance , version , instDir ) ;
2015-01-27 21:31:07 +00:00
QString errorMsg = tr ( " Failed to create instance %1: " ) . arg ( instDirName ) ;
switch ( error )
{
2015-02-01 02:08:25 +00:00
case InstanceList : : NoCreateError :
break ;
case InstanceList : : InstExists :
2015-01-27 21:31:07 +00:00
{
errorMsg + = tr ( " An instance with the given directory name already exists. " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
}
2015-02-01 02:08:25 +00:00
case InstanceList : : CantCreateDir :
2015-01-27 21:31:07 +00:00
{
errorMsg + = tr ( " Failed to create the instance directory. " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
2013-10-29 12:40:09 +00:00
}
2013-12-10 00:13:35 +00:00
2015-01-27 21:31:07 +00:00
default :
{
errorMsg + = tr ( " Unknown instance loader error %1 " ) . arg ( error ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
}
}
newInstance - > setName ( instName ) ;
newInstance - > setIconKey ( instIcon ) ;
newInstance - > setGroupInitial ( instGroup ) ;
2015-02-12 21:01:20 +00:00
MMC - > instances ( ) - > add ( InstancePtr ( newInstance ) ) ;
2015-01-27 21:31:07 +00:00
MMC - > instances ( ) - > saveGroupList ( ) ;
finalizeInstance ( newInstance ) ;
}
2015-02-12 21:01:20 +00:00
2015-01-27 21:31:07 +00:00
void MainWindow : : finalizeInstance ( InstancePtr inst )
{
2013-12-15 17:10:51 +00:00
if ( MMC - > accounts ( ) - > anyAccountIsValid ( ) )
2013-12-10 00:13:35 +00:00
{
ProgressDialog loadDialog ( this ) ;
2015-01-27 21:31:07 +00:00
auto update = inst - > doUpdate ( ) ;
2013-12-15 17:10:51 +00:00
connect ( update . get ( ) , & Task : : failed , [ this ] ( QString reason )
{
2013-12-10 00:13:35 +00:00
QString error = QString ( " Instance load failed: %1 " ) . arg ( reason ) ;
2013-12-15 17:10:51 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error " ) , error , QMessageBox : : Warning )
- > show ( ) ;
2013-12-10 00:13:35 +00:00
} ) ;
loadDialog . exec ( update . get ( ) ) ;
}
2013-12-15 19:42:17 +00:00
else
{
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-01-09 18:22:22 +00:00
}
2015-01-27 21:31:07 +00:00
void MainWindow : : on_actionAddInstance_triggered ( )
{
waitForMinecraftVersions ( ) ;
NewInstanceDialog newInstDlg ( this ) ;
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 ( ) ) ;
}
}
2013-11-03 20:28:04 +00:00
void MainWindow : : on_actionCopyInstance_triggered ( )
{
if ( ! m_selectedInstance )
return ;
CopyInstanceDialog copyInstDlg ( m_selectedInstance , this ) ;
if ( ! copyInstDlg . exec ( ) )
return ;
QString instancesDir = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
QString instDirName = DirNameFromString ( copyInstDlg . instName ( ) , instancesDir ) ;
QString instDir = PathCombine ( instancesDir , instDirName ) ;
2014-03-30 19:11:05 +01:00
InstancePtr newInstance ;
2015-02-01 02:08:25 +00:00
auto error = MMC - > instances ( ) - > copyInstance ( newInstance , m_selectedInstance , instDir ) ;
2013-11-03 20:28:04 +00:00
2014-03-23 18:07:13 +00:00
QString errorMsg = tr ( " Failed to create instance %1: " ) . arg ( instDirName ) ;
2013-11-03 20:28:04 +00:00
switch ( error )
{
2015-02-01 02:08:25 +00:00
case InstanceList : : NoCreateError :
2013-11-03 20:28:04 +00:00
newInstance - > setName ( copyInstDlg . instName ( ) ) ;
newInstance - > setIconKey ( copyInstDlg . iconKey ( ) ) ;
2014-03-30 19:11:05 +01:00
MMC - > instances ( ) - > add ( newInstance ) ;
2015-04-19 20:02:34 +01:00
newInstance - > setGroupPost ( copyInstDlg . instGroup ( ) ) ;
2013-11-03 20:28:04 +00:00
return ;
2015-02-01 02:08:25 +00:00
case InstanceList : : InstExists :
2013-11-03 20:28:04 +00:00
{
2014-03-23 18:07:13 +00:00
errorMsg + = tr ( " An instance with the given directory name already exists. " ) ;
2013-11-03 20:28:04 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
2015-02-01 02:08:25 +00:00
case InstanceList : : CantCreateDir :
2013-11-03 20:28:04 +00:00
{
2014-03-23 18:07:13 +00:00
errorMsg + = tr ( " Failed to create the instance directory. " ) ;
2013-11-03 20:28:04 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
default :
{
2014-03-23 18:07:13 +00:00
errorMsg + = tr ( " Unknown instance loader error %1 " ) . arg ( error ) ;
2013-11-03 20:28:04 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
}
}
2013-08-10 17:34:08 +01:00
void MainWindow : : on_actionChangeInstIcon_triggered ( )
2013-03-19 05:24:34 +00:00
{
2013-10-06 00:13:40 +01:00
if ( ! m_selectedInstance )
2013-08-10 17:34:08 +01:00
return ;
2013-10-06 00:13:40 +01:00
2013-08-10 17:34:08 +01:00
IconPickerDialog dlg ( this ) ;
2013-08-25 00:32:42 +01:00
dlg . exec ( m_selectedInstance - > iconKey ( ) ) ;
2013-10-06 00:13:40 +01:00
if ( dlg . result ( ) = = QDialog : : Accepted )
2013-03-19 05:24:34 +00:00
{
2013-08-25 00:32:42 +01:00
m_selectedInstance - > setIconKey ( dlg . selectedIconKey ) ;
2015-02-01 10:44:47 +00:00
auto ico = ENV . icons ( ) - > getBigIcon ( dlg . selectedIconKey ) ;
2013-08-25 00:32:42 +01:00
ui - > actionChangeInstIcon - > setIcon ( ico ) ;
2013-03-19 05:24:34 +00:00
}
}
2013-12-31 00:24:28 +00:00
void MainWindow : : iconUpdated ( QString icon )
{
2014-01-27 02:00:49 +00:00
if ( icon = = m_currentInstIcon )
2013-12-31 00:24:28 +00:00
{
2015-02-01 10:44:47 +00:00
ui - > actionChangeInstIcon - > setIcon ( ENV . icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-03-19 05:24:34 +00:00
}
}
2013-12-31 00:24:28 +00:00
void MainWindow : : updateInstanceToolIcon ( QString new_icon )
{
m_currentInstIcon = new_icon ;
2015-02-01 10:44:47 +00:00
ui - > actionChangeInstIcon - > setIcon ( ENV . icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-12-31 00:24:28 +00:00
}
2014-01-06 09:01:40 +00:00
void MainWindow : : setSelectedInstanceById ( const QString & id )
{
2014-05-11 18:32:17 +01:00
if ( id . isNull ( ) )
return ;
const QModelIndex index = MMC - > instances ( ) - > getInstanceIndexById ( id ) ;
if ( index . isValid ( ) )
2014-01-06 09:01:40 +00:00
{
2014-05-11 18:32:17 +01:00
QModelIndex selectionIndex = proxymodel - > mapFromSource ( index ) ;
view - > selectionModel ( ) - > setCurrentIndex ( selectionIndex , QItemSelectionModel : : ClearAndSelect ) ;
2014-01-06 09:01:40 +00:00
}
}
2013-08-10 17:34:08 +01:00
void MainWindow : : on_actionChangeInstGroup_triggered ( )
{
2013-10-06 00:13:40 +01:00
if ( ! m_selectedInstance )
2013-08-10 17:34:08 +01:00
return ;
2013-10-06 00:13:40 +01:00
2013-08-10 17:34:08 +01:00
bool ok = false ;
2013-10-06 00:13:40 +01:00
QString name ( m_selectedInstance - > group ( ) ) ;
2013-12-15 17:10:51 +00:00
auto groups = MMC - > instances ( ) - > getGroups ( ) ;
2013-12-15 19:42:17 +00:00
groups . insert ( 0 , " " ) ;
2013-12-15 17:10:51 +00:00
groups . sort ( Qt : : CaseInsensitive ) ;
int foo = groups . indexOf ( name ) ;
name = QInputDialog : : getItem ( this , tr ( " Group name " ) , tr ( " Enter a new group name. " ) , groups ,
foo , true , & ok ) ;
name = name . simplified ( ) ;
2013-10-06 00:13:40 +01:00
if ( ok )
2013-08-25 21:48:41 +01:00
m_selectedInstance - > setGroupPost ( name ) ;
2013-08-10 17:34:08 +01:00
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionViewInstanceFolder_triggered ( )
{
2013-10-06 00:13:40 +01:00
QString str = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
openDirInDefaultProgram ( str ) ;
2013-01-09 18:22:22 +00:00
}
void MainWindow : : on_actionRefresh_triggered ( )
{
2013-09-07 03:00:58 +01:00
MMC - > instances ( ) - > loadList ( ) ;
2013-01-09 18:22:22 +00:00
}
void MainWindow : : on_actionViewCentralModsFolder_triggered ( )
{
2013-10-06 00:13:40 +01:00
openDirInDefaultProgram ( MMC - > settings ( ) - > get ( " CentralModsDir " ) . toString ( ) , true ) ;
2013-01-09 18:22:22 +00:00
}
2013-08-25 00:32:42 +01:00
void MainWindow : : on_actionConfig_Folder_triggered ( )
{
2013-10-06 00:13:40 +01:00
if ( m_selectedInstance )
2013-08-25 00:32:42 +01:00
{
QString str = m_selectedInstance - > instanceConfigFolder ( ) ;
2013-10-06 00:13:40 +01:00
openDirInDefaultProgram ( QDir ( str ) . absolutePath ( ) ) ;
2013-08-25 00:32:42 +01:00
}
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionCheckUpdate_triggered ( )
{
2013-12-04 18:34:12 +00:00
auto updater = MMC - > updateChecker ( ) ;
2015-01-31 15:59:03 +00:00
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , true ) ;
2013-01-09 18:22:22 +00:00
}
2014-06-18 00:15:01 +01:00
template < typename T >
void ShowPageDialog ( T raw_provider , QWidget * parent , QString open_page = QString ( ) )
2014-05-11 19:06:06 +01:00
{
2014-06-18 00:15:01 +01:00
auto provider = std : : dynamic_pointer_cast < BasePageProvider > ( raw_provider ) ;
2014-06-09 00:29:18 +01:00
if ( ! provider )
return ;
2014-06-18 00:15:01 +01:00
PageDialog dlg ( provider , open_page , parent ) ;
2014-06-09 00:29:18 +01:00
dlg . exec ( ) ;
2014-05-11 19:06:06 +01:00
}
2015-02-07 09:43:09 +00:00
void ShowInstancePageDialog ( InstancePtr instance , QWidget * parent , QString open_page = QString ( ) )
{
auto provider = std : : make_shared < InstancePageProvider > ( instance ) ;
ShowPageDialog ( provider , parent , open_page ) ;
}
2014-07-15 23:13:40 +01:00
void MainWindow : : on_actionSettings_triggered ( )
{
ShowPageDialog ( m_globalSettingsProvider , this , " global-settings " ) ;
// FIXME: quick HACK to make this work. improve, optimize.
proxymodel - > invalidate ( ) ;
proxymodel - > sort ( 0 ) ;
updateToolsMenu ( ) ;
2015-01-28 19:56:23 +00:00
update ( ) ;
2014-07-15 23:13:40 +01:00
}
2014-06-18 00:15:01 +01:00
void MainWindow : : on_actionInstanceSettings_triggered ( )
{
2015-02-07 09:43:09 +00:00
ShowInstancePageDialog ( m_selectedInstance , this , " settings " ) ;
2014-06-18 00:15:01 +01:00
}
void MainWindow : : on_actionEditInstNotes_triggered ( )
{
2015-02-07 09:43:09 +00:00
ShowInstancePageDialog ( m_selectedInstance , this , " notes " ) ;
2014-06-18 00:15:01 +01:00
}
void MainWindow : : on_actionEditInstance_triggered ( )
{
2015-02-07 09:43:09 +00:00
ShowInstancePageDialog ( m_selectedInstance , this ) ;
2014-06-18 00:15:01 +01:00
}
2014-06-28 16:07:08 +01:00
void MainWindow : : on_actionScreenshots_triggered ( )
{
2015-02-07 09:43:09 +00:00
ShowInstancePageDialog ( m_selectedInstance , this , " screenshots " ) ;
2014-06-28 16:07:08 +01:00
}
2013-11-20 18:20:35 +00:00
void MainWindow : : on_actionManageAccounts_triggered ( )
{
2014-07-15 23:13:40 +01:00
ShowPageDialog ( m_globalSettingsProvider , this , " accounts " ) ;
2013-11-20 18:20:35 +00:00
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionReportBug_triggered ( )
{
2014-01-09 04:50:08 +00:00
openWebPage ( QUrl ( " https://github.com/MultiMC/MultiMC5/issues " ) ) ;
2013-01-09 18:22:22 +00:00
}
2014-04-11 02:59:30 +01:00
void MainWindow : : on_actionPatreon_triggered ( )
{
openWebPage ( QUrl ( " http://www.patreon.com/multimc " ) ) ;
}
2014-01-02 19:25:38 +00:00
void MainWindow : : on_actionMoreNews_triggered ( )
2013-01-09 18:22:22 +00:00
{
2013-10-15 00:19:22 +01:00
openWebPage ( QUrl ( " http://multimc.org/posts.html " ) ) ;
2013-01-09 18:22:22 +00:00
}
2014-01-02 20:37:56 +00:00
void MainWindow : : newsButtonClicked ( )
{
2015-01-27 21:31:07 +00:00
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-02 20:37:56 +00:00
if ( entries . count ( ) > 0 )
openWebPage ( QUrl ( entries [ 0 ] - > link ) ) ;
else
openWebPage ( QUrl ( " http://multimc.org/posts.html " ) ) ;
}
2013-01-09 18:22:22 +00:00
void MainWindow : : on_actionAbout_triggered ( )
{
2013-10-06 00:13:40 +01:00
AboutDialog dialog ( this ) ;
2013-03-11 21:19:17 +00:00
dialog . exec ( ) ;
2013-01-09 18:22:22 +00:00
}
2013-01-30 05:52:37 +00:00
2013-10-06 00:13:40 +01:00
void MainWindow : : on_mainToolBar_visibilityChanged ( bool )
2013-01-30 05:52:37 +00:00
{
// Don't allow hiding the main toolbar.
// This is the only way I could find to prevent it... :/
2013-10-06 00:13:40 +01:00
ui - > mainToolBar - > setVisible ( true ) ;
2013-01-30 05:52:37 +00:00
}
2013-06-23 21:10:32 +01:00
void MainWindow : : on_actionDeleteInstance_triggered ( )
{
2013-08-25 00:32:42 +01:00
if ( m_selectedInstance )
2013-07-04 23:39:41 +01:00
{
2013-11-03 20:28:04 +00:00
auto response = CustomMessageBox : : selectable (
2015-05-01 20:27:16 +01:00
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 ( ) ;
2013-07-04 23:39:41 +01:00
if ( response = = QMessageBox : : Yes )
{
2013-08-26 05:30:11 +01:00
m_selectedInstance - > nuke ( ) ;
2013-07-04 23:39:41 +01:00
}
}
2013-06-23 21:10:32 +01:00
}
2015-02-12 21:01:20 +00:00
void MainWindow : : on_actionExportInstance_triggered ( )
{
if ( m_selectedInstance )
{
2015-04-19 03:19:29 +01:00
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 ( )
{
2013-10-06 00:13:40 +01:00
if ( m_selectedInstance )
2013-06-23 21:10:32 +01:00
{
bool ok = false ;
2013-10-06 00:13:40 +01:00
QString name ( m_selectedInstance - > name ( ) ) ;
name =
QInputDialog : : getText ( this , tr ( " Instance name " ) , tr ( " Enter a new instance name. " ) ,
QLineEdit : : Normal , name , & ok ) ;
2013-07-07 03:11:24 +01:00
if ( name . length ( ) > 0 )
{
2013-10-06 00:13:40 +01:00
if ( ok & & name . length ( ) )
2013-08-28 20:52:19 +01:00
{
2013-08-25 00:32:42 +01:00
m_selectedInstance - > setName ( name ) ;
2013-08-28 20:52:19 +01:00
renameButton - > setText ( name ) ;
}
2013-07-07 03:11:24 +01:00
}
2013-06-23 21:10:32 +01:00
}
}
void MainWindow : : on_actionViewSelectedInstFolder_triggered ( )
{
2013-10-06 00:13:40 +01:00
if ( m_selectedInstance )
2013-06-23 21:10:32 +01:00
{
2013-08-25 00:32:42 +01:00
QString str = m_selectedInstance - > instanceRoot ( ) ;
2013-10-06 00:13:40 +01:00
openDirInDefaultProgram ( 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
{
// Save the window state and geometry.
2013-11-03 00:45:25 +00:00
MMC - > settings ( ) - > set ( " MainWindowState " , saveState ( ) . toBase64 ( ) ) ;
MMC - > settings ( ) - > set ( " MainWindowGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
2013-10-06 00:13:40 +01:00
QMainWindow : : closeEvent ( event ) ;
2013-10-26 08:38:21 +01:00
QApplication : : exit ( ) ;
2013-01-30 05:52:37 +00:00
}
2013-10-06 02:07:57 +01:00
/*
2013-10-06 00:13:40 +01:00
void MainWindow : : on_instanceView_customContextMenuRequested ( const QPoint & pos )
2013-01-31 20:31:16 +00:00
{
2013-10-06 00:13:40 +01:00
QMenu * instContextMenu = new QMenu ( " Instance " , this ) ;
2013-03-11 21:19:17 +00:00
2013-01-31 20:31:16 +00:00
// Add the actions from the toolbar to the context menu.
2013-10-06 00:13:40 +01:00
instContextMenu - > addActions ( ui - > instanceToolBar - > actions ( ) ) ;
2013-03-11 21:19:17 +00:00
2013-10-06 00:13:40 +01:00
instContextMenu - > exec ( view - > mapToGlobal ( pos ) ) ;
2013-01-31 20:31:16 +00:00
}
2013-10-06 02:07:57 +01:00
*/
2013-10-21 21:25:50 +01:00
void MainWindow : : instanceActivated ( QModelIndex index )
{
if ( ! index . isValid ( ) )
return ;
2014-06-27 23:05:00 +01:00
QString id = index . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
2014-03-30 19:11:05 +01:00
InstancePtr inst = MMC - > instances ( ) - > getInstanceById ( id ) ;
2014-06-27 23:05:00 +01:00
if ( ! inst )
return ;
2013-10-21 21:25:50 +01:00
2015-05-04 00:20:48 +01:00
JavaCommon : : checkJVMArgs ( inst - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
2013-11-03 15:20:26 +00:00
2013-11-29 02:45:52 +00:00
doLaunch ( ) ;
2013-10-21 21:25:50 +01:00
}
2013-02-05 22:34:20 +00:00
void MainWindow : : on_actionLaunchInstance_triggered ( )
{
2013-10-06 00:13:40 +01:00
if ( m_selectedInstance )
2013-03-11 21:19:17 +00:00
{
2015-05-04 00:20:48 +01:00
JavaCommon : : checkJVMArgs ( m_selectedInstance - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
2013-11-29 02:45:52 +00:00
doLaunch ( ) ;
2013-03-11 21:19:17 +00:00
}
2013-02-05 22:34:20 +00:00
}
2014-01-27 02:00:49 +00:00
void MainWindow : : on_actionLaunchInstanceOffline_triggered ( )
{
if ( m_selectedInstance )
{
2015-05-04 00:20:48 +01:00
JavaCommon : : checkJVMArgs ( m_selectedInstance - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
2014-01-27 02:00:49 +00:00
doLaunch ( false ) ;
}
}
2014-02-15 21:26:44 +00:00
void MainWindow : : doLaunch ( bool online , BaseProfilerFactory * profiler )
2013-10-21 21:25:50 +01:00
{
2013-10-21 22:08:09 +01:00
if ( ! m_selectedInstance )
return ;
2013-11-21 00:31:15 +00:00
// Find an account to use.
std : : shared_ptr < MojangAccountList > accounts = MMC - > accounts ( ) ;
2013-11-22 18:47:39 +00:00
MojangAccountPtr account = accounts - > activeAccount ( ) ;
2013-11-21 00:31:15 +00:00
if ( accounts - > count ( ) < = 0 )
2013-10-21 21:25:50 +01:00
{
2013-11-21 00:31:15 +00:00
// Tell the user they need to log in at least one account in order to play.
2013-12-15 17:10:51 +00:00
auto reply = CustomMessageBox : : selectable (
this , tr ( " No Accounts " ) ,
tr ( " In order to play Minecraft, you must have at least one Mojang or Minecraft "
" account logged in to MultiMC. "
" Would you like to open the account manager to add an account now? " ) ,
2013-11-22 16:12:16 +00:00
QMessageBox : : Information , QMessageBox : : Yes | QMessageBox : : No ) - > exec ( ) ;
2013-10-21 21:25:50 +01:00
2013-11-22 16:12:16 +00:00
if ( reply = = QMessageBox : : Yes )
2013-10-21 21:25:50 +01:00
{
2013-11-22 16:12:16 +00:00
// Open the account manager.
on_actionManageAccounts_triggered ( ) ;
2013-10-21 21:25:50 +01:00
}
}
2013-11-22 18:47:39 +00:00
else if ( account . get ( ) = = nullptr )
2013-10-21 21:25:50 +01:00
{
2013-11-27 22:14:18 +00:00
// If no default account is set, ask the user which one to use.
AccountSelectDialog selectDialog ( tr ( " Which account would you like to use? " ) ,
2013-12-15 17:10:51 +00:00
AccountSelectDialog : : GlobalDefaultCheckbox , this ) ;
2013-10-06 00:13:40 +01:00
2013-11-27 22:14:18 +00:00
selectDialog . exec ( ) ;
// Launch the instance with the selected account.
account = selectDialog . selectedAccount ( ) ;
// If the user said to use the account as default, do that.
if ( selectDialog . useAsGlobalDefault ( ) & & account . get ( ) ! = nullptr )
accounts - > setActiveAccount ( account - > username ( ) ) ;
2013-02-05 22:34:20 +00:00
}
2013-11-27 22:14:18 +00:00
2013-12-08 16:34:45 +00:00
// if no account is selected, we bail
if ( ! account . get ( ) )
return ;
2013-12-01 01:00:42 +00:00
2014-01-27 02:00:49 +00:00
// we try empty password first :)
QString password ;
// we loop until the user succeeds in logging in or gives up
bool tryagain = true ;
// the failure. the default failure.
2013-12-24 22:38:37 +00:00
QString failReason = tr ( " Your account is currently not logged in. Please enter "
" your password to log in again. " ) ;
2014-01-27 02:00:49 +00:00
while ( tryagain )
2013-11-29 02:45:52 +00:00
{
2014-01-27 02:00:49 +00:00
AuthSessionPtr session ( new AuthSession ( ) ) ;
session - > wants_online = online ;
auto task = account - > login ( session , password ) ;
if ( task )
2013-12-24 22:38:37 +00:00
{
2014-01-27 02:00:49 +00:00
// We'll need to validate the access token to make sure the account
// is still logged in.
ProgressDialog progDialog ( this ) ;
if ( online )
progDialog . setSkipButton ( true , tr ( " Play Offline " ) ) ;
progDialog . exec ( task . get ( ) ) ;
2013-12-24 22:38:37 +00:00
if ( ! task - > successful ( ) )
{
failReason = task - > failReason ( ) ;
}
}
2014-01-27 02:00:49 +00:00
switch ( session - > status )
2013-12-24 22:38:37 +00:00
{
2014-01-27 02:00:49 +00:00
case AuthSession : : Undetermined :
{
2015-02-02 01:14:14 +00:00
qCritical ( ) < < " Received undetermined session status during login. Bye. " ;
2014-01-27 02:00:49 +00:00
tryagain = false ;
break ;
2013-12-24 22:38:37 +00:00
}
2014-01-27 02:00:49 +00:00
case AuthSession : : RequiresPassword :
2013-11-29 02:45:52 +00:00
{
2014-01-27 02:00:49 +00:00
EditAccountDialog passDialog ( failReason , this , EditAccountDialog : : PasswordField ) ;
if ( passDialog . exec ( ) = = QDialog : : Accepted )
{
password = passDialog . password ( ) ;
}
else
{
tryagain = false ;
}
break ;
}
case AuthSession : : PlayableOffline :
{
// we ask the user for a player name
bool ok = false ;
QString usedname = session - > player_name ;
QString name = QInputDialog : : getText ( this , tr ( " Player name " ) ,
tr ( " Choose your offline mode player name. " ) ,
QLineEdit : : Normal , session - > player_name , & ok ) ;
if ( ! ok )
{
tryagain = false ;
break ;
}
if ( name . length ( ) )
{
usedname = name ;
}
session - > MakeOffline ( usedname ) ;
// offline flavored game from here :3
}
case AuthSession : : PlayableOnline :
{
// update first if the server actually responded
if ( session - > auth_server_online )
{
2014-02-15 21:26:44 +00:00
updateInstance ( m_selectedInstance , session , profiler ) ;
2014-01-27 02:00:49 +00:00
}
else
{
2014-02-15 21:26:44 +00:00
launchInstance ( m_selectedInstance , session , profiler ) ;
2014-01-27 02:00:49 +00:00
}
tryagain = false ;
}
2013-11-29 02:45:52 +00:00
}
}
2013-02-05 22:34:20 +00:00
}
2014-06-27 23:05:00 +01:00
void MainWindow : : updateInstance ( InstancePtr instance , AuthSessionPtr session ,
BaseProfilerFactory * profiler )
2013-02-05 22:34:20 +00:00
{
2014-01-27 02:00:49 +00:00
auto updateTask = instance - > doUpdate ( ) ;
2013-10-06 00:13:40 +01:00
if ( ! updateTask )
2013-03-24 14:36:00 +00:00
{
2014-02-15 21:26:44 +00:00
launchInstance ( instance , session , profiler ) ;
2013-12-15 17:10:51 +00:00
return ;
2013-03-24 14:36:00 +00:00
}
2013-12-15 17:10:51 +00:00
ProgressDialog tDialog ( this ) ;
2014-02-15 21:26:44 +00:00
connect ( updateTask . get ( ) , & Task : : succeeded , [ this , instance , session , profiler ]
{ launchInstance ( instance , session , profiler ) ; } ) ;
2013-12-15 17:10:51 +00:00
connect ( updateTask . get ( ) , SIGNAL ( failed ( QString ) ) , SLOT ( onGameUpdateError ( QString ) ) ) ;
tDialog . exec ( updateTask . get ( ) ) ;
2013-02-05 22:34:20 +00:00
}
2013-02-21 01:10:09 +00:00
2014-06-27 23:05:00 +01:00
void MainWindow : : launchInstance ( InstancePtr instance , AuthSessionPtr session ,
BaseProfilerFactory * profiler )
2013-05-08 18:56:43 +01:00
{
Q_ASSERT_X ( instance ! = NULL , " launchInstance " , " instance is NULL " ) ;
2014-01-27 02:00:49 +00:00
Q_ASSERT_X ( session . get ( ) ! = nullptr , " launchInstance " , " session is NULL " ) ;
2013-10-06 00:13:40 +01:00
2014-05-18 18:07:01 +01:00
QString launchScript ;
2015-04-15 02:12:57 +01:00
if ( ! instance - > reload ( ) )
{
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Couldn't load the instance profile. " ) ) ;
return ;
}
2015-01-27 21:31:07 +00:00
BaseProcess * proc = instance - > prepareForLaunch ( session ) ;
if ( ! proc )
2013-08-03 14:57:33 +01:00
return ;
2013-10-06 00:13:40 +01:00
2013-11-23 00:41:28 +00:00
this - > hide ( ) ;
2013-10-06 00:13:40 +01:00
2013-09-06 21:40:50 +01:00
console = new ConsoleWindow ( proc ) ;
2013-11-23 00:41:28 +00:00
connect ( console , SIGNAL ( isClosing ( ) ) , this , SLOT ( instanceEnded ( ) ) ) ;
2013-10-22 18:25:10 +01:00
2015-02-08 16:56:14 +00:00
proc - > setHeader ( " MultiMC version: " + BuildConfig . printableVersionString ( ) + " \n \n " ) ;
2014-02-15 23:10:45 +00:00
proc - > arm ( ) ;
2014-02-15 13:19:35 +00:00
2015-04-06 19:52:59 +01:00
if ( ! profiler )
2014-02-15 13:19:35 +00:00
{
2015-04-06 19:52:59 +01:00
proc - > launch ( ) ;
return ;
2014-02-15 13:19:35 +00:00
}
2015-04-06 19:52:59 +01:00
QString error ;
if ( ! profiler - > check ( & error ) )
2014-02-15 21:26:44 +00:00
{
2015-04-06 19:52:59 +01:00
proc - > abort ( ) ;
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Couldn't start profiler: %1 " ) . arg ( error ) ) ;
return ;
2014-02-15 21:26:44 +00:00
}
2015-04-06 19:52:59 +01:00
BaseProfiler * profilerInstance = profiler - > createProfiler ( instance , this ) ;
connect ( profilerInstance , & BaseProfiler : : readyToLaunch ,
[ this , proc ] ( const QString & message )
{
QMessageBox msg ;
msg . setText ( tr ( " The game launch is delayed until you press the "
" button. This is the right time to setup the profiler, as the "
" profiler server is running now. \n \n %1 " ) . arg ( message ) ) ;
msg . setWindowTitle ( tr ( " Waiting " ) ) ;
msg . setIcon ( QMessageBox : : Information ) ;
msg . addButton ( tr ( " Launch " ) , QMessageBox : : AcceptRole ) ;
msg . setModal ( true ) ;
msg . exec ( ) ;
proc - > launch ( ) ;
} ) ;
connect ( profilerInstance , & BaseProfiler : : abortLaunch ,
[ this , proc ] ( const QString & message )
{
QMessageBox msg ;
msg . setText ( tr ( " Couldn't start the profiler: %1 " ) . arg ( message ) ) ;
msg . setWindowTitle ( tr ( " Error " ) ) ;
msg . setIcon ( QMessageBox : : Critical ) ;
msg . addButton ( QMessageBox : : Ok ) ;
msg . setModal ( true ) ;
msg . exec ( ) ;
proc - > abort ( ) ;
} ) ;
profilerInstance - > beginProfiling ( proc ) ;
2013-03-11 21:19:17 +00:00
}
2013-08-03 14:57:33 +01:00
void MainWindow : : onGameUpdateError ( QString error )
2013-05-08 18:56:43 +01:00
{
2013-11-03 20:28:04 +00:00
CustomMessageBox : : selectable ( this , tr ( " Error updating instance " ) , error ,
QMessageBox : : Warning ) - > show ( ) ;
2013-05-08 18:56:43 +01:00
}
2013-08-08 23:26:35 +01:00
void MainWindow : : taskStart ( )
2013-05-06 23:19:20 +01:00
{
// Nothing to do here yet.
}
2013-08-08 23:26:35 +01:00
void MainWindow : : taskEnd ( )
2013-05-06 23:19:20 +01:00
{
2013-08-08 23:26:35 +01:00
QObject * sender = QObject : : sender ( ) ;
if ( sender = = m_versionLoadTask )
2013-05-06 23:19:20 +01:00
m_versionLoadTask = NULL ;
2013-10-06 00:13:40 +01:00
2013-08-08 23:26:35 +01:00
sender - > deleteLater ( ) ;
2013-05-06 23:19:20 +01:00
}
void MainWindow : : startTask ( Task * task )
{
2013-08-08 23:26:35 +01:00
connect ( task , SIGNAL ( started ( ) ) , SLOT ( taskStart ( ) ) ) ;
connect ( task , SIGNAL ( succeeded ( ) ) , SLOT ( taskEnd ( ) ) ) ;
connect ( task , SIGNAL ( failed ( QString ) ) , SLOT ( taskEnd ( ) ) ) ;
2013-09-17 23:00:35 +01:00
task - > start ( ) ;
2013-05-06 23:19:20 +01:00
}
2013-02-12 23:35:35 +00:00
// BrowserDialog
2013-10-06 00:13:40 +01:00
void MainWindow : : openWebPage ( QUrl url )
2013-02-12 23:35:35 +00:00
{
2013-08-20 01:29:36 +01:00
QDesktopServices : : openUrl ( url ) ;
2013-02-12 23:35:35 +00:00
}
2013-02-21 19:40:32 +00: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
{
2014-05-11 18:32:17 +01:00
if ( ! current . isValid ( ) )
{
MMC - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
selectionBad ( ) ;
return ;
}
QString id = current . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
m_selectedInstance = MMC - > instances ( ) - > getInstanceById ( id ) ;
2014-03-30 19:11:05 +01:00
if ( m_selectedInstance )
2013-08-25 00:32:42 +01:00
{
2014-02-17 19:31:50 +00:00
ui - > instanceToolBar - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2013-08-25 21:48:41 +01:00
renameButton - > setText ( m_selectedInstance - > name ( ) ) ;
2013-10-26 02:28:50 +01:00
m_statusLeft - > setText ( m_selectedInstance - > getStatusbarDescription ( ) ) ;
2013-12-31 00:24:28 +00:00
updateInstanceToolIcon ( m_selectedInstance - > iconKey ( ) ) ;
2013-11-27 14:00:44 +00:00
2014-02-16 10:49:55 +00:00
updateToolsMenu ( ) ;
2014-02-15 21:26:44 +00:00
2013-11-27 14:00:44 +00:00
MMC - > settings ( ) - > set ( " SelectedInstance " , m_selectedInstance - > id ( ) ) ;
2013-08-25 00:32:42 +01:00
}
else
{
2014-05-11 18:32:17 +01:00
MMC - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
selectionBad ( ) ;
return ;
2013-08-25 00:32:42 +01:00
}
2013-08-26 05:30:11 +01:00
}
2015-04-07 00:21:03 +01:00
void MainWindow : : instanceDataChanged ( const QModelIndex & topLeft , const QModelIndex & bottomRight )
{
auto current = view - > selectionModel ( ) - > currentIndex ( ) ;
QItemSelection test ( topLeft , bottomRight ) ;
if ( test . contains ( current ) )
{
instanceChanged ( current , current ) ;
}
}
2013-08-26 05:30:11 +01:00
void MainWindow : : selectionBad ( )
{
2014-01-06 09:01:40 +00:00
// start by reseting everything...
2013-08-26 05:30:11 +01:00
m_selectedInstance = nullptr ;
2013-12-31 00:24:28 +00:00
2013-08-26 05:30:11 +01:00
statusBar ( ) - > clearMessage ( ) ;
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-09-08 17:13:09 +01:00
renameButton - > setText ( tr ( " Rename Instance " ) ) ;
2013-12-31 00:24:28 +00:00
updateInstanceToolIcon ( " infinity " ) ;
2014-01-06 09:01:40 +00:00
// ...and then see if we can enable the previously selected instance
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-07-14 21:01:30 +01:00
}
2013-08-25 21:48:41 +01:00
2013-11-23 00:41:28 +00:00
void MainWindow : : instanceEnded ( )
2013-09-06 22:52:17 +01:00
{
this - > show ( ) ;
}
2013-10-14 02:59:21 +01:00
void MainWindow : : checkSetDefaultJava ( )
{
2014-06-27 23:05:00 +01:00
const QString javaHack = " IntelHack " ;
2013-10-20 21:28:31 +01:00
bool askForJava = false ;
2014-06-27 23:05:00 +01:00
do
2013-10-14 02:59:21 +01:00
{
2013-10-20 21:28:31 +01:00
QString currentHostName = QHostInfo : : localHostName ( ) ;
QString oldHostName = MMC - > settings ( ) - > get ( " LastHostname " ) . toString ( ) ;
if ( currentHostName ! = oldHostName )
{
MMC - > settings ( ) - > set ( " LastHostname " , currentHostName ) ;
askForJava = true ;
2014-06-27 23:05:00 +01:00
break ;
2013-10-20 21:28:31 +01:00
}
QString currentJavaPath = MMC - > settings ( ) - > get ( " JavaPath " ) . toString ( ) ;
if ( currentJavaPath . isEmpty ( ) )
{
askForJava = true ;
2014-06-27 23:05:00 +01:00
break ;
2013-10-20 21:28:31 +01:00
}
2014-11-16 11:56:33 +00:00
if ( ! currentJavaPath . contains ( ' / ' ) )
{
currentJavaPath = QStandardPaths : : findExecutable ( currentJavaPath ) ;
}
QFile currentJavaBin ( currentJavaPath ) ;
if ( ! currentJavaBin . exists ( ) )
{
askForJava = true ;
break ;
}
2014-06-27 23:05:00 +01:00
# if defined Q_OS_WIN32
QString currentHack = MMC - > settings ( ) - > get ( " JavaDetectionHack " ) . toString ( ) ;
if ( currentHack ! = javaHack )
{
CustomMessageBox : : selectable (
this , tr ( " Java detection forced " ) ,
tr ( " Because of graphics performance issues caused by Intel drivers on Windows, "
2014-06-27 23:21:36 +01:00
" MultiMC java detection was forced. Please select a Java "
" version.<br/><br/>If you have custom java versions set for your instances, "
" make sure you use the 'javaw.exe' executable. " ) ,
2014-06-27 23:05:00 +01:00
QMessageBox : : Warning ) - > exec ( ) ;
askForJava = true ;
break ;
}
# endif
} while ( 0 ) ;
2013-10-20 21:28:31 +01:00
if ( askForJava )
{
2015-02-02 01:14:14 +00:00
qDebug ( ) < < " Java path needs resetting, showing Java selection dialog... " ;
2013-10-14 02:59:21 +01:00
JavaVersionPtr java ;
2013-10-20 21:28:31 +01:00
VersionSelectDialog vselect ( MMC - > javalist ( ) . get ( ) , tr ( " Select a Java version " ) , this ,
false ) ;
2013-10-14 02:59:21 +01:00
vselect . setResizeOn ( 2 ) ;
vselect . exec ( ) ;
2013-10-24 00:47:54 +01:00
if ( vselect . selectedVersion ( ) )
java = std : : dynamic_pointer_cast < JavaVersion > ( vselect . selectedVersion ( ) ) ;
else
2013-10-14 02:59:21 +01:00
{
2013-11-03 20:28:04 +00:00
CustomMessageBox : : selectable (
this , tr ( " Invalid version selected " ) ,
tr ( " You didn't select a valid Java version, so MultiMC will "
" select the default. "
" You can change this in the settings dialog. " ) ,
QMessageBox : : Warning ) - > show ( ) ;
2013-10-29 12:40:09 +00:00
2013-10-14 02:59:21 +01:00
JavaUtils ju ;
java = ju . GetDefaultJava ( ) ;
}
2013-10-26 18:55:48 +01:00
if ( java )
2014-06-27 23:05:00 +01:00
{
2013-10-24 00:47:54 +01:00
MMC - > settings ( ) - > set ( " JavaPath " , java - > path ) ;
2014-06-27 23:05:00 +01:00
MMC - > settings ( ) - > set ( " JavaDetectionHack " , javaHack ) ;
}
2013-10-24 00:47:54 +01:00
else
MMC - > settings ( ) - > set ( " JavaPath " , QString ( " java " ) ) ;
2013-10-14 02:59:21 +01:00
}
}
2014-07-27 14:50:03 +01:00
void MainWindow : : checkInstancePathForProblems ( )
{
QString instanceFolder = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
if ( checkProblemticPathJava ( QDir ( instanceFolder ) ) )
{
2015-04-25 23:01:41 +01:00
QMessageBox warning ( this ) ;
2014-07-27 14:50:03 +01:00
warning . setText ( tr (
" Your instance folder contains \' ! \' and this is known to cause Java problems! " ) ) ;
warning . setInformativeText (
2015-04-25 23:01:41 +01:00
tr ( " You have now two options: <br/> "
" - change the instance folder in the settings <br/> "
2014-07-27 14:50:03 +01:00
" - move this installation of MultiMC5 to a different folder " ) ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
2015-04-25 23:01:41 +01:00
auto tempFolderText = tr ( " This is a problem: <br/> "
" - 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 " ) ;
QString pathfoldername = QDir ( instanceFolder ) . absolutePath ( ) ;
if ( pathfoldername . contains ( " Rar$ " , Qt : : CaseInsensitive ) )
{
QMessageBox warning ( this ) ;
warning . setText ( tr (
" Your instance folder contains \' Rar$ \' - that means you haven't extracted the MultiMC zip! " ) ) ;
warning . setInformativeText ( tempFolderText ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
else if ( pathfoldername . contains ( QDir : : tempPath ( ) ) )
{
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
}