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

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
This commit is contained in:
tux3 2016-01-21 07:47:15 +01:00
parent 24bccb7bdd
commit 94f3e6d6e4
No known key found for this signature in database
GPG Key ID: 7E086DD661263264
2 changed files with 16 additions and 3 deletions

View File

@ -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)
// 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)
}
// 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)
QList<QStringList> SmileyPack::getEmoticons() const
{
QMutexLocker locker(&loadingMutex);
return emoticons;
}
@ -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)
void SmileyPack::onSmileyPackChanged()
{
load(Settings::getInstance().getSmileyPack());
loadingMutex.lock();
QtConcurrent::run(this, &SmileyPack::load, Settings::getInstance().getSmileyPack());
}

View File

@ -25,6 +25,7 @@
#include <QString>
#include <QStringList>
#include <QIcon>
#include <QMutex>
#define SMILEYPACK_SEARCH_PATHS \
{ \
@ -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:
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:
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