NOISSUE fix listing of mods in log, improve display with unicode

This commit is contained in:
Petr Mrázek 2019-08-04 05:08:40 +02:00
parent 6b82e942d0
commit ce4a55bc3b
7 changed files with 145 additions and 40 deletions

View File

@ -213,8 +213,10 @@ set(MINECRAFT_SOURCES
minecraft/auth/flows/RefreshTask.cpp minecraft/auth/flows/RefreshTask.cpp
minecraft/auth/flows/ValidateTask.h minecraft/auth/flows/ValidateTask.h
minecraft/auth/flows/ValidateTask.cpp minecraft/auth/flows/ValidateTask.cpp
minecraft/gameoptions/GameOptions.h minecraft/gameoptions/GameOptions.h
minecraft/gameoptions/GameOptions.cpp minecraft/gameoptions/GameOptions.cpp
minecraft/update/AssetUpdateTask.h minecraft/update/AssetUpdateTask.h
minecraft/update/AssetUpdateTask.cpp minecraft/update/AssetUpdateTask.cpp
minecraft/update/FMLLibrariesTask.cpp minecraft/update/FMLLibrariesTask.cpp
@ -223,6 +225,7 @@ set(MINECRAFT_SOURCES
minecraft/update/FoldersTask.h minecraft/update/FoldersTask.h
minecraft/update/LibrariesTask.cpp minecraft/update/LibrariesTask.cpp
minecraft/update/LibrariesTask.h minecraft/update/LibrariesTask.h
minecraft/launch/ClaimAccount.cpp minecraft/launch/ClaimAccount.cpp
minecraft/launch/ClaimAccount.h minecraft/launch/ClaimAccount.h
minecraft/launch/CreateServerResourcePacksFolder.cpp minecraft/launch/CreateServerResourcePacksFolder.cpp
@ -239,12 +242,16 @@ set(MINECRAFT_SOURCES
minecraft/launch/PrintInstanceInfo.h minecraft/launch/PrintInstanceInfo.h
minecraft/launch/ReconstructAssets.cpp minecraft/launch/ReconstructAssets.cpp
minecraft/launch/ReconstructAssets.h minecraft/launch/ReconstructAssets.h
minecraft/launch/ScanModFolders.cpp
minecraft/launch/ScanModFolders.h
minecraft/legacy/LegacyModList.h minecraft/legacy/LegacyModList.h
minecraft/legacy/LegacyModList.cpp minecraft/legacy/LegacyModList.cpp
minecraft/legacy/LegacyInstance.h minecraft/legacy/LegacyInstance.h
minecraft/legacy/LegacyInstance.cpp minecraft/legacy/LegacyInstance.cpp
minecraft/legacy/LegacyUpgradeTask.h minecraft/legacy/LegacyUpgradeTask.h
minecraft/legacy/LegacyUpgradeTask.cpp minecraft/legacy/LegacyUpgradeTask.cpp
minecraft/GradleSpecifier.h minecraft/GradleSpecifier.h
minecraft/MinecraftInstance.cpp minecraft/MinecraftInstance.cpp
minecraft/MinecraftInstance.h minecraft/MinecraftInstance.h

View File

@ -21,6 +21,7 @@
#include "minecraft/launch/ModMinecraftJar.h" #include "minecraft/launch/ModMinecraftJar.h"
#include "minecraft/launch/ClaimAccount.h" #include "minecraft/launch/ClaimAccount.h"
#include "minecraft/launch/ReconstructAssets.h" #include "minecraft/launch/ReconstructAssets.h"
#include "minecraft/launch/ScanModFolders.h"
#include "java/launch/CheckJava.h" #include "java/launch/CheckJava.h"
#include "java/JavaUtils.h" #include "java/JavaUtils.h"
#include "meta/Index.h" #include "meta/Index.h"
@ -550,37 +551,38 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session)
out << ""; out << "";
} }
if(loaderModList()->size()) auto printModList = [&](const QString & label, ModFolderModel & model) {
{ if(model.size())
out << "Mods:";
for(auto & mod: loaderModList()->allMods())
{ {
if(!mod.enabled()) out << QString("%1:").arg(label);
continue; auto modList = model.allMods();
if(mod.type() == Mod::MOD_FOLDER) std::sort(modList.begin(), modList.end(), [](Mod &a, Mod &b) {
continue; auto aName = a.filename().completeBaseName();
// TODO: proper implementation would need to descend into folders. auto bName = b.filename().completeBaseName();
return aName.localeAwareCompare(bName) < 0;
});
for(auto & mod: modList)
{
if(mod.type() == Mod::MOD_FOLDER)
{
out << u8" [📁] " + mod.filename().completeBaseName() + " (folder)";
continue;
}
out << " " + mod.filename().completeBaseName(); if(mod.enabled()) {
out << u8" [✔️] " + mod.filename().completeBaseName();
}
else {
out << u8" [❌] " + mod.filename().completeBaseName() + " (disabled)";
}
}
out << "";
} }
out << ""; };
}
if(coreModList()->size()) printModList("Mods", *(loaderModList().get()));
{ printModList("Core Mods", *(coreModList().get()));
out << "Core Mods:";
for(auto & coremod: coreModList()->allMods())
{
if(!coremod.enabled())
continue;
if(coremod.type() == Mod::MOD_FOLDER)
continue;
// TODO: proper implementation would need to descend into folders.
out << " " + coremod.filename().completeBaseName();
}
out << "";
}
auto & jarMods = profile->getJarMods(); auto & jarMods = profile->getJarMods();
if(jarMods.size()) if(jarMods.size())
@ -827,6 +829,11 @@ shared_qobject_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPt
process->appendStep(new ModMinecraftJar(pptr)); process->appendStep(new ModMinecraftJar(pptr));
} }
// if there are any jar mods
{
process->appendStep(new ScanModFolders(pptr));
}
// print some instance info here... // print some instance info here...
{ {
process->appendStep(new PrintInstanceInfo(pptr, session)); process->appendStep(new PrintInstanceInfo(pptr, session));

View File

@ -6,7 +6,6 @@
#include <QDir> #include <QDir>
#include "multimc_logic_export.h" #include "multimc_logic_export.h"
class ModsModel;
class ModFolderModel; class ModFolderModel;
class WorldList; class WorldList;
class GameOptions; class GameOptions;
@ -68,7 +67,6 @@ public:
std::shared_ptr<ComponentList> getComponentList() const; std::shared_ptr<ComponentList> getComponentList() const;
////// Mod Lists ////// ////// Mod Lists //////
std::shared_ptr<ModsModel> modsModel() const;
std::shared_ptr<ModFolderModel> loaderModList() const; std::shared_ptr<ModFolderModel> loaderModList() const;
std::shared_ptr<ModFolderModel> coreModList() const; std::shared_ptr<ModFolderModel> coreModList() const;
std::shared_ptr<ModFolderModel> resourcePackList() const; std::shared_ptr<ModFolderModel> resourcePackList() const;
@ -123,7 +121,6 @@ private:
protected: // data protected: // data
std::shared_ptr<ComponentList> m_components; std::shared_ptr<ComponentList> m_components;
mutable std::shared_ptr<ModsModel> m_mods_model;
mutable std::shared_ptr<ModFolderModel> m_loader_mod_list; mutable std::shared_ptr<ModFolderModel> m_loader_mod_list;
mutable std::shared_ptr<ModFolderModel> m_core_mod_list; mutable std::shared_ptr<ModFolderModel> m_core_mod_list;
mutable std::shared_ptr<ModFolderModel> m_resource_pack_list; mutable std::shared_ptr<ModFolderModel> m_resource_pack_list;

View File

@ -0,0 +1,54 @@
/* Copyright 2013-2019 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ScanModFolders.h"
#include "launch/LaunchTask.h"
#include "MMCZip.h"
#include "minecraft/OpSys.h"
#include "FileSystem.h"
#include "minecraft/MinecraftInstance.h"
#include "minecraft/mod/ModFolderModel.h"
void ScanModFolders::executeTask()
{
auto m_inst = std::dynamic_pointer_cast<MinecraftInstance>(m_parent->instance());
auto loaders = m_inst->loaderModList();
connect(loaders.get(), &ModFolderModel::updateFinished, this, &ScanModFolders::modsDone);
loaders->update();
auto cores = m_inst->coreModList();
connect(cores.get(), &ModFolderModel::updateFinished, this, &ScanModFolders::coreModsDone);
cores->update();
}
void ScanModFolders::modsDone()
{
m_modsDone = true;
checkDone();
}
void ScanModFolders::coreModsDone()
{
m_coreModsDone = true;
checkDone();
}
void ScanModFolders::checkDone()
{
if(m_modsDone && m_coreModsDone) {
emitSucceeded();
}
}

View File

@ -0,0 +1,42 @@
/* Copyright 2013-2019 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <launch/LaunchStep.h>
#include <memory>
class ScanModFolders: public LaunchStep
{
Q_OBJECT
public:
explicit ScanModFolders(LaunchTask *parent) : LaunchStep(parent) {};
virtual ~ScanModFolders(){};
virtual void executeTask() override;
virtual bool canAbort() const override
{
return false;
}
private slots:
void coreModsDone();
void modsDone();
private:
void checkDone();
private: // DATA
bool m_modsDone = false;
bool m_coreModsDone = false;
};

View File

@ -81,12 +81,12 @@ bool ModFolderModel::update()
auto task = new ModFolderLoadTask(m_dir); auto task = new ModFolderLoadTask(m_dir);
m_update = task->result(); m_update = task->result();
QThreadPool *threadPool = QThreadPool::globalInstance(); QThreadPool *threadPool = QThreadPool::globalInstance();
connect(task, &ModFolderLoadTask::succeeded, this, &ModFolderModel::updateFinished); connect(task, &ModFolderLoadTask::succeeded, this, &ModFolderModel::finishUpdate);
threadPool->start(task); threadPool->start(task);
return true; return true;
} }
void ModFolderModel::updateFinished() void ModFolderModel::finishUpdate()
{ {
QSet<QString> currentSet = modsIndex.keys().toSet(); QSet<QString> currentSet = modsIndex.keys().toSet();
auto & newMods = m_update->mods; auto & newMods = m_update->mods;
@ -159,7 +159,7 @@ void ModFolderModel::updateFinished()
m_update.reset(); m_update.reset();
emit changed(); emit updateFinished();
if(scheduled_update) { if(scheduled_update) {
scheduled_update = false; scheduled_update = false;
@ -180,11 +180,11 @@ void ModFolderModel::resolveMod(Mod& m)
m.setResolving(true, nextResolutionTicket); m.setResolving(true, nextResolutionTicket);
nextResolutionTicket++; nextResolutionTicket++;
QThreadPool *threadPool = QThreadPool::globalInstance(); QThreadPool *threadPool = QThreadPool::globalInstance();
connect(task, &LocalModParseTask::finished, this, &ModFolderModel::modParseFinished); connect(task, &LocalModParseTask::finished, this, &ModFolderModel::finishModParse);
threadPool->start(task); threadPool->start(task);
} }
void ModFolderModel::modParseFinished(int token) void ModFolderModel::finishModParse(int token)
{ {
auto iter = activeTickets.find(token); auto iter = activeTickets.find(token);
if(iter == activeTickets.end()) { if(iter == activeTickets.end()) {
@ -317,7 +317,6 @@ bool ModFolderModel::enableMods(const QModelIndexList& indexes, bool enable)
m.enable(enable); m.enable(enable);
emit dataChanged(i, i); emit dataChanged(i, i);
} }
emit changed();
return true; return true;
} }
@ -335,7 +334,6 @@ bool ModFolderModel::deleteMods(const QModelIndexList& indexes)
Mod &m = mods[i.row()]; Mod &m = mods[i.row()];
m.destroy(); m.destroy();
} }
emit changed();
return true; return true;
} }

View File

@ -116,11 +116,11 @@ public slots:
private private
slots: slots:
void directoryChanged(QString path); void directoryChanged(QString path);
void updateFinished(); void finishUpdate();
void modParseFinished(int token); void finishModParse(int token);
signals: signals:
void changed(); void updateFinished();
private: private:
void resolveMod(Mod& m); void resolveMod(Mod& m);