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.
|
# 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
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
TARGET = qtox
|
TARGET = qtox
|
||||||
|
@ -83,7 +83,8 @@ HEADERS += widget/form/addfriendform.h \
|
||||||
widget/videosurface.h \
|
widget/videosurface.h \
|
||||||
widget/camera.h \
|
widget/camera.h \
|
||||||
widget/netcamview.h \
|
widget/netcamview.h \
|
||||||
widget/tool/clickablelabel.h
|
widget/tool/clickablelabel.h \
|
||||||
|
smileypack.h
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
widget/form/addfriendform.cpp \
|
widget/form/addfriendform.cpp \
|
||||||
|
@ -115,4 +116,5 @@ SOURCES += \
|
||||||
widget/videosurface.cpp \
|
widget/videosurface.cpp \
|
||||||
widget/camera.cpp \
|
widget/camera.cpp \
|
||||||
widget/netcamview.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;
|
enableSmoothAnimation = newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray Settings::getSmileyPack() const
|
QString Settings::getSmileyPack() const
|
||||||
{
|
{
|
||||||
return smileyPack;
|
return smileyPack;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Settings::setSmileyPack(const QByteArray &value)
|
void Settings::setSmileyPack(const QString &value)
|
||||||
{
|
{
|
||||||
smileyPack = value;
|
smileyPack = value;
|
||||||
emit smileyPackChanged();
|
emit smileyPackChanged();
|
||||||
|
|
|
@ -83,8 +83,8 @@ public:
|
||||||
bool isAnimationEnabled() const;
|
bool isAnimationEnabled() const;
|
||||||
void setAnimationEnabled(bool newValue);
|
void setAnimationEnabled(bool newValue);
|
||||||
|
|
||||||
QByteArray getSmileyPack() const;
|
QString getSmileyPack() const;
|
||||||
void setSmileyPack(const QByteArray &value);
|
void setSmileyPack(const QString &value);
|
||||||
|
|
||||||
bool isCurstomEmojiFont() const;
|
bool isCurstomEmojiFont() const;
|
||||||
void setCurstomEmojiFont(bool value);
|
void setCurstomEmojiFont(bool value);
|
||||||
|
@ -142,7 +142,7 @@ private:
|
||||||
|
|
||||||
// GUI
|
// GUI
|
||||||
bool enableSmoothAnimation;
|
bool enableSmoothAnimation;
|
||||||
QByteArray smileyPack;
|
QString smileyPack;
|
||||||
bool customEmojiFont;
|
bool customEmojiFont;
|
||||||
QString emojiFontFamily;
|
QString emojiFontFamily;
|
||||||
int emojiFontPointSize;
|
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 "chatform.h"
|
||||||
#include "friend.h"
|
#include "friend.h"
|
||||||
|
#include "smileypack.h"
|
||||||
#include "widget/friendwidget.h"
|
#include "widget/friendwidget.h"
|
||||||
#include "widget/widget.h"
|
#include "widget/widget.h"
|
||||||
#include "widget/filetransfertwidget.h"
|
#include "widget/filetransfertwidget.h"
|
||||||
|
@ -238,6 +239,7 @@ void ChatForm::addFriendMessage(QString message)
|
||||||
|
|
||||||
void ChatForm::addMessage(QString author, QString message, QString date)
|
void ChatForm::addMessage(QString author, QString message, QString date)
|
||||||
{
|
{
|
||||||
|
message = SmileyPack::getInstance().replaceEmoticons(message);
|
||||||
addMessage(new QLabel(author), new QLabel(message), new QLabel(date));
|
addMessage(new QLabel(author), new QLabel(message), new QLabel(date));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include <QFont>
|
#include <QFont>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
SettingsForm::SettingsForm()
|
SettingsForm::SettingsForm()
|
||||||
: QObject()
|
: QObject()
|
||||||
|
@ -49,6 +51,9 @@ SettingsForm::SettingsForm()
|
||||||
makeToxPortable.setText(tr("Make Tox portable","Text on a checkbox to make qTox a portable application"));
|
makeToxPortable.setText(tr("Make Tox portable","Text on a checkbox to make qTox a portable application"));
|
||||||
makeToxPortable.setChecked(Settings::getInstance().getMakeToxPortable());
|
makeToxPortable.setChecked(Settings::getInstance().getMakeToxPortable());
|
||||||
|
|
||||||
|
smileyPackLabel.setText(tr("Smiley Pack", "Text on smiley pack label"));
|
||||||
|
smileyPackFilename.setText(Settings::getInstance().getSmileyPack());
|
||||||
|
|
||||||
main->setLayout(&layout);
|
main->setLayout(&layout);
|
||||||
layout.addWidget(&nameLabel);
|
layout.addWidget(&nameLabel);
|
||||||
layout.addWidget(&name);
|
layout.addWidget(&name);
|
||||||
|
@ -60,6 +65,9 @@ SettingsForm::SettingsForm()
|
||||||
layout.addWidget(&enableIPv6);
|
layout.addWidget(&enableIPv6);
|
||||||
layout.addWidget(&useTranslations);
|
layout.addWidget(&useTranslations);
|
||||||
layout.addWidget(&makeToxPortable);
|
layout.addWidget(&makeToxPortable);
|
||||||
|
layout.addWidget(&smileyPackLabel);
|
||||||
|
layout.addWidget(&smileyPackFilename);
|
||||||
|
layout.addWidget(&smileyBrowseFileButton);
|
||||||
layout.addStretch();
|
layout.addStretch();
|
||||||
|
|
||||||
head->setLayout(&headLayout);
|
head->setLayout(&headLayout);
|
||||||
|
@ -70,6 +78,7 @@ SettingsForm::SettingsForm()
|
||||||
connect(&useTranslations, SIGNAL(stateChanged(int)), this, SLOT(onUseTranslationUpdated()));
|
connect(&useTranslations, SIGNAL(stateChanged(int)), this, SLOT(onUseTranslationUpdated()));
|
||||||
connect(&makeToxPortable, SIGNAL(stateChanged(int)), this, SLOT(onMakeToxPortableUpdated()));
|
connect(&makeToxPortable, SIGNAL(stateChanged(int)), this, SLOT(onMakeToxPortableUpdated()));
|
||||||
connect(&idLabel, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
|
connect(&idLabel, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
|
||||||
|
connect(&smileyBrowseFileButton, SIGNAL(clicked()), this, SLOT(onBrowseSmileyFilename()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsForm::~SettingsForm()
|
SettingsForm::~SettingsForm()
|
||||||
|
@ -116,3 +125,17 @@ void SettingsForm::onMakeToxPortableUpdated()
|
||||||
{
|
{
|
||||||
Settings::getInstance().setMakeToxPortable(makeToxPortable.isChecked());
|
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 onEnableIPv6Updated();
|
||||||
void onUseTranslationUpdated();
|
void onUseTranslationUpdated();
|
||||||
void onMakeToxPortableUpdated();
|
void onMakeToxPortableUpdated();
|
||||||
|
void onBrowseSmileyFilename();
|
||||||
void copyIdClicked();
|
void copyIdClicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QLabel headLabel, nameLabel, statusTextLabel;
|
QLabel headLabel, nameLabel, statusTextLabel, smileyPackLabel;
|
||||||
QTextEdit id;
|
QTextEdit id;
|
||||||
ClickableLabel idLabel;
|
ClickableLabel idLabel;
|
||||||
QPushButton videoTest;
|
QPushButton videoTest;
|
||||||
QCheckBox enableIPv6, useTranslations, makeToxPortable;
|
QCheckBox enableIPv6, useTranslations, makeToxPortable;
|
||||||
QVBoxLayout layout, headLayout;
|
QVBoxLayout layout, headLayout;
|
||||||
QWidget *main, *head;
|
QWidget *main, *head;
|
||||||
|
QLineEdit smileyPackFilename;
|
||||||
|
QToolButton smileyBrowseFileButton;
|
||||||
public:
|
public:
|
||||||
QLineEdit name, statusText;
|
QLineEdit name, statusText;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user