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:
parent
809ae86898
commit
e01467e386
8
qtox.pro
8
qtox.pro
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
122
smileypack.cpp
Normal 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
43
smileypack.h
Normal 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
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user