Skip to content
This repository has been archived by the owner on Feb 12, 2023. It is now read-only.

Commit

Permalink
perf(smileys): Use lazy smileys loading
Browse files Browse the repository at this point in the history
  • Loading branch information
Diadlo committed Nov 13, 2017
1 parent a764a66 commit d83400b
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
19 changes: 14 additions & 5 deletions src/persistence/smileypack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,18 +203,18 @@ bool SmileyPack::load(const QString& filename)
const int iconsCount = emoticonElements.size();
emoticons.clear();
emoticonToIcon.clear();
emoticonToPath.clear();
icons.clear();
icons.reserve(iconsCount);

for (int i = 0; i < iconsCount; ++i) {
QDomNode node = emoticonElements.at(i);
QString iconName = node.attributes().namedItem(itemName).nodeValue();
QString iconPath = QDir{path}.filePath(iconName);
icons.append(QIcon{iconPath});
QDomElement stringElement = node.firstChildElement(childName);
QStringList emoticonList;
while (!stringElement.isNull()) {
QString emoticon = stringElement.text().replace("<", "&lt;").replace(">", "&gt;");
emoticonToIcon.insert(emoticon, &icons[i]);
emoticonToPath.insert(emoticon, iconPath);
emoticonList.append(emoticon);
stringElement = stringElement.nextSibling().toElement();
}
Expand Down Expand Up @@ -243,7 +243,7 @@ QString SmileyPack::smileyfied(const QString& msg)
QString key = match.captured();
int startPos = match.capturedStart();
int keyLength = key.length();
if (emoticonToIcon.contains(key)) {
if (emoticonToPath.contains(key)) {
QString imgRichText = getAsRichText(key);
result.replace(startPos + replaceDiff, keyLength, imgRichText);
replaceDiff += imgRichText.length() - keyLength;
Expand All @@ -270,7 +270,16 @@ QList<QStringList> SmileyPack::getEmoticons() const
QIcon SmileyPack::getAsIcon(const QString& emoticon)
{
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()
Expand Down
1 change: 1 addition & 0 deletions src/persistence/smileypack.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ private slots:

QVector<QIcon> icons;
QMap<QString, const QIcon*> emoticonToIcon;
QMap<QString, QString> emoticonToPath;
QList<QStringList> emoticons;
QString path;
mutable QMutex loadingMutex;
Expand Down

0 comments on commit d83400b

Please sign in to comment.