2015-02-03 03:55:30 +05:30
/* Copyright 2013-2015 MultiMC Contributors
2013-02-20 04:37:52 +05:30
*
* Authors : Andrew Okin
* Peterix
* Orochimarufan < orochimarufan . x3 @ gmail . com >
2013-01-09 23:52:22 +05:30
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
2013-03-12 02:49:17 +05:30
*
2013-01-09 23:52:22 +05:30
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
2013-11-04 07:23:05 +05:30
# include "MultiMC.h"
2014-04-06 07:29:37 +05:30
# include "BuildConfig.h"
2013-01-09 23:52:22 +05:30
2013-11-04 07:23:05 +05:30
# include "MainWindow.h"
2015-03-02 02:50:57 +05:30
# include <QtCore/QVariant>
# 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 23:52:22 +05:30
2013-02-01 02:01:16 +05:30
# include <QMenu>
2013-02-02 00:37:36 +05:30
# include <QMessageBox>
2013-02-13 08:33:15 +05:30
# include <QInputDialog>
2013-09-07 07:30:58 +05:30
2013-01-09 23:52:22 +05:30
# include <QDesktopServices>
2014-02-04 06:10:51 +05:30
# include <QKeyEvent>
2013-01-09 23:52:22 +05:30
# include <QUrl>
2013-02-20 04:37:52 +05:30
# include <QDir>
2013-02-21 06:40:09 +05:30
# include <QFileInfo>
2013-08-25 05:02:42 +05:30
# include <QLabel>
# include <QToolButton>
2013-11-28 04:09:49 +05:30
# include <QWidgetAction>
2014-02-15 18:49:35 +05:30
# include <QProgressDialog>
2014-04-17 18:19:03 +05:30
# include <QShortcut>
2015-02-13 02:31:20 +05:30
# include <QFileDialog>
# include <JlCompress.h>
2013-01-09 23:52:22 +05:30
2013-02-21 06:40:09 +05:30
# include "osutils.h"
2013-02-22 01:10:32 +05:30
# include "userutils.h"
# include "pathutils.h"
2013-02-02 00:37:36 +05:30
2014-02-04 06:10:51 +05:30
# include "gui/groupview/GroupView.h"
# include "gui/groupview/InstanceDelegate.h"
2015-02-01 16:14:47 +05:30
# include "gui/InstanceProxyModel.h"
2013-08-17 17:10:51 +05:30
2013-11-04 07:23:05 +05:30
# include "gui/Platform.h"
# include "gui/widgets/LabeledToolButton.h"
2014-05-16 02:02:54 +05:30
# include "widgets/ServerStatus.h"
2013-11-04 07:23:05 +05:30
# include "gui/dialogs/NewInstanceDialog.h"
# include "gui/dialogs/ProgressDialog.h"
# include "gui/dialogs/AboutDialog.h"
# include "gui/dialogs/VersionSelectDialog.h"
# include "gui/dialogs/CustomMessageBox.h"
# include "gui/dialogs/IconPickerDialog.h"
# include "gui/dialogs/CopyInstanceDialog.h"
2013-11-28 03:44:18 +05:30
# include "gui/dialogs/AccountSelectDialog.h"
2013-12-02 05:25:24 +05:30
# include "gui/dialogs/UpdateDialog.h"
2013-11-29 09:10:40 +05:30
# include "gui/dialogs/EditAccountDialog.h"
2014-03-15 18:48:29 +05:30
# include "gui/dialogs/NotificationDialog.h"
2013-11-04 07:23:05 +05:30
2014-07-21 03:17:46 +05:30
# include "gui/pages/global/MultiMCPage.h"
2014-07-16 03:43:40 +05:30
# include "gui/pages/global/ExternalToolsPage.h"
# include "gui/pages/global/AccountListPage.h"
2014-09-06 21:46:56 +05:30
# include "gui/pages/global/ProxyPage.h"
# include "gui/pages/global/JavaPage.h"
# include "gui/pages/global/MinecraftPage.h"
2014-07-16 03:43:40 +05:30
2013-11-04 07:23:05 +05:30
# include "gui/ConsoleWindow.h"
2014-06-02 04:19:53 +05:30
# include "pagedialog/PageDialog.h"
2013-02-02 00:37:36 +05:30
2014-05-09 00:50:10 +05:30
# include "logic/InstanceList.h"
# include "logic/minecraft/MinecraftVersionList.h"
2015-02-05 01:40:10 +05:30
# include "logic/minecraft/LwjglVersionList.h"
2013-12-31 05:54:28 +05:30
# include "logic/icons/IconList.h"
2014-05-09 00:50:10 +05:30
# include "logic/java/JavaVersionList.h"
2013-09-07 07:30:58 +05:30
2013-12-01 06:30:42 +05:30
# include "logic/auth/flows/AuthenticateTask.h"
# include "logic/auth/flows/RefreshTask.h"
2013-11-29 08:15:52 +05:30
2013-12-06 01:22:55 +05:30
# include "logic/updater/DownloadUpdateTask.h"
2013-12-16 02:18:58 +05:30
# include "logic/news/NewsChecker.h"
2013-12-13 20:28:11 +05:30
# include "logic/net/URLConstants.h"
2014-02-24 02:44:24 +05:30
# include "logic/net/NetJob.h"
2015-01-31 21:29:03 +05:30
# include "logic/Env.h"
2013-12-13 20:28:11 +05:30
2013-08-17 17:10:51 +05:30
# include "logic/BaseInstance.h"
2015-01-28 03:01:07 +05:30
# include "logic/BaseProcess.h"
2014-05-09 00:50:10 +05:30
# include "logic/java/JavaUtils.h"
2015-02-01 23:24:58 +05:30
# include "gui/NagUtils.h"
2015-02-07 15:13:09 +05:30
# include "InstancePageProvider.h"
2015-02-05 01:40:10 +05:30
# include "logic/minecraft/SkinUtils.h"
2013-09-07 07:30:58 +05:30
2015-02-05 01:40:10 +05:30
//#include "logic/minecraft/LegacyInstance.h"
2013-03-12 02:49:17 +05:30
2013-12-05 00:04:12 +05:30
# include <logic/updater/UpdateChecker.h>
2015-02-05 01:40:10 +05:30
# include <logic/notifications/NotificationChecker.h>
2014-01-01 23:51:58 +05:30
# include <logic/tasks/ThreadTask.h>
2015-02-13 02:31:20 +05:30
# include "logic/net/CacheDownload.h"
2013-12-08 08:28:44 +05:30
2014-02-16 17:22:35 +05:30
# include "logic/tools/BaseProfiler.h"
2014-02-15 18:49:35 +05:30
2013-10-06 04:43:40 +05:30
MainWindow : : MainWindow ( QWidget * parent ) : QMainWindow ( parent ) , ui ( new Ui : : MainWindow )
2013-01-09 23:52:22 +05:30
{
2013-10-21 01:58:31 +05:30
MultiMCPlatform : : fixWM_CLASS ( this ) ;
2013-10-06 04:43:40 +05:30
ui - > setupUi ( this ) ;
2014-01-09 05:32:15 +05:30
2015-01-28 03:01:07 +05:30
// initialize the news checker
m_newsChecker . reset ( new NewsChecker ( BuildConfig . NEWS_RSS_URL ) ) ;
2014-06-28 03:35:00 +05:30
QString winTitle =
QString ( " MultiMC 5 - Version %1 " ) . arg ( BuildConfig . printableVersionString ( ) ) ;
2014-04-06 02:28:47 +05:30
if ( ! BuildConfig . BUILD_PLATFORM . isEmpty ( ) )
winTitle + = " on " + BuildConfig . BUILD_PLATFORM ;
2014-01-09 05:32:15 +05:30
setWindowTitle ( winTitle ) ;
2013-10-06 04:43:40 +05:30
2013-08-27 20:20:42 +05:30
// OSX magic.
2014-10-19 21:49:37 +05:30
setUnifiedTitleAndToolBarOnMac ( true ) ;
2013-10-06 04:43:40 +05:30
2014-04-17 18:19:03 +05:30
// Global shortcuts
{
2014-06-28 03:35:00 +05:30
// FIXME: This is kinda weird. and bad. We need some kind of managed shutdown.
2014-04-17 18:19:03 +05:30
auto q = new QShortcut ( QKeySequence : : Quit , this ) ;
2014-04-22 01:18:58 +05:30
connect ( q , SIGNAL ( activated ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
2014-04-17 18:19:03 +05:30
}
2013-08-26 10:39:54 +05:30
// The instance action toolbar customizations
{
2013-11-04 01:58:04 +05:30
// disabled until we have an instance selected
2013-08-26 10:39:54 +05:30
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-11-04 01:58:04 +05:30
2013-08-26 10:39:54 +05:30
// the rename label is inside the rename tool button
renameButton = new LabeledToolButton ( ) ;
renameButton - > setText ( " Instance Name " ) ;
2013-08-27 09:09:49 +05:30
renameButton - > setToolTip ( ui - > actionRenameInstance - > toolTip ( ) ) ;
2013-08-26 10:39:54 +05:30
connect ( renameButton , SIGNAL ( clicked ( bool ) ) , SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
ui - > instanceToolBar - > insertWidget ( ui - > actionLaunchInstance , renameButton ) ;
ui - > instanceToolBar - > insertSeparator ( ui - > actionLaunchInstance ) ;
2013-10-06 04:43:40 +05:30
renameButton - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
2013-08-26 10:39:54 +05:30
}
2013-10-06 04:43:40 +05:30
2014-01-03 00:55:38 +05:30
// Add the news label to the news toolbar.
{
newsLabel = new QToolButton ( ) ;
2015-03-02 02:50:57 +05:30
newsLabel - > setIcon ( MMC - > getThemedIcon ( " news " ) ) ;
2014-01-03 00:55:38 +05:30
newsLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
newsLabel - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
ui - > newsToolBar - > insertWidget ( ui - > actionMoreNews , newsLabel ) ;
2014-01-27 07:30:49 +05:30
QObject : : connect ( newsLabel , & QAbstractButton : : clicked , this ,
& MainWindow : : newsButtonClicked ) ;
2015-01-28 03:01:07 +05:30
QObject : : connect ( m_newsChecker . get ( ) , & NewsChecker : : newsLoaded , this ,
2014-01-27 07:30:49 +05:30
& MainWindow : : updateNewsLabel ) ;
2014-01-03 00:55:38 +05:30
updateNewsLabel ( ) ;
}
2013-08-26 10:39:54 +05:30
// Create the instance list widget
{
2014-02-04 06:10:51 +05:30
view = new GroupView ( ui - > centralWidget ) ;
2013-10-06 04:43:40 +05:30
view - > setSelectionMode ( QAbstractItemView : : SingleSelection ) ;
2014-02-04 06:10:51 +05:30
// 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 10:39:54 +05:30
auto delegate = new ListViewDelegate ( ) ;
view - > setItemDelegate ( delegate ) ;
2014-02-04 06:10:51 +05:30
// view->setSpacing(10);
// view->setUniformItemWidths(true);
2013-10-06 04:43:40 +05:30
2013-08-27 20:20:42 +05:30
// do not show ugly blue border on the mac
2013-08-27 19:50:32 +05:30
view - > setAttribute ( Qt : : WA_MacShowFocusRect , false ) ;
2013-10-06 04:43:40 +05:30
2013-08-26 10:39:54 +05:30
view - > installEventFilter ( this ) ;
2013-03-12 02:49:17 +05:30
2013-10-06 04:43:40 +05:30
proxymodel = new InstanceProxyModel ( this ) ;
2013-11-12 13:53:39 +05:30
// proxymodel->setSortRole(KCategorizedSortFilterProxyModel::CategorySortRole);
// proxymodel->setFilterRole(KCategorizedSortFilterProxyModel::CategorySortRole);
2013-10-06 04:43:40 +05:30
// 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 ) ;
2014-01-05 05:36:59 +05:30
view - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
2014-01-27 07:30:49 +05:30
connect ( view , SIGNAL ( customContextMenuRequested ( const QPoint & ) ) , this ,
SLOT ( showInstanceContextMenu ( const QPoint & ) ) ) ;
2014-01-05 05:36:59 +05:30
2013-10-06 04:43:40 +05:30
ui - > horizontalLayout - > addWidget ( view ) ;
2013-08-26 10:39:54 +05:30
}
// The cat background
{
2013-09-07 07:30:58 +05:30
bool cat_enable = MMC - > settings ( ) - > get ( " TheCat " ) . toBool ( ) ;
2013-08-26 10:39:54 +05:30
ui - > actionCAT - > setChecked ( cat_enable ) ;
connect ( ui - > actionCAT , SIGNAL ( toggled ( bool ) ) , SLOT ( onCatToggled ( bool ) ) ) ;
setCatBackground ( cat_enable ) ;
}
// start instance when double-clicked
2013-10-06 04:43:40 +05:30
connect ( view , SIGNAL ( doubleClicked ( const QModelIndex & ) ) , this ,
SLOT ( instanceActivated ( const QModelIndex & ) ) ) ;
2013-08-26 10:39:54 +05:30
// track the selection -- update the instance toolbar
2013-10-06 04:43:40 +05:30
connect ( view - > selectionModel ( ) ,
SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ) , this ,
SLOT ( instanceChanged ( const QModelIndex & , const QModelIndex & ) ) ) ;
2013-12-31 05:54:28 +05:30
// track icon changes and update the toolbar!
2015-02-01 16:14:47 +05:30
connect ( ENV . icons ( ) . get ( ) , SIGNAL ( iconUpdated ( QString ) ) , SLOT ( iconUpdated ( QString ) ) ) ;
2013-12-31 05:54:28 +05:30
2013-08-26 10:39:54 +05:30
// model reset -> selection is invalid. All the instance pointers are wrong.
// FIXME: stop using POINTERS everywhere
2013-10-06 04:43:40 +05:30
connect ( MMC - > instances ( ) . get ( ) , SIGNAL ( dataIsInvalid ( ) ) , SLOT ( selectionBad ( ) ) ) ;
2014-01-03 01:17:34 +05:30
m_statusLeft = new QLabel ( tr ( " No instance selected " ) , this ) ;
2014-05-16 02:02:54 +05:30
m_statusRight = new ServerStatus ( this ) ;
2013-10-26 06:58:50 +05:30
statusBar ( ) - > addPermanentWidget ( m_statusLeft , 1 ) ;
2014-01-12 23:58:42 +05:30
statusBar ( ) - > addPermanentWidget ( m_statusRight , 0 ) ;
2013-10-26 06:58:50 +05:30
2013-11-27 22:26:15 +05:30
// Add "manage accounts" button, right align
2013-12-15 22:40:51 +05:30
QWidget * spacer = new QWidget ( ) ;
2013-11-27 22:26:15 +05:30
spacer - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Expanding ) ;
ui - > mainToolBar - > addWidget ( spacer ) ;
2013-11-28 04:09:49 +05:30
accountMenu = new QMenu ( this ) ;
2013-11-29 03:16:04 +05:30
manageAccountsAction = new QAction ( tr ( " Manage Accounts " ) , this ) ;
2013-11-28 04:09:49 +05:30
manageAccountsAction - > setCheckable ( false ) ;
2013-12-15 22:40:51 +05:30
connect ( manageAccountsAction , SIGNAL ( triggered ( bool ) ) , this ,
SLOT ( on_actionManageAccounts_triggered ( ) ) ) ;
2013-11-28 04:09:49 +05:30
repopulateAccountsMenu ( ) ;
accountMenuButton = new QToolButton ( this ) ;
accountMenuButton - > setText ( tr ( " Accounts " ) ) ;
accountMenuButton - > setMenu ( accountMenu ) ;
accountMenuButton - > setPopupMode ( QToolButton : : InstantPopup ) ;
accountMenuButton - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
2015-03-02 02:50:57 +05:30
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-28 04:09:49 +05:30
QWidgetAction * accountMenuButtonAction = new QWidgetAction ( this ) ;
accountMenuButtonAction - > setDefaultWidget ( accountMenuButton ) ;
ui - > mainToolBar - > addAction ( accountMenuButtonAction ) ;
2013-11-27 22:26:15 +05:30
2014-07-16 03:43:40 +05:30
// set up global pages dialog
{
m_globalSettingsProvider = std : : make_shared < GenericPageProvider > ( tr ( " Settings " ) ) ;
2014-07-21 03:17:46 +05:30
m_globalSettingsProvider - > addPage < MultiMCPage > ( ) ;
m_globalSettingsProvider - > addPage < MinecraftPage > ( ) ;
m_globalSettingsProvider - > addPage < JavaPage > ( ) ;
m_globalSettingsProvider - > addPage < ProxyPage > ( ) ;
2014-07-16 03:43:40 +05:30
m_globalSettingsProvider - > addPage < ExternalToolsPage > ( ) ;
2014-07-21 03:17:46 +05:30
m_globalSettingsProvider - > addPage < AccountListPage > ( ) ;
2014-07-16 03:43:40 +05:30
}
2013-11-29 03:16:04 +05:30
// Update the menu when the active account changes.
2013-12-15 22:40:51 +05:30
// Shouldn't have to use lambdas here like this, but if I don't, the compiler throws a fit.
// Template hell sucks...
connect ( MMC - > accounts ( ) . get ( ) , & MojangAccountList : : activeAccountChanged , [ this ]
{ activeAccountChanged ( ) ; } ) ;
connect ( MMC - > accounts ( ) . get ( ) , & MojangAccountList : : listChanged , [ this ]
{ repopulateAccountsMenu ( ) ; } ) ;
2013-11-29 03:16:04 +05:30
2014-01-11 05:52:08 +05:30
// Show initial account
activeAccountChanged ( ) ;
auto accounts = MMC - > accounts ( ) ;
2013-11-28 00:15:29 +05:30
2014-06-28 03:35:00 +05:30
QList < CacheDownloadPtr > skin_dls ;
2013-12-15 22:40:51 +05:30
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-28 04:17:15 +05:30
{
2014-01-11 05:52:08 +05:30
auto account = accounts - > at ( i ) ;
2013-12-15 22:40:51 +05:30
if ( account ! = nullptr )
2013-11-28 00:15:29 +05:30
{
2014-01-11 05:52:08 +05:30
for ( auto profile : account - > profiles ( ) )
2013-11-28 04:17:15 +05:30
{
2015-01-31 21:29:03 +05:30
auto meta = Env : : getInstance ( ) . metacache ( ) - > resolveEntry ( " skins " , profile . name + " .png " ) ;
2013-11-28 04:17:15 +05:30
auto action = CacheDownload : : make (
2013-12-15 22:40:51 +05:30
QUrl ( " http:// " + URLConstants : : SKINS_BASE + profile . name + " .png " ) , meta ) ;
2014-06-28 03:35:00 +05:30
skin_dls . append ( action ) ;
2013-11-28 04:17:15 +05:30
meta - > stale = true ;
}
}
2013-11-28 00:15:29 +05:30
}
2014-06-28 03:35:00 +05:30
if ( ! skin_dls . isEmpty ( ) )
{
auto job = new NetJob ( " Startup player skins download " ) ;
connect ( job , SIGNAL ( succeeded ( ) ) , SLOT ( skinJobFinished ( ) ) ) ;
connect ( job , SIGNAL ( failed ( ) ) , SLOT ( skinJobFinished ( ) ) ) ;
for ( auto action : skin_dls )
2015-01-12 02:34:31 +05:30
{
2014-06-28 03:35:00 +05:30
job - > addNetAction ( action ) ;
2015-01-12 02:34:31 +05:30
}
2014-06-28 03:35:00 +05:30
skin_download_job . reset ( job ) ;
job - > start ( ) ;
}
2013-11-27 22:26:15 +05:30
2013-08-26 10:39:54 +05:30
// 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 22:23:22 +05:30
{
2013-09-16 04:24:39 +05:30
if ( ! MMC - > minecraftlist ( ) - > isLoaded ( ) )
2013-08-26 10:39:54 +05:30
{
2013-09-16 04:24:39 +05:30
m_versionLoadTask = MMC - > minecraftlist ( ) - > getLoadTask ( ) ;
2013-08-26 10:39:54 +05:30
startTask ( m_versionLoadTask ) ;
}
2013-09-16 04:24:39 +05:30
if ( ! MMC - > lwjgllist ( ) - > isLoaded ( ) )
2013-08-26 10:39:54 +05:30
{
2013-09-16 04:24:39 +05:30
MMC - > lwjgllist ( ) - > loadList ( ) ;
2013-08-26 10:39:54 +05:30
}
2013-11-17 16:38:07 +05:30
2015-01-28 03:01:07 +05:30
m_newsChecker - > reloadNews ( ) ;
2014-01-03 00:55:38 +05:30
updateNewsLabel ( ) ;
2013-12-16 02:18:58 +05:30
2013-12-02 05:25:24 +05:30
// set up the updater object.
2013-12-05 00:04:12 +05:30
auto updater = MMC - > updateChecker ( ) ;
2013-12-25 07:16:06 +05:30
connect ( updater . get ( ) , & UpdateChecker : : updateAvailable , this ,
& MainWindow : : updateAvailable ) ;
2014-07-14 04:27:54 +05:30
connect ( updater . get ( ) , & UpdateChecker : : noUpdateFound , this ,
& MainWindow : : updateNotAvailable ) ;
2013-12-02 05:25:24 +05:30
// if automatic update checks are allowed, start one.
2013-12-15 22:40:51 +05:30
if ( MMC - > settings ( ) - > get ( " AutoUpdate " ) . toBool ( ) )
2014-07-14 04:41:52 +05:30
{
auto updater = MMC - > updateChecker ( ) ;
2015-01-31 21:29:03 +05:30
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , false ) ;
2014-07-14 04:41:52 +05:30
}
2015-02-07 17:25:18 +05:30
auto checker = new NotificationChecker ( ) ;
checker - > setNotificationsUrl ( QUrl ( BuildConfig . NOTIFICATION_URL ) ) ;
checker - > setApplicationChannel ( BuildConfig . VERSION_CHANNEL ) ;
checker - > setApplicationPlatform ( BuildConfig . BUILD_PLATFORM ) ;
checker - > setApplicationFullVersion ( BuildConfig . FULL_VERSION_STR ) ;
m_notificationChecker . reset ( checker ) ;
2015-01-29 13:33:11 +05:30
connect ( m_notificationChecker . get ( ) ,
2014-01-27 07:30:49 +05:30
& NotificationChecker : : notificationCheckFinished , this ,
& MainWindow : : notificationsChanged ) ;
2015-02-07 17:25:18 +05:30
checker - > checkForNotifications ( ) ;
2013-05-17 22:23:22 +05:30
}
2013-11-27 19:30:44 +05:30
2014-01-06 14:31:40 +05:30
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-11-27 19:30:44 +05:30
// removing this looks stupid
view - > setFocus ( ) ;
2013-01-09 23:52:22 +05:30
}
MainWindow : : ~ MainWindow ( )
{
delete ui ;
2013-03-12 02:49:17 +05:30
delete proxymodel ;
}
2014-03-30 23:41:05 +05:30
void MainWindow : : skinJobFinished ( )
{
2014-06-28 03:35:00 +05:30
activeAccountChanged ( ) ;
skin_download_job . reset ( ) ;
2014-03-30 23:41:05 +05:30
}
2014-01-27 07:30:49 +05:30
void MainWindow : : showInstanceContextMenu ( const QPoint & pos )
2014-01-05 05:36:59 +05:30
{
2014-04-08 03:46:49 +05:30
QList < QAction * > actions ;
QAction * actionSep = new QAction ( " " , this ) ;
actionSep - > setSeparator ( true ) ;
bool onInstance = view - > indexAt ( pos ) . isValid ( ) ;
if ( onInstance )
2014-01-05 05:36:59 +05:30
{
2014-04-08 03:46:49 +05:30
actions = ui - > instanceToolBar - > actions ( ) ;
QAction * actionVoid = new QAction ( m_selectedInstance - > name ( ) , this ) ;
actionVoid - > setEnabled ( false ) ;
QAction * actionRename = new QAction ( tr ( " Rename " ) , this ) ;
actionRename - > setToolTip ( ui - > actionRenameInstance - > toolTip ( ) ) ;
2014-01-05 05:36:59 +05:30
2014-04-08 03:46:49 +05:30
QAction * actionCopyInstance = new QAction ( tr ( " Copy instance " ) , this ) ;
actionCopyInstance - > setToolTip ( ui - > actionCopyInstance - > toolTip ( ) ) ;
2014-01-05 05:36:59 +05:30
2014-06-28 03:35:00 +05:30
connect ( actionRename , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionRenameInstance_triggered ( ) ) ) ;
connect ( actionCopyInstance , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionCopyInstance_triggered ( ) ) ) ;
2014-01-05 05:36:59 +05:30
2014-04-08 03:46:49 +05:30
actions . replace ( 1 , actionRename ) ;
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCopyInstance ) ;
}
else
{
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 05:36:59 +05:30
2014-06-28 03:35:00 +05:30
connect ( actionCreateInstance , SIGNAL ( triggered ( bool ) ) ,
SLOT ( on_actionAddInstance_triggered ( ) ) ) ;
2014-04-08 03:46:49 +05:30
actions . prepend ( actionSep ) ;
actions . prepend ( actionVoid ) ;
actions . append ( actionCreateInstance ) ;
}
2014-01-05 05:36:59 +05:30
QMenu myMenu ;
myMenu . addActions ( actions ) ;
2014-06-28 03:35:00 +05:30
if ( onInstance )
2014-04-08 03:46:49 +05:30
myMenu . setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2014-01-05 05:36:59 +05:30
myMenu . exec ( view - > mapToGlobal ( pos ) ) ;
}
2014-02-16 16:19:55 +05:30
void MainWindow : : updateToolsMenu ( )
{
if ( ui - > actionLaunchInstance - > menu ( ) )
{
ui - > actionLaunchInstance - > menu ( ) - > deleteLater ( ) ;
}
QMenu * launchMenu = new QMenu ( this ) ;
QAction * normalLaunch = launchMenu - > addAction ( tr ( " Launch " ) ) ;
2014-06-28 03:35:00 +05:30
connect ( normalLaunch , & QAction : : triggered , [ this ] ( )
{ doLaunch ( ) ; } ) ;
2014-02-16 16:19:55 +05:30
launchMenu - > addSeparator ( ) - > setText ( tr ( " Profilers " ) ) ;
for ( auto profiler : MMC - > profilers ( ) . values ( ) )
{
QAction * profilerAction = launchMenu - > addAction ( profiler - > name ( ) ) ;
QString error ;
if ( ! profiler - > check ( & error ) )
{
profilerAction - > setDisabled ( true ) ;
2014-06-28 03:35:00 +05:30
profilerAction - > setToolTip (
tr ( " Profiler not setup correctly. Go into settings, \" External Tools \" . " ) ) ;
2014-02-16 16:19:55 +05:30
}
else
{
2014-06-28 03:35:00 +05:30
connect ( profilerAction , & QAction : : triggered , [ this , profiler ] ( )
{ doLaunch ( true , profiler . get ( ) ) ; } ) ;
2014-02-16 16:19:55 +05:30
}
}
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-28 03:35:00 +05:30
toolAction - > setToolTip (
tr ( " Tool not setup correctly. Go into settings, \" External Tools \" . " ) ) ;
2014-02-16 16:19:55 +05:30
}
else
{
connect ( toolAction , & QAction : : triggered , [ this , tool ] ( )
2014-06-28 03:35:00 +05:30
{ tool - > createDetachedTool ( m_selectedInstance , this ) - > run ( ) ; } ) ;
2014-02-16 16:19:55 +05:30
}
}
ui - > actionLaunchInstance - > setMenu ( launchMenu ) ;
}
2013-11-28 04:09:49 +05:30
void MainWindow : : repopulateAccountsMenu ( )
{
accountMenu - > clear ( ) ;
std : : shared_ptr < MojangAccountList > accounts = MMC - > accounts ( ) ;
2013-11-28 05:09:36 +05:30
MojangAccountPtr active_account = accounts - > activeAccount ( ) ;
2013-11-28 04:09:49 +05:30
2013-11-28 05:09:36 +05:30
QString active_username = " " ;
2013-11-29 03:16:04 +05:30
if ( active_account ! = nullptr )
2013-11-28 04:09:49 +05:30
{
active_username = accounts - > activeAccount ( ) - > username ( ) ;
}
2013-11-29 03:16:04 +05:30
if ( accounts - > count ( ) < = 0 )
2013-11-28 04:09:49 +05:30
{
QAction * action = new QAction ( tr ( " No accounts added! " ) , this ) ;
action - > setEnabled ( false ) ;
accountMenu - > addAction ( action ) ;
accountMenu - > addSeparator ( ) ;
}
else
{
// TODO: Nicer way to iterate?
2013-11-29 03:16:04 +05:30
for ( int i = 0 ; i < accounts - > count ( ) ; i + + )
2013-11-28 04:09:49 +05:30
{
MojangAccountPtr account = accounts - > at ( i ) ;
// Styling hack
QAction * section = new QAction ( account - > username ( ) , this ) ;
section - > setEnabled ( false ) ;
accountMenu - > addAction ( section ) ;
2013-12-05 07:09:52 +05:30
for ( auto profile : account - > profiles ( ) )
2013-11-28 04:09:49 +05:30
{
2013-12-05 07:09:52 +05:30
QAction * action = new QAction ( profile . name , this ) ;
2013-11-28 04:09:49 +05:30
action - > setData ( account - > username ( ) ) ;
action - > setCheckable ( true ) ;
2013-12-15 22:40:51 +05:30
if ( active_username = = account - > username ( ) )
2013-11-28 04:09:49 +05:30
{
action - > setChecked ( true ) ;
}
2013-12-05 07:09:52 +05:30
action - > setIcon ( SkinUtils : : getFaceFromCache ( profile . name ) ) ;
2013-11-28 04:09:49 +05:30
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
}
accountMenu - > addSeparator ( ) ;
}
}
2013-11-29 03:16:04 +05:30
QAction * action = new QAction ( tr ( " No Default Account " ) , this ) ;
2013-11-28 05:09:36 +05:30
action - > setCheckable ( true ) ;
2015-03-02 02:50:57 +05:30
action - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-28 05:09:36 +05:30
action - > setData ( " " ) ;
2013-12-15 22:40:51 +05:30
if ( active_username . isEmpty ( ) )
2013-11-28 05:09:36 +05:30
{
action - > setChecked ( true ) ;
}
accountMenu - > addAction ( action ) ;
connect ( action , SIGNAL ( triggered ( bool ) ) , SLOT ( changeActiveAccount ( ) ) ) ;
accountMenu - > addSeparator ( ) ;
2013-11-28 04:09:49 +05:30
accountMenu - > addAction ( manageAccountsAction ) ;
}
/*
* Assumes the sender is a QAction
*/
void MainWindow : : changeActiveAccount ( )
{
2013-12-15 22:40:51 +05:30
QAction * sAction = ( QAction * ) sender ( ) ;
2013-11-28 04:09:49 +05:30
// Profile's associated Mojang username
2013-11-29 03:16:04 +05:30
// Will need to change when profiles are properly implemented
2013-12-15 22:40:51 +05:30
if ( sAction - > data ( ) . type ( ) ! = QVariant : : Type : : String )
return ;
2013-11-28 04:09:49 +05:30
2013-11-28 05:09:36 +05:30
QVariant data = sAction - > data ( ) ;
QString id = " " ;
2013-11-29 03:16:04 +05:30
if ( ! data . isNull ( ) )
2013-11-28 04:09:49 +05:30
{
2013-11-28 05:09:36 +05:30
id = data . toString ( ) ;
2013-11-28 04:09:49 +05:30
}
2013-11-28 05:09:36 +05:30
MMC - > accounts ( ) - > setActiveAccount ( id ) ;
2013-11-28 04:09:49 +05:30
activeAccountChanged ( ) ;
}
2013-11-27 22:26:15 +05:30
void MainWindow : : activeAccountChanged ( )
{
2013-11-28 04:09:49 +05:30
repopulateAccountsMenu ( ) ;
2013-11-27 22:26:15 +05:30
MojangAccountPtr account = MMC - > accounts ( ) - > activeAccount ( ) ;
2013-11-29 03:16:04 +05:30
if ( account ! = nullptr & & account - > username ( ) ! = " " )
2013-11-27 22:26:15 +05:30
{
2013-11-28 00:15:29 +05:30
const AccountProfile * profile = account - > currentProfile ( ) ;
2013-11-29 03:16:04 +05:30
if ( profile ! = nullptr )
2013-11-28 00:15:29 +05:30
{
2013-12-05 07:09:52 +05:30
accountMenuButton - > setIcon ( SkinUtils : : getFaceFromCache ( profile - > name ) ) ;
2013-11-28 04:09:49 +05:30
return ;
2013-11-28 00:15:29 +05:30
}
2013-11-27 22:26:15 +05:30
}
2013-11-28 04:09:49 +05:30
2013-11-29 03:16:04 +05:30
// Set the icon to the "no account" icon.
2015-03-02 02:50:57 +05:30
accountMenuButton - > setIcon ( MMC - > getThemedIcon ( " noaccount " ) ) ;
2013-11-27 22:26:15 +05:30
}
2013-10-06 04:43:40 +05:30
bool MainWindow : : eventFilter ( QObject * obj , QEvent * ev )
2013-08-12 04:09:19 +05:30
{
2013-10-06 04:43:40 +05:30
if ( obj = = view )
2013-08-12 04:09:19 +05:30
{
if ( ev - > type ( ) = = QEvent : : KeyPress )
{
2013-10-06 04:43:40 +05:30
QKeyEvent * keyEvent = static_cast < QKeyEvent * > ( ev ) ;
switch ( keyEvent - > key ( ) )
2013-08-12 04:09:19 +05:30
{
2013-10-06 04:43:40 +05:30
case Qt : : Key_Enter :
case Qt : : Key_Return :
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-12 04:09:19 +05:30
}
}
}
2013-10-06 04:43:40 +05:30
return QMainWindow : : eventFilter ( obj , ev ) ;
2013-08-12 04:09:19 +05:30
}
2014-01-03 00:55:38 +05:30
void MainWindow : : updateNewsLabel ( )
{
2015-01-28 03:01:07 +05:30
if ( m_newsChecker - > isLoadingNews ( ) )
2014-01-03 00:55:38 +05:30
{
newsLabel - > setText ( tr ( " Loading news... " ) ) ;
newsLabel - > setEnabled ( false ) ;
}
else
{
2015-01-28 03:01:07 +05:30
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-03 00:55:38 +05:30
if ( entries . length ( ) > 0 )
{
newsLabel - > setText ( entries [ 0 ] - > title ) ;
newsLabel - > setEnabled ( true ) ;
}
else
{
newsLabel - > setText ( tr ( " No news available. " ) ) ;
newsLabel - > setEnabled ( false ) ;
}
}
}
2013-12-05 00:04:12 +05:30
void MainWindow : : updateAvailable ( QString repo , QString versionName , int versionId )
2013-12-02 05:25:24 +05:30
{
UpdateDialog dlg ;
2013-12-15 22:40:51 +05:30
UpdateAction action = ( UpdateAction ) dlg . exec ( ) ;
switch ( action )
2013-12-02 05:25:24 +05:30
{
2013-12-15 22:40:51 +05:30
case UPDATE_LATER :
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Update will be installed later. " ;
2013-12-15 22:40:51 +05:30
break ;
case UPDATE_NOW :
downloadUpdates ( repo , versionId ) ;
break ;
case UPDATE_ONEXIT :
downloadUpdates ( repo , versionId , true ) ;
break ;
2013-12-02 05:25:24 +05:30
}
}
2014-07-14 04:27:54 +05:30
void MainWindow : : updateNotAvailable ( )
{
UpdateDialog dlg ( false ) ;
dlg . exec ( ) ;
}
2014-01-03 23:49:27 +05:30
QList < int > stringToIntList ( const QString & string )
{
QStringList split = string . split ( ' , ' , QString : : SkipEmptyParts ) ;
QList < int > out ;
for ( int i = 0 ; i < split . size ( ) ; + + i )
{
out . append ( split . at ( i ) . toInt ( ) ) ;
}
return out ;
}
QString intListToString ( const QList < int > & list )
{
QStringList slist ;
for ( int i = 0 ; i < list . size ( ) ; + + i )
{
slist . append ( QString : : number ( list . at ( i ) ) ) ;
}
return slist . join ( ' , ' ) ;
}
void MainWindow : : notificationsChanged ( )
{
QList < NotificationChecker : : NotificationEntry > entries =
2015-01-29 13:33:11 +05:30
m_notificationChecker - > notificationEntries ( ) ;
2014-01-03 23:49:27 +05:30
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 17:25:18 +05:30
if ( ! shownNotifications . contains ( entry . id ) )
2014-01-03 23:49:27 +05:30
{
2014-03-15 18:48:29 +05:30
NotificationDialog dialog ( entry , this ) ;
if ( dialog . exec ( ) = = NotificationDialog : : DontShowAgain )
2014-01-04 01:35:03 +05:30
{
shownNotifications . append ( entry . id ) ;
}
2014-01-03 23:49:27 +05:30
}
}
MMC - > settings ( ) - > set ( " ShownNotifications " , intListToString ( shownNotifications ) ) ;
}
2013-12-07 00:29:58 +05:30
void MainWindow : : downloadUpdates ( QString repo , int versionId , bool installOnExit )
{
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Downloading updates. " ;
2013-12-15 22:40:51 +05:30
// 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-07 00:29:58 +05:30
ProgressDialog updateDlg ( this ) ;
2015-01-31 21:29:03 +05:30
DownloadUpdateTask updateTask ( MMC - > root ( ) , repo , versionId , & updateDlg ) ;
2013-12-07 00:29:58 +05:30
// If the task succeeds, install the updates.
if ( updateDlg . exec ( & updateTask ) )
{
2014-01-05 17:47:42 +05:30
UpdateFlags baseFlags = None ;
2014-06-28 03:35:00 +05:30
if ( BuildConfig . UPDATER_DRY_RUN )
2014-04-06 02:28:47 +05:30
baseFlags | = DryRun ;
2013-12-07 00:29:58 +05:30
if ( installOnExit )
2014-01-05 17:47:42 +05:30
MMC - > installUpdates ( updateTask . updateFilesDir ( ) , baseFlags | OnExit ) ;
2013-12-07 00:29:58 +05:30
else
2014-01-05 17:47:42 +05:30
MMC - > installUpdates ( updateTask . updateFilesDir ( ) , baseFlags | RestartOnFinish ) ;
2013-12-07 00:29:58 +05:30
}
}
2013-10-06 04:43:40 +05:30
void MainWindow : : onCatToggled ( bool state )
2013-08-26 02:18:41 +05:30
{
setCatBackground ( state ) ;
2013-09-07 07:30:58 +05:30
MMC - > settings ( ) - > set ( " TheCat " , state ) ;
2013-08-26 02:18:41 +05:30
}
2013-10-06 04:43:40 +05:30
void MainWindow : : setCatBackground ( bool enabled )
2013-08-26 02:18:41 +05:30
{
2013-10-06 04:43:40 +05:30
if ( enabled )
2013-08-26 02:18:41 +05:30
{
2014-02-10 03:25:44 +05:30
view - > setStyleSheet ( " GroupView "
2013-10-06 04:43:40 +05:30
" { "
" background-image: url(:/backgrounds/kitteh); "
" background-attachment: fixed; "
" background-clip: padding; "
" background-position: top right; "
" background-repeat: none; "
" background-color:palette(base); "
" } " ) ;
2013-08-26 02:18:41 +05:30
}
else
{
view - > setStyleSheet ( QString ( ) ) ;
}
}
2015-02-13 02:31:20 +05:30
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-28 03:01:07 +05:30
// FIXME: eliminate, should not be needed
void MainWindow : : waitForMinecraftVersions ( )
2013-01-09 23:52:22 +05:30
{
2013-10-06 04:43:40 +05:30
if ( ! MMC - > minecraftlist ( ) - > isLoaded ( ) & & m_versionLoadTask & &
m_versionLoadTask - > isRunning ( ) )
2013-05-07 03:49:20 +05:30
{
QEventLoop waitLoop ;
2013-08-09 03:56:35 +05:30
waitLoop . connect ( m_versionLoadTask , SIGNAL ( failed ( QString ) ) , SLOT ( quit ( ) ) ) ;
waitLoop . connect ( m_versionLoadTask , SIGNAL ( succeeded ( ) ) , SLOT ( quit ( ) ) ) ;
2013-05-07 03:49:20 +05:30
waitLoop . exec ( ) ;
}
2015-01-28 03:01:07 +05:30
}
2013-10-06 04:43:40 +05:30
2015-01-28 03:01:07 +05:30
void MainWindow : : instanceFromZipPack ( QString instName , QString instGroup , QString instIcon , QUrl url )
{
2014-03-30 23:41:05 +05:30
InstancePtr newInstance ;
2013-10-06 04:43:40 +05:30
2013-11-04 01:58:04 +05:30
QString instancesDir = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
2015-01-28 03:01:07 +05:30
QString instDirName = DirNameFromString ( instName , instancesDir ) ;
2013-11-04 01:58:04 +05:30
QString instDir = PathCombine ( instancesDir , instDirName ) ;
2015-02-01 07:38:25 +05:30
2015-01-28 03:01:07 +05:30
QString archivePath ;
if ( url . isLocalFile ( ) )
2013-04-23 03:45:18 +05:30
{
2015-01-28 03:01:07 +05:30
archivePath = url . toLocalFile ( ) ;
}
else
{
const QString path = url . host ( ) + ' / ' + url . path ( ) ;
2015-01-31 21:29:03 +05:30
auto entry = ENV . metacache ( ) - > resolveEntry ( " general " , path ) ;
2015-01-28 03:01:07 +05:30
CacheDownloadPtr dl = CacheDownload : : make ( url , entry ) ;
NetJob job ( tr ( " Modpack download " ) ) ;
job . addNetAction ( dl ) ;
2013-10-06 04:43:40 +05:30
2015-01-28 03:01:07 +05:30
// FIXME: possibly causes endless loop problems
ProgressDialog dlDialog ( this ) ;
if ( dlDialog . exec ( & job ) ! = QDialog : : Accepted )
2015-02-13 02:31:20 +05:30
{
return ;
}
2015-01-28 03:01:07 +05:30
archivePath = entry - > getFullPath ( ) ;
}
2015-02-13 02:31:20 +05:30
2015-01-28 03:01:07 +05:30
QTemporaryDir extractTmpDir ;
QDir extractDir ( extractTmpDir . path ( ) ) ;
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Attempting to create instance from " < < archivePath ;
2015-01-28 03:01:07 +05:30
if ( JlCompress : : extractDir ( archivePath , extractDir . absolutePath ( ) ) . isEmpty ( ) )
{
CustomMessageBox : : selectable ( this , tr ( " Error " ) ,
tr ( " Failed to extract modpack " ) , QMessageBox : : Warning ) - > show ( ) ;
return ;
2013-04-23 03:45:18 +05:30
}
2015-01-28 03:01:07 +05:30
const QFileInfo instanceCfgFile = findRecursive ( extractDir . absolutePath ( ) , " instance.cfg " ) ;
if ( ! instanceCfgFile . isFile ( ) | | ! instanceCfgFile . exists ( ) )
2015-02-13 02:31:20 +05:30
{
2015-01-28 03:01:07 +05:30
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-13 02:31:20 +05:30
2015-02-01 07:38:25 +05:30
auto error = MMC - > instances ( ) - > loadInstance ( newInstance , instDir ) ;
2015-01-28 03:01:07 +05:30
QString errorMsg = tr ( " Failed to load instance %1: " ) . arg ( instDirName ) ;
switch ( error )
{
2015-02-01 07:38:25 +05:30
case InstanceList : : UnknownLoadError :
2015-01-28 03:01:07 +05:30
errorMsg + = tr ( " Unkown error " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
2015-02-01 07:38:25 +05:30
case InstanceList : : NotAnInstance :
2015-01-28 03:01:07 +05:30
errorMsg + = tr ( " Not an instance " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
}
2015-02-13 02:31:20 +05:30
2015-01-28 03:01:07 +05:30
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 07:38:25 +05:30
auto error = MMC - > instances ( ) - > createInstance ( newInstance , version , instDir ) ;
2015-01-28 03:01:07 +05:30
QString errorMsg = tr ( " Failed to create instance %1: " ) . arg ( instDirName ) ;
switch ( error )
{
2015-02-01 07:38:25 +05:30
case InstanceList : : NoCreateError :
break ;
case InstanceList : : InstExists :
2015-01-28 03:01:07 +05:30
{
errorMsg + = tr ( " An instance with the given directory name already exists. " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
}
2015-02-01 07:38:25 +05:30
case InstanceList : : CantCreateDir :
2015-01-28 03:01:07 +05:30
{
errorMsg + = tr ( " Failed to create the instance directory. " ) ;
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
return ;
2013-10-29 18:10:09 +05:30
}
2013-12-10 05:43:35 +05:30
2015-01-28 03:01:07 +05:30
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-13 02:31:20 +05:30
MMC - > instances ( ) - > add ( InstancePtr ( newInstance ) ) ;
2015-01-28 03:01:07 +05:30
MMC - > instances ( ) - > saveGroupList ( ) ;
finalizeInstance ( newInstance ) ;
}
2015-02-13 02:31:20 +05:30
2015-01-28 03:01:07 +05:30
void MainWindow : : finalizeInstance ( InstancePtr inst )
{
2013-12-15 22:40:51 +05:30
if ( MMC - > accounts ( ) - > anyAccountIsValid ( ) )
2013-12-10 05:43:35 +05:30
{
ProgressDialog loadDialog ( this ) ;
2015-01-28 03:01:07 +05:30
auto update = inst - > doUpdate ( ) ;
2013-12-15 22:40:51 +05:30
connect ( update . get ( ) , & Task : : failed , [ this ] ( QString reason )
{
2013-12-10 05:43:35 +05:30
QString error = QString ( " Instance load failed: %1 " ) . arg ( reason ) ;
2013-12-15 22:40:51 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , error , QMessageBox : : Warning )
- > show ( ) ;
2013-12-10 05:43:35 +05:30
} ) ;
loadDialog . exec ( update . get ( ) ) ;
}
2013-12-16 01:12:17 +05:30
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 23:52:22 +05:30
}
2015-01-28 03:01:07 +05:30
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-04 01:58:04 +05:30
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 23:41:05 +05:30
InstancePtr newInstance ;
2015-02-01 07:38:25 +05:30
auto error = MMC - > instances ( ) - > copyInstance ( newInstance , m_selectedInstance , instDir ) ;
2013-11-04 01:58:04 +05:30
2014-03-23 23:37:13 +05:30
QString errorMsg = tr ( " Failed to create instance %1: " ) . arg ( instDirName ) ;
2013-11-04 01:58:04 +05:30
switch ( error )
{
2015-02-01 07:38:25 +05:30
case InstanceList : : NoCreateError :
2013-11-04 01:58:04 +05:30
newInstance - > setName ( copyInstDlg . instName ( ) ) ;
2014-11-09 01:47:28 +05:30
newInstance - > setGroupInitial ( copyInstDlg . instGroup ( ) ) ;
2013-11-04 01:58:04 +05:30
newInstance - > setIconKey ( copyInstDlg . iconKey ( ) ) ;
2014-03-30 23:41:05 +05:30
MMC - > instances ( ) - > add ( newInstance ) ;
2013-11-04 01:58:04 +05:30
return ;
2015-02-01 07:38:25 +05:30
case InstanceList : : InstExists :
2013-11-04 01:58:04 +05:30
{
2014-03-23 23:37:13 +05:30
errorMsg + = tr ( " An instance with the given directory name already exists. " ) ;
2013-11-04 01:58:04 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
2015-02-01 07:38:25 +05:30
case InstanceList : : CantCreateDir :
2013-11-04 01:58:04 +05:30
{
2014-03-23 23:37:13 +05:30
errorMsg + = tr ( " Failed to create the instance directory. " ) ;
2013-11-04 01:58:04 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
default :
{
2014-03-23 23:37:13 +05:30
errorMsg + = tr ( " Unknown instance loader error %1 " ) . arg ( error ) ;
2013-11-04 01:58:04 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error " ) , errorMsg , QMessageBox : : Warning ) - > show ( ) ;
break ;
}
}
}
2013-08-10 22:04:08 +05:30
void MainWindow : : on_actionChangeInstIcon_triggered ( )
2013-03-19 10:54:34 +05:30
{
2013-10-06 04:43:40 +05:30
if ( ! m_selectedInstance )
2013-08-10 22:04:08 +05:30
return ;
2013-10-06 04:43:40 +05:30
2013-08-10 22:04:08 +05:30
IconPickerDialog dlg ( this ) ;
2013-08-25 05:02:42 +05:30
dlg . exec ( m_selectedInstance - > iconKey ( ) ) ;
2013-10-06 04:43:40 +05:30
if ( dlg . result ( ) = = QDialog : : Accepted )
2013-03-19 10:54:34 +05:30
{
2013-08-25 05:02:42 +05:30
m_selectedInstance - > setIconKey ( dlg . selectedIconKey ) ;
2015-02-01 16:14:47 +05:30
auto ico = ENV . icons ( ) - > getBigIcon ( dlg . selectedIconKey ) ;
2013-08-25 05:02:42 +05:30
ui - > actionChangeInstIcon - > setIcon ( ico ) ;
2013-03-19 10:54:34 +05:30
}
}
2013-12-31 05:54:28 +05:30
void MainWindow : : iconUpdated ( QString icon )
{
2014-01-27 07:30:49 +05:30
if ( icon = = m_currentInstIcon )
2013-12-31 05:54:28 +05:30
{
2015-02-01 16:14:47 +05:30
ui - > actionChangeInstIcon - > setIcon ( ENV . icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-03-19 10:54:34 +05:30
}
}
2013-12-31 05:54:28 +05:30
void MainWindow : : updateInstanceToolIcon ( QString new_icon )
{
m_currentInstIcon = new_icon ;
2015-02-01 16:14:47 +05:30
ui - > actionChangeInstIcon - > setIcon ( ENV . icons ( ) - > getBigIcon ( m_currentInstIcon ) ) ;
2013-12-31 05:54:28 +05:30
}
2014-01-06 14:31:40 +05:30
void MainWindow : : setSelectedInstanceById ( const QString & id )
{
2014-05-11 23:02:17 +05:30
if ( id . isNull ( ) )
return ;
const QModelIndex index = MMC - > instances ( ) - > getInstanceIndexById ( id ) ;
if ( index . isValid ( ) )
2014-01-06 14:31:40 +05:30
{
2014-05-11 23:02:17 +05:30
QModelIndex selectionIndex = proxymodel - > mapFromSource ( index ) ;
view - > selectionModel ( ) - > setCurrentIndex ( selectionIndex , QItemSelectionModel : : ClearAndSelect ) ;
2014-01-06 14:31:40 +05:30
}
}
2013-08-10 22:04:08 +05:30
void MainWindow : : on_actionChangeInstGroup_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( ! m_selectedInstance )
2013-08-10 22:04:08 +05:30
return ;
2013-10-06 04:43:40 +05:30
2013-08-10 22:04:08 +05:30
bool ok = false ;
2013-10-06 04:43:40 +05:30
QString name ( m_selectedInstance - > group ( ) ) ;
2013-12-15 22:40:51 +05:30
auto groups = MMC - > instances ( ) - > getGroups ( ) ;
2013-12-16 01:12:17 +05:30
groups . insert ( 0 , " " ) ;
2013-12-15 22:40:51 +05:30
groups . sort ( Qt : : CaseInsensitive ) ;
int foo = groups . indexOf ( name ) ;
name = QInputDialog : : getItem ( this , tr ( " Group name " ) , tr ( " Enter a new group name. " ) , groups ,
foo , true , & ok ) ;
name = name . simplified ( ) ;
2013-10-06 04:43:40 +05:30
if ( ok )
2013-08-26 02:18:41 +05:30
m_selectedInstance - > setGroupPost ( name ) ;
2013-08-10 22:04:08 +05:30
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionViewInstanceFolder_triggered ( )
{
2013-10-06 04:43:40 +05:30
QString str = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
openDirInDefaultProgram ( str ) ;
2013-01-09 23:52:22 +05:30
}
void MainWindow : : on_actionRefresh_triggered ( )
{
2013-09-07 07:30:58 +05:30
MMC - > instances ( ) - > loadList ( ) ;
2013-01-09 23:52:22 +05:30
}
void MainWindow : : on_actionViewCentralModsFolder_triggered ( )
{
2013-10-06 04:43:40 +05:30
openDirInDefaultProgram ( MMC - > settings ( ) - > get ( " CentralModsDir " ) . toString ( ) , true ) ;
2013-01-09 23:52:22 +05:30
}
2013-08-25 05:02:42 +05:30
void MainWindow : : on_actionConfig_Folder_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-08-25 05:02:42 +05:30
{
QString str = m_selectedInstance - > instanceConfigFolder ( ) ;
2013-10-06 04:43:40 +05:30
openDirInDefaultProgram ( QDir ( str ) . absolutePath ( ) ) ;
2013-08-25 05:02:42 +05:30
}
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionCheckUpdate_triggered ( )
{
2013-12-05 00:04:12 +05:30
auto updater = MMC - > updateChecker ( ) ;
2015-01-31 21:29:03 +05:30
updater - > checkForUpdate ( MMC - > settings ( ) - > get ( " UpdateChannel " ) . toString ( ) , true ) ;
2013-01-09 23:52:22 +05:30
}
2014-06-18 04:45:01 +05:30
template < typename T >
void ShowPageDialog ( T raw_provider , QWidget * parent , QString open_page = QString ( ) )
2014-05-11 23:36:06 +05:30
{
2014-06-18 04:45:01 +05:30
auto provider = std : : dynamic_pointer_cast < BasePageProvider > ( raw_provider ) ;
2014-06-09 04:59:18 +05:30
if ( ! provider )
return ;
2014-06-18 04:45:01 +05:30
PageDialog dlg ( provider , open_page , parent ) ;
2014-06-09 04:59:18 +05:30
dlg . exec ( ) ;
2014-05-11 23:36:06 +05:30
}
2015-02-07 15:13:09 +05:30
void ShowInstancePageDialog ( InstancePtr instance , QWidget * parent , QString open_page = QString ( ) )
{
auto provider = std : : make_shared < InstancePageProvider > ( instance ) ;
ShowPageDialog ( provider , parent , open_page ) ;
}
2014-07-16 03:43:40 +05:30
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-29 01:26:23 +05:30
update ( ) ;
2014-07-16 03:43:40 +05:30
}
2014-06-18 04:45:01 +05:30
void MainWindow : : on_actionInstanceSettings_triggered ( )
{
2015-02-07 15:13:09 +05:30
ShowInstancePageDialog ( m_selectedInstance , this , " settings " ) ;
2014-06-18 04:45:01 +05:30
}
void MainWindow : : on_actionEditInstNotes_triggered ( )
{
2015-02-07 15:13:09 +05:30
ShowInstancePageDialog ( m_selectedInstance , this , " notes " ) ;
2014-06-18 04:45:01 +05:30
}
void MainWindow : : on_actionEditInstance_triggered ( )
{
2015-02-07 15:13:09 +05:30
ShowInstancePageDialog ( m_selectedInstance , this ) ;
2014-06-18 04:45:01 +05:30
}
2014-06-28 20:37:08 +05:30
void MainWindow : : on_actionScreenshots_triggered ( )
{
2015-02-07 15:13:09 +05:30
ShowInstancePageDialog ( m_selectedInstance , this , " screenshots " ) ;
2014-06-28 20:37:08 +05:30
}
2013-11-20 23:50:35 +05:30
void MainWindow : : on_actionManageAccounts_triggered ( )
{
2014-07-16 03:43:40 +05:30
ShowPageDialog ( m_globalSettingsProvider , this , " accounts " ) ;
2013-11-20 23:50:35 +05:30
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionReportBug_triggered ( )
{
2014-01-09 10:20:08 +05:30
openWebPage ( QUrl ( " https://github.com/MultiMC/MultiMC5/issues " ) ) ;
2013-01-09 23:52:22 +05:30
}
2014-04-11 07:29:30 +05:30
void MainWindow : : on_actionPatreon_triggered ( )
{
openWebPage ( QUrl ( " http://www.patreon.com/multimc " ) ) ;
}
2014-01-03 00:55:38 +05:30
void MainWindow : : on_actionMoreNews_triggered ( )
2013-01-09 23:52:22 +05:30
{
2013-10-15 04:49:22 +05:30
openWebPage ( QUrl ( " http://multimc.org/posts.html " ) ) ;
2013-01-09 23:52:22 +05:30
}
2014-01-03 02:07:56 +05:30
void MainWindow : : newsButtonClicked ( )
{
2015-01-28 03:01:07 +05:30
QList < NewsEntryPtr > entries = m_newsChecker - > getNewsEntries ( ) ;
2014-01-03 02:07:56 +05:30
if ( entries . count ( ) > 0 )
openWebPage ( QUrl ( entries [ 0 ] - > link ) ) ;
else
openWebPage ( QUrl ( " http://multimc.org/posts.html " ) ) ;
}
2013-01-09 23:52:22 +05:30
void MainWindow : : on_actionAbout_triggered ( )
{
2013-10-06 04:43:40 +05:30
AboutDialog dialog ( this ) ;
2013-03-12 02:49:17 +05:30
dialog . exec ( ) ;
2013-01-09 23:52:22 +05:30
}
2013-01-30 11:22:37 +05:30
2013-10-06 04:43:40 +05:30
void MainWindow : : on_mainToolBar_visibilityChanged ( bool )
2013-01-30 11:22:37 +05:30
{
// Don't allow hiding the main toolbar.
// This is the only way I could find to prevent it... :/
2013-10-06 04:43:40 +05:30
ui - > mainToolBar - > setVisible ( true ) ;
2013-01-30 11:22:37 +05:30
}
2013-06-24 01:40:32 +05:30
void MainWindow : : on_actionDeleteInstance_triggered ( )
{
2013-08-25 05:02:42 +05:30
if ( m_selectedInstance )
2013-07-05 04:09:41 +05:30
{
2013-11-04 01:58:04 +05:30
auto response = CustomMessageBox : : selectable (
this , tr ( " CAREFUL " ) , tr ( " This is permanent! Are you sure? \n About to delete: " ) +
m_selectedInstance - > name ( ) ,
QMessageBox : : Question , QMessageBox : : Yes | QMessageBox : : No ) - > exec ( ) ;
2013-07-05 04:09:41 +05:30
if ( response = = QMessageBox : : Yes )
{
2013-08-26 10:00:11 +05:30
m_selectedInstance - > nuke ( ) ;
2013-07-05 04:09:41 +05:30
}
}
2013-06-24 01:40:32 +05:30
}
2015-04-13 00:20:45 +05:30
# include <pathutils.h>
bool compressSubDir ( QuaZip * zip , QString dir , QString origDir , QString prefix )
{
if ( ! zip ) return false ;
if ( zip - > getMode ( ) ! = QuaZip : : mdCreate & & zip - > getMode ( ) ! = QuaZip : : mdAppend & & zip - > getMode ( ) ! = QuaZip : : mdAdd )
{
return false ;
}
QDir directory ( dir ) ;
if ( ! directory . exists ( ) ) return false ;
QDir origDirectory ( origDir ) ;
if ( dir ! = origDir )
{
QuaZipFile dirZipFile ( zip ) ;
auto dirPrefix = PathCombine ( prefix , origDirectory . relativeFilePath ( dir ) ) + " / " ;
if ( ! dirZipFile . open ( QIODevice : : WriteOnly , QuaZipNewInfo ( dirPrefix , dir ) , 0 , 0 , 0 ) )
{
return false ;
}
dirZipFile . close ( ) ;
}
QFileInfoList files = directory . entryInfoList ( QDir : : AllDirs | QDir : : NoDotAndDotDot | QDir : : Hidden ) ;
for ( auto file : files )
{
if ( ! compressSubDir ( zip , file . absoluteFilePath ( ) , origDir , prefix ) )
{
return false ;
}
}
files = directory . entryInfoList ( QDir : : Files ) ;
for ( auto file : files )
{
if ( ! file . isFile ( ) )
{
continue ;
}
if ( file . absoluteFilePath ( ) = = zip - > getZipName ( ) )
{
continue ;
}
QString filename = origDirectory . relativeFilePath ( file . absoluteFilePath ( ) ) ;
if ( prefix . size ( ) )
{
filename = PathCombine ( prefix , filename ) ;
}
if ( ! JlCompress : : compressFile ( zip , file . absoluteFilePath ( ) , filename ) )
{
return false ;
}
}
return true ;
}
bool compressDir ( QString zipFile , QString dir , QString prefix = QString ( ) )
{
QuaZip zip ( zipFile ) ;
QDir ( ) . mkpath ( QFileInfo ( zipFile ) . absolutePath ( ) ) ;
if ( ! zip . open ( QuaZip : : mdCreate ) )
{
QFile : : remove ( zipFile ) ;
return false ;
}
QSet < QString > added ;
if ( ! compressSubDir ( & zip , dir , dir , prefix ) )
{
QFile : : remove ( zipFile ) ;
return false ;
}
zip . close ( ) ;
if ( zip . getZipError ( ) ! = 0 )
{
QFile : : remove ( zipFile ) ;
return false ;
}
return true ;
}
2015-02-13 02:31:20 +05:30
void MainWindow : : on_actionExportInstance_triggered ( )
{
if ( m_selectedInstance )
{
2015-04-13 00:20:45 +05:30
auto name = RemoveInvalidFilenameChars ( m_selectedInstance - > name ( ) ) ;
2015-02-13 02:31:20 +05:30
const QString output = QFileDialog : : getSaveFileName ( this , tr ( " Export %1 " )
. arg ( m_selectedInstance - > name ( ) ) ,
2015-04-13 00:20:45 +05:30
PathCombine ( QDir : : homePath ( ) , name + " .zip " ) , " Zip (*.zip) " ) ;
2015-02-13 02:31:20 +05:30
if ( output . isNull ( ) )
{
return ;
}
if ( QFile : : exists ( output ) )
{
int ret = QMessageBox : : question ( this , tr ( " Overwrite? " ) , tr ( " This file already exists. Do you want to overwrite it? " ) ,
QMessageBox : : No , QMessageBox : : Yes ) ;
if ( ret = = QMessageBox : : No )
{
return ;
}
}
2015-04-13 00:20:45 +05:30
if ( ! compressDir ( output , m_selectedInstance - > instanceRoot ( ) , name ) )
2015-02-13 02:31:20 +05:30
{
QMessageBox : : warning ( this , tr ( " Error " ) , tr ( " Unable to export instance " ) ) ;
}
}
}
2013-06-24 01:40:32 +05:30
void MainWindow : : on_actionRenameInstance_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-06-24 01:40:32 +05:30
{
bool ok = false ;
2013-10-06 04:43:40 +05:30
QString name ( m_selectedInstance - > name ( ) ) ;
name =
QInputDialog : : getText ( this , tr ( " Instance name " ) , tr ( " Enter a new instance name. " ) ,
QLineEdit : : Normal , name , & ok ) ;
2013-07-07 07:41:24 +05:30
if ( name . length ( ) > 0 )
{
2013-10-06 04:43:40 +05:30
if ( ok & & name . length ( ) )
2013-08-29 01:22:19 +05:30
{
2013-08-25 05:02:42 +05:30
m_selectedInstance - > setName ( name ) ;
2013-08-29 01:22:19 +05:30
renameButton - > setText ( name ) ;
}
2013-07-07 07:41:24 +05:30
}
2013-06-24 01:40:32 +05:30
}
}
void MainWindow : : on_actionViewSelectedInstFolder_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-06-24 01:40:32 +05:30
{
2013-08-25 05:02:42 +05:30
QString str = m_selectedInstance - > instanceRoot ( ) ;
2013-10-06 04:43:40 +05:30
openDirInDefaultProgram ( QDir ( str ) . absolutePath ( ) ) ;
2013-06-24 01:40:32 +05:30
}
}
2013-10-06 04:43:40 +05:30
void MainWindow : : closeEvent ( QCloseEvent * event )
2013-01-30 11:22:37 +05:30
{
// Save the window state and geometry.
2013-11-03 06:15:25 +05:30
MMC - > settings ( ) - > set ( " MainWindowState " , saveState ( ) . toBase64 ( ) ) ;
MMC - > settings ( ) - > set ( " MainWindowGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
2013-10-06 04:43:40 +05:30
QMainWindow : : closeEvent ( event ) ;
2013-10-26 13:08:21 +05:30
QApplication : : exit ( ) ;
2013-01-30 11:22:37 +05:30
}
2013-10-06 06:37:57 +05:30
/*
2013-10-06 04:43:40 +05:30
void MainWindow : : on_instanceView_customContextMenuRequested ( const QPoint & pos )
2013-02-01 02:01:16 +05:30
{
2013-10-06 04:43:40 +05:30
QMenu * instContextMenu = new QMenu ( " Instance " , this ) ;
2013-03-12 02:49:17 +05:30
2013-02-01 02:01:16 +05:30
// Add the actions from the toolbar to the context menu.
2013-10-06 04:43:40 +05:30
instContextMenu - > addActions ( ui - > instanceToolBar - > actions ( ) ) ;
2013-03-12 02:49:17 +05:30
2013-10-06 04:43:40 +05:30
instContextMenu - > exec ( view - > mapToGlobal ( pos ) ) ;
2013-02-01 02:01:16 +05:30
}
2013-10-06 06:37:57 +05:30
*/
2013-10-22 01:55:50 +05:30
void MainWindow : : instanceActivated ( QModelIndex index )
{
if ( ! index . isValid ( ) )
return ;
2014-06-28 03:35:00 +05:30
QString id = index . data ( InstanceList : : InstanceIDRole ) . toString ( ) ;
2014-03-30 23:41:05 +05:30
InstancePtr inst = MMC - > instances ( ) - > getInstanceById ( id ) ;
2014-06-28 03:35:00 +05:30
if ( ! inst )
return ;
2013-10-22 01:55:50 +05:30
2013-11-06 06:48:47 +05:30
NagUtils : : checkJVMArgs ( inst - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
2013-11-03 20:50:26 +05:30
2013-11-29 08:15:52 +05:30
doLaunch ( ) ;
2013-10-22 01:55:50 +05:30
}
2013-02-06 04:04:20 +05:30
void MainWindow : : on_actionLaunchInstance_triggered ( )
{
2013-10-06 04:43:40 +05:30
if ( m_selectedInstance )
2013-03-12 02:49:17 +05:30
{
2013-11-06 06:48:47 +05:30
NagUtils : : checkJVMArgs ( m_selectedInstance - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
2013-11-29 08:15:52 +05:30
doLaunch ( ) ;
2013-03-12 02:49:17 +05:30
}
2013-02-06 04:04:20 +05:30
}
2014-01-27 07:30:49 +05:30
void MainWindow : : on_actionLaunchInstanceOffline_triggered ( )
{
if ( m_selectedInstance )
{
NagUtils : : checkJVMArgs ( m_selectedInstance - > settings ( ) . get ( " JvmArgs " ) . toString ( ) , this ) ;
doLaunch ( false ) ;
}
}
2014-02-16 02:56:44 +05:30
void MainWindow : : doLaunch ( bool online , BaseProfilerFactory * profiler )
2013-10-22 01:55:50 +05:30
{
2013-10-22 02:38:09 +05:30
if ( ! m_selectedInstance )
return ;
2013-11-21 06:01:15 +05:30
// Find an account to use.
std : : shared_ptr < MojangAccountList > accounts = MMC - > accounts ( ) ;
2013-11-23 00:17:39 +05:30
MojangAccountPtr account = accounts - > activeAccount ( ) ;
2013-11-21 06:01:15 +05:30
if ( accounts - > count ( ) < = 0 )
2013-10-22 01:55:50 +05:30
{
2013-11-21 06:01:15 +05:30
// Tell the user they need to log in at least one account in order to play.
2013-12-15 22:40:51 +05:30
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 21:42:16 +05:30
QMessageBox : : Information , QMessageBox : : Yes | QMessageBox : : No ) - > exec ( ) ;
2013-10-22 01:55:50 +05:30
2013-11-22 21:42:16 +05:30
if ( reply = = QMessageBox : : Yes )
2013-10-22 01:55:50 +05:30
{
2013-11-22 21:42:16 +05:30
// Open the account manager.
on_actionManageAccounts_triggered ( ) ;
2013-10-22 01:55:50 +05:30
}
}
2013-11-23 00:17:39 +05:30
else if ( account . get ( ) = = nullptr )
2013-10-22 01:55:50 +05:30
{
2013-11-28 03:44:18 +05:30
// 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 22:40:51 +05:30
AccountSelectDialog : : GlobalDefaultCheckbox , this ) ;
2013-10-06 04:43:40 +05:30
2013-11-28 03:44:18 +05:30
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-06 04:04:20 +05:30
}
2013-11-28 03:44:18 +05:30
2013-12-08 22:04:45 +05:30
// if no account is selected, we bail
if ( ! account . get ( ) )
return ;
2013-12-01 06:30:42 +05:30
2014-01-27 07:30:49 +05:30
// 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-25 04:08:37 +05:30
QString failReason = tr ( " Your account is currently not logged in. Please enter "
" your password to log in again. " ) ;
2014-01-27 07:30:49 +05:30
while ( tryagain )
2013-11-29 08:15:52 +05:30
{
2014-01-27 07:30:49 +05:30
AuthSessionPtr session ( new AuthSession ( ) ) ;
session - > wants_online = online ;
auto task = account - > login ( session , password ) ;
if ( task )
2013-12-25 04:08:37 +05:30
{
2014-01-27 07:30:49 +05:30
// 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-25 04:08:37 +05:30
if ( ! task - > successful ( ) )
{
failReason = task - > failReason ( ) ;
}
}
2014-01-27 07:30:49 +05:30
switch ( session - > status )
2013-12-25 04:08:37 +05:30
{
2014-01-27 07:30:49 +05:30
case AuthSession : : Undetermined :
{
2015-02-02 06:44:14 +05:30
qCritical ( ) < < " Received undetermined session status during login. Bye. " ;
2014-01-27 07:30:49 +05:30
tryagain = false ;
break ;
2013-12-25 04:08:37 +05:30
}
2014-01-27 07:30:49 +05:30
case AuthSession : : RequiresPassword :
2013-11-29 08:15:52 +05:30
{
2014-01-27 07:30:49 +05:30
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-16 02:56:44 +05:30
updateInstance ( m_selectedInstance , session , profiler ) ;
2014-01-27 07:30:49 +05:30
}
else
{
2014-02-16 02:56:44 +05:30
launchInstance ( m_selectedInstance , session , profiler ) ;
2014-01-27 07:30:49 +05:30
}
tryagain = false ;
}
2013-11-29 08:15:52 +05:30
}
}
2013-02-06 04:04:20 +05:30
}
2014-06-28 03:35:00 +05:30
void MainWindow : : updateInstance ( InstancePtr instance , AuthSessionPtr session ,
BaseProfilerFactory * profiler )
2013-02-06 04:04:20 +05:30
{
2014-01-27 07:30:49 +05:30
auto updateTask = instance - > doUpdate ( ) ;
2013-10-06 04:43:40 +05:30
if ( ! updateTask )
2013-03-24 20:06:00 +05:30
{
2014-02-16 02:56:44 +05:30
launchInstance ( instance , session , profiler ) ;
2013-12-15 22:40:51 +05:30
return ;
2013-03-24 20:06:00 +05:30
}
2013-12-15 22:40:51 +05:30
ProgressDialog tDialog ( this ) ;
2014-02-16 02:56:44 +05:30
connect ( updateTask . get ( ) , & Task : : succeeded , [ this , instance , session , profiler ]
{ launchInstance ( instance , session , profiler ) ; } ) ;
2013-12-15 22:40:51 +05:30
connect ( updateTask . get ( ) , SIGNAL ( failed ( QString ) ) , SLOT ( onGameUpdateError ( QString ) ) ) ;
tDialog . exec ( updateTask . get ( ) ) ;
2013-02-06 04:04:20 +05:30
}
2013-02-21 06:40:09 +05:30
2014-06-28 03:35:00 +05:30
void MainWindow : : launchInstance ( InstancePtr instance , AuthSessionPtr session ,
BaseProfilerFactory * profiler )
2013-05-08 23:26:43 +05:30
{
Q_ASSERT_X ( instance ! = NULL , " launchInstance " , " instance is NULL " ) ;
2014-01-27 07:30:49 +05:30
Q_ASSERT_X ( session . get ( ) ! = nullptr , " launchInstance " , " session is NULL " ) ;
2013-10-06 04:43:40 +05:30
2014-05-18 22:37:01 +05:30
QString launchScript ;
2015-01-28 03:01:07 +05:30
BaseProcess * proc = instance - > prepareForLaunch ( session ) ;
if ( ! proc )
2013-08-03 19:27:33 +05:30
return ;
2013-10-06 04:43:40 +05:30
2013-11-23 06:11:28 +05:30
this - > hide ( ) ;
2013-10-06 04:43:40 +05:30
2013-09-07 02:10:50 +05:30
console = new ConsoleWindow ( proc ) ;
2013-11-23 06:11:28 +05:30
connect ( console , SIGNAL ( isClosing ( ) ) , this , SLOT ( instanceEnded ( ) ) ) ;
2013-10-22 22:55:10 +05:30
2014-02-16 04:40:45 +05:30
proc - > arm ( ) ;
2014-02-15 18:49:35 +05:30
2014-02-16 02:56:44 +05:30
if ( profiler )
2014-02-15 18:49:35 +05:30
{
2014-02-16 02:56:44 +05:30
QString error ;
if ( ! profiler - > check ( & error ) )
{
2014-06-28 03:35:00 +05:30
QMessageBox : : critical ( this , tr ( " Error " ) ,
tr ( " Couldn't start profiler: %1 " ) . arg ( error ) ) ;
2014-02-16 04:40:45 +05:30
proc - > abort ( ) ;
2014-02-16 02:56:44 +05:30
return ;
}
BaseProfiler * profilerInstance = profiler - > createProfiler ( instance , this ) ;
2014-02-15 18:49:35 +05:30
QProgressDialog dialog ;
dialog . setMinimum ( 0 ) ;
dialog . setMaximum ( 0 ) ;
dialog . setValue ( 0 ) ;
dialog . setLabelText ( tr ( " Waiting for profiler... " ) ) ;
2014-06-28 03:35:00 +05:30
connect ( & dialog , & QProgressDialog : : canceled , profilerInstance ,
& BaseProfiler : : abortProfiling ) ;
2014-02-15 18:49:35 +05:30
dialog . show ( ) ;
2014-06-28 03:35:00 +05:30
connect ( profilerInstance , & BaseProfiler : : readyToLaunch ,
[ & dialog , this , proc ] ( const QString & message )
2014-02-15 18:49:35 +05:30
{
dialog . accept ( ) ;
QMessageBox msg ;
2015-01-28 03:01:07 +05:30
msg . setText ( tr ( " The game launch is delayed until you press the "
2014-02-15 18:49:35 +05:30
" 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 . exec ( ) ;
2014-02-16 04:40:45 +05:30
proc - > launch ( ) ;
2014-02-15 18:49:35 +05:30
} ) ;
2014-06-28 03:35:00 +05:30
connect ( profilerInstance , & BaseProfiler : : abortLaunch ,
[ & dialog , this , proc ] ( const QString & message )
2014-02-16 13:24:52 +05:30
{
dialog . accept ( ) ;
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 . exec ( ) ;
proc - > abort ( ) ;
} ) ;
2014-02-16 02:56:44 +05:30
profilerInstance - > beginProfiling ( proc ) ;
2014-02-15 18:49:35 +05:30
dialog . exec ( ) ;
}
2014-02-16 02:56:44 +05:30
else
{
2014-02-16 04:40:45 +05:30
proc - > launch ( ) ;
2014-02-16 02:56:44 +05:30
}
2013-03-12 02:49:17 +05:30
}
2013-08-03 19:27:33 +05:30
void MainWindow : : onGameUpdateError ( QString error )
2013-05-08 23:26:43 +05:30
{
2013-11-04 01:58:04 +05:30
CustomMessageBox : : selectable ( this , tr ( " Error updating instance " ) , error ,
QMessageBox : : Warning ) - > show ( ) ;
2013-05-08 23:26:43 +05:30
}
2013-08-09 03:56:35 +05:30
void MainWindow : : taskStart ( )
2013-05-07 03:49:20 +05:30
{
// Nothing to do here yet.
}
2013-08-09 03:56:35 +05:30
void MainWindow : : taskEnd ( )
2013-05-07 03:49:20 +05:30
{
2013-08-09 03:56:35 +05:30
QObject * sender = QObject : : sender ( ) ;
if ( sender = = m_versionLoadTask )
2013-05-07 03:49:20 +05:30
m_versionLoadTask = NULL ;
2013-10-06 04:43:40 +05:30
2013-08-09 03:56:35 +05:30
sender - > deleteLater ( ) ;
2013-05-07 03:49:20 +05:30
}
void MainWindow : : startTask ( Task * task )
{
2013-08-09 03:56:35 +05:30
connect ( task , SIGNAL ( started ( ) ) , SLOT ( taskStart ( ) ) ) ;
connect ( task , SIGNAL ( succeeded ( ) ) , SLOT ( taskEnd ( ) ) ) ;
connect ( task , SIGNAL ( failed ( QString ) ) , SLOT ( taskEnd ( ) ) ) ;
2013-09-18 03:30:35 +05:30
task - > start ( ) ;
2013-05-07 03:49:20 +05:30
}
2013-02-13 05:05:35 +05:30
// BrowserDialog
2013-10-06 04:43:40 +05:30
void MainWindow : : openWebPage ( QUrl url )
2013-02-13 05:05:35 +05:30
{
2013-08-20 05:59:36 +05:30
QDesktopServices : : openUrl ( url ) ;
2013-02-13 05:05:35 +05:30
}
2013-02-22 01:10:32 +05:30
2013-10-06 04:43:40 +05:30
void MainWindow : : instanceChanged ( const QModelIndex & current , const QModelIndex & previous )
2013-08-25 05:02:42 +05:30
{
2014-05-11 23:02:17 +05:30
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 23:41:05 +05:30
if ( m_selectedInstance )
2013-08-25 05:02:42 +05:30
{
2014-02-18 01:01:50 +05:30
ui - > instanceToolBar - > setEnabled ( m_selectedInstance - > canLaunch ( ) ) ;
2013-08-26 02:18:41 +05:30
renameButton - > setText ( m_selectedInstance - > name ( ) ) ;
2013-10-26 06:58:50 +05:30
m_statusLeft - > setText ( m_selectedInstance - > getStatusbarDescription ( ) ) ;
2013-12-31 05:54:28 +05:30
updateInstanceToolIcon ( m_selectedInstance - > iconKey ( ) ) ;
2013-11-27 19:30:44 +05:30
2014-02-16 16:19:55 +05:30
updateToolsMenu ( ) ;
2014-02-16 02:56:44 +05:30
2013-11-27 19:30:44 +05:30
MMC - > settings ( ) - > set ( " SelectedInstance " , m_selectedInstance - > id ( ) ) ;
2013-08-25 05:02:42 +05:30
}
else
{
2014-05-11 23:02:17 +05:30
MMC - > settings ( ) - > set ( " SelectedInstance " , QString ( ) ) ;
selectionBad ( ) ;
return ;
2013-08-25 05:02:42 +05:30
}
2013-08-26 10:00:11 +05:30
}
void MainWindow : : selectionBad ( )
{
2014-01-06 14:31:40 +05:30
// start by reseting everything...
2013-08-26 10:00:11 +05:30
m_selectedInstance = nullptr ;
2013-12-31 05:54:28 +05:30
2013-08-26 10:00:11 +05:30
statusBar ( ) - > clearMessage ( ) ;
ui - > instanceToolBar - > setEnabled ( false ) ;
2013-09-08 21:43:09 +05:30
renameButton - > setText ( tr ( " Rename Instance " ) ) ;
2013-12-31 05:54:28 +05:30
updateInstanceToolIcon ( " infinity " ) ;
2014-01-06 14:31:40 +05:30
// ...and then see if we can enable the previously selected instance
setSelectedInstanceById ( MMC - > settings ( ) - > get ( " SelectedInstance " ) . toString ( ) ) ;
2013-07-15 01:31:30 +05:30
}
2013-08-26 02:18:41 +05:30
2013-11-23 06:11:28 +05:30
void MainWindow : : instanceEnded ( )
2013-09-07 03:22:17 +05:30
{
this - > show ( ) ;
}
2013-10-14 07:29:21 +05:30
void MainWindow : : checkSetDefaultJava ( )
{
2014-06-28 03:35:00 +05:30
const QString javaHack = " IntelHack " ;
2013-10-21 01:58:31 +05:30
bool askForJava = false ;
2014-06-28 03:35:00 +05:30
do
2013-10-14 07:29:21 +05:30
{
2013-10-21 01:58:31 +05:30
QString currentHostName = QHostInfo : : localHostName ( ) ;
QString oldHostName = MMC - > settings ( ) - > get ( " LastHostname " ) . toString ( ) ;
if ( currentHostName ! = oldHostName )
{
MMC - > settings ( ) - > set ( " LastHostname " , currentHostName ) ;
askForJava = true ;
2014-06-28 03:35:00 +05:30
break ;
2013-10-21 01:58:31 +05:30
}
QString currentJavaPath = MMC - > settings ( ) - > get ( " JavaPath " ) . toString ( ) ;
if ( currentJavaPath . isEmpty ( ) )
{
askForJava = true ;
2014-06-28 03:35:00 +05:30
break ;
2013-10-21 01:58:31 +05:30
}
2014-11-16 17:26:33 +05:30
if ( ! currentJavaPath . contains ( ' / ' ) )
{
currentJavaPath = QStandardPaths : : findExecutable ( currentJavaPath ) ;
}
QFile currentJavaBin ( currentJavaPath ) ;
if ( ! currentJavaBin . exists ( ) )
{
askForJava = true ;
break ;
}
2014-06-28 03:35:00 +05:30
# 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-28 03:51:36 +05:30
" 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-28 03:35:00 +05:30
QMessageBox : : Warning ) - > exec ( ) ;
askForJava = true ;
break ;
}
# endif
} while ( 0 ) ;
2013-10-21 01:58:31 +05:30
if ( askForJava )
{
2015-02-02 06:44:14 +05:30
qDebug ( ) < < " Java path needs resetting, showing Java selection dialog... " ;
2013-10-14 07:29:21 +05:30
JavaVersionPtr java ;
2013-10-21 01:58:31 +05:30
VersionSelectDialog vselect ( MMC - > javalist ( ) . get ( ) , tr ( " Select a Java version " ) , this ,
false ) ;
2013-10-14 07:29:21 +05:30
vselect . setResizeOn ( 2 ) ;
vselect . exec ( ) ;
2013-10-24 05:17:54 +05:30
if ( vselect . selectedVersion ( ) )
java = std : : dynamic_pointer_cast < JavaVersion > ( vselect . selectedVersion ( ) ) ;
else
2013-10-14 07:29:21 +05:30
{
2013-11-04 01:58:04 +05:30
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 18:10:09 +05:30
2013-10-14 07:29:21 +05:30
JavaUtils ju ;
java = ju . GetDefaultJava ( ) ;
}
2013-10-26 23:25:48 +05:30
if ( java )
2014-06-28 03:35:00 +05:30
{
2013-10-24 05:17:54 +05:30
MMC - > settings ( ) - > set ( " JavaPath " , java - > path ) ;
2014-06-28 03:35:00 +05:30
MMC - > settings ( ) - > set ( " JavaDetectionHack " , javaHack ) ;
}
2013-10-24 05:17:54 +05:30
else
MMC - > settings ( ) - > set ( " JavaPath " , QString ( " java " ) ) ;
2013-10-14 07:29:21 +05:30
}
}
2014-07-27 19:20:03 +05:30
void MainWindow : : checkInstancePathForProblems ( )
{
QString instanceFolder = MMC - > settings ( ) - > get ( " InstanceDir " ) . toString ( ) ;
if ( checkProblemticPathJava ( QDir ( instanceFolder ) ) )
{
QMessageBox warning ;
warning . setText ( tr (
" Your instance folder contains \' ! \' and this is known to cause Java problems! " ) ) ;
warning . setInformativeText (
tr ( " You have now three options: <br/> "
" - ignore this warning <br/> "
" - change the instance dir in the settings <br/> "
" - move this installation of MultiMC5 to a different folder " ) ) ;
warning . setDefaultButton ( QMessageBox : : Ok ) ;
warning . exec ( ) ;
}
}