1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

perf(smileys): Use lazy smileys loading

This commit is contained in:
Diadlo 2017-10-31 16:28:16 +03:00
parent a764a66471
commit d83400bcdc
No known key found for this signature in database
GPG Key ID: 5AF9F2E29107C727
2 changed files with 15 additions and 5 deletions

View File

@ -203,18 +203,18 @@ bool SmileyPack::load(const QString& filename)
const int iconsCount = emoticonElements.size(); const int iconsCount = emoticonElements.size();
emoticons.clear(); emoticons.clear();
emoticonToIcon.clear(); emoticonToIcon.clear();
emoticonToPath.clear();
icons.clear(); icons.clear();
icons.reserve(iconsCount);
for (int i = 0; i < iconsCount; ++i) { for (int i = 0; i < iconsCount; ++i) {
QDomNode node = emoticonElements.at(i); QDomNode node = emoticonElements.at(i);
QString iconName = node.attributes().namedItem(itemName).nodeValue(); QString iconName = node.attributes().namedItem(itemName).nodeValue();
QString iconPath = QDir{path}.filePath(iconName); QString iconPath = QDir{path}.filePath(iconName);
icons.append(QIcon{iconPath});
QDomElement stringElement = node.firstChildElement(childName); QDomElement stringElement = node.firstChildElement(childName);
QStringList emoticonList; QStringList emoticonList;
while (!stringElement.isNull()) { while (!stringElement.isNull()) {
QString emoticon = stringElement.text().replace("<", "&lt;").replace(">", "&gt;"); QString emoticon = stringElement.text().replace("<", "&lt;").replace(">", "&gt;");
emoticonToIcon.insert(emoticon, &icons[i]); emoticonToPath.insert(emoticon, iconPath);
emoticonList.append(emoticon); emoticonList.append(emoticon);
stringElement = stringElement.nextSibling().toElement(); stringElement = stringElement.nextSibling().toElement();
} }
@ -243,7 +243,7 @@ QString SmileyPack::smileyfied(const QString& msg)
QString key = match.captured(); QString key = match.captured();
int startPos = match.capturedStart(); int startPos = match.capturedStart();
int keyLength = key.length(); int keyLength = key.length();
if (emoticonToIcon.contains(key)) { if (emoticonToPath.contains(key)) {
QString imgRichText = getAsRichText(key); QString imgRichText = getAsRichText(key);
result.replace(startPos + replaceDiff, keyLength, imgRichText); result.replace(startPos + replaceDiff, keyLength, imgRichText);
replaceDiff += imgRichText.length() - keyLength; replaceDiff += imgRichText.length() - keyLength;
@ -270,7 +270,16 @@ QList<QStringList> SmileyPack::getEmoticons() const
QIcon SmileyPack::getAsIcon(const QString& emoticon) QIcon SmileyPack::getAsIcon(const QString& emoticon)
{ {
QMutexLocker locker(&loadingMutex); QMutexLocker locker(&loadingMutex);
return emoticonToIcon.contains(emoticon) ? *(emoticonToIcon[emoticon]) : QIcon(); if (emoticonToIcon.contains(emoticon))
return *(emoticonToIcon[emoticon]);
if (!emoticonToPath.contains(emoticon))
return QIcon{};
const QString& iconPath = emoticonToPath[emoticon];
icons.append(QIcon{iconPath});
emoticonToIcon.insert(emoticon, &icons.last());
return icons.last();
} }
void SmileyPack::onSmileyPackChanged() void SmileyPack::onSmileyPackChanged()

View File

@ -49,6 +49,7 @@ private:
QVector<QIcon> icons; QVector<QIcon> icons;
QMap<QString, const QIcon*> emoticonToIcon; QMap<QString, const QIcon*> emoticonToIcon;
QMap<QString, QString> emoticonToPath;
QList<QStringList> emoticons; QList<QStringList> emoticons;
QString path; QString path;
mutable QMutex loadingMutex; mutable QMutex loadingMutex;