2019-01-16 20:14:24 +00:00
/* Copyright 2013-2019 MultiMC Contributors
2013-02-01 19:07:36 +00:00
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
2013-10-06 13:43:46 +01:00
*
2013-02-01 19:07:36 +00:00
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
2013-11-04 01:53:05 +00:00
# include "MultiMC.h"
# include "NewInstanceDialog.h"
# include "ui_NewInstanceDialog.h"
2013-02-01 19:07:36 +00:00
2015-02-09 00:51:14 +00:00
# include <BaseVersion.h>
# include <icons/IconList.h>
# include <tasks/Task.h>
# include <InstanceList.h>
2013-04-22 21:39:41 +01:00
2013-11-04 01:53:05 +00:00
# include "VersionSelectDialog.h"
2013-09-17 23:00:35 +01:00
# include "ProgressDialog.h"
2013-08-10 17:34:08 +01:00
# include "IconPickerDialog.h"
2013-04-22 21:39:41 +01:00
2013-02-01 19:07:36 +00:00
# include <QLayout>
2013-04-22 21:39:41 +01:00
# include <QPushButton>
2015-02-12 21:01:20 +00:00
# include <QFileDialog>
# include <QValidator>
2018-03-19 01:36:12 +00:00
# include <QDialogButtonBox>
2015-02-12 21:01:20 +00:00
2018-03-19 01:36:12 +00:00
# include "widgets/PageContainer.h"
# include <pages/modplatform/VanillaPage.h>
# include <pages/modplatform/FTBPage.h>
# include <pages/modplatform/TwitchPage.h>
2019-07-09 20:51:19 +01:00
# include <pages/modplatform/ImportPage.h>
2018-03-19 01:36:12 +00:00
# include <pages/modplatform/TechnicPage.h>
2013-02-01 19:07:36 +00:00
2019-07-09 21:04:52 +01:00
2017-04-22 05:11:26 +01:00
NewInstanceDialog : : NewInstanceDialog ( const QString & initialGroup , const QString & url , QWidget * parent )
2018-07-15 13:51:05 +01:00
: QDialog ( parent ) , ui ( new Ui : : NewInstanceDialog )
2013-02-01 19:07:36 +00:00
{
2018-07-15 13:51:05 +01:00
ui - > setupUi ( this ) ;
2015-02-12 21:01:20 +00:00
2018-07-15 13:51:05 +01:00
setWindowIcon ( MMC - > getThemedIcon ( " new " ) ) ;
2017-03-19 23:44:49 +00:00
2018-07-15 13:51:05 +01:00
InstIconKey = " default " ;
ui - > iconButton - > setIcon ( MMC - > icons ( ) - > getIcon ( InstIconKey ) ) ;
2015-02-12 21:01:20 +00:00
2018-07-15 13:51:05 +01:00
auto groups = MMC - > instances ( ) - > getGroups ( ) . toSet ( ) ;
auto groupList = QStringList ( groups . toList ( ) ) ;
groupList . sort ( Qt : : CaseInsensitive ) ;
groupList . removeOne ( " " ) ;
groupList . push_front ( initialGroup ) ;
groupList . push_front ( " " ) ;
ui - > groupBox - > addItems ( groupList ) ;
int index = groupList . indexOf ( initialGroup ) ;
if ( index = = - 1 )
{
index = 0 ;
}
ui - > groupBox - > setCurrentIndex ( index ) ;
ui - > groupBox - > lineEdit ( ) - > setPlaceholderText ( tr ( " No group " ) ) ;
2015-08-21 08:00:35 +01:00
2018-02-28 18:42:30 +00:00
2018-07-31 01:20:04 +01:00
// NOTE: m_buttons must be initialized before PageContainer, because it indirectly accesses m_buttons through setSuggestedPack! Do not move this below.
m_buttons = new QDialogButtonBox ( QDialogButtonBox : : Help | QDialogButtonBox : : Ok | QDialogButtonBox : : Cancel ) ;
2018-02-28 18:42:30 +00:00
2018-07-15 13:51:05 +01:00
m_container = new PageContainer ( this ) ;
m_container - > setSizePolicy ( QSizePolicy : : Policy : : Preferred , QSizePolicy : : Policy : : Expanding ) ;
m_container - > layout ( ) - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
ui - > verticalLayout - > insertWidget ( 2 , m_container ) ;
2018-02-28 18:42:30 +00:00
2018-07-15 13:51:05 +01:00
m_container - > addButtons ( m_buttons ) ;
2018-07-22 23:49:26 +01:00
// Bonk Qt over its stupid head and make sure it understands which button is the default one...
// See: https://stackoverflow.com/questions/24556831/qbuttonbox-set-default-button
auto OkButton = m_buttons - > button ( QDialogButtonBox : : Ok ) ;
OkButton - > setDefault ( true ) ;
OkButton - > setAutoDefault ( true ) ;
connect ( OkButton , & QPushButton : : clicked , this , & NewInstanceDialog : : accept ) ;
auto CancelButton = m_buttons - > button ( QDialogButtonBox : : Cancel ) ;
CancelButton - > setDefault ( false ) ;
CancelButton - > setAutoDefault ( false ) ;
connect ( CancelButton , & QPushButton : : clicked , this , & NewInstanceDialog : : reject ) ;
auto HelpButton = m_buttons - > button ( QDialogButtonBox : : Help ) ;
HelpButton - > setDefault ( false ) ;
HelpButton - > setAutoDefault ( false ) ;
connect ( HelpButton , & QPushButton : : clicked , m_container , & PageContainer : : help ) ;
2018-03-19 01:36:12 +00:00
2018-07-15 13:51:05 +01:00
if ( ! url . isEmpty ( ) )
{
2019-07-09 21:04:52 +01:00
QUrl actualUrl ( url ) ;
if ( actualUrl . host ( ) = = " www.curseforge.com " ) {
m_container - > selectPage ( " twitch " ) ;
twitchPage - > setUrl ( url ) ;
}
else {
m_container - > selectPage ( " import " ) ;
importPage - > setUrl ( url ) ;
}
2018-07-15 13:51:05 +01:00
}
2018-02-28 18:42:30 +00:00
2018-07-15 13:51:05 +01:00
updateDialogState ( ) ;
2018-03-19 01:36:12 +00:00
2018-07-15 13:51:05 +01:00
restoreGeometry ( QByteArray : : fromBase64 ( MMC - > settings ( ) - > get ( " NewInstanceGeometry " ) . toByteArray ( ) ) ) ;
2013-04-22 21:39:41 +01:00
}
2018-03-27 21:02:57 +01:00
void NewInstanceDialog : : reject ( )
{
2018-07-15 13:51:05 +01:00
MMC - > settings ( ) - > set ( " NewInstanceGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
QDialog : : reject ( ) ;
2018-03-27 21:02:57 +01:00
}
void NewInstanceDialog : : accept ( )
{
2018-07-15 13:51:05 +01:00
MMC - > settings ( ) - > set ( " NewInstanceGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
importIconNow ( ) ;
QDialog : : accept ( ) ;
2018-03-27 21:02:57 +01:00
}
2018-03-19 01:36:12 +00:00
QList < BasePage * > NewInstanceDialog : : getPages ( )
2017-03-19 23:44:49 +00:00
{
2019-07-09 20:51:19 +01:00
importPage = new ImportPage ( this ) ;
2019-07-09 21:04:52 +01:00
twitchPage = new TwitchPage ( this ) ;
2018-07-15 13:51:05 +01:00
return
{
new VanillaPage ( this ) ,
importPage ,
2019-07-09 21:04:52 +01:00
twitchPage ,
new FTBPage ( this )
2018-07-15 13:51:05 +01:00
} ;
2018-03-19 01:36:12 +00:00
}
QString NewInstanceDialog : : dialogTitle ( )
{
2018-07-15 13:51:05 +01:00
return tr ( " New Instance " ) ;
2017-03-19 23:44:49 +00:00
}
2013-05-03 20:41:37 +01:00
NewInstanceDialog : : ~ NewInstanceDialog ( )
2013-04-22 21:39:41 +01:00
{
2018-07-15 13:51:05 +01:00
delete ui ;
2013-04-22 21:39:41 +01:00
}
2018-03-19 01:36:12 +00:00
void NewInstanceDialog : : setSuggestedPack ( const QString & name , InstanceTask * task )
2013-04-22 21:39:41 +01:00
{
2018-07-15 13:51:05 +01:00
creationTask . reset ( task ) ;
ui - > instNameTextBox - > setPlaceholderText ( name ) ;
2018-02-28 18:42:30 +00:00
2018-08-01 23:52:31 +01:00
if ( ! task )
{
ui - > iconButton - > setIcon ( MMC - > icons ( ) - > getIcon ( " default " ) ) ;
importIcon = false ;
}
2018-07-15 13:51:05 +01:00
auto allowOK = task & & ! instName ( ) . isEmpty ( ) ;
m_buttons - > button ( QDialogButtonBox : : Ok ) - > setEnabled ( allowOK ) ;
2013-04-22 21:39:41 +01:00
}
2018-04-07 15:15:58 +01:00
void NewInstanceDialog : : setSuggestedIconFromFile ( const QString & path , const QString & name )
{
2018-07-15 13:51:05 +01:00
importIcon = true ;
importIconPath = path ;
importIconName = name ;
2018-04-07 15:15:58 +01:00
2018-07-15 13:51:05 +01:00
//Hmm, for some reason they can be to small
ui - > iconButton - > setIcon ( QIcon ( path ) ) ;
2018-04-07 15:15:58 +01:00
}
2018-03-19 01:36:12 +00:00
InstanceTask * NewInstanceDialog : : extractTask ( )
2013-04-22 21:39:41 +01:00
{
2018-07-15 13:51:05 +01:00
InstanceTask * extracted = creationTask . get ( ) ;
creationTask . release ( ) ;
extracted - > setName ( instName ( ) ) ;
extracted - > setGroup ( instGroup ( ) ) ;
extracted - > setIcon ( iconKey ( ) ) ;
return extracted ;
2018-03-19 01:36:12 +00:00
}
2013-10-06 13:43:46 +01:00
2018-03-19 01:36:12 +00:00
void NewInstanceDialog : : updateDialogState ( )
{
2018-07-15 13:51:05 +01:00
auto allowOK = creationTask & & ! instName ( ) . isEmpty ( ) ;
2018-07-22 23:49:26 +01:00
auto OkButton = m_buttons - > button ( QDialogButtonBox : : Ok ) ;
if ( OkButton - > isEnabled ( ) ! = allowOK )
{
OkButton - > setEnabled ( allowOK ) ;
}
2013-04-22 21:39:41 +01:00
}
2013-04-22 23:15:18 +01:00
QString NewInstanceDialog : : instName ( ) const
{
2018-07-28 21:08:09 +01:00
auto result = ui - > instNameTextBox - > text ( ) . trimmed ( ) ;
2018-07-15 13:51:05 +01:00
if ( result . size ( ) )
{
2018-07-28 21:08:09 +01:00
return result ;
2018-07-15 13:51:05 +01:00
}
2018-07-28 21:08:09 +01:00
result = ui - > instNameTextBox - > placeholderText ( ) . trimmed ( ) ;
2018-07-15 13:51:05 +01:00
if ( result . size ( ) )
{
2018-07-28 21:08:09 +01:00
return result ;
2018-07-15 13:51:05 +01:00
}
return QString ( ) ;
2013-04-22 23:15:18 +01:00
}
2015-08-21 08:00:35 +01:00
2014-11-08 20:17:28 +00:00
QString NewInstanceDialog : : instGroup ( ) const
{
2018-07-15 13:51:05 +01:00
return ui - > groupBox - > currentText ( ) ;
2014-11-08 20:17:28 +00:00
}
2013-04-22 23:15:18 +01:00
QString NewInstanceDialog : : iconKey ( ) const
{
2018-07-15 13:51:05 +01:00
return InstIconKey ;
2013-04-22 23:15:18 +01:00
}
2013-05-07 03:28:28 +01:00
2013-08-10 17:34:08 +01:00
void NewInstanceDialog : : on_iconButton_clicked ( )
{
2018-07-15 13:51:05 +01:00
importIconNow ( ) ; //so the user can switch back
IconPickerDialog dlg ( this ) ;
dlg . execWithSelection ( InstIconKey ) ;
2013-10-06 13:43:46 +01:00
2018-07-15 13:51:05 +01:00
if ( dlg . result ( ) = = QDialog : : Accepted )
{
InstIconKey = dlg . selectedIconKey ;
ui - > iconButton - > setIcon ( MMC - > icons ( ) - > getIcon ( InstIconKey ) ) ;
importIcon = false ;
}
2013-08-10 17:34:08 +01:00
}
2013-05-07 03:28:28 +01:00
void NewInstanceDialog : : on_instNameTextBox_textChanged ( const QString & arg1 )
{
2018-07-15 13:51:05 +01:00
updateDialogState ( ) ;
2013-05-07 03:28:28 +01:00
}
2018-04-07 15:15:58 +01:00
void NewInstanceDialog : : importIconNow ( )
{
2018-07-15 13:51:05 +01:00
if ( importIcon ) {
MMC - > icons ( ) - > installIcon ( importIconPath , importIconName ) ;
InstIconKey = importIconName ;
importIcon = false ;
}
MMC - > settings ( ) - > set ( " NewInstanceGeometry " , saveGeometry ( ) . toBase64 ( ) ) ;
2018-04-07 15:15:58 +01:00
}