fix: handling of incomplete mods
(i.e. mods without ModDetails that may have metadata)
This commit is contained in:
@ -58,8 +58,6 @@ Mod::Mod(const QFileInfo& file)
|
||||
|
||||
Mod::Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata)
|
||||
: m_file(mods_dir.absoluteFilePath(metadata.filename))
|
||||
// It is weird, but name is not reliable for comparing with the JAR files name
|
||||
// FIXME: Maybe use hash when implemented?
|
||||
, m_internal_id(metadata.filename)
|
||||
, m_name(metadata.name)
|
||||
{
|
||||
@ -131,7 +129,7 @@ auto Mod::enable(bool value) -> bool
|
||||
return false;
|
||||
} else {
|
||||
path += ".disabled";
|
||||
|
||||
|
||||
if (!file.rename(path))
|
||||
return false;
|
||||
}
|
||||
@ -145,16 +143,22 @@ auto Mod::enable(bool value) -> bool
|
||||
|
||||
void Mod::setStatus(ModStatus status)
|
||||
{
|
||||
if(m_localDetails.get())
|
||||
if (m_localDetails) {
|
||||
m_localDetails->status = status;
|
||||
} else {
|
||||
m_temp_status = status;
|
||||
}
|
||||
}
|
||||
void Mod::setMetadata(Metadata::ModStruct* metadata)
|
||||
{
|
||||
if(status() == ModStatus::NoMetadata)
|
||||
if (status() == ModStatus::NoMetadata)
|
||||
setStatus(ModStatus::Installed);
|
||||
|
||||
if(m_localDetails.get())
|
||||
if (m_localDetails) {
|
||||
m_localDetails->metadata.reset(metadata);
|
||||
} else {
|
||||
m_temp_metadata.reset(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
auto Mod::destroy(QDir& index_dir) -> bool
|
||||
@ -205,20 +209,36 @@ auto Mod::authors() const -> QStringList
|
||||
|
||||
auto Mod::status() const -> ModStatus
|
||||
{
|
||||
if (!m_localDetails)
|
||||
return m_temp_status;
|
||||
return details().status;
|
||||
}
|
||||
|
||||
auto Mod::metadata() -> std::shared_ptr<Metadata::ModStruct>
|
||||
{
|
||||
if (m_localDetails)
|
||||
return m_localDetails->metadata;
|
||||
return m_temp_metadata;
|
||||
}
|
||||
|
||||
auto Mod::metadata() const -> const std::shared_ptr<Metadata::ModStruct>
|
||||
{
|
||||
if (m_localDetails)
|
||||
return m_localDetails->metadata;
|
||||
return m_temp_metadata;
|
||||
}
|
||||
|
||||
void Mod::finishResolvingWithDetails(std::shared_ptr<ModDetails> details)
|
||||
{
|
||||
m_resolving = false;
|
||||
m_resolved = true;
|
||||
m_localDetails = details;
|
||||
|
||||
if (status() != ModStatus::NoMetadata
|
||||
&& m_temp_metadata.get()
|
||||
&& m_temp_metadata->isValid() &&
|
||||
m_localDetails.get()) {
|
||||
|
||||
m_localDetails->metadata.swap(m_temp_metadata);
|
||||
if (m_localDetails && m_temp_metadata && m_temp_metadata->isValid()) {
|
||||
m_localDetails->metadata = m_temp_metadata;
|
||||
if (status() == ModStatus::NoMetadata)
|
||||
setStatus(ModStatus::Installed);
|
||||
}
|
||||
|
||||
setStatus(m_temp_status);
|
||||
}
|
||||
|
Reference in New Issue
Block a user