Browse Source

Async smiley loading for fast start

This can be a ~1s win on startup time with a HDD, now we load and cache the smileys in the background, blocking only if we try to use them while they are still loading
pull/2834/head
tux3 10 years ago
parent
commit
94f3e6d6e4
No known key found for this signature in database
GPG Key ID: 7E086DD661263264
  1. 15
      src/persistence/smileypack.cpp
  2. 4
      src/persistence/smileypack.h

15
src/persistence/smileypack.cpp

@ -33,10 +33,12 @@ @@ -33,10 +33,12 @@
#include <QDomElement>
#include <QBuffer>
#include <QStringBuilder>
#include <QtConcurrent/QtConcurrentRun>
SmileyPack::SmileyPack()
{
load(Settings::getInstance().getSmileyPack());
loadingMutex.lock();
QtConcurrent::run(this, &SmileyPack::load, Settings::getInstance().getSmileyPack());
connect(&Settings::getInstance(), &Settings::smileyPackChanged, this, &SmileyPack::onSmileyPackChanged);
}
@ -101,7 +103,10 @@ bool SmileyPack::load(const QString& filename) @@ -101,7 +103,10 @@ bool SmileyPack::load(const QString& filename)
// open emoticons.xml
QFile xmlFile(filename);
if (!xmlFile.open(QIODevice::ReadOnly))
{
loadingMutex.unlock();
return false; // cannot open file
}
/* parse the cfg file
* sample:
@ -151,11 +156,14 @@ bool SmileyPack::load(const QString& filename) @@ -151,11 +156,14 @@ bool SmileyPack::load(const QString& filename)
}
// success!
loadingMutex.unlock();
return true;
}
QString SmileyPack::smileyfied(QString msg)
{
QMutexLocker locker(&loadingMutex);
QRegExp exp("\\S+"); // matches words
int index = msg.indexOf(exp);
@ -179,6 +187,7 @@ QString SmileyPack::smileyfied(QString msg) @@ -179,6 +187,7 @@ QString SmileyPack::smileyfied(QString msg)
QList<QStringList> SmileyPack::getEmoticons() const
{
QMutexLocker locker(&loadingMutex);
return emoticons;
}
@ -189,6 +198,7 @@ QString SmileyPack::getAsRichText(const QString &key) @@ -189,6 +198,7 @@ QString SmileyPack::getAsRichText(const QString &key)
QIcon SmileyPack::getAsIcon(const QString &key)
{
QMutexLocker locker(&loadingMutex);
return getCachedSmiley(key);
}
@ -217,5 +227,6 @@ QIcon SmileyPack::getCachedSmiley(const QString &key) @@ -217,5 +227,6 @@ QIcon SmileyPack::getCachedSmiley(const QString &key)
void SmileyPack::onSmileyPackChanged()
{
load(Settings::getInstance().getSmileyPack());
loadingMutex.lock();
QtConcurrent::run(this, &SmileyPack::load, Settings::getInstance().getSmileyPack());
}

4
src/persistence/smileypack.h

@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
#include <QString>
#include <QStringList>
#include <QIcon>
#include <QMutex>
#define SMILEYPACK_SEARCH_PATHS \
{ \
@ -40,7 +41,6 @@ public: @@ -40,7 +41,6 @@ public:
static QList<QPair<QString, QString> > listSmileyPacks(const QStringList& paths = SMILEYPACK_SEARCH_PATHS);
static bool isValid(const QString& filename);
bool load(const QString& filename);
QString smileyfied(QString msg);
QList<QStringList> getEmoticons() const;
QString getAsRichText(const QString& key);
@ -54,6 +54,7 @@ private: @@ -54,6 +54,7 @@ private:
SmileyPack(SmileyPack&) = delete;
SmileyPack& operator=(const SmileyPack&) = delete;
bool load(const QString& filename); ///< The caller must lock loadingMutex and should run it in a thread
void cacheSmiley(const QString& name);
QIcon getCachedSmiley(const QString& key);
@ -61,6 +62,7 @@ private: @@ -61,6 +62,7 @@ private:
QHash<QString, QIcon> iconCache; // representation of a smiley ie. "happy.png" -> data
QList<QStringList> emoticons; // {{ ":)", ":-)" }, {":(", ...}, ... }
QString path; // directory containing the cfg and image files
mutable QMutex loadingMutex;
};
#endif // SMILEYPACK_H

Loading…
Cancel
Save