aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/mod/ModFolderModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/minecraft/mod/ModFolderModel.cpp')
-rw-r--r--launcher/minecraft/mod/ModFolderModel.cpp124
1 files changed, 81 insertions, 43 deletions
diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp
index 5ee08cbf..112d219e 100644
--- a/launcher/minecraft/mod/ModFolderModel.cpp
+++ b/launcher/minecraft/mod/ModFolderModel.cpp
@@ -65,15 +65,21 @@ void ModFolderModel::startWatching()
update();
+ // Watch the mods folder
is_watching = m_watcher->addPath(m_dir.absolutePath());
- if (is_watching)
- {
+ if (is_watching) {
qDebug() << "Started watching " << m_dir.absolutePath();
- }
- else
- {
+ } else {
qDebug() << "Failed to start watching " << m_dir.absolutePath();
}
+
+ // Watch the mods index folder
+ is_watching = m_watcher->addPath(indexDir().absolutePath());
+ if (is_watching) {
+ qDebug() << "Started watching " << indexDir().absolutePath();
+ } else {
+ qDebug() << "Failed to start watching " << indexDir().absolutePath();
+ }
}
void ModFolderModel::stopWatching()
@@ -82,14 +88,18 @@ void ModFolderModel::stopWatching()
return;
is_watching = !m_watcher->removePath(m_dir.absolutePath());
- if (!is_watching)
- {
+ if (!is_watching) {
qDebug() << "Stopped watching " << m_dir.absolutePath();
- }
- else
- {
+ } else {
qDebug() << "Failed to stop watching " << m_dir.absolutePath();
}
+
+ is_watching = !m_watcher->removePath(indexDir().absolutePath());
+ if (!is_watching) {
+ qDebug() << "Stopped watching " << indexDir().absolutePath();
+ } else {
+ qDebug() << "Failed to stop watching " << indexDir().absolutePath();
+ }
}
bool ModFolderModel::update()
@@ -124,7 +134,7 @@ void ModFolderModel::finishUpdate()
QSet<QString> newSet(newList.begin(), newList.end());
#else
QSet<QString> currentSet = modsIndex.keys().toSet();
- auto & newMods = m_update->mods;
+ auto& newMods = m_update->mods;
QSet<QString> newSet = newMods.keys().toSet();
#endif
@@ -132,19 +142,20 @@ void ModFolderModel::finishUpdate()
{
QSet<QString> kept = currentSet;
kept.intersect(newSet);
- for(auto & keptMod: kept) {
- auto & newMod = newMods[keptMod];
+ for(auto& keptMod : kept) {
+ auto newMod = newMods[keptMod];
auto row = modsIndex[keptMod];
- auto & currentMod = mods[row];
- if(newMod.dateTimeChanged() == currentMod.dateTimeChanged()) {
+ auto currentMod = mods[row];
+ if(newMod->dateTimeChanged() == currentMod->dateTimeChanged()) {
// no significant change, ignore...
continue;
}
- auto & oldMod = mods[row];
- if(oldMod.isResolving()) {
- activeTickets.remove(oldMod.resolutionTicket());
+ auto oldMod = mods[row];
+ if(oldMod->isResolving()) {
+ activeTickets.remove(oldMod->resolutionTicket());
}
- oldMod = newMod;
+
+ mods[row] = newMod;
resolveMod(mods[row]);
emit dataChanged(index(row, 0), index(row, columnCount(QModelIndex()) - 1));
}
@@ -163,9 +174,10 @@ void ModFolderModel::finishUpdate()
int removedIndex = *iter;
beginRemoveRows(QModelIndex(), removedIndex, removedIndex);
auto removedIter = mods.begin() + removedIndex;
- if(removedIter->isResolving()) {
- activeTickets.remove(removedIter->resolutionTicket());
+ if((*removedIter)->isResolving()) {
+ activeTickets.remove((*removedIter)->resolutionTicket());
}
+
mods.erase(removedIter);
endRemoveRows();
}
@@ -191,8 +203,8 @@ void ModFolderModel::finishUpdate()
{
modsIndex.clear();
int idx = 0;
- for(auto & mod: mods) {
- modsIndex[mod.internal_id()] = idx;
+ for(auto mod: mods) {
+ modsIndex[mod->internal_id()] = idx;
idx++;
}
}
@@ -207,17 +219,17 @@ void ModFolderModel::finishUpdate()
}
}
-void ModFolderModel::resolveMod(Mod& m)
+void ModFolderModel::resolveMod(Mod::Ptr m)
{
- if(!m.shouldResolve()) {
+ if(!m->shouldResolve()) {
return;
}
- auto task = new LocalModParseTask(nextResolutionTicket, m.type(), m.fileinfo());
+ auto task = new LocalModParseTask(nextResolutionTicket, m->type(), m->fileinfo());
auto result = task->result();
- result->id = m.internal_id();
+ result->id = m->internal_id();
activeTickets.insert(nextResolutionTicket, result);
- m.setResolving(true, nextResolutionTicket);
+ m->setResolving(true, nextResolutionTicket);
nextResolutionTicket++;
QThreadPool *threadPool = QThreadPool::globalInstance();
connect(task, &LocalModParseTask::finished, this, &ModFolderModel::finishModParse);
@@ -233,8 +245,8 @@ void ModFolderModel::finishModParse(int token)
auto result = *iter;
activeTickets.remove(token);
int row = modsIndex[result->id];
- auto & mod = mods[row];
- mod.finishResolvingWithDetails(result->details);
+ auto mod = mods[row];
+ mod->finishResolvingWithDetails(result->details);
emit dataChanged(index(row), index(row, columnCount(QModelIndex()) - 1));
}
@@ -259,6 +271,18 @@ bool ModFolderModel::isValid()
return m_dir.exists() && m_dir.isReadable();
}
+auto ModFolderModel::selectedMods(QModelIndexList& indexes) -> QList<Mod::Ptr>
+{
+ QList<Mod::Ptr> 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...
bool ModFolderModel::installMod(const QString &filename)
{
@@ -344,6 +368,20 @@ bool ModFolderModel::installMod(const QString &filename)
return false;
}
+bool ModFolderModel::uninstallMod(const QString& filename, bool preserve_metadata)
+{
+
+ for(auto mod : allMods()){
+ if(mod->fileinfo().fileName() == filename){
+ auto index_dir = indexDir();
+ mod->destroy(index_dir, preserve_metadata);
+ return true;
+ }
+ }
+
+ return false;
+}
+
bool ModFolderModel::setModStatus(const QModelIndexList& indexes, ModStatusAction enable)
{
if(interaction_disabled) {
@@ -377,9 +415,9 @@ bool ModFolderModel::deleteMods(const QModelIndexList& indexes)
if(i.column() != 0) {
continue;
}
- Mod &m = mods[i.row()];
+ auto m = mods[i.row()];
auto index_dir = indexDir();
- m.destroy(index_dir);
+ m->destroy(index_dir);
}
return true;
}
@@ -406,9 +444,9 @@ QVariant ModFolderModel::data(const QModelIndex &index, int role) const
switch (column)
{
case NameColumn:
- return mods[row].name();
+ return mods[row]->name();
case VersionColumn: {
- switch(mods[row].type()) {
+ switch(mods[row]->type()) {
case Mod::MOD_FOLDER:
return tr("Folder");
case Mod::MOD_SINGLEFILE:
@@ -416,23 +454,23 @@ QVariant ModFolderModel::data(const QModelIndex &index, int role) const
default:
break;
}
- return mods[row].version();
+ return mods[row]->version();
}
case DateColumn:
- return mods[row].dateTimeChanged();
+ return mods[row]->dateTimeChanged();
default:
return QVariant();
}
case Qt::ToolTipRole:
- return mods[row].internal_id();
+ return mods[row]->internal_id();
case Qt::CheckStateRole:
switch (column)
{
case ActiveColumn:
- return mods[row].enabled() ? Qt::Checked : Qt::Unchecked;
+ return mods[row]->enabled() ? Qt::Checked : Qt::Unchecked;
default:
return QVariant();
}
@@ -472,20 +510,20 @@ bool ModFolderModel::setModStatus(int row, ModFolderModel::ModStatusAction actio
break;
case Toggle:
default:
- desiredStatus = !mod.enabled();
+ desiredStatus = !mod->enabled();
break;
}
- if(desiredStatus == mod.enabled()) {
+ if(desiredStatus == mod->enabled()) {
return true;
}
// preserve the row, but change its ID
- auto oldId = mod.internal_id();
- if(!mod.enable(!mod.enabled())) {
+ auto oldId = mod->internal_id();
+ if(!mod->enable(!mod->enabled())) {
return false;
}
- auto newId = mod.internal_id();
+ auto newId = mod->internal_id();
if(modsIndex.contains(newId)) {
// NOTE: this could handle a corner case, where we are overwriting a file, because the same 'mod' exists both enabled and disabled
// But is it necessary?