diff --git a/src/emoticon/emoticonlistwidgetselector.cpp b/src/emoticon/emoticonlistwidgetselector.cpp index e4848b7..8810614 100644 --- a/src/emoticon/emoticonlistwidgetselector.cpp +++ b/src/emoticon/emoticonlistwidgetselector.cpp @@ -1,87 +1,94 @@ /* Copyright (c) 2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "emoticonlistwidgetselector.h" #include "kpimtextedit_debug.h" using namespace KPIMTextEdit; EmoticonTextEditItem::EmoticonTextEditItem(const QString &emoticonText, QListWidget *parent) : QListWidgetItem(parent) { mText = emoticonText; setText(mText); } QString EmoticonTextEditItem::text() const { return mText; } QString EmoticonTextEditItem::pixmapPath() const { return mPixmapPath; } EmoticonListWidgetSelector::EmoticonListWidgetSelector(QWidget *parent) : QListWidget(parent) { setViewMode(QListView::IconMode); setSelectionMode(QAbstractItemView::SingleSelection); setMouseTracking(true); setDragEnabled(false); connect(this, &EmoticonListWidgetSelector::itemEntered, this, &EmoticonListWidgetSelector::slotMouseOverItem); connect(this, &EmoticonListWidgetSelector::itemClicked, this, &EmoticonListWidgetSelector::slotEmoticonClicked); setIconSize(QSize(32, 32)); QFont f; f.setPointSize(22); f.setFamily(QStringLiteral("NotoColorEmoji")); setFont(f); } EmoticonListWidgetSelector::~EmoticonListWidgetSelector() { } void EmoticonListWidgetSelector::slotMouseOverItem(QListWidgetItem *item) { item->setSelected(true); if (!hasFocus()) { setFocus(); } } void EmoticonListWidgetSelector::setEmoticons(const QList &lst) { for (uint emoji : lst) { const QString str = QString::fromUcs4(&emoji, 1); new KPIMTextEdit::EmoticonTextEditItem(str, this); } } +void EmoticonListWidgetSelector::setEmoticons(const QStringList &lst) +{ + for (const QString& emoji : lst) { + new KPIMTextEdit::EmoticonTextEditItem(emoji, this); + } +} + void EmoticonListWidgetSelector::slotEmoticonClicked(QListWidgetItem *item) { if (!item) { return; } EmoticonTextEditItem *itemEmoticon = static_cast(item); Q_EMIT itemSelected(itemEmoticon->text()); } diff --git a/src/emoticon/emoticonlistwidgetselector.h b/src/emoticon/emoticonlistwidgetselector.h index a8c3cc2..48d59c0 100644 --- a/src/emoticon/emoticonlistwidgetselector.h +++ b/src/emoticon/emoticonlistwidgetselector.h @@ -1,56 +1,57 @@ /* Copyright (c) 2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef EMOTICONLISTWIDGETSELECTOR_H #define EMOTICONLISTWIDGETSELECTOR_H #include #include "kpimtextedit_private_export.h" namespace KPIMTextEdit { class KPIMTEXTEDIT_TESTS_EXPORT EmoticonTextEditItem : public QListWidgetItem { public: explicit EmoticonTextEditItem(const QString &emoticonText, QListWidget *parent); QString text() const; QString pixmapPath() const; private: QString mText; QString mPixmapPath; }; class KPIMTEXTEDIT_TESTS_EXPORT EmoticonListWidgetSelector : public QListWidget { Q_OBJECT public: explicit EmoticonListWidgetSelector(QWidget *parent = nullptr); ~EmoticonListWidgetSelector(); void setEmoticons(const QList &lst); + void setEmoticons(const QStringList &lst); Q_SIGNALS: void itemSelected(const QString &); private: void slotMouseOverItem(QListWidgetItem *item); void slotEmoticonClicked(QListWidgetItem *item); }; } #endif // EMOTICONLISTWIDGETSELECTOR_H diff --git a/src/emoticon/emoticonunicodetab.cpp b/src/emoticon/emoticonunicodetab.cpp index 2bb6683..980f1ab 100644 --- a/src/emoticon/emoticonunicodetab.cpp +++ b/src/emoticon/emoticonunicodetab.cpp @@ -1,81 +1,94 @@ /* Copyright (c) 2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "emoticonunicodetab.h" #include "emoticonlistwidgetselector.h" #include "textutils.h" #include using namespace KPIMTextEdit; EmoticonUnicodeTab::EmoticonUnicodeTab(QWidget *parent) : QTabWidget(parent) { setTabBarAutoHide(true); loadEmoticons(); QFont f; f.setPointSize(22); f.setFamily(QStringLiteral("NotoColorEmoji")); setFont(f); } EmoticonUnicodeTab::~EmoticonUnicodeTab() { } void EmoticonUnicodeTab::loadEmoticons() { createPlainTextEmoticonTab(i18n("Faces"), TextUtils::unicodeFacesEmoji()); createPlainTextEmoticonTab(i18n("Animals"), TextUtils::unicodeAnimalsEmoji()); createPlainTextEmoticonTab(i18n("Emotions"), TextUtils::unicodeEmotionEmoji()); createPlainTextEmoticonTab(i18n("Body"), TextUtils::unicodeBodyEmoji()); createPlainTextEmoticonTab(i18n("Transports"), TextUtils::unicodeTransportEmoji()); createPlainTextEmoticonTab(i18n("Events"), TextUtils::unicodeEventEmoji()); createPlainTextEmoticonTab(i18n("Flags"), TextUtils::unicodeFlagsEmoji()); createPlainTextEmoticonTab(i18n("Weather"), TextUtils::unicodeWeatherEmoji()); createPlainTextEmoticonTab(i18n("Foods"), TextUtils::unicodeFoodEmoji()); createPlainTextEmoticonTab(i18n("Sports"), TextUtils::unicodeSportEmoji()); createPlainTextEmoticonTab(i18n("Time"), TextUtils::unicodeTimeEmoji()); createPlainTextEmoticonTab(i18n("Game"), TextUtils::unicodeGameEmoji()); createPlainTextEmoticonTab(i18n("Clothing"), TextUtils::unicodeClothingEmoji()); createPlainTextEmoticonTab(i18n("Music"), TextUtils::unicodeSoundMusicEmoji()); createPlainTextEmoticonTab(i18n("Computer"), TextUtils::unicodeComputerEmoji()); createPlainTextEmoticonTab(i18n("Symbols"), TextUtils::unicodeSymbolsEmoji()); createPlainTextEmoticonTab(i18n("Face"), TextUtils::unicodeFaceEmoji()); createPlainTextEmoticonTab(i18n("Fantasy"), TextUtils::unicodeFantasyEmoji()); createPlainTextEmoticonTab(i18n("Plant"), TextUtils::unicodePlantEmoji()); createPlainTextEmoticonTab(i18n("Travel"), TextUtils::unicodeTravelEmoji()); createPlainTextEmoticonTab(i18n("Book"), TextUtils::unicodeBookPaperEmoji()); createPlainTextEmoticonTab(i18n("Book Tools"), TextUtils::unicodeBookToolsEmoji()); createPlainTextEmoticonTab(i18n("Science"), TextUtils::unicodeScienceEmoji()); } void EmoticonUnicodeTab::createPlainTextEmoticonTab(const QString &str, const QList &emoticons) { if (!emoticons.isEmpty()) { EmoticonListWidgetSelector *selector = new EmoticonListWidgetSelector(this); connect(selector, &KPIMTextEdit::EmoticonListWidgetSelector::itemSelected, this, &EmoticonUnicodeTab::itemSelected); selector->setEmoticons(emoticons); const QString strTab = QString::fromUcs4(&emoticons.at(0), 1); const int index = addTab(selector, strTab); if (!str.isEmpty()) { setTabToolTip(index, str); } } } +void EmoticonUnicodeTab::createPlainTextEmoticonTab(const QString &str, const QStringList &emoticons) +{ + if (!emoticons.isEmpty()) { + EmoticonListWidgetSelector *selector = new EmoticonListWidgetSelector(this); + connect(selector, &KPIMTextEdit::EmoticonListWidgetSelector::itemSelected, this, &EmoticonUnicodeTab::itemSelected); + selector->setEmoticons(emoticons); + const QString strTab = emoticons.first(); + const int index = addTab(selector, strTab); + if (!str.isEmpty()) { + setTabToolTip(index, str); + } + } +} diff --git a/src/emoticon/emoticonunicodetab.h b/src/emoticon/emoticonunicodetab.h index e0a5c87..971a2fd 100644 --- a/src/emoticon/emoticonunicodetab.h +++ b/src/emoticon/emoticonunicodetab.h @@ -1,45 +1,46 @@ /* Copyright (c) 2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef EMOTICONUNICODETAB_H #define EMOTICONUNICODETAB_H #include #include "kpimtextedit_export.h" namespace KPIMTextEdit { class KPIMTEXTEDIT_EXPORT EmoticonUnicodeTab : public QTabWidget { Q_OBJECT public: explicit EmoticonUnicodeTab(QWidget *parent = nullptr); ~EmoticonUnicodeTab(); void loadEmoticons(); Q_SIGNALS: void itemSelected(const QString &); private: void createPlainTextEmoticonTab(const QString &str, const QList &emoticons); + void createPlainTextEmoticonTab(const QString &str, const QStringList &emoticons); }; } #endif // EMOTICONUNICODETAB_H diff --git a/src/textutils.cpp b/src/textutils.cpp index da6e629..26f7be2 100644 --- a/src/textutils.cpp +++ b/src/textutils.cpp @@ -1,384 +1,897 @@ /* This file is part of KDE. Copyright (c) 2009 Thomas McGuire Copyright (c) 2010 Stephen Kelly This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "textutils.h" #include "kpimtextedit_debug.h" #include #include #include using namespace KPIMTextEdit; static bool isCharFormatFormatted(const QTextCharFormat &format, const QFont &defaultFont, const QTextCharFormat &defaultBlockFormat) { if (!format.anchorHref().isEmpty() || format.font() != defaultFont || format.isAnchor() || format.verticalAlignment() != defaultBlockFormat.verticalAlignment() || format.layoutDirection() != defaultBlockFormat.layoutDirection() || format.underlineStyle() != defaultBlockFormat.underlineStyle() || format.foreground().color() != defaultBlockFormat.foreground().color() || format.background().color() != defaultBlockFormat.background().color()) { return true; } return false; } static bool isBlockFormatFormatted(const QTextBlockFormat &format, const QTextBlockFormat &defaultFormat) { if (format.alignment() != defaultFormat.alignment() || format.layoutDirection() != defaultFormat.layoutDirection() || format.indent() != defaultFormat.indent() || format.textIndent() != defaultFormat.textIndent()) { return true; } return false; } /// @return true if the format represents a list, table, image or something like that. static bool isSpecial(const QTextFormat &charFormat) { return charFormat.isFrameFormat() || charFormat.isImageFormat() || charFormat.isListFormat() || charFormat.isTableFormat() || charFormat.isTableCellFormat(); } bool TextUtils::containsFormatting(const QTextDocument *document) { if (!document) { return false; } QTextDocument defaultTextDocument; const QTextCharFormat defaultCharFormat = defaultTextDocument.begin().charFormat(); const QTextBlockFormat defaultBlockFormat = defaultTextDocument.begin().blockFormat(); const QFont defaultFont = defaultTextDocument.defaultFont(); QTextBlock block = document->firstBlock(); while (block.isValid()) { if (isBlockFormatFormatted(block.blockFormat(), defaultBlockFormat)) { return true; } if (isSpecial(block.charFormat()) || isSpecial(block.blockFormat()) || block.textList()) { return true; } QTextBlock::iterator it = block.begin(); while (!it.atEnd()) { const QTextFragment fragment = it.fragment(); const QTextCharFormat charFormat = fragment.charFormat(); if (isSpecial(charFormat)) { return true; } if (isCharFormatFormatted(fragment.charFormat(), defaultFont, defaultCharFormat)) { return true; } ++it; } block = block.next(); } if (document->toHtml().contains(QLatin1String("
"))) { return true; } return false; } QString TextUtils::flowText(QString &wrappedText, const QString &indent, int maxLength) { if (wrappedText.isEmpty()) { return indent; } if (maxLength <= indent.length()) { qCWarning(KPIMTEXTEDIT_LOG) << "indent was set to a string that is longer or the same length " << "as maxLength, setting maxLength to indent.length() + 1"; maxLength = indent.length() + 1; } maxLength -= indent.length(); // take into account indent QString result; while (!wrappedText.isEmpty()) { // first check for the next newline. if it's before maxLength, break there, and continue int newLine = wrappedText.indexOf(QLatin1Char('\n')); if (newLine > 0 && newLine <= maxLength) { result += indent + wrappedText.left(newLine + 1); wrappedText = wrappedText.mid(newLine + 1); continue; } // Find the next point in the wrappedText where we have to do a line break. // Start searching at maxLength position and then walk backwards looking // for a space. int breakPosition; if (wrappedText.length() > maxLength) { breakPosition = maxLength; while ((breakPosition >= 0) && (wrappedText[breakPosition] != QLatin1Char(' '))) { breakPosition--; } if (breakPosition <= 0) { // Couldn't break before maxLength. breakPosition = maxLength; } } else { breakPosition = wrappedText.length(); } QString line = wrappedText.left(breakPosition); if (breakPosition < wrappedText.length()) { wrappedText = wrappedText.mid(breakPosition); } else { wrappedText.clear(); } // Strip leading whitespace of new lines, since that looks strange if (!result.isEmpty() && line.startsWith(QLatin1Char(' '))) { line = line.mid(1); } result += indent + line + QLatin1Char('\n'); } return result.left(result.length() - 1); } QList TextUtils::unicodeFullEmoji() { return TextUtils::unicodeFacesEmoji() +TextUtils::unicodeAnimalsEmoji() +TextUtils::unicodeEmotionEmoji() +TextUtils::unicodeBodyEmoji() +TextUtils::unicodeTransportEmoji() +TextUtils::unicodeEventEmoji() - +TextUtils::unicodeFlagsEmoji() + //+TextUtils::unicodeFlagsEmoji() +TextUtils::unicodeWeatherEmoji() +TextUtils::unicodeFoodEmoji() +TextUtils::unicodeSportEmoji() +TextUtils::unicodeTimeEmoji() +TextUtils::unicodeGameEmoji() +TextUtils::unicodeClothingEmoji() +TextUtils::unicodeSoundMusicEmoji() +TextUtils::unicodeComputerEmoji() +TextUtils::unicodeSymbolsEmoji() +TextUtils::unicodeFaceEmoji() +TextUtils::unicodeFantasyEmoji() +TextUtils::unicodePlantEmoji() +TextUtils::unicodeTravelEmoji() +TextUtils::unicodeBookPaperEmoji() +TextUtils::unicodeBookToolsEmoji() +TextUtils::unicodeScienceEmoji(); } QList TextUtils::unicodeFacesEmoji() { const QList lstEmoji{0x1F600, 0x1F603, 0x1F604, 0x1F601, 0x1F606, 0x1F6005, 0x1F923, 0x1F602, 0x1F642, 0x1F643, 0x1F609, 0x1F60A, 0x1F607, 0x1F970, 0x1F60D, 0x1F929, 0x1F618, 0x1F617, 0x1F61A, 0x1F619, 0x1F60B, 0x1F61B, 0x1F61C, 0x1F92A, 0x1F61D, 0x1F911, 0x1F917, 0x1F92D, 0x1F92B, 0x1F914, 0x1F910, 0x1F928, 0x1F610, 0x1F611, 0x1F636, 0x1F60F, 0x1F612, 0x1F644, 0x1F62C, 0x1F925, 0x1F60C, 0x1F614, 0x1F62A, 0x1F924, 0x1F634, 0x1F637, 0x1F912, 0x1F915, 0x1F922, 0x1F92E, 0x1F927, 0x1F975, 0x1F976, 0x1F974, 0x1F635, 0x1F92F, 0x1F920, 0x1F973, 0x1F60E, 0x1F913, 0x1F908, 0x1F615, 0x1F61F, 0x1F641, 0x1F62E, 0x1F62F, 0x1F632, 0x1F633, 0x1F97A, 0x1F626, 0x1F627}; //Add more return lstEmoji; } QList TextUtils::unicodeAnimalsEmoji() { const QList lstEmoji{0x1F63A, 0x1F638, 0x1F639, 0x1F638, 0x1F63C, 0x1F63D, 0x1F640, 0x1F63F, 0x1F63E, 0x1F648, 0x1F649, 0x1F64A, 0x1F435, 0x1F412, 0x1F98D, 0x1F431, 0x1F984, 0x1F410, 0x1F401, 0x1F400, 0x1F43F, 0x1F428, 0x1F414, 0x1F423, 0x1F54A, 0x1F986, 0x1F99A, 0x1F99C, 0x1F40A, 0x1F577, 0x1F982, 0x1F9A0, 0x1F41E}; return lstEmoji; } QList TextUtils::unicodeEmotionEmoji() { //Add more const QList lstEmoji{0x1F48B, 0x1F48C, 0x1F498, 0x1F49D, 0x1F496, 0x1F497, 0x1F493, 0x1F49E, 0x1F495, 0x1F4AF, 0x1F4A2, 0x1F4A5, 0x1F4A4}; return lstEmoji; } QList TextUtils::unicodeBodyEmoji() { //Add more const QList lstEmoji{0x1F44B, 0x1F91A, 0x1F590, 0x270B, 0x1F596, 0x1F44C, 0x270C, 0x1F91F, 0x1F44D, 0x1F44F, 0x1F4AA, 0x1F448, 0x1F449, 0x1F446, 0x1F595, 0x1F447, 0x261D, 0x1F44D, 0x1F44E, 0x270A, 0x1F44A, 0x1F91B, 0x1F91C, 0x1F44F, 0x1F64C, 0x1F450, 0x1F932, 0x1F91D, 0x1F64F, 0x270D, 0x1F485, 0x1F933, 0x1F9E0, 0x1F9B7, 0x1F9B4, 0x1F440, 0x1F441, 0x1F445, 0x1F444}; return lstEmoji; } QList TextUtils::unicodeTransportEmoji() { //Add more const QList lstEmoji{0x1F682, 0x1F683, 0x1F684, 0x1F685, 0x1F686, 0x1F687, 0x1F688, 0x1F689, 0x1F69D, 0x1F691, 0x1F692, 0x1F693, 0x1F694, 0x1F695, 0x1F696, 0x1F697, 0x2708, 0x1F6E9, 0x1F6EB, 0x1F6EC, 0x1F681, 0x1F69F, 0x1F6A0, 0x1F680, 0x1F6F0, 0x1F6F8, 0x1F6B2, 0x1F6F4, 0x1F6F9, 0x1F68F, 0x1F6E3, 0x1F6E4, 0x1F6E2, 0x26FD, 0x1F6A8, 0x1F6A5, 0x1F6A6, 0x1F6D1, 0x1F6A7, 0x2693, 0x26F5, 0x1F6F6, 0x1F6A4, 0x1F6F3, 0x26F4, 0x1F6E5, 0x1F6A2, 0x1F9F3}; return lstEmoji; } QList TextUtils::unicodeEventEmoji() { //Add more const QList lstEmoji{0x1F383, 0x1F384, 0x1F386, 0x1F387, 0x1F9E8, 0x2728, 0x1F388, 0x1F389, 0x1F38A, 0x1F38B, 0x1F38D, 0x1F38E, 0x1F38F, 0x1F390, 0x1F391}; return lstEmoji; } -QList TextUtils::unicodeFlagsEmoji() +QStringList TextUtils::unicodeFlagsEmoji() { - //Add more - const QList lstEmoji{ /*0x1F1E8, 0x1F1E9, 0x1F1EA, 0x1F1EB, 0x1F1EC, 0x1F1EE, 0x1F1FB, 0x1F1FE,*/ 0x1F3C1, 0x1F6A9, 0x1F3F4, 0x1F3F3}; - return lstEmoji; + QStringList lst = { + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa8"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa9"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xaa"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xab"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xac"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xae"), + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb6"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbd"), + + QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa7"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaf"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb6"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbd"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaf"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xaf"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb6"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb6"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa7"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb6"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbd"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb5"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xb4\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xb6\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa7"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaf"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbd"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa9"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xad"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xaf"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb1"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb4"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb7"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbb"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbc"), + + QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbe"), + + QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbf"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa8"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xac"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xae"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xb3"), + + QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xba"), + + QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xab"), + + QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xb8"), + + QString::fromUtf8("\xf0\x9f\x87\xbd\xf0\x9f\x87\xb0"), + + QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xaa"), + + QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xb9"), + + QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xa6"), + + QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xb2"), + + QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xbc") }; + return lst; } +//QList TextUtils::unicodeFlagsEmoji() +//{ +// //Add more +// const QList lstEmoji{ /*0x1F1E8, 0x1F1E9, 0x1F1EA, 0x1F1EB, 0x1F1EC, 0x1F1EE, 0x1F1FB, 0x1F1FE,*/ 0x1F3C1, 0x1F6A9, 0x1F3F4, 0x1F3F3, 0x1F1EB}; +// return lstEmoji; +//} + QList TextUtils::unicodeWeatherEmoji() { //Add more const QList lstEmoji{0x2601, 0x26C5, 0x26C8, 0x1F324, 0x1F325, 0x1F326, 0x1F327, 0x1F328, 0x1F329, 0x1F32A, 0x1F32B, 0x1F32C, 0x1F300, 0x1F308, 0x1F302, 0x2602, 0x2603, 0x26C4, 0x2604, 0x1F525, 0x1F4A7, 0x1F30A, 0x1F311, 0x1F312, 0x1F313, 0x1F314, 0x1F315, 0x1F316, 0x1F317, 0x1F318, 0x1F319, 0x1F31A, 0x1F31B, 0x1F31C, 0x1F321, 0x2600, 0x1F31D, 0x1F31E, 0x2B50, 0x1F31F, 0x1F320 }; return lstEmoji; } QList TextUtils::unicodeFoodEmoji() { //Add more const QList lstEmoji{0x1F347, 0x1F348, 0x1F349, 0x1F34A, 0x1F34B, 0x1F34C, 0x1F34D, 0x1F34E, 0x1F34F, 0x1F350, 0x1F351, 0x1F352, 0x1F353, 0x1F951, 0x1F346, 0x1F954, 0x1F35E, 0x1F950, 0x1F956, 0x1F968, 0x1F9C0, 0x1F356, 0x1F357, 0x1F969, 0x1F953, 0x1F354, 0x1F35F, 0x1F355, 0x1F32D, 0x1F96A, 0x1F32E, 0x1F32F, 0x1F959, 0x1F95A, 0x1F373, 0x1F958, 0x1F372, 0x1F963, 0x1F957, 0x1F371, 0x1F358, 0x1F359, 0x1F35A, 0x1F35B, 0x1F980, 0x1F99E, 0x1F990, 0x1F991, 0x1F366, 0x1F367, 0x1F368}; return lstEmoji; } QList TextUtils::unicodeSportEmoji() { //Add more const QList lstEmoji{0x1F93A, 0x1F3C7, 0x26F7, 0x1F3C2, 0x1F3CC, 0x1F3C4, 0x1F6A3, 0x1F3CA, 0x26F9, 0x1F3CB, 0x1F6B4, 0x1F938, 0x1F93C, 0x1F93D, 0x1F93E, 0x26BD, 0x26BE, 0x1F94E, 0x1F3C0, 0x1F3D0, 0x1F3C8, 0x1F3C9, 0x1F3BE, 0x1F94F, 0x1F3B3, 0x1F3CF, 0x1F3D1, 0x26F8, 0x1F3A3, 0x1F94C}; return lstEmoji; } QList TextUtils::unicodeTimeEmoji() { //Add more const QList lstEmoji{0x231B, 0x23F3, 0x231A, 0x23F0, 0x23F1, 0x23F2, 0x1F570, 0x1F55B, 0x1F567, 0x1F550, 0x1F55C, 0x1F551, 0x1F55D, 0x1F552, 0x1F55E, 0x1F553, 0x1F55F, 0x1F554, 0x1F560, 0x1F555, 0x1F561, 0x1F556, 0x1F562, 0x1F557, 0x1F563, 0x1F558, 0x1F564, 0x1F559, 0x1F565, 0x1F55A, 0x1F566}; return lstEmoji; } QList TextUtils::unicodeGameEmoji() { //Add more const QList lstEmoji{0x1F3AF, 0x1F3B1, 0x1F52E, 0x1F9FF, 0x1F3AE, 0x1F579, 0x1F3B0, 0x1F3B2, 0x1F9F8, 0x265F, 0x1F0CF}; return lstEmoji; } QList TextUtils::unicodeClothingEmoji() { //Add more const QList lstEmoji{0x1F453, 0x1F576, 0x1F97D, 0x1F97C, 0x1F454, 0x1F455, 0x1F456, 0x1F9E3, 0x1F9E4, 0x1F9E5, 0x1F9E6, 0x1F457, 0x1F458, 0x1F459, 0x1F45A, 0x1F45B, 0x1F45C, 0x1F45D, 0x1F462, 0x1F451, 0x1F452, 0x1F3A9, 0x1F393, 0x1F9E2, 0x26D1, 0x1F4FF, 0x1F484, 0x1F48D, 0x1F48E}; return lstEmoji; } QList TextUtils::unicodeSoundMusicEmoji() { //Add more const QList lstEmoji{0x1F507, 0x1F508, 0x1F509, 0x1F50A, 0x1F4E2, 0x1F4E3, 0x1F4EF, 0x1F514, 0x1F515, 0x1F3BC, 0x1F3B5, 0x1F3B6, 0x1F399, 0x1F39A, 0x1F39B, 0x1F3A4, 0x1F3A7, 0x1F4FB, 0x1F3B7, 0x1F3B8, 0x1F3B9, 0x1F3BA, 0x1F3BB, 0x1F941 }; return lstEmoji; } QList TextUtils::unicodeComputerEmoji() { //Add more const QList lstEmoji{0x1F50B, 0x1F50C, 0x1F4BB, 0x1F5A5, 0x1F5A8, 0x2328, 0x1F5B1, 0x1F5B2, 0x1F4BD, 0x1F4BE, 0x1F4BF, 0x1F4C0, 0x1F9EE }; return lstEmoji; } QList TextUtils::unicodeSymbolsEmoji() { //Add more const QList lstEmoji{0x1F3E7, 0x1F6AE, 0x1F6B0, 0x267F, 0x1F6B9, 0x1F6BA, 0x1F6BB, 0x1F6BC, 0x1F6BE, 0x1F6C2, 0x1F6C3, 0x1F6C4, 0x1F6C5, 0x26A0, 0x1F6B8, 0x26D4, 0x1F6AB, 0x1F6B3, 0x1F6AD, 0x1F6AF, 0x1F6B1, 0x1F6B7, 0x1F4F5, 0x1F51E, 0x2622, 0x2623, 0x2B06, 0x2197, 0x2640, 0x2642, 0x2695}; return lstEmoji; } QList TextUtils::unicodeFaceEmoji() { //Add more const QList lstEmoji{0x1F4A9, 0x1F921, 0x1F479, 0x1F47A, 0x1F47B, 0x1F47D, 0x1F47E, 0x1F916, 0x1F624, 0x1F621, 0x1F620, 0x1F92C, 0x1F608, 0x1F47F, 0x1F480, 0x2620}; return lstEmoji; } QList TextUtils::unicodeFantasyEmoji() { //Add more const QList lstEmoji{0x1F47C, 0x1F385, 0x1F936, 0x1F9B8, 0x1F9B9, 0x1F9D9, 0x1F9DA, 0x1F9DB, 0x1F9DC, 0x1F9DD, 0x1F9DE, 0x1F9DF, 0x1F9DE}; return lstEmoji; } QList TextUtils::unicodePlantEmoji() { //Add more const QList lstEmoji{0x1F490, 0x1F338, 0x1F4AE, 0x1F3F5, 0x1F339, 0x1F940, 0x1F33A, 0x1F33B, 0x1F33C, 0x1F337, 0x1F331, 0x1F332, 0x1F333, 0x1F334, 0x1F335, 0x1F33E, 0x1F33F, 0x2618, 0x1F340, 0x1F341, 0x1F342, 0x1F343}; return lstEmoji; } QList TextUtils::unicodeTravelEmoji() { //Add more const QList lstEmoji{0x1F30D, 0x1F30E, 0x1F30F, 0x1F310, 0x1F5FA, 0x1F5FE, 0x1F9ED, 0x1F3D4, 0x26F0, 0x1F30B, 0x1F5FB, 0x1F3D5, 0x1F3D6, 0x1F3DC, 0x1F3DD, 0x1F3DE, 0x1F3DF, 0x1F3DB, 0x1F3D7, 0x1F9F1, 0x1F3D8, 0x1F3DA, 0x1F3E0, 0x1F3E1, 0x1F3E2, 0x1F3E3, 0x1F3E4, 0x1F3E5, 0x1F3E6, 0x1F3E8, 0x1F3E9, 0x1F3EA, 0x1F3EB, 0x1F3EC, 0x1F3ED, 0x1F3EF, 0x1F3F0, 0x1F492, 0x1F5FC, 0x1F5FD, 0x26EA, 0x1F54C, 0x1F6D5, 0x1F54D, 0x26E9, 0x1F54B, 0x26F2, 0x26FA, 0x1F301, 0x1F303, 0x1F304, 0x1F305, 0x1F306, 0x1F307, 0x1F309, 0x2668, 0x1F3A0, 0x1F3A1, 0x1F3A2, 0x1F488, 0x1F3AA}; return lstEmoji; } QList TextUtils::unicodeBookPaperEmoji() { //Add more const QList lstEmoji{0x1F4D4, 0x1F4D5, 0x1F4D6, 0x1F4D7, 0x1F4D8, 0x1F4D9, 0x1F4DA, 0x1F4D3, 0x1F4D2, 0x1F4C3, 0x1F4DC, 0x1F4C4, 0x1F4F0, 0x1F5DE, 0x1F4D1, 0x1F516, 0x1F3F7}; return lstEmoji; } QList TextUtils::unicodeBookToolsEmoji() { //Add more const QList lstEmoji{0x1F528, 0x26CF, 0x2692, 0x1F6E0, 0x1F5E1, 0x2694, 0x1F52B, 0x1F3F9, 0x1F6E1, 0x1F527, 0x1F529, 0x2699, 0x1F5DC, 0x2696, 0x1F517, 0x26D3, 0x1F9F0, 0x1F9F2}; return lstEmoji; } QList TextUtils::unicodeScienceEmoji() { //Add more const QList lstEmoji{0x2697, 0x1F9EA, 0x1F9EB, 0x1F9EC, 0x1F52C, 0x1F52D, 0x1F4E1, 0x1F489, 0x1F48A, 0x1FA79}; return lstEmoji; } diff --git a/src/textutils.h b/src/textutils.h index 4b9cc57..2f59c9e 100644 --- a/src/textutils.h +++ b/src/textutils.h @@ -1,86 +1,86 @@ /* This file is part of KDE. Copyright (c) 2009 Thomas McGuire Copyright (c) 2010 Stephen Kelly This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KPIMTEXTEDIT_TEXTUTILS_H #define KPIMTEXTEDIT_TEXTUTILS_H #include "kpimtextedit_export.h" #include - +#include class QTextDocument; namespace KPIMTextEdit { /** Utility class for methods working with rich text. @since 4.5 */ namespace TextUtils { /** * Returns whether the QTextDocument @p document contains rich text formatting. */ KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT bool containsFormatting(const QTextDocument *document); /** * Changes the given text so that each line of it fits into the given maximal length. * At each line, the "indent" string is prepended, which is usually the quote prefix. * The text parameter will be empty afterwards. * @param text the text to indent * @param indent the indentation prefix string * @param maxLength the maximal length the string of text will fit into * Example: * text = "Hello World, this is a test." * indent = "> " * maxLength = 16 * Result: "> Hello World,\n" * "> this is a test." */ KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QString flowText(QString &text, const QString &indent, int maxLength); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFullEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFacesEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeAnimalsEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeEmotionEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeBodyEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeTransportEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeEventEmoji(); -KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFlagsEmoji(); +KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QStringList unicodeFlagsEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeWeatherEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFoodEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeSportEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeTimeEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeGameEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeClothingEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeSoundMusicEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeComputerEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeSymbolsEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFaceEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeFantasyEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodePlantEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeTravelEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeBookPaperEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeBookToolsEmoji(); KPIMTEXTEDIT_EXPORT Q_REQUIRED_RESULT QList unicodeScienceEmoji(); } } #endif