summaryrefslogtreecommitdiffstats
path: root/application
diff options
context:
space:
mode:
authorJanrupf <werbung.janrupf@t-online.de>2018-02-28 19:42:30 +0100
committerJanrupf <werbung.janrupf@t-online.de>2018-02-28 19:43:56 +0100
commitab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d (patch)
treef37e1c28160f882dd8f224788a985370832d6814 /application
parent1a43f2829743cb88ace3f650d3e060725990c1f1 (diff)
downloadMultiMC-ab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d.tar
MultiMC-ab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d.tar.gz
MultiMC-ab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d.tar.lz
MultiMC-ab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d.tar.xz
MultiMC-ab3fe74c97158fd0f979c15a0d1b0f7eb9976e7d.zip
Added FTB pack selection ad download, WIP
Diffstat (limited to 'application')
-rw-r--r--application/CMakeLists.txt7
-rw-r--r--application/MainWindow.cpp13
-rw-r--r--application/MainWindow.h2
-rw-r--r--application/dialogs/ChooseFtbPackDialog.cpp64
-rw-r--r--application/dialogs/ChooseFtbPackDialog.h32
-rw-r--r--application/dialogs/ChooseFtbPackDialog.ui163
-rw-r--r--application/dialogs/NewInstanceDialog.cpp61
-rw-r--r--application/dialogs/NewInstanceDialog.h14
-rw-r--r--application/dialogs/NewInstanceDialog.ui129
-rw-r--r--application/widgets/FtbModpackListItem.cpp8
-rw-r--r--application/widgets/FtbModpackListItem.h15
11 files changed, 473 insertions, 35 deletions
diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt
index 100785f2..da9a42c6 100644
--- a/application/CMakeLists.txt
+++ b/application/CMakeLists.txt
@@ -153,6 +153,9 @@ SET(MULTIMC_SOURCES
dialogs/VersionSelectDialog.h
dialogs/SkinUploadDialog.cpp
dialogs/SkinUploadDialog.h
+ dialogs/ChooseFtbPackDialog.cpp
+ dialogs/ChooseFtbPackDialog.h
+
# GUI - widgets
widgets/Common.cpp
@@ -186,7 +189,8 @@ SET(MULTIMC_SOURCES
widgets/VersionSelectWidget.h
widgets/ProgressWidget.h
widgets/ProgressWidget.cpp
-
+ widgets/FtbModpackListItem.h
+ widgets/FtbModpackListItem.cpp
# GUI - instance group view
groupview/GroupedProxyModel.cpp
@@ -236,6 +240,7 @@ SET(MULTIMC_UIS
dialogs/UpdateDialog.ui
dialogs/NotificationDialog.ui
dialogs/SkinUploadDialog.ui
+ dialogs/ChooseFtbPackDialog.ui
# Widgets/other
widgets/CustomCommands.ui
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp
index 36b3ba6d..1d36ef8c 100644
--- a/application/MainWindow.cpp
+++ b/application/MainWindow.cpp
@@ -1272,6 +1272,14 @@ void MainWindow::instanceFromVersion(QString instName, QString instGroup, QStrin
// finalizeInstance(newInstance);
}
+void MainWindow::instanceFromFtbPack(FtbPackDownloader *downloader, QString instName, QString instGroup, QString instIcon) {
+ std::unique_ptr<Task> task(MMC->folderProvider()->ftbCreationTask(downloader, instName, instGroup, instIcon));
+ runModalTask(task.get());
+
+ // FIXME: handle instance selection after creation
+ // finalizeInstance(newInstance);
+}
+
void MainWindow::on_actionCopyInstance_triggered()
{
if (!m_selectedInstance)
@@ -1347,7 +1355,10 @@ void MainWindow::addInstance(QString url)
const QUrl modpackUrl = newInstDlg.modpackUrl();
- if (modpackUrl.isValid())
+ if(newInstDlg.isFtbModpackRequested()) {
+ instanceFromFtbPack(newInstDlg.getFtbPackDownloader(), newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey());
+ }
+ else if (modpackUrl.isValid())
{
instanceFromZipPack(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), modpackUrl);
}
diff --git a/application/MainWindow.h b/application/MainWindow.h
index 6fa076bb..e4c281dc 100644
--- a/application/MainWindow.h
+++ b/application/MainWindow.h
@@ -25,6 +25,7 @@
#include "minecraft/auth/MojangAccount.h"
#include "net/NetJob.h"
#include "updater/GoUpdate.h"
+#include <modplatform/FtbPackDownloader.h>
class LaunchController;
class NewsChecker;
@@ -185,6 +186,7 @@ private:
void runModalTask(Task *task);
void instanceFromVersion(QString instName, QString instGroup, QString instIcon, BaseVersionPtr version);
void instanceFromZipPack(QString instName, QString instGroup, QString instIcon, QUrl url);
+ void instanceFromFtbPack(FtbPackDownloader *downloader, QString instName, QString instGroup, QString instIcon);
void finalizeInstance(InstancePtr inst);
private:
diff --git a/application/dialogs/ChooseFtbPackDialog.cpp b/application/dialogs/ChooseFtbPackDialog.cpp
new file mode 100644
index 00000000..ae7c72e1
--- /dev/null
+++ b/application/dialogs/ChooseFtbPackDialog.cpp
@@ -0,0 +1,64 @@
+#include "ChooseFtbPackDialog.h"
+#include "widgets/FtbModpackListItem.h"
+
+ChooseFtbPackDialog::ChooseFtbPackDialog(FtbModpackList modpacks) : ui(new Ui::ChooseFtbPackDialog) {
+ ui->setupUi(this);
+
+ for(int i = 0; i < modpacks.size(); i++) {
+ FtbModpackListItem *item = new FtbModpackListItem(ui->packList, modpacks.at(i));
+
+ item->setText(modpacks.at(i).name);
+ }
+
+ //TODO: Use a model/view instead of a widget
+ connect(ui->packList, &QListWidget::itemClicked, this, &ChooseFtbPackDialog::onListItemClicked);
+ connect(ui->packVersionSelection, &QComboBox::currentTextChanged, this, &ChooseFtbPackDialog::onVersionSelectionItemChanged);
+
+ ui->modpackInfo->setOpenExternalLinks(true);
+
+}
+
+ChooseFtbPackDialog::~ChooseFtbPackDialog(){
+ delete ui;
+}
+
+void ChooseFtbPackDialog::onListItemClicked(QListWidgetItem *item){
+ ui->packVersionSelection->clear();
+ FtbModpack selectedPack = static_cast<FtbModpackListItem*>(item)->getModpack();
+
+ ui->modpackInfo->setHtml("Pack by <b>" + selectedPack.author + "</b>" + "<br>Minecraft " + selectedPack.mcVersion + "<br>"
+ "<br>" + selectedPack.description + "<ul><li>" + selectedPack.mods.replace(";", "</li><li>") + "</li></ul>");
+
+ bool currentAdded = false;
+
+ for(int i = 0; i < selectedPack.oldVersions.size(); i++) {
+ if(selectedPack.currentVersion == selectedPack.oldVersions.at(i)) {
+ currentAdded = true;
+ }
+ ui->packVersionSelection->addItem(selectedPack.oldVersions.at(i));
+ }
+
+ if(!currentAdded) {
+ ui->packVersionSelection->addItem(selectedPack.currentVersion);
+ }
+
+ selected = selectedPack;
+
+}
+
+void ChooseFtbPackDialog::onVersionSelectionItemChanged(QString data) {
+ if(data.isNull() || data.isEmpty()) {
+ selectedVersion = "";
+ return;
+ }
+
+ selectedVersion = data;
+}
+
+FtbModpack ChooseFtbPackDialog::getSelectedModpack() {
+ return selected;
+}
+
+QString ChooseFtbPackDialog::getSelectedVersion() {
+ return selectedVersion;
+}
diff --git a/application/dialogs/ChooseFtbPackDialog.h b/application/dialogs/ChooseFtbPackDialog.h
new file mode 100644
index 00000000..212aa27b
--- /dev/null
+++ b/application/dialogs/ChooseFtbPackDialog.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <QDialog>
+#include <net/NetJob.h>
+#include <modplatform/PackHelpers.h>
+#include "ui_ChooseFtbPackDialog.h"
+#include <modplatform/PackHelpers.h>
+
+namespace Ui {
+ class ChooseFtbPackDialog;
+}
+
+class ChooseFtbPackDialog : public QDialog {
+
+ Q_OBJECT
+
+private:
+ Ui::ChooseFtbPackDialog *ui;
+ FtbModpack selected;
+ QString selectedVersion;
+
+private slots:
+ void onListItemClicked(QListWidgetItem *item);
+ void onVersionSelectionItemChanged(QString data);
+
+public:
+ ChooseFtbPackDialog(FtbModpackList packs);
+ ~ChooseFtbPackDialog();
+
+ FtbModpack getSelectedModpack();
+ QString getSelectedVersion();
+};
diff --git a/application/dialogs/ChooseFtbPackDialog.ui b/application/dialogs/ChooseFtbPackDialog.ui
new file mode 100644
index 00000000..fdf845a9
--- /dev/null
+++ b/application/dialogs/ChooseFtbPackDialog.ui
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ChooseFtbPackDialog</class>
+ <widget class="QDialog" name="ChooseFtbPackDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>730</width>
+ <height>437</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="geometry">
+ <rect>
+ <x>540</x>
+ <y>400</y>
+ <width>176</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>261</width>
+ <height>381</height>
+ </rect>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>259</width>
+ <height>379</height>
+ </rect>
+ </property>
+ <widget class="QListWidget" name="packList">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>261</width>
+ <height>381</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QScrollArea" name="scrollArea_2">
+ <property name="geometry">
+ <rect>
+ <x>280</x>
+ <y>10</y>
+ <width>441</width>
+ <height>381</height>
+ </rect>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>439</width>
+ <height>379</height>
+ </rect>
+ </property>
+ <widget class="QTextBrowser" name="modpackInfo">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>441</width>
+ <height>381</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QComboBox" name="packVersionSelection">
+ <property name="geometry">
+ <rect>
+ <x>450</x>
+ <y>400</y>
+ <width>72</width>
+ <height>25</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel" name="selectedVersionLabel">
+ <property name="geometry">
+ <rect>
+ <x>340</x>
+ <y>400</y>
+ <width>101</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Version selected:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ChooseFtbPackDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>666</x>
+ <y>422</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>889</x>
+ <y>501</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ChooseFtbPackDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>680</x>
+ <y>411</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>524</x>
+ <y>458</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/application/dialogs/NewInstanceDialog.cpp b/application/dialogs/NewInstanceDialog.cpp
index 5424a119..5faf57ac 100644
--- a/application/dialogs/NewInstanceDialog.cpp
+++ b/application/dialogs/NewInstanceDialog.cpp
@@ -25,6 +25,7 @@
#include "VersionSelectDialog.h"
#include "ProgressDialog.h"
#include "IconPickerDialog.h"
+#include "ChooseFtbPackDialog.h"
#include <QLayout>
#include <QPushButton>
@@ -92,9 +93,12 @@ NewInstanceDialog::NewInstanceDialog(const QString & initialGroup, const QString
connect(ui->modpackEdit, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState);
connect(ui->modpackBox, &QRadioButton::clicked, this, &NewInstanceDialog::updateDialogState);
+
connect(ui->versionBox, &QRadioButton::clicked, this, &NewInstanceDialog::updateDialogState);
connect(ui->versionTextBox, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState);
+ connect(ui->ftbBox, &QRadioButton::clicked, this, &NewInstanceDialog::updateDialogState);
+
auto groups = MMC->instances()->getGroups().toSet();
auto groupList = QStringList(groups.toList());
groupList.sort(Qt::CaseInsensitive);
@@ -117,6 +121,14 @@ NewInstanceDialog::NewInstanceDialog(const QString & initialGroup, const QString
ui->modpackBox->setChecked(true);
ui->modpackEdit->setText(url);
}
+
+ ftbPackDownloader = new FtbPackDownloader();
+
+ connect(ftbPackDownloader, &FtbPackDownloader::ready, this, &NewInstanceDialog::ftbPackDataDownloadSuccessfully);
+ connect(ftbPackDownloader, &FtbPackDownloader::packFetchFailed, this, &NewInstanceDialog::ftbPackDataDownloadFailed);
+
+ ftbPackDownloader->fetchModpacks(false);
+
updateDialogState();
}
@@ -147,6 +159,17 @@ void NewInstanceDialog::updateDialogState()
QFileInfo fi(url.fileName());
suggestedName = fi.completeBaseName();
}
+ else if (ui->ftbBox->isChecked())
+ {
+ if(ftbPackDownloader->isValidPackSelected()) {
+ suggestedName = ftbPackDownloader->getSuggestedInstanceName();
+ ui->labelFtbPack->setText(selectedPack.name);
+ }
+
+ }
+
+ ftbModpackRequested = ui->ftbBox->isChecked();
+
if(suggestedName.isEmpty())
{
ui->instNameTextBox->setPlaceholderText(originalPlaceholderText);
@@ -156,9 +179,10 @@ void NewInstanceDialog::updateDialogState()
ui->instNameTextBox->setPlaceholderText(suggestedName);
}
bool allowOK = !instName().isEmpty() && (
- (ui->versionBox->isChecked() && m_selectedVersion) ||
- (ui->modpackBox->isChecked() && ui->modpackEdit->hasAcceptableInput())
- );
+ (ui->versionBox->isChecked() && m_selectedVersion) ||
+ (ui->modpackBox->isChecked() && ui->modpackEdit->hasAcceptableInput()) ||
+ (ui->ftbBox->isChecked() && ftbPackDownloader && ftbPackDownloader->isValidPackSelected() )
+ );
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(allowOK);
}
@@ -271,3 +295,34 @@ void NewInstanceDialog::on_modpackBtn_clicked()
}
}
}
+
+bool NewInstanceDialog::isFtbModpackRequested() {
+ return ftbModpackRequested;
+}
+
+FtbPackDownloader *NewInstanceDialog::getFtbPackDownloader() {
+ return ftbPackDownloader;
+}
+
+void NewInstanceDialog::on_btnChooseFtbPack_clicked() {
+ ChooseFtbPackDialog dl(ftbPackDownloader->getModpacks());
+ dl.exec();
+ if(dl.result() == QDialog::Accepted) {
+ selectedPack = dl.getSelectedModpack();
+ ftbPackDownloader->selectPack(selectedPack, dl.getSelectedVersion());
+ }
+ updateDialogState();
+}
+
+void NewInstanceDialog::ftbPackDataDownloadSuccessfully() {
+ ui->packDataDownloadStatus->setText(tr("(Pack data download complete)"));
+ // ui->labelFtbPack->setText(tr("Disabled for now... not completed!"));
+
+ // Disable for PR
+ ui->ftbBox->setEnabled(true);
+}
+
+void NewInstanceDialog::ftbPackDataDownloadFailed() {
+ ui->packDataDownloadStatus->setText(tr("(Pack data download failed)"));
+}
+
diff --git a/application/dialogs/NewInstanceDialog.h b/application/dialogs/NewInstanceDialog.h
index 820a8d46..9b0f7f53 100644
--- a/application/dialogs/NewInstanceDialog.h
+++ b/application/dialogs/NewInstanceDialog.h
@@ -18,6 +18,8 @@
#include <QDialog>
#include "BaseVersion.h"
+#include "modplatform/FtbPackDownloader.h"
+#include "modplatform/PackHelpers.h"
namespace Ui
{
@@ -42,19 +44,31 @@ public:
QUrl modpackUrl() const;
BaseVersionPtr selectedVersion() const;
+ bool isFtbModpackRequested();
+ FtbPackDownloader* getFtbPackDownloader();
+
private
slots:
void on_btnChangeVersion_clicked();
void on_iconButton_clicked();
void on_modpackBtn_clicked();
+ void on_btnChooseFtbPack_clicked();
void on_instNameTextBox_textChanged(const QString &arg1);
void versionListUpdated();
+ void ftbPackDataDownloadSuccessfully();
+ void ftbPackDataDownloadFailed();
+
private:
Ui::NewInstanceDialog *ui;
bool m_versionSetByUser = false;
+ bool ftbModpackRequested = false;
+
BaseVersionPtr m_selectedVersion;
QString InstIconKey;
QString originalPlaceholderText;
+
+ FtbPackDownloader* ftbPackDownloader;
+ FtbModpack selectedPack;
};
diff --git a/application/dialogs/NewInstanceDialog.ui b/application/dialogs/NewInstanceDialog.ui
index 6b875ff4..428b9c57 100644
--- a/application/dialogs/NewInstanceDialog.ui
+++ b/application/dialogs/NewInstanceDialog.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>281</width>
- <height>404</height>
+ <height>407</height>
</rect>
</property>
<property name="windowTitle">
@@ -107,37 +107,50 @@
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
- <item row="4" column="2">
- <widget class="QToolButton" name="modpackBtn">
+ <item row="5" column="0">
+ <widget class="QRadioButton" name="ftbBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
+ <string>Install FTB Pack</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QToolButton" name="btnChangeVersion">
+ <property name="text">
<string notr="true">...</string>
</property>
</widget>
</item>
- <item row="4" column="0" colspan="2">
- <widget class="FocusLineEdit" name="modpackEdit">
+ <item row="7" column="2">
+ <widget class="QToolButton" name="btnChooseFtbPack">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
- <string notr="true">http://</string>
+ <string>...</string>
</property>
</widget>
</item>
- <item row="2" column="0" colspan="2">
- <widget class="QLineEdit" name="versionTextBox">
- <property name="readOnly">
- <bool>true</bool>
+ <item row="4" column="2">
+ <widget class="QToolButton" name="modpackBtn">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string notr="true">...</string>
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QToolButton" name="btnChangeVersion">
+ <item row="7" column="0" colspan="2">
+ <widget class="QLabel" name="labelFtbPack">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="text">
- <string notr="true">...</string>
+ <string> No Pack choosen</string>
</property>
</widget>
</item>
@@ -158,6 +171,30 @@
</property>
</widget>
</item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLineEdit" name="versionTextBox">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="FocusLineEdit" name="modpackEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string notr="true">http://</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1" colspan="2">
+ <widget class="QLabel" name="packDataDownloadStatus">
+ <property name="text">
+ <string>(Loading Pack data...)</string>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
@@ -219,8 +256,8 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>257</x>
- <y>333</y>
+ <x>266</x>
+ <y>378</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
@@ -235,11 +272,11 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>325</x>
- <y>333</y>
+ <x>271</x>
+ <y>378</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
+ <x>280</x>
<y>274</y>
</hint>
</hints>
@@ -251,12 +288,12 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>81</x>
- <y>229</y>
+ <x>91</x>
+ <y>251</y>
</hint>
<hint type="destinationlabel">
- <x>236</x>
- <y>221</y>
+ <x>240</x>
+ <y>278</y>
</hint>
</hints>
</connection>
@@ -267,12 +304,12 @@
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
- <x>129</x>
- <y>225</y>
+ <x>139</x>
+ <y>251</y>
</hint>
<hint type="destinationlabel">
- <x>328</x>
- <y>229</y>
+ <x>270</x>
+ <y>278</y>
</hint>
</hints>
</connection>
@@ -287,8 +324,8 @@
<y>195</y>
</hint>
<hint type="destinationlabel">
- <x>213</x>
- <y>191</y>
+ <x>223</x>
+ <y>224</y>
</hint>
</hints>
</connection>
@@ -303,8 +340,40 @@
<y>198</y>
</hint>
<hint type="destinationlabel">
- <x>322</x>
- <y>192</y>
+ <x>270</x>
+ <y>224</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>ftbBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>btnChooseFtbPack</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>67</x>
+ <y>301</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>254</x>
+ <y>327</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>ftbBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>labelFtbPack</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>81</x>
+ <y>310</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>73</x>
+ <y>334</y>
</hint>
</hints>
</connection>
diff --git a/application/widgets/FtbModpackListItem.cpp b/application/widgets/FtbModpackListItem.cpp
new file mode 100644
index 00000000..874e0eac
--- /dev/null
+++ b/application/widgets/FtbModpackListItem.cpp
@@ -0,0 +1,8 @@
+#include "FtbModpackListItem.h"
+
+FtbModpackListItem::FtbModpackListItem(QListWidget *list, FtbModpack modpack) : QListWidgetItem(list), modpack(modpack) {
+}
+
+FtbModpack FtbModpackListItem::getModpack(){
+ return modpack;
+}
diff --git a/application/widgets/FtbModpackListItem.h b/application/widgets/FtbModpackListItem.h
new file mode 100644
index 00000000..977cad2d
--- /dev/null
+++ b/application/widgets/FtbModpackListItem.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "QListWidget"
+#include <modplatform/PackHelpers.h>
+
+class FtbModpackListItem : public QListWidgetItem {
+
+private:
+ FtbModpack modpack;
+
+public:
+ FtbModpackListItem(QListWidget *list, FtbModpack modpack);
+ FtbModpack getModpack();
+
+};