Add option to install mod loader during instance creation
This commit is contained in:
		| @@ -9,6 +9,15 @@ | ||||
| InstanceCreationTask::InstanceCreationTask(BaseVersionPtr version) | ||||
| { | ||||
|     m_version = version; | ||||
|     m_usingLoader = false; | ||||
| } | ||||
|  | ||||
| InstanceCreationTask::InstanceCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loaderVersion) | ||||
| { | ||||
|     m_version = version; | ||||
|     m_usingLoader = true; | ||||
|     m_loader = loader; | ||||
|     m_loaderVersion = loaderVersion; | ||||
| } | ||||
|  | ||||
| void InstanceCreationTask::executeTask() | ||||
| @@ -21,6 +30,8 @@ void InstanceCreationTask::executeTask() | ||||
|         auto components = inst.getPackProfile(); | ||||
|         components->buildingFromScratch(); | ||||
|         components->setComponentVersion("net.minecraft", m_version->descriptor(), true); | ||||
|         if(m_usingLoader) | ||||
|             components->setComponentVersion(m_loader, m_loaderVersion->descriptor(), true); | ||||
|         inst.setName(m_instName); | ||||
|         inst.setIconKey(m_instIcon); | ||||
|         instanceSettings->resumeSave(); | ||||
|   | ||||
| @@ -12,6 +12,7 @@ class InstanceCreationTask : public InstanceTask | ||||
|     Q_OBJECT | ||||
| public: | ||||
|     explicit InstanceCreationTask(BaseVersionPtr version); | ||||
|     explicit InstanceCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loaderVersion); | ||||
|  | ||||
| protected: | ||||
|     //! Entry point for tasks. | ||||
| @@ -19,4 +20,7 @@ protected: | ||||
|  | ||||
| private: /* data */ | ||||
|     BaseVersionPtr m_version; | ||||
|     bool m_usingLoader; | ||||
|     QString m_loader; | ||||
|     BaseVersionPtr m_loaderVersion; | ||||
| }; | ||||
|   | ||||
| @@ -59,6 +59,11 @@ VanillaPage::VanillaPage(NewInstanceDialog *dialog, QWidget *parent) | ||||
|     connect(ui->releaseFilter, &QCheckBox::stateChanged, this, &VanillaPage::filterChanged); | ||||
|     connect(ui->experimentsFilter, &QCheckBox::stateChanged, this, &VanillaPage::filterChanged); | ||||
|     connect(ui->refreshBtn, &QPushButton::clicked, this, &VanillaPage::refresh); | ||||
|  | ||||
|     connect(ui->loaderVersionList, &VersionSelectWidget::selectedVersionChanged, this, &VanillaPage::setSelectedLoaderVersion); | ||||
|     connect(ui->loaderBtnGroup, &QButtonGroup::idToggled, this, &VanillaPage::loaderFilterChanged); | ||||
|     connect(ui->loaderRefreshBtn, &QPushButton::clicked, this, &VanillaPage::loaderRefresh); | ||||
|  | ||||
| } | ||||
|  | ||||
| void VanillaPage::openedImpl() | ||||
| @@ -80,6 +85,13 @@ void VanillaPage::refresh() | ||||
|     ui->versionList->loadList(); | ||||
| } | ||||
|  | ||||
| void VanillaPage::loaderRefresh() | ||||
| { | ||||
|     if(ui->noneFilter->isChecked()) | ||||
|         return; | ||||
|     ui->loaderVersionList->loadList(); | ||||
| } | ||||
|  | ||||
| void VanillaPage::filterChanged() | ||||
| { | ||||
|     QStringList out; | ||||
| @@ -99,6 +111,38 @@ void VanillaPage::filterChanged() | ||||
|     ui->versionList->setFilter(BaseVersionList::TypeRole, new RegexpFilter(regexp, false)); | ||||
| } | ||||
|  | ||||
| void VanillaPage::loaderFilterChanged() | ||||
| { | ||||
|     if(ui->noneFilter->isChecked()) | ||||
|     { | ||||
|         ui->loaderVersionList->setExactFilter(BaseVersionList::ParentVersionRole, "AAA"); // empty list | ||||
|         // TODO: The below message does not show when the add instance window is first opened. This should be fixed. | ||||
|         ui->loaderVersionList->setEmptyString(tr("No mod loader is selected.")); | ||||
|         return; | ||||
|     } | ||||
|     else if(ui->forgeFilter->isChecked()) | ||||
|     { | ||||
|         ui->loaderVersionList->setExactFilter(BaseVersionList::ParentVersionRole, m_selectedVersion->descriptor()); | ||||
|         m_selectedLoader = "net.minecraftforge"; | ||||
|     } | ||||
|     else if(ui->fabricFilter->isChecked()) | ||||
|     { | ||||
|         ui->loaderVersionList->setExactFilter(BaseVersionList::ParentVersionRole, ""); | ||||
|         m_selectedLoader = "net.fabricmc.fabric-loader"; | ||||
|     } | ||||
|     else if(ui->liteLoaderFilter->isChecked()) | ||||
|     { | ||||
|         ui->loaderVersionList->setExactFilter(BaseVersionList::ParentVersionRole, m_selectedVersion->descriptor()); | ||||
|         m_selectedLoader = "com.mumfrey.liteloader"; | ||||
|     } | ||||
|  | ||||
|     auto vlist = APPLICATION->metadataIndex()->get(m_selectedLoader); | ||||
|     ui->loaderVersionList->initialize(vlist.get()); | ||||
|     ui->loaderVersionList->selectRecommended(); | ||||
|     suggestCurrent(); | ||||
|     ui->loaderVersionList->setEmptyString(tr("No versions are currently available for Minecraft %1").arg(m_selectedVersion->descriptor())); | ||||
| } | ||||
|  | ||||
| VanillaPage::~VanillaPage() | ||||
| { | ||||
|     delete ui; | ||||
| @@ -119,6 +163,16 @@ BaseVersionPtr VanillaPage::selectedVersion() const | ||||
|     return m_selectedVersion; | ||||
| } | ||||
|  | ||||
| BaseVersionPtr VanillaPage::selectedLoaderVersion() const | ||||
| { | ||||
|     return m_selectedLoaderVersion; | ||||
| } | ||||
|  | ||||
| QString VanillaPage::selectedLoader() const | ||||
| { | ||||
|     return m_selectedLoader; | ||||
| } | ||||
|  | ||||
| void VanillaPage::suggestCurrent() | ||||
| { | ||||
|     if (!isOpened) | ||||
| @@ -132,7 +186,15 @@ void VanillaPage::suggestCurrent() | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     dialog->setSuggestedPack(m_selectedVersion->descriptor(), new InstanceCreationTask(m_selectedVersion)); | ||||
|     // List is empty if either no mod loader is selected, or no versions are available | ||||
|     if(!ui->loaderVersionList->hasVersions()) | ||||
|         dialog->setSuggestedPack(m_selectedVersion->descriptor(), new InstanceCreationTask(m_selectedVersion)); | ||||
|     else | ||||
|     { | ||||
|         dialog->setSuggestedPack(m_selectedVersion->descriptor(), | ||||
|                                  new InstanceCreationTask(m_selectedVersion, m_selectedLoader, | ||||
|                                                           m_selectedLoaderVersion)); | ||||
|     } | ||||
|     dialog->setSuggestedIcon("default"); | ||||
| } | ||||
|  | ||||
| @@ -140,4 +202,11 @@ void VanillaPage::setSelectedVersion(BaseVersionPtr version) | ||||
| { | ||||
|     m_selectedVersion = version; | ||||
|     suggestCurrent(); | ||||
|     loaderFilterChanged(); | ||||
| } | ||||
|  | ||||
| void VanillaPage::setSelectedLoaderVersion(BaseVersionPtr version) | ||||
| { | ||||
|     m_selectedLoaderVersion = version; | ||||
|     suggestCurrent(); | ||||
| } | ||||
|   | ||||
| @@ -77,15 +77,20 @@ public: | ||||
|     void openedImpl() override; | ||||
|  | ||||
|     BaseVersionPtr selectedVersion() const; | ||||
|     BaseVersionPtr selectedLoaderVersion() const; | ||||
|     QString selectedLoader() const; | ||||
|  | ||||
| public slots: | ||||
|     void setSelectedVersion(BaseVersionPtr version); | ||||
|     void setSelectedLoaderVersion(BaseVersionPtr version); | ||||
|  | ||||
| private slots: | ||||
|     void filterChanged(); | ||||
|     void loaderFilterChanged(); | ||||
|  | ||||
| private: | ||||
|     void refresh(); | ||||
|     void loaderRefresh(); | ||||
|     void suggestCurrent(); | ||||
|  | ||||
| private: | ||||
| @@ -94,4 +99,6 @@ private: | ||||
|     Ui::VanillaPage *ui = nullptr; | ||||
|     bool m_versionSetByUser = false; | ||||
|     BaseVersionPtr m_selectedVersion; | ||||
|     BaseVersionPtr m_selectedLoaderVersion; | ||||
|     QString m_selectedLoader; | ||||
| }; | ||||
|   | ||||
| @@ -33,113 +33,221 @@ | ||||
|        <string notr="true"/> | ||||
|       </attribute> | ||||
|       <layout class="QGridLayout" name="gridLayout_2"> | ||||
|        <item row="0" column="1"> | ||||
|         <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|          <item> | ||||
|           <widget class="QLabel" name="label"> | ||||
|            <property name="text"> | ||||
|             <string>Filter</string> | ||||
|            </property> | ||||
|            <property name="alignment"> | ||||
|             <set>Qt::AlignCenter</set> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="releaseFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Releases</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|            <property name="checked"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="snapshotFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Snapshots</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="oldSnapshotFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Old Snapshots</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="betaFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Betas</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="alphaFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Alphas</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="experimentsFilter"> | ||||
|            <property name="text"> | ||||
|             <string>Experiments</string> | ||||
|            </property> | ||||
|            <property name="checkable"> | ||||
|             <bool>true</bool> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <spacer name="verticalSpacer"> | ||||
|            <property name="orientation"> | ||||
|             <enum>Qt::Vertical</enum> | ||||
|            </property> | ||||
|            <property name="sizeHint" stdset="0"> | ||||
|             <size> | ||||
|              <width>20</width> | ||||
|              <height>40</height> | ||||
|             </size> | ||||
|            </property> | ||||
|           </spacer> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QPushButton" name="refreshBtn"> | ||||
|            <property name="text"> | ||||
|             <string>Refresh</string> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|         </layout> | ||||
|        </item> | ||||
|        <item row="0" column="0"> | ||||
|         <widget class="VersionSelectWidget" name="versionList" native="true"> | ||||
|        <item row="2" column="0"> | ||||
|         <widget class="Line" name="line"> | ||||
|          <property name="sizePolicy"> | ||||
|           <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> | ||||
|           <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> | ||||
|            <horstretch>0</horstretch> | ||||
|            <verstretch>0</verstretch> | ||||
|           </sizepolicy> | ||||
|          </property> | ||||
|          <property name="orientation"> | ||||
|           <enum>Qt::Horizontal</enum> | ||||
|          </property> | ||||
|         </widget> | ||||
|        </item> | ||||
|        <item row="0" column="0"> | ||||
|         <layout class="QHBoxLayout" name="minecraftLayout"> | ||||
|          <item> | ||||
|           <widget class="VersionSelectWidget" name="versionList" native="true"> | ||||
|            <property name="sizePolicy"> | ||||
|             <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> | ||||
|              <horstretch>0</horstretch> | ||||
|              <verstretch>0</verstretch> | ||||
|             </sizepolicy> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|            <item> | ||||
|             <widget class="QLabel" name="label"> | ||||
|              <property name="text"> | ||||
|               <string>Filter</string> | ||||
|              </property> | ||||
|              <property name="alignment"> | ||||
|               <set>Qt::AlignCenter</set> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="releaseFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Releases</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|              <property name="checked"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="snapshotFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Snapshots</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="oldSnapshotFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Old Snapshots</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="betaFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Betas</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="alphaFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Alphas</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QCheckBox" name="experimentsFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Experiments</string> | ||||
|              </property> | ||||
|              <property name="checkable"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <spacer name="verticalSpacer"> | ||||
|              <property name="orientation"> | ||||
|               <enum>Qt::Vertical</enum> | ||||
|              </property> | ||||
|              <property name="sizeHint" stdset="0"> | ||||
|               <size> | ||||
|                <width>20</width> | ||||
|                <height>40</height> | ||||
|               </size> | ||||
|              </property> | ||||
|             </spacer> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QPushButton" name="refreshBtn"> | ||||
|              <property name="text"> | ||||
|               <string>Refresh</string> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|           </layout> | ||||
|          </item> | ||||
|         </layout> | ||||
|        </item> | ||||
|        <item row="4" column="0"> | ||||
|         <layout class="QHBoxLayout" name="loaderLayout"> | ||||
|          <item> | ||||
|           <widget class="VersionSelectWidget" name="loaderVersionList" native="true"> | ||||
|            <property name="sizePolicy"> | ||||
|             <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> | ||||
|              <horstretch>0</horstretch> | ||||
|              <verstretch>0</verstretch> | ||||
|             </sizepolicy> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||
|            <item> | ||||
|             <widget class="QLabel" name="loaderLabel"> | ||||
|              <property name="text"> | ||||
|               <string>Mod Loader</string> | ||||
|              </property> | ||||
|              <property name="alignment"> | ||||
|               <set>Qt::AlignCenter</set> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QRadioButton" name="noneFilter"> | ||||
|              <property name="text"> | ||||
|               <string>None</string> | ||||
|              </property> | ||||
|              <property name="checked"> | ||||
|               <bool>true</bool> | ||||
|              </property> | ||||
|              <attribute name="buttonGroup"> | ||||
|               <string notr="true">loaderBtnGroup</string> | ||||
|              </attribute> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QRadioButton" name="forgeFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Forge</string> | ||||
|              </property> | ||||
|              <attribute name="buttonGroup"> | ||||
|               <string notr="true">loaderBtnGroup</string> | ||||
|              </attribute> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QRadioButton" name="fabricFilter"> | ||||
|              <property name="text"> | ||||
|               <string>Fabric</string> | ||||
|              </property> | ||||
|              <attribute name="buttonGroup"> | ||||
|               <string notr="true">loaderBtnGroup</string> | ||||
|              </attribute> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QRadioButton" name="liteLoaderFilter"> | ||||
|              <property name="text"> | ||||
|               <string>LiteLoader</string> | ||||
|              </property> | ||||
|              <attribute name="buttonGroup"> | ||||
|               <string notr="true">loaderBtnGroup</string> | ||||
|              </attribute> | ||||
|             </widget> | ||||
|            </item> | ||||
|            <item> | ||||
|             <spacer name="verticalSpacer_2"> | ||||
|              <property name="orientation"> | ||||
|               <enum>Qt::Vertical</enum> | ||||
|              </property> | ||||
|              <property name="sizeHint" stdset="0"> | ||||
|               <size> | ||||
|                <width>20</width> | ||||
|                <height>40</height> | ||||
|               </size> | ||||
|              </property> | ||||
|             </spacer> | ||||
|            </item> | ||||
|            <item> | ||||
|             <widget class="QPushButton" name="loaderRefreshBtn"> | ||||
|              <property name="text"> | ||||
|               <string>Refresh</string> | ||||
|              </property> | ||||
|             </widget> | ||||
|            </item> | ||||
|           </layout> | ||||
|          </item> | ||||
|         </layout> | ||||
|        </item> | ||||
|       </layout> | ||||
|      </widget> | ||||
|     </widget> | ||||
| @@ -166,4 +274,7 @@ | ||||
|  </tabstops> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
|  <buttongroups> | ||||
|   <buttongroup name="loaderBtnGroup"/> | ||||
|  </buttongroups> | ||||
| </ui> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user