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

basic support for smileys

This commit is contained in:
krepa098 2014-07-25 14:52:14 +02:00
parent 809ae86898
commit e01467e386
8 changed files with 204 additions and 10 deletions

View File

@ -20,7 +20,7 @@
# See the COPYING file for more details.
QT += core gui network multimedia multimediawidgets
QT += core gui network multimedia multimediawidgets xml
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtox
@ -83,7 +83,8 @@ HEADERS += widget/form/addfriendform.h \
widget/videosurface.h \
widget/camera.h \
widget/netcamview.h \
widget/tool/clickablelabel.h
widget/tool/clickablelabel.h \
smileypack.h
SOURCES += \
widget/form/addfriendform.cpp \
@ -115,4 +116,5 @@ SOURCES += \
widget/videosurface.cpp \
widget/camera.cpp \
widget/netcamview.cpp \
widget/tool/clickablelabel.cpp
widget/tool/clickablelabel.cpp \
smileypack.cpp

View File

@ -258,12 +258,12 @@ void Settings::setAnimationEnabled(bool newValue)
enableSmoothAnimation = newValue;
}
QByteArray Settings::getSmileyPack() const
QString Settings::getSmileyPack() const
{
return smileyPack;
}
void Settings::setSmileyPack(const QByteArray &value)
void Settings::setSmileyPack(const QString &value)
{
smileyPack = value;
emit smileyPackChanged();

View File

@ -83,8 +83,8 @@ public:
bool isAnimationEnabled() const;
void setAnimationEnabled(bool newValue);
QByteArray getSmileyPack() const;
void setSmileyPack(const QByteArray &value);
QString getSmileyPack() const;
void setSmileyPack(const QString &value);
bool isCurstomEmojiFont() const;
void setCurstomEmojiFont(bool value);
@ -142,7 +142,7 @@ private:
// GUI
bool enableSmoothAnimation;
QByteArray smileyPack;
QString smileyPack;
bool customEmojiFont;
QString emojiFontFamily;
int emojiFontPointSize;

122
smileypack.cpp Normal file
View File

@ -0,0 +1,122 @@
/*
Copyright (C) 2013 by Maxim Biro <nurupo.contributions@gmail.com>
This file is part of Tox Qt GUI.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#include "smileypack.h"
#include "settings.h"
#include <QFileInfo>
#include <QFile>
#include <QtXml>
#include <QDebug>
SmileyPack::SmileyPack()
{
load(Settings::getInstance().getSmileyPack());
connect(&Settings::getInstance(), &Settings::smileyPackChanged, this, &SmileyPack::onSmileyPackChanged);
}
SmileyPack& SmileyPack::getInstance()
{
static SmileyPack smileyPack;
return smileyPack;
}
bool SmileyPack::load(const QString& filename)
{
// discard old data
lookupTable.clear();
QDir::setSearchPaths("smiley", QStringList());
// open emoticons.xml
QFile xmlFile(filename);
if(!xmlFile.open(QIODevice::ReadOnly))
return false; // cannot open file
/* parse the cfg document
* sample:
* <?xml version='1.0'?>
* <messaging-emoticon-map>
* <emoticon file="smile.png" >
* <string>:)</string>
* <string>:-)</string>
* </emoticon>
* <emoticon file="sad.png" >
* <string>:(</string>
* <string>:-(</string>
* </emoticon>
* </messaging-emoticon-map>
*/
QDomDocument doc;
doc.setContent(xmlFile.readAll());
QDomNodeList emoticonElements = doc.elementsByTagName("emoticon");
for (int i = 0; i < emoticonElements.size(); ++i)
{
QString file = emoticonElements.at(i).attributes().namedItem("file").nodeValue();
QDomElement stringElement = emoticonElements.at(i).firstChildElement("string");
while (!stringElement.isNull())
{
QString rune = stringElement.text();
lookupTable.insert(rune, file); // add it to the map
stringElement = stringElement.nextSibling().toElement();
}
}
// Rich Text makes use of Qt's resource system, so
// let Qt know about our smilies
QFileInfo info(filename);
QDir::setSearchPaths("smiley", QStringList() << info.absolutePath());
// success!
return true;
}
QString SmileyPack::replaceEmoticons(const QString &msg) const
{
QString out = msg;
QRegExp exp("\\S*"); // matches words
int index = msg.indexOf(exp);
int offset = 0;
// if a word is key of a smiley, replace it by it's corresponding image in Rich Text
while (index >= 0 || exp.matchedLength() > 0)
{
QString key = exp.cap();
if (lookupTable.contains(key))
{
QString width = QString::number(16);
QString height = QString::number(16);
QString img = lookupTable[key];
QString imgRt = "<img src=\"smiley:" + img + "\" width=\"" + width + "\" height=\"" + height + "\">";
out.replace(index + offset, key.length(), imgRt);
offset += imgRt.length() - key.length();
}
index = msg.indexOf(exp, index + exp.matchedLength() + 1);
}
return out;
}
void SmileyPack::onSmileyPackChanged()
{
load(Settings::getInstance().getSmileyPack());
}

43
smileypack.h Normal file
View File

@ -0,0 +1,43 @@
/*
Copyright (C) 2013 by Maxim Biro <nurupo.contributions@gmail.com>
This file is part of Tox Qt GUI.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
#ifndef SMILEYPACK_H
#define SMILEYPACK_H
#include <QHash>
#include <QString>
#include <QObject>
//maps emoticons to smilies
class SmileyPack : public QObject
{
Q_OBJECT
public:
explicit SmileyPack();
SmileyPack(SmileyPack&) = delete;
SmileyPack& operator=(const SmileyPack&) = delete;
static SmileyPack& getInstance();
bool load(const QString &filename);
QString replaceEmoticons(const QString& msg) const;
protected:
QHash<QString, QString> lookupTable; // matches an emoticon with it's corresponding smiley
private slots:
void onSmileyPackChanged();
};
#endif // SMILEYPACK_H

View File

@ -16,6 +16,7 @@
#include "chatform.h"
#include "friend.h"
#include "smileypack.h"
#include "widget/friendwidget.h"
#include "widget/widget.h"
#include "widget/filetransfertwidget.h"
@ -238,6 +239,7 @@ void ChatForm::addFriendMessage(QString message)
void ChatForm::addMessage(QString author, QString message, QString date)
{
message = SmileyPack::getInstance().replaceEmoticons(message);
addMessage(new QLabel(author), new QLabel(message), new QLabel(date));
}

View File

@ -20,6 +20,8 @@
#include <QFont>
#include <QClipboard>
#include <QApplication>
#include <QFileDialog>
#include <QDir>
SettingsForm::SettingsForm()
: QObject()
@ -49,6 +51,9 @@ SettingsForm::SettingsForm()
makeToxPortable.setText(tr("Make Tox portable","Text on a checkbox to make qTox a portable application"));
makeToxPortable.setChecked(Settings::getInstance().getMakeToxPortable());
smileyPackLabel.setText(tr("Smiley Pack", "Text on smiley pack label"));
smileyPackFilename.setText(Settings::getInstance().getSmileyPack());
main->setLayout(&layout);
layout.addWidget(&nameLabel);
layout.addWidget(&name);
@ -60,6 +65,9 @@ SettingsForm::SettingsForm()
layout.addWidget(&enableIPv6);
layout.addWidget(&useTranslations);
layout.addWidget(&makeToxPortable);
layout.addWidget(&smileyPackLabel);
layout.addWidget(&smileyPackFilename);
layout.addWidget(&smileyBrowseFileButton);
layout.addStretch();
head->setLayout(&headLayout);
@ -70,6 +78,7 @@ SettingsForm::SettingsForm()
connect(&useTranslations, SIGNAL(stateChanged(int)), this, SLOT(onUseTranslationUpdated()));
connect(&makeToxPortable, SIGNAL(stateChanged(int)), this, SLOT(onMakeToxPortableUpdated()));
connect(&idLabel, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
connect(&smileyBrowseFileButton, SIGNAL(clicked()), this, SLOT(onBrowseSmileyFilename()));
}
SettingsForm::~SettingsForm()
@ -116,3 +125,17 @@ void SettingsForm::onMakeToxPortableUpdated()
{
Settings::getInstance().setMakeToxPortable(makeToxPortable.isChecked());
}
void SettingsForm::onBrowseSmileyFilename()
{
// directory containing a file called emoticons.xml
QString filename = QFileDialog::getOpenFileName(nullptr, tr("Select smiley pack"), QDir::currentPath(), "emoticons.xml");
// get relative path to app's local directory
QString relPath = QDir::current().relativeFilePath(filename);
// save
Settings::getInstance().setSmileyPack(relPath);
smileyPackFilename.setText(relPath);
}

View File

@ -47,17 +47,19 @@ private slots:
void onEnableIPv6Updated();
void onUseTranslationUpdated();
void onMakeToxPortableUpdated();
void onBrowseSmileyFilename();
void copyIdClicked();
private:
QLabel headLabel, nameLabel, statusTextLabel;
QLabel headLabel, nameLabel, statusTextLabel, smileyPackLabel;
QTextEdit id;
ClickableLabel idLabel;
QPushButton videoTest;
QCheckBox enableIPv6, useTranslations, makeToxPortable;
QVBoxLayout layout, headLayout;
QWidget *main, *head;
QLineEdit smileyPackFilename;
QToolButton smileyBrowseFileButton;
public:
QLineEdit name, statusText;
};