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"