Browse Source

Merge pull request #4100 from IvanSavenko/launcher_fix_drag_lag

Fix lag on dragging mod list in Launcher on Android
Ivan Savenko 1 year ago
parent
commit
a33a37b1a4
2 changed files with 25 additions and 3 deletions
  1. 21 2
      launcher/modManager/cmodlist.cpp
  2. 4 1
      launcher/modManager/cmodlist.h

+ 21 - 2
launcher/modManager/cmodlist.cpp

@@ -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;

+ 4 - 1
launcher/modManager/cmodlist.h

@@ -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