mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
Fix lag on dragging mod list in Launcher on Android
Tested by enabling dragging on desktop. According to profiler, most of time was spent on generating mod information. Cheap to do once, but it looks like Qt does this A LOT. Added simple caching & reduced copying. Seems to be working fine on PC, but not yet confirmed whether same goes for mobile
This commit is contained in:
parent
cffdf1081c
commit
e3ed4eda44
@ -226,11 +226,13 @@ QVariantMap CModList::copyField(QVariantMap data, QString from, QString to) cons
|
||||
|
||||
void CModList::reloadRepositories()
|
||||
{
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
void CModList::resetRepositories()
|
||||
{
|
||||
repositories.clear();
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
void CModList::addRepository(QVariantMap data)
|
||||
@ -238,20 +240,25 @@ void CModList::addRepository(QVariantMap data)
|
||||
for(auto & key : data.keys())
|
||||
data[key.toLower()] = data.take(key);
|
||||
repositories.push_back(copyField(data, "version", "latestVersion"));
|
||||
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
void CModList::setLocalModList(QVariantMap data)
|
||||
{
|
||||
localModList = copyField(data, "version", "installedVersion");
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
void CModList::setModSettings(QVariant data)
|
||||
{
|
||||
modSettings = data.toMap();
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
void CModList::modChanged(QString modID)
|
||||
{
|
||||
cachedMods.clear();
|
||||
}
|
||||
|
||||
static QVariant getValue(QVariant input, QString path)
|
||||
@ -270,9 +277,21 @@ static QVariant getValue(QVariant input, QString path)
|
||||
}
|
||||
}
|
||||
|
||||
CModEntry CModList::getMod(QString modname) const
|
||||
const CModEntry & CModList::getMod(QString modName) const
|
||||
{
|
||||
modName = modName.toLower();
|
||||
|
||||
auto it = cachedMods.find(modName);
|
||||
|
||||
if (it != cachedMods.end())
|
||||
return it.value();
|
||||
|
||||
auto itNew = cachedMods.insert(modName, getModUncached(modName));
|
||||
return *itNew;
|
||||
}
|
||||
|
||||
CModEntry CModList::getModUncached(QString modname) const
|
||||
{
|
||||
modname = modname.toLower();
|
||||
QVariantMap repo;
|
||||
QVariantMap local = localModList[modname].toMap();
|
||||
QVariantMap settings;
|
||||
|
@ -82,8 +82,11 @@ class CModList
|
||||
QVariantMap localModList;
|
||||
QVariantMap modSettings;
|
||||
|
||||
mutable QMap<QString, CModEntry> cachedMods;
|
||||
|
||||
QVariantMap copyField(QVariantMap data, QString from, QString to) const;
|
||||
|
||||
CModEntry getModUncached(QString modname) const;
|
||||
public:
|
||||
virtual void resetRepositories();
|
||||
virtual void reloadRepositories();
|
||||
@ -93,7 +96,7 @@ public:
|
||||
virtual void modChanged(QString modID);
|
||||
|
||||
// returns mod by name. Note: mod MUST exist
|
||||
CModEntry getMod(QString modname) const;
|
||||
const CModEntry & getMod(QString modname) const;
|
||||
|
||||
// returns list of all mods necessary to run selected one, including mod itself
|
||||
// order is: first mods in list don't have any dependencies, last mod is modname
|
||||
|
Loading…
Reference in New Issue
Block a user