1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-15 01:24:45 +02:00

Restored display of enabled and disabled mods in Launcher

This commit is contained in:
Ivan Savenko
2024-11-14 18:43:41 +00:00
parent ac3aecba81
commit 37e975036c
7 changed files with 36 additions and 43 deletions

View File

@ -258,10 +258,12 @@ QString CModListView::genChangelogText(const ModState & mod)
return result; return result;
} }
QStringList CModListView::getModNames(QStringList input) QStringList CModListView::getModNames(QString queryingModID, QStringList input)
{ {
QStringList result; QStringList result;
auto queryingMod = modStateModel->getMod(queryingModID);
for(const auto & modID : input) for(const auto & modID : input)
{ {
// Missing mod - use mod ID // Missing mod - use mod ID
@ -274,6 +276,9 @@ QStringList CModListView::getModNames(QStringList input)
auto mod = modStateModel->getMod(modID); auto mod = modStateModel->getMod(modID);
if (queryingMod.getParentID() == modID)
continue;
if (mod.isHidden()) if (mod.isHidden())
continue; continue;
@ -281,7 +286,7 @@ QStringList CModListView::getModNames(QStringList input)
if (displayName.isEmpty()) if (displayName.isEmpty())
displayName = modID.toLower(); displayName = modID.toLower();
if (mod.isSubmod()) if (mod.isSubmod() && queryingMod.getParentID() != mod.getParentID() )
{ {
auto parentModID = mod.getTopParentID(); auto parentModID = mod.getTopParentID();
auto parentMod = modStateModel->getMod(parentModID); auto parentMod = modStateModel->getMod(parentModID);
@ -375,8 +380,8 @@ QString CModListView::genModInfoText(const ModState & mod)
result += replaceIfNotEmpty(supportedLanguagesTranslated, lineTemplate.arg(tr("Languages"))); result += replaceIfNotEmpty(supportedLanguagesTranslated, lineTemplate.arg(tr("Languages")));
} }
result += replaceIfNotEmpty(getModNames(mod.getDependencies()), lineTemplate.arg(tr("Required mods"))); result += replaceIfNotEmpty(getModNames(mod.getID(), mod.getDependencies()), lineTemplate.arg(tr("Required mods")));
result += replaceIfNotEmpty(getModNames(mod.getConflicts()), lineTemplate.arg(tr("Conflicting mods"))); result += replaceIfNotEmpty(getModNames(mod.getID(), mod.getConflicts()), lineTemplate.arg(tr("Conflicting mods")));
result += replaceIfNotEmpty(mod.getDescription(), textTemplate.arg(tr("Description"))); result += replaceIfNotEmpty(mod.getDescription(), textTemplate.arg(tr("Description")));
result += "<p></p>"; // to get some empty space result += "<p></p>"; // to get some empty space
@ -389,12 +394,12 @@ QString CModListView::genModInfoText(const ModState & mod)
QString notes; QString notes;
notes += replaceIfNotEmpty(getModNames(findInvalidDependencies(mod.getID())), listTemplate.arg(unknownDeps)); notes += replaceIfNotEmpty(getModNames(mod.getID(), findInvalidDependencies(mod.getID())), listTemplate.arg(unknownDeps));
notes += replaceIfNotEmpty(getModNames(findBlockingMods(mod.getID())), listTemplate.arg(blockingMods)); notes += replaceIfNotEmpty(getModNames(mod.getID(), findBlockingMods(mod.getID())), listTemplate.arg(blockingMods));
if(mod.isEnabled()) if(modStateModel->isModEnabled(mod.getID()))
notes += replaceIfNotEmpty(getModNames(findDependentMods(mod.getID(), true)), listTemplate.arg(hasActiveDependentMods)); notes += replaceIfNotEmpty(getModNames(mod.getID(), findDependentMods(mod.getID(), true)), listTemplate.arg(hasActiveDependentMods));
if(mod.isInstalled()) if(mod.isInstalled())
notes += replaceIfNotEmpty(getModNames(findDependentMods(mod.getID(), false)), listTemplate.arg(hasDependentMods)); notes += replaceIfNotEmpty(getModNames(mod.getID(), findDependentMods(mod.getID(), false)), listTemplate.arg(hasDependentMods));
if(mod.isSubmod()) if(mod.isSubmod())
notes += noteTemplate.arg(thisIsSubmod); notes += noteTemplate.arg(thisIsSubmod);
@ -445,8 +450,8 @@ void CModListView::selectMod(const QModelIndex & index)
bool hasBlockingMods = !findBlockingMods(modName).empty(); bool hasBlockingMods = !findBlockingMods(modName).empty();
bool hasDependentMods = !findDependentMods(modName, true).empty(); bool hasDependentMods = !findDependentMods(modName, true).empty();
ui->disableButton->setVisible(mod.isEnabled()); ui->disableButton->setVisible(modStateModel->isModEnabled(mod.getID()));
ui->enableButton->setVisible(mod.isDisabled()); ui->enableButton->setVisible(!modStateModel->isModEnabled(mod.getID()));
ui->installButton->setVisible(mod.isAvailable() && !mod.isSubmod()); ui->installButton->setVisible(mod.isAvailable() && !mod.isSubmod());
ui->uninstallButton->setVisible(mod.isInstalled() && !mod.isSubmod()); ui->uninstallButton->setVisible(mod.isInstalled() && !mod.isSubmod());
ui->updateButton->setVisible(mod.isUpdateAvailable()); ui->updateButton->setVisible(mod.isUpdateAvailable());
@ -515,7 +520,7 @@ QStringList CModListView::findBlockingMods(QString modUnderTest)
{ {
auto mod = modStateModel->getMod(name); auto mod = modStateModel->getMod(name);
if(mod.isEnabled()) if(modStateModel->isModEnabled(mod.getID()))
{ {
// one of enabled mods have requirement (or this mod) marked as conflict // one of enabled mods have requirement (or this mod) marked as conflict
for(const auto & conflict : mod.getConflicts()) for(const auto & conflict : mod.getConflicts())
@ -541,7 +546,7 @@ QStringList CModListView::findDependentMods(QString mod, bool excludeDisabled)
if(current.getDependencies().contains(mod, Qt::CaseInsensitive)) if(current.getDependencies().contains(mod, Qt::CaseInsensitive))
{ {
if(!(current.isDisabled() && excludeDisabled)) if(!(modStateModel->isModEnabled(modName) && excludeDisabled))
ret += modName; ret += modName;
} }
} }
@ -566,7 +571,7 @@ void CModListView::enableModByName(QString modName)
for(const auto & name : mod.getDependencies()) for(const auto & name : mod.getDependencies())
{ {
if(modStateModel->getMod(name).isDisabled()) if(!modStateModel->isModEnabled(name))
manager->enableMod(name); manager->enableMod(name);
} }
} }
@ -582,7 +587,7 @@ void CModListView::on_disableButton_clicked()
void CModListView::disableModByName(QString modName) void CModListView::disableModByName(QString modName)
{ {
if(modStateModel->isModExists(modName) && modStateModel->getMod(modName).isEnabled()) if(modStateModel->isModExists(modName) && modStateModel->isModEnabled(modName))
manager->disableMod(modName); manager->disableMod(modName);
} }
@ -608,7 +613,7 @@ void CModListView::on_uninstallButton_clicked()
if(modStateModel->isModExists(modName) && modStateModel->getMod(modName).isInstalled()) if(modStateModel->isModExists(modName) && modStateModel->getMod(modName).isInstalled())
{ {
if(modStateModel->getMod(modName).isEnabled()) if(modStateModel->isModEnabled(modName))
manager->disableMod(modName); manager->disableMod(modName);
manager->uninstallMod(modName); manager->uninstallMod(modName);
} }
@ -627,14 +632,13 @@ void CModListView::on_installButton_clicked()
auto mod = modStateModel->getMod(name); auto mod = modStateModel->getMod(name);
if(mod.isAvailable()) if(mod.isAvailable())
downloadFile(name + ".zip", mod.getDownloadUrl(), name, mod.getDownloadSizeMegabytes()); downloadFile(name + ".zip", mod.getDownloadUrl(), name, mod.getDownloadSizeMegabytes());
else if(!mod.isEnabled()) else if(modStateModel->isModEnabled(name))
enableModByName(name); enableModByName(name);
} }
for(const auto & name : modStateModel->getMod(modName).getConflicts()) for(const auto & name : modStateModel->getMod(modName).getConflicts())
{ {
auto mod = modStateModel->getMod(name); if(modStateModel->isModEnabled(name))
if(mod.isEnabled())
{ {
//TODO: consider reverse dependencies disabling //TODO: consider reverse dependencies disabling
//TODO: consider if it may be possible for subdependencies to block disabling conflicting mod? //TODO: consider if it may be possible for subdependencies to block disabling conflicting mod?
@ -915,7 +919,7 @@ void CModListView::installMods(QStringList archives)
if(entry.isInstalled()) if(entry.isInstalled())
{ {
// enable mod if installed and enabled // enable mod if installed and enabled
if(entry.isEnabled()) if(modStateModel->isModEnabled(mod))
modsToEnable.push_back(mod); modsToEnable.push_back(mod);
} }
else else
@ -948,12 +952,11 @@ void CModListView::installMods(QStringList archives)
{ {
for(const auto & dependencyName : mod.getDependencies()) for(const auto & dependencyName : mod.getDependencies())
{ {
auto dependency = modStateModel->getMod(dependencyName); if(!modStateModel->isModEnabled(dependencyName))
if(dependency.isDisabled())
manager->enableMod(dependencyName); manager->enableMod(dependencyName);
} }
if(mod.isDisabled() && manager->enableMod(modName)) if(!modStateModel->isModEnabled(modName) && manager->enableMod(modName))
{ {
for(QString child : modStateModel->getSubmods(modName)) for(QString child : modStateModel->getSubmods(modName))
enableMod(child); enableMod(child);
@ -1082,8 +1085,7 @@ bool CModListView::isModAvailable(const QString & modName)
bool CModListView::isModEnabled(const QString & modName) bool CModListView::isModEnabled(const QString & modName)
{ {
auto mod = modStateModel->getMod(modName); return modStateModel->isModEnabled(modName);
return mod.isEnabled();
} }
bool CModListView::isModInstalled(const QString & modName) bool CModListView::isModInstalled(const QString & modName)
@ -1144,13 +1146,13 @@ void CModListView::on_allModsView_doubleClicked(const QModelIndex &index)
return; return;
} }
if(!hasBlockingMods && !hasInvalidDeps && mod.isDisabled()) if(!hasBlockingMods && !hasInvalidDeps && !modStateModel->isModEnabled(modName))
{ {
on_enableButton_clicked(); on_enableButton_clicked();
return; return;
} }
if(!hasDependentMods && !mod.isVisible() && mod.isEnabled()) if(!hasDependentMods && !mod.isVisible() && modStateModel->isModEnabled(modName))
{ {
on_disableButton_clicked(); on_disableButton_clicked();
return; return;

View File

@ -44,7 +44,7 @@ class CModListView : public QWidget
void checkManagerErrors(); void checkManagerErrors();
/// replace mod ID's with proper human-readable mod names /// replace mod ID's with proper human-readable mod names
QStringList getModNames(QStringList input); QStringList getModNames(QString queryingMod, QStringList input);
// find mods unknown to mod list (not present in repo and not installed) // find mods unknown to mod list (not present in repo and not installed)
QStringList findInvalidDependencies(QString mod); QStringList findInvalidDependencies(QString mod);

View File

@ -205,16 +205,6 @@ bool ModState::isHidden() const
return isCompatibility() || getID() == "vcmi" || getID() == "core"; return isCompatibility() || getID() == "vcmi" || getID() == "core";
} }
bool ModState::isDisabled() const
{
return false; // TODO
}
bool ModState::isEnabled() const
{
return true; // TODO
}
bool ModState::isAvailable() const bool ModState::isAvailable() const
{ {
return !isInstalled(); return !isInstalled();

View File

@ -61,8 +61,6 @@ public:
bool isVisible() const; bool isVisible() const;
bool isHidden() const; bool isHidden() const;
bool isDisabled() const;
bool isEnabled() const;
bool isAvailable() const; bool isAvailable() const;
bool isInstalled() const; bool isInstalled() const;
bool isUpdateAvailable() const; bool isUpdateAvailable() const;

View File

@ -284,9 +284,9 @@ bool CModFilterModel::filterMatchesCategory(const QModelIndex & source) const
case ModFilterMask::UPDATEABLE: case ModFilterMask::UPDATEABLE:
return mod.isUpdateAvailable(); return mod.isUpdateAvailable();
case ModFilterMask::ENABLED: case ModFilterMask::ENABLED:
return mod.isInstalled() && mod.isEnabled(); return mod.isInstalled() && base->model->isModEnabled(modID);
case ModFilterMask::DISABLED: case ModFilterMask::DISABLED:
return mod.isInstalled() && mod.isDisabled(); return mod.isInstalled() && !base->model->isModEnabled(modID);
} }
assert(0); assert(0);
return false; return false;

View File

@ -70,7 +70,7 @@ bool ModStateModel::isModInstalled(QString modName) const
bool ModStateModel::isModEnabled(QString modName) const bool ModStateModel::isModEnabled(QString modName) const
{ {
return getMod(modName).isEnabled(); // TODO return modManager->isModActive(modName.toStdString());
} }
bool ModStateModel::isModUpdateAvailable(QString modName) const bool ModStateModel::isModUpdateAvailable(QString modName) const

View File

@ -27,6 +27,9 @@ ModDescription::ModDescription(const TModID & fullID, const JsonNode & localConf
{ {
if(getID() != "core") if(getID() != "core")
dependencies.emplace("core"); dependencies.emplace("core");
if (!getParentID().empty())
dependencies.emplace(getParentID());
} }
ModDescription::~ModDescription() = default; ModDescription::~ModDescription() = default;