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 shared_ptr to automaticaly count references
Browse files Browse the repository at this point in the history
  • Loading branch information
Diadlo committed Nov 13, 2017
1 parent d83400b commit c640007
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 20 deletions.
4 changes: 3 additions & 1 deletion src/chatlog/customtextdocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ QVariant CustomTextDocument::loadResource(int type, const QUrl& name)
Settings::getInstance().getEmojiFontPointSize());
QString fileName = QUrl::fromPercentEncoding(name.toEncoded()).mid(4).toHtmlEscaped();

return SmileyPack::getInstance().getAsIcon(fileName).pixmap(size);
std::shared_ptr<QIcon> icon = SmileyPack::getInstance().getAsIcon(fileName);
emoticonIcons.append(icon);
return icon->pixmap(size);
}

return QTextDocument::loadResource(type, name);
Expand Down
10 changes: 9 additions & 1 deletion src/chatlog/customtextdocument.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,23 @@
#define CUSTOMTEXTDOCUMENT_H

#include <QTextDocument>
#include <QList>

#include <memory>

class QIcon;

class CustomTextDocument : public QTextDocument
{
Q_OBJECT
public:
explicit CustomTextDocument(QObject* parent = 0);
explicit CustomTextDocument(QObject* parent = nullptr);

protected:
virtual QVariant loadResource(int type, const QUrl& name);

private:
QList<std::shared_ptr<QIcon>> emoticonIcons;
};

#endif // CUSTOMTEXTDOCUMENT_H
19 changes: 10 additions & 9 deletions src/persistence/smileypack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,6 @@ bool SmileyPack::load(const QString& filename)
emoticons.clear();
emoticonToIcon.clear();
emoticonToPath.clear();
icons.clear();

for (int i = 0; i < iconsCount; ++i) {
QDomNode node = emoticonElements.at(i);
Expand Down Expand Up @@ -267,19 +266,21 @@ QList<QStringList> SmileyPack::getEmoticons() const
* @param emoticon Passed emoticon
* @return Returns cached icon according to passed emoticon, null if no icon mapped to this emoticon
*/
QIcon SmileyPack::getAsIcon(const QString& emoticon)
std::shared_ptr<QIcon> SmileyPack::getAsIcon(const QString& emoticon)
{
QMutexLocker locker(&loadingMutex);
if (emoticonToIcon.contains(emoticon))
return *(emoticonToIcon[emoticon]);
return emoticonToIcon[emoticon];

if (!emoticonToPath.contains(emoticon))
return QIcon{};
const auto iconPathIt = emoticonToPath.find(emoticon);
if (iconPathIt == emoticonToPath.end()) {
return std::make_shared<QIcon>();
}

const QString& iconPath = emoticonToPath[emoticon];
icons.append(QIcon{iconPath});
emoticonToIcon.insert(emoticon, &icons.last());
return icons.last();
const QString& iconPath = iconPathIt.value();
auto icon = std::make_shared<QIcon>(iconPath);
emoticonToIcon.insert(emoticon, icon);
return icon;
}

void SmileyPack::onSmileyPackChanged()
Expand Down
9 changes: 5 additions & 4 deletions src/persistence/smileypack.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include <QMap>
#include <QMutex>

#include <memory>

class SmileyPack : public QObject
{
Q_OBJECT
Expand All @@ -35,7 +37,7 @@ class SmileyPack : public QObject

QString smileyfied(const QString& msg);
QList<QStringList> getEmoticons() const;
QIcon getAsIcon(const QString& key);
std::shared_ptr<QIcon> getAsIcon(const QString& key);

private slots:
void onSmileyPackChanged();
Expand All @@ -47,9 +49,8 @@ private slots:

bool load(const QString& filename);

QVector<QIcon> icons;
QMap<QString, const QIcon*> emoticonToIcon;
QMap<QString, QString> emoticonToPath;
QMap<QString, std::shared_ptr<QIcon>> emoticonToIcon;
QHash<QString, QString> emoticonToPath;
QList<QStringList> emoticons;
QString path;
mutable QMutex loadingMutex;
Expand Down
5 changes: 4 additions & 1 deletion src/widget/emoticonswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,12 @@ EmoticonsWidget::EmoticonsWidget(QWidget* parent)
}
buttonLayout->addStretch();

SmileyPack& smileyPack = SmileyPack::getInstance();
for (const QStringList& set : emoticons) {
QPushButton* button = new QPushButton;
button->setIcon(SmileyPack::getInstance().getAsIcon(set[0]).pixmap(size));
std::shared_ptr<QIcon> icon = smileyPack.getAsIcon(set[0]);
emoticonsIcons.append(icon);
button->setIcon(icon->pixmap(size));
button->setToolTip(set.join(" "));
button->setProperty("sequence", set[0]);
button->setCursor(Qt::PointingHandCursor);
Expand Down
6 changes: 6 additions & 0 deletions src/widget/emoticonswidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
#include <QMenu>
#include <QStackedWidget>
#include <QVBoxLayout>
#include <QVector>

#include <memory>

class QIcon;

class EmoticonsWidget : public QMenu
{
Expand All @@ -47,6 +52,7 @@ private slots:
private:
QStackedWidget stack;
QVBoxLayout layout;
QList<std::shared_ptr<QIcon>> emoticonsIcons;

public:
QSize sizeHint() const override;
Expand Down
9 changes: 5 additions & 4 deletions src/widget/form/settings/userinterfaceform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,12 @@ void UserInterfaceForm::reloadSmileys()
for (int i = 0; i < emoticons.size(); ++i)
smileys.push_front(emoticons.at(i).first());

emoticonsIcons.clear();
const QSize size(18, 18);
for (int i = 0; i < smileLabels.size(); ++i) {
QIcon icon = SmileyPack::getInstance().getAsIcon(smileys[i]);
smileLabels[i]->setPixmap(icon.pixmap(size));
std::shared_ptr<QIcon> icon = SmileyPack::getInstance().getAsIcon(smileys[i]);
emoticonsIcons.append(icon);
smileLabels[i]->setPixmap(icon->pixmap(size));
smileLabels[i]->setToolTip(smileys[i]);
}

Expand All @@ -253,8 +255,7 @@ void UserInterfaceForm::reloadSmileys()
int maxSide = qMin(desktop.geometry().height() / sideSize, desktop.geometry().width() / sideSize);
QSize maxSize(maxSide, maxSide);

QIcon icon = SmileyPack::getInstance().getAsIcon(smileys[0]);
QSize actualSize = icon.actualSize(maxSize);
QSize actualSize = emoticonsIcons.first()->actualSize(maxSize);
bodyUI->emoticonSize->setMaximum(actualSize.width());
}

Expand Down
3 changes: 3 additions & 0 deletions src/widget/form/settings/userinterfaceform.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include "genericsettings.h"
#include "src/widget/form/settingswidget.h"

#include <memory>

namespace Ui {
class UserInterfaceSettings;
}
Expand Down Expand Up @@ -65,6 +67,7 @@ private slots:

private:
QList<QLabel*> smileLabels;
QList<std::shared_ptr<QIcon>> emoticonsIcons;
SettingsWidget* parent;
Ui::UserInterfaceSettings* bodyUI;
const int MAX_FORMAT_LENGTH = 128;
Expand Down

0 comments on commit c640007

Please sign in to comment.