File indexing completed on 2024-06-23 04:40:22
0001 /* 0002 SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org> 0003 based on code from kopete 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "emoticontexteditselector.h" 0009 #include "emoticoncategorybuttons.h" 0010 #include "emoticonlistview.h" 0011 0012 #include <KLocalizedString> 0013 #include <QLineEdit> 0014 #include <QVBoxLayout> 0015 #include <TextEmoticonsCore/EmojiModel> 0016 #include <TextEmoticonsCore/EmojiModelManager> 0017 #include <TextEmoticonsCore/EmojiProxyModel> 0018 #include <TextEmoticonsCore/EmoticonUnicodeUtils> 0019 #include <TextEmoticonsCore/UnicodeEmoticonManager> 0020 0021 using namespace TextEmoticonsWidgets; 0022 0023 class EmoticonTextEditSelector::EmoticonTextEditSelectorPrivate 0024 { 0025 public: 0026 EmoticonTextEditSelectorPrivate(EmoticonTextEditSelector *q) 0027 : mCategoryButtons(new EmoticonCategoryButtons(q)) 0028 , mSearchUnicodeLineEdit(new QLineEdit(q)) 0029 , mEmoticonListView(new EmoticonListView(q)) 0030 , mEmojiProxyModel(new TextEmoticonsCore::EmojiProxyModel(q)) 0031 , qq(q) 0032 { 0033 } 0034 void slotUsedIdentifierChanged(const QStringList &lst) 0035 { 0036 mEmojiProxyModel->setRecentEmoticons(lst); 0037 } 0038 void slotCategorySelected(const QString &category) 0039 { 0040 mSearchUnicodeLineEdit->setText({}); 0041 mEmojiProxyModel->setCategory(category); 0042 mEmoticonListView->setIsRecentView(category == TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier()); 0043 } 0044 0045 void slotSearchUnicode(const QString &str) 0046 { 0047 mEmojiProxyModel->setSearchIdentifier(str); 0048 } 0049 0050 void slotItemSelected(const QString &str, const QString &identifier) 0051 { 0052 TextEmoticonsCore::EmojiModelManager::self()->addIdentifier(identifier); 0053 Q_EMIT qq->insertEmoji(str); 0054 Q_EMIT qq->insertEmojiIdentifier(identifier); 0055 if (qq->isVisible() && qq->parentWidget() && qq->parentWidget()->inherits("QMenu")) { 0056 qq->parentWidget()->close(); 0057 } 0058 } 0059 EmoticonCategoryButtons *const mCategoryButtons; 0060 QLineEdit *const mSearchUnicodeLineEdit; 0061 EmoticonListView *const mEmoticonListView; 0062 TextEmoticonsCore::EmojiProxyModel *const mEmojiProxyModel; 0063 bool mCustomEmojiSupport = false; 0064 EmoticonTextEditSelector *const qq; 0065 }; 0066 0067 EmoticonTextEditSelector::EmoticonTextEditSelector(QWidget *parent) 0068 : QWidget(parent) 0069 , d(new EmoticonTextEditSelectorPrivate(this)) 0070 { 0071 const int defaultFontSize{22}; 0072 QFont f; 0073 f.setPointSize(defaultFontSize); 0074 f.setFamily(TextEmoticonsCore::EmoticonUnicodeUtils::emojiFontName()); 0075 d->mEmoticonListView->setFontSize(defaultFontSize); 0076 d->mCategoryButtons->setFont(f); 0077 auto mainLayout = new QVBoxLayout(this); 0078 mainLayout->setObjectName(QStringLiteral("mainLayout")); 0079 mainLayout->setSpacing(0); 0080 mainLayout->setContentsMargins({}); 0081 d->mSearchUnicodeLineEdit->setObjectName(QStringLiteral("mSearchUnicodeLineEdit")); 0082 d->mSearchUnicodeLineEdit->setClearButtonEnabled(true); 0083 d->mSearchUnicodeLineEdit->setPlaceholderText(i18n("Search Emoticon...")); 0084 mainLayout->addWidget(d->mSearchUnicodeLineEdit); 0085 0086 d->mCategoryButtons->setObjectName(QStringLiteral("mCategoryButtons")); 0087 mainLayout->addWidget(d->mCategoryButtons); 0088 d->mEmoticonListView->setObjectName(QStringLiteral("mEmoticonListView")); 0089 mainLayout->addWidget(d->mEmoticonListView); 0090 0091 d->mEmojiProxyModel->setObjectName(QStringLiteral("mEmoticonProxyModel")); 0092 d->mEmoticonListView->setModel(d->mEmojiProxyModel); 0093 connect(d->mEmoticonListView, &EmoticonListView::fontSizeChanged, d->mEmoticonListView, &EmoticonListView::setFontSize); 0094 connect(d->mEmoticonListView, &EmoticonListView::emojiItemSelected, this, [this](const QString &str, const QString &identifier) { 0095 d->slotItemSelected(str, identifier); 0096 }); 0097 connect(d->mCategoryButtons, &EmoticonCategoryButtons::categorySelected, this, [this](const QString &category) { 0098 d->slotCategorySelected(category); 0099 }); 0100 connect(d->mSearchUnicodeLineEdit, &QLineEdit::textChanged, this, [this](const QString &str) { 0101 d->slotSearchUnicode(str); 0102 }); 0103 connect(TextEmoticonsCore::EmojiModelManager::self(), &TextEmoticonsCore::EmojiModelManager::usedIdentifierChanged, this, [this](const QStringList &lst) { 0104 d->slotUsedIdentifierChanged(lst); 0105 }); 0106 0107 connect(d->mEmoticonListView, &EmoticonListView::clearHistory, this, []() { 0108 TextEmoticonsCore::EmojiModelManager::self()->setRecentIdentifier(QStringList()); 0109 }); 0110 0111 const QSize popupMenuSize = QSize(400, 250); 0112 setMinimumSize(popupMenuSize); 0113 } 0114 0115 void EmoticonTextEditSelector::forceLineEditFocus() 0116 { 0117 d->mSearchUnicodeLineEdit->setFocus(); 0118 } 0119 0120 EmoticonTextEditSelector::~EmoticonTextEditSelector() = default; 0121 0122 void EmoticonTextEditSelector::loadEmoticons() 0123 { 0124 if (!d->mCategoryButtons->wasLoaded()) { 0125 TextEmoticonsCore::UnicodeEmoticonManager *emojiManager = TextEmoticonsCore::UnicodeEmoticonManager::self(); 0126 d->mEmojiProxyModel->setSourceModel(TextEmoticonsCore::EmojiModelManager::self()->emojiModel()); 0127 const QList<TextEmoticonsCore::EmoticonCategory> categories = emojiManager->categories(); 0128 d->mCategoryButtons->setCategories(categories, d->mCustomEmojiSupport); 0129 d->mEmojiProxyModel->setRecentEmoticons(TextEmoticonsCore::EmojiModelManager::self()->recentIdentifier()); 0130 } 0131 } 0132 0133 void EmoticonTextEditSelector::setCustomEmojiSupport(bool b) 0134 { 0135 d->mCustomEmojiSupport = b; 0136 } 0137 0138 bool EmoticonTextEditSelector::customEmojiSupport() const 0139 { 0140 return d->mCustomEmojiSupport; 0141 } 0142 0143 #include "moc_emoticontexteditselector.cpp"