From 29da2210c98a2f1bf2dcaf6af18ba818ceef5d2c Mon Sep 17 00:00:00 2001 From: sudden6 Date: Fri, 23 Sep 2016 00:12:40 +0200 Subject: [PATCH] feat(smileys): try to load smileys from XDG_DATA_DIR directories This provides a location where users can store custom smiley packs --- src/persistence/smileypack.cpp | 73 +++++++++++++++++++++++++--------- src/persistence/smileypack.h | 11 +++-- 2 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/persistence/smileypack.cpp b/src/persistence/smileypack.cpp index 4b94f1051..86eeef30b 100644 --- a/src/persistence/smileypack.cpp +++ b/src/persistence/smileypack.cpp @@ -33,25 +33,33 @@ #include #include #include +#include #include +#define EMOTICONS_SUB_DIR (QString)"emoticons" + /** * @class SmileyPack * @brief Maps emoticons to smileys. * - * @var QHash SmileyPack::filenameTable + * @var SmileyPack::filenameTable * @brief Matches an emoticon to its corresponding smiley ie. ":)" -> "happy.png" * - * @var QHash SmileyPack::iconCache + * @var SmileyPack::iconCache * @brief representation of a smiley ie. "happy.png" -> data * - * @var QList SmileyPack::emoticons + * @var SmileyPack::emoticons * @brief {{ ":)", ":-)" }, {":(", ...}, ... } * - * @var QString SmileyPack::path + * @var SmileyPack::path * @brief directory containing the cfg and image files + * + * @var SmileyPack::defaultPaths + * @brief Contains all directories where smileys could be found */ +QStringList SmileyPack::defaultPaths = loadDefaultPaths(); + SmileyPack::SmileyPack() { loadingMutex.lock(); @@ -68,7 +76,41 @@ SmileyPack& SmileyPack::getInstance() return smileyPack; } -QList > SmileyPack::listSmileyPacks(const QStringList &paths) +QStringList SmileyPack::loadDefaultPaths() +{ + QStringList paths = QStringList{":/smileys", "~/.kde4/share/emoticons", "~/.kde/share/emoticons"}; + // qTox should find emoticons next to the binary + paths.append('.' + QDir::separator() + EMOTICONS_SUB_DIR); + + // qTox exclusive emoticons + for(auto qtoxPath : QStandardPaths::standardLocations(QStandardPaths::DataLocation)) + { + qtoxPath += QDir::separator() + EMOTICONS_SUB_DIR; + if(!paths.contains(qtoxPath)) + { + paths << qtoxPath; + } + } + + // system wide emoticons + for(auto genericPath : QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) + { + genericPath += QDir::separator() + EMOTICONS_SUB_DIR; + if(!paths.contains(genericPath)) + { + paths << genericPath; + } + } + + return paths; +} + +QList> SmileyPack::listSmileyPacks() +{ + return listSmileyPacks(defaultPaths); +} + +QList> SmileyPack::listSmileyPacks(const QStringList& paths) { QList > smileyPacks; @@ -90,15 +132,8 @@ QList > SmileyPack::listSmileyPacks(const QStringList &p { QString packageName = dir.dirName(); QString absPath = entries[0].absoluteFilePath(); - QString relPath = QDir(QCoreApplication::applicationDirPath()).relativeFilePath(absPath); - - if (relPath.leftRef(2) == "..") - { - if (!smileyPacks.contains(QPair(packageName, absPath))) - smileyPacks << QPair(packageName, absPath); - else if (!smileyPacks.contains(QPair(packageName, relPath))) - smileyPacks << QPair(packageName, relPath); // use relative path for subdirectories - } + if (!smileyPacks.contains(QPair(packageName, absPath))) + smileyPacks << QPair(packageName, absPath); } dir.cdUp(); } @@ -107,7 +142,7 @@ QList > SmileyPack::listSmileyPacks(const QStringList &p return smileyPacks; } -bool SmileyPack::isValid(const QString &filename) +bool SmileyPack::isValid(const QString& filename) { return QFile(filename).exists(); } @@ -217,18 +252,18 @@ QList SmileyPack::getEmoticons() const return emoticons; } -QString SmileyPack::getAsRichText(const QString &key) +QString SmileyPack::getAsRichText(const QString& key) { return QString("").arg(key); } -QIcon SmileyPack::getAsIcon(const QString &key) +QIcon SmileyPack::getAsIcon(const QString& key) { QMutexLocker locker(&loadingMutex); return getCachedSmiley(key); } -void SmileyPack::cacheSmiley(const QString &name) +void SmileyPack::cacheSmiley(const QString& name) { QString filename = QDir(path).filePath(name); @@ -237,7 +272,7 @@ void SmileyPack::cacheSmiley(const QString &name) iconCache.insert(name, icon); } -QIcon SmileyPack::getCachedSmiley(const QString &key) +QIcon SmileyPack::getCachedSmiley(const QString& key) { // valid key? if (!filenameTable.contains(key)) diff --git a/src/persistence/smileypack.h b/src/persistence/smileypack.h index da40b58fe..a1d73b939 100644 --- a/src/persistence/smileypack.h +++ b/src/persistence/smileypack.h @@ -27,17 +27,14 @@ #include #include -#define SMILEYPACK_SEARCH_PATHS \ - { \ - ":/smileys", "./smileys", "/usr/share/qtox/smileys", "/usr/share/emoticons", "~/.kde4/share/emoticons", "~/.kde/share/emoticons" \ - } - class SmileyPack : public QObject { Q_OBJECT + public: static SmileyPack& getInstance(); - static QList > listSmileyPacks(const QStringList& paths = SMILEYPACK_SEARCH_PATHS); + static QList> listSmileyPacks(const QStringList& paths); + static QList> listSmileyPacks(); static bool isValid(const QString& filename); QString smileyfied(QString msg); @@ -56,11 +53,13 @@ private: bool load(const QString& filename); void cacheSmiley(const QString& name); QIcon getCachedSmiley(const QString& key); + static QStringList loadDefaultPaths(); QHash filenameTable; QHash iconCache; QList emoticons; QString path; + static QStringList defaultPaths; mutable QMutex loadingMutex; };