diff --git a/launcher/modManager/cmodlistview_moc.cpp b/launcher/modManager/cmodlistview_moc.cpp index 7ccda6006..03e4a2dc6 100644 --- a/launcher/modManager/cmodlistview_moc.cpp +++ b/launcher/modManager/cmodlistview_moc.cpp @@ -457,7 +457,6 @@ void CModListView::selectMod(const QModelIndex & index) //FIXME: this function should be recursive //FIXME: ensure that this is also reflected correctly in "Notes" section of mod description bool hasInvalidDeps = !findInvalidDependencies(modName).empty(); - //bool hasBlockingMods = !findBlockingMods(modName).empty(); bool hasDependentMods = !findDependentMods(modName, true).empty(); ui->disableButton->setVisible(modStateModel->isModEnabled(mod.getID())); @@ -521,29 +520,6 @@ QStringList CModListView::findInvalidDependencies(QString mod) return ret; } -QStringList CModListView::findBlockingMods(QString modUnderTest) -{ - QStringList ret; - auto required = modStateModel->getMod(modUnderTest).getDependencies(); - - for(QString name : modStateModel->getAllMods()) - { - auto mod = modStateModel->getMod(name); - - if(modStateModel->isModEnabled(mod.getID())) - { - // one of enabled mods have requirement (or this mod) marked as conflict - for(const auto & conflict : mod.getConflicts()) - { - if(required.contains(conflict)) - ret.push_back(name); - } - } - } - - return ret; -} - QStringList CModListView::findDependentMods(QString mod, bool excludeDisabled) { QStringList ret; @@ -691,7 +667,9 @@ void CModListView::manualInstallFile(QString filePath) for(const auto widget : qApp->allWidgets()) if(auto settingsView = qobject_cast(widget)) settingsView->loadSettings(); - // TODO: rescan local mods + + modStateModel->reloadLocalState(); + modModel->reloadRepositories(); } } } @@ -879,8 +857,8 @@ void CModListView::installFiles(QStringList files) if(futureExtract.get()) { //update - CResourceHandler::get("initial")->updateFilteredFiles([](const std::string &){ return true; }); - // TODO: rescan local mods + modStateModel->reloadLocalState(); + modModel->reloadRepositories(); } } @@ -1080,7 +1058,6 @@ void CModListView::on_allModsView_doubleClicked(const QModelIndex &index) auto mod = modStateModel->getMod(modName); bool hasInvalidDeps = !findInvalidDependencies(modName).empty(); - bool hasBlockingMods = !findBlockingMods(modName).empty(); bool hasDependentMods = !findDependentMods(modName, true).empty(); if(!hasInvalidDeps && mod.isAvailable() && !mod.isSubmod()) @@ -1105,7 +1082,7 @@ void CModListView::on_allModsView_doubleClicked(const QModelIndex &index) return; } - if(!hasBlockingMods && !hasInvalidDeps && !modStateModel->isModEnabled(modName)) + if(!hasInvalidDeps && !modStateModel->isModEnabled(modName)) { on_enableButton_clicked(); return; diff --git a/launcher/modManager/cmodlistview_moc.h b/launcher/modManager/cmodlistview_moc.h index 1a0789ad7..9e9bf14c6 100644 --- a/launcher/modManager/cmodlistview_moc.h +++ b/launcher/modManager/cmodlistview_moc.h @@ -48,8 +48,6 @@ class CModListView : public QWidget // find mods unknown to mod list (not present in repo and not installed) QStringList findInvalidDependencies(QString mod); - // find mods that block enabling of this mod: conflicting with this mod or one of required mods - QStringList findBlockingMods(QString modUnderTest); // find mods that depend on this one QStringList findDependentMods(QString mod, bool excludeDisabled); diff --git a/launcher/modManager/modstateitemmodel_moc.cpp b/launcher/modManager/modstateitemmodel_moc.cpp index a7f80c3bd..1d1eed937 100644 --- a/launcher/modManager/modstateitemmodel_moc.cpp +++ b/launcher/modManager/modstateitemmodel_moc.cpp @@ -14,17 +14,6 @@ #include -namespace ModStatus -{ -static const QString iconDelete = ":/icons/mod-delete.png"; -static const QString iconDisabled = ":/icons/mod-disabled.png"; -static const QString iconDisabledSubmod = ":/icons/submod-disabled.png"; -static const QString iconDownload = ":/icons/mod-download.png"; -static const QString iconEnabled = ":/icons/mod-enabled.png"; -static const QString iconEnabledSubmod = ":/icons/submod-enabled.png"; -static const QString iconUpdate = ":/icons/mod-update.png"; -} - ModStateItemModel::ModStateItemModel(std::shared_ptr model, QObject * parent) : QAbstractItemModel(parent) , model(model) @@ -109,6 +98,13 @@ QVariant ModStateItemModel::getText(const ModState & mod, int field) const QVariant ModStateItemModel::getIcon(const ModState & mod, int field) const { + static const QString iconDisabled = ":/icons/mod-disabled.png"; + static const QString iconDisabledSubmod = ":/icons/submod-disabled.png"; + static const QString iconDownload = ":/icons/mod-download.png"; + static const QString iconEnabled = ":/icons/mod-enabled.png"; + static const QString iconEnabledSubmod = ":/icons/submod-enabled.png"; + static const QString iconUpdate = ":/icons/mod-update.png"; + if (field == ModFields::STATUS_ENABLED) { if (!model->isModInstalled(mod.getID())) @@ -119,24 +115,24 @@ QVariant ModStateItemModel::getIcon(const ModState & mod, int field) const if (!model->isModEnabled(mod.getTopParentID())) { if (model->isModEnabled(mod.getID())) - return QIcon(ModStatus::iconEnabledSubmod); + return QIcon(iconEnabledSubmod); else - return QIcon(ModStatus::iconDisabledSubmod); + return QIcon(iconDisabledSubmod); } } if (model->isModEnabled(mod.getID())) - return QIcon(ModStatus::iconEnabled); + return QIcon(iconEnabled); else - return QIcon(ModStatus::iconDisabled); + return QIcon(iconDisabled); } if(field == ModFields::STATUS_UPDATE) { if (model->isModUpdateAvailable(mod.getID())) - return QIcon(ModStatus::iconUpdate); + return QIcon(iconUpdate); if (!model->isModInstalled(mod.getID())) - return QIcon(ModStatus::iconDownload); + return QIcon(iconDownload); } return QVariant(); @@ -189,7 +185,7 @@ Qt::ItemFlags ModStateItemModel::flags(const QModelIndex &) const QVariant ModStateItemModel::headerData(int section, Qt::Orientation orientation, int role) const { - static const QString header[ModFields::COUNT] = + static const std::array header = { QT_TRANSLATE_NOOP("ModFields", "Name"), QT_TRANSLATE_NOOP("ModFields", ""), // status icon @@ -198,7 +194,7 @@ QVariant ModStateItemModel::headerData(int section, Qt::Orientation orientation, }; if(role == Qt::DisplayRole && orientation == Qt::Horizontal) - return QCoreApplication::translate("ModFields", header[section].toStdString().c_str()); + return QCoreApplication::translate("ModFields", header[section]); return QVariant(); } @@ -311,7 +307,7 @@ bool CModFilterModel::filterAcceptsRow(int source_row, const QModelIndex & sourc for(size_t i = 0; i < base->rowCount(index); i++) { - if(filterMatchesThis(base->index((int)i, 0, index))) + if(filterMatchesThis(base->index(i, 0, index))) return true; } diff --git a/launcher/modManager/modstateitemmodel_moc.h b/launcher/modManager/modstateitemmodel_moc.h index af29dbce1..22f1da0f4 100644 --- a/launcher/modManager/modstateitemmodel_moc.h +++ b/launcher/modManager/modstateitemmodel_moc.h @@ -69,7 +69,7 @@ class ModStateItemModel final : public QAbstractItemModel QVariant getIcon(const ModState & mod, int field) const; public: - explicit ModStateItemModel(std::shared_ptr model, QObject * parent = nullptr); + explicit ModStateItemModel(std::shared_ptr model, QObject * parent); /// CModListContainer overrides void reloadRepositories(); @@ -81,7 +81,7 @@ public: int rowCount(const QModelIndex & parent) const override; int columnCount(const QModelIndex & parent) const override; - QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const override; + QModelIndex index(int row, int column, const QModelIndex & parent) const override; QModelIndex parent(const QModelIndex & child) const override; Qt::ItemFlags flags(const QModelIndex & index) const override; diff --git a/lib/modding/ContentTypeHandler.cpp b/lib/modding/ContentTypeHandler.cpp index 3c9371c9c..380e98d18 100644 --- a/lib/modding/ContentTypeHandler.cpp +++ b/lib/modding/ContentTypeHandler.cpp @@ -262,11 +262,9 @@ void CContentHandler::init() bool CContentHandler::preloadData(const ModDescription & mod, bool validate) { bool result = true; - if (validate && mod.getID() != ModScope::scopeBuiltin()) // TODO: remove workaround - { - if (!JsonUtils::validate(mod.getLocalConfig(), "vcmi:mod", mod.getID())) - result = false; - } + + if (!JsonUtils::validate(mod.getLocalConfig(), "vcmi:mod", mod.getID())) + result = false; for(auto & handler : handlers) { diff --git a/lib/modding/ModManager.cpp b/lib/modding/ModManager.cpp index 1602b89f6..94b4988cf 100644 --- a/lib/modding/ModManager.cpp +++ b/lib/modding/ModManager.cpp @@ -103,7 +103,7 @@ double ModsState::getInstalledModSizeMegabytes(const TModID & modName) const sizeBytes += boost::filesystem::file_size(*it); } - double sizeMegabytes = sizeBytes / double(1024*1024); + double sizeMegabytes = sizeBytes / static_cast(1024*1024); return sizeMegabytes; } @@ -150,20 +150,19 @@ std::vector ModsState::scanModsDirectory(const std::string & modDir) con /////////////////////////////////////////////////////////////////////////////// -static JsonNode loadModSettings(const JsonPath & path) -{ - if(CResourceHandler::get("local")->existsResource(ResourcePath(path))) - { - return JsonNode(path); - } - // Probably new install. Create initial configuration - CResourceHandler::get("local")->createResource(path.getOriginalName() + ".json"); - return JsonNode(); -} - ModsPresetState::ModsPresetState() { - modConfig = loadModSettings(JsonPath::builtin("config/modSettings.json")); + static const JsonPath settingsPath = JsonPath::builtin("config/modSettings.json"); + + if(CResourceHandler::get("local")->existsResource(ResourcePath(settingsPath))) + { + modConfig = JsonNode(settingsPath); + } + else + { + // Probably new install. Create initial configuration + CResourceHandler::get("local")->createResource(settingsPath.getOriginalName() + ".json"); + } if(modConfig["presets"].isNull()) { @@ -365,7 +364,6 @@ ModManager::ModManager(const JsonNode & repositoryList) : modsState(std::make_unique()) , modsPreset(std::make_unique()) { - //TODO: load only active mods & all their submods in game mode? modsStorage = std::make_unique(modsState->getInstalledMods(), repositoryList); eraseMissingModsFromPreset();