feat: add update mods to the ui / mod model
Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
6e2869834f
commit
2d10c246a8
@ -259,6 +259,18 @@ bool ModFolderModel::isValid()
|
|||||||
return m_dir.exists() && m_dir.isReadable();
|
return m_dir.exists() && m_dir.isReadable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto ModFolderModel::selectedMods(QModelIndexList& indexes) -> std::list<Mod>
|
||||||
|
{
|
||||||
|
std::list<Mod> selected_mods;
|
||||||
|
for (auto i : indexes) {
|
||||||
|
if(i.column() != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
selected_mods.push_back(mods[i.row()]);
|
||||||
|
}
|
||||||
|
return selected_mods;
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: this does not take disabled mod (with extra .disable extension) into account...
|
// FIXME: this does not take disabled mod (with extra .disable extension) into account...
|
||||||
bool ModFolderModel::installMod(const QString &filename)
|
bool ModFolderModel::installMod(const QString &filename)
|
||||||
{
|
{
|
||||||
|
@ -144,6 +144,8 @@ public:
|
|||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto selectedMods(QModelIndexList& indexes) -> std::list<Mod>;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void disableInteraction(bool disabled);
|
void disableInteraction(bool disabled);
|
||||||
|
|
||||||
|
@ -147,6 +147,17 @@
|
|||||||
<string>Download a new resource</string>
|
<string>Download a new resource</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionUpdateItem">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Check for &Updates</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>"Tries to find / update all selected resources (all resources if none is selected)"</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "ui/GuiUtil.h"
|
#include "ui/GuiUtil.h"
|
||||||
#include "ui/dialogs/CustomMessageBox.h"
|
#include "ui/dialogs/CustomMessageBox.h"
|
||||||
#include "ui/dialogs/ModDownloadDialog.h"
|
#include "ui/dialogs/ModDownloadDialog.h"
|
||||||
|
#include "ui/dialogs/ModUpdateDialog.h"
|
||||||
|
|
||||||
#include "DesktopServices.h"
|
#include "DesktopServices.h"
|
||||||
|
|
||||||
@ -78,6 +79,23 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr<ModFolderModel>
|
|||||||
ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem);
|
ui->actionsToolbar->insertActionBefore(ui->actionAddItem, ui->actionDownloadItem);
|
||||||
|
|
||||||
connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::installMods);
|
connect(ui->actionDownloadItem, &QAction::triggered, this, &ModFolderPage::installMods);
|
||||||
|
|
||||||
|
ui->actionUpdateItem->setToolTip(tr("Tries to find / update all selected mods (all mods if none is selected)"));
|
||||||
|
ui->actionsToolbar->insertActionAfter(ui->actionAddItem, ui->actionUpdateItem);
|
||||||
|
connect(ui->actionUpdateItem, &QAction::triggered, this, &ModFolderPage::updateMods);
|
||||||
|
|
||||||
|
connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this,
|
||||||
|
[this] { ui->actionUpdateItem->setEnabled(ui->treeView->selectionModel()->hasSelection() || !m_model->empty()); });
|
||||||
|
|
||||||
|
connect(mods.get(), &ModFolderModel::rowsInserted, this,
|
||||||
|
[this] { ui->actionUpdateItem->setEnabled(ui->treeView->selectionModel()->hasSelection() || !m_model->empty()); });
|
||||||
|
|
||||||
|
connect(mods.get(), &ModFolderModel::updateFinished, this, [this, mods] {
|
||||||
|
ui->actionUpdateItem->setEnabled(ui->treeView->selectionModel()->hasSelection() || !m_model->empty());
|
||||||
|
|
||||||
|
// Prevent a weird crash when trying to open the mods page twice in a session o.O
|
||||||
|
disconnect(mods.get(), &ModFolderModel::updateFinished, this, 0);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +125,6 @@ bool CoreModFolderPage::shouldDisplay() const
|
|||||||
return false;
|
return false;
|
||||||
if (version->getComponent("net.minecraft")->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate)
|
if (version->getComponent("net.minecraft")->getReleaseDateTime() < g_VersionFilterData.legacyCutoffDate)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -118,7 +135,7 @@ void ModFolderPage::installMods()
|
|||||||
return;
|
return;
|
||||||
if (m_instance->typeName() != "Minecraft")
|
if (m_instance->typeName() != "Minecraft")
|
||||||
return; // this is a null instance or a legacy instance
|
return; // this is a null instance or a legacy instance
|
||||||
|
|
||||||
auto profile = static_cast<MinecraftInstance*>(m_instance)->getPackProfile();
|
auto profile = static_cast<MinecraftInstance*>(m_instance)->getPackProfile();
|
||||||
if (profile->getModLoaders() == ModAPI::Unspecified) {
|
if (profile->getModLoaders() == ModAPI::Unspecified) {
|
||||||
QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!"));
|
QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!"));
|
||||||
@ -140,7 +157,7 @@ void ModFolderPage::installMods()
|
|||||||
QStringList warnings = tasks->warnings();
|
QStringList warnings = tasks->warnings();
|
||||||
if (warnings.count())
|
if (warnings.count())
|
||||||
CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show();
|
CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show();
|
||||||
|
|
||||||
tasks->deleteLater();
|
tasks->deleteLater();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -155,3 +172,58 @@ void ModFolderPage::installMods()
|
|||||||
m_model->update();
|
m_model->update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModFolderPage::updateMods()
|
||||||
|
{
|
||||||
|
auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes();
|
||||||
|
|
||||||
|
auto mods_list = m_model->selectedMods(selection);
|
||||||
|
bool use_all = mods_list.empty();
|
||||||
|
if (use_all)
|
||||||
|
mods_list = m_model->allMods().toStdList();
|
||||||
|
|
||||||
|
ModUpdateDialog update_dialog(this, m_instance, m_model, mods_list);
|
||||||
|
update_dialog.checkCandidates();
|
||||||
|
|
||||||
|
if (update_dialog.aborted()) {
|
||||||
|
CustomMessageBox::selectable(this, tr("Aborted"), tr("The mod updater was aborted!"), QMessageBox::Warning)->show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (update_dialog.noUpdates()) {
|
||||||
|
CustomMessageBox::selectable(this, tr("Update checker"),
|
||||||
|
(mods_list.size() == 1)
|
||||||
|
? tr("'%1' is up-to-date! :)").arg(mods_list.front().name())
|
||||||
|
: tr("All %1mods are up-to-date! :)").arg(use_all ? "" : (tr("selected") + " ")))
|
||||||
|
->exec();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update_dialog.exec()) {
|
||||||
|
ConcurrentTask* tasks = new ConcurrentTask(this);
|
||||||
|
connect(tasks, &Task::failed, [this, tasks](QString reason) {
|
||||||
|
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
|
||||||
|
tasks->deleteLater();
|
||||||
|
});
|
||||||
|
connect(tasks, &Task::aborted, [this, tasks]() {
|
||||||
|
CustomMessageBox::selectable(this, tr("Aborted"), tr("Download stopped by user."), QMessageBox::Information)->show();
|
||||||
|
tasks->deleteLater();
|
||||||
|
});
|
||||||
|
connect(tasks, &Task::succeeded, [this, tasks]() {
|
||||||
|
QStringList warnings = tasks->warnings();
|
||||||
|
if (warnings.count()) {
|
||||||
|
CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show();
|
||||||
|
}
|
||||||
|
tasks->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
|
for (auto task : update_dialog.getTasks()) {
|
||||||
|
tasks->addTask(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgressDialog loadDialog(this);
|
||||||
|
loadDialog.setSkipButton(true, tr("Abort"));
|
||||||
|
loadDialog.execWithTask(tasks);
|
||||||
|
|
||||||
|
m_model->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -56,6 +56,7 @@ class ModFolderPage : public ExternalResourcesPage {
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void installMods();
|
void installMods();
|
||||||
|
void updateMods();
|
||||||
};
|
};
|
||||||
|
|
||||||
class CoreModFolderPage : public ModFolderPage {
|
class CoreModFolderPage : public ModFolderPage {
|
||||||
|
Loading…
Reference in New Issue
Block a user