KTextAddons

emoticontexteditselector.cpp
1/*
2 SPDX-FileCopyrightText: 2012-2025 Laurent Montel <montel@kde.org>
3 based on code from kopete
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "emoticontexteditselector.h"
9#include "emoticoncategorybuttons.h"
10#include "emoticonlistview.h"
11#include "emoticontonecombobox.h"
12
13#include <KLocalizedString>
14#include <QLineEdit>
15#include <QVBoxLayout>
16#include <TextEmoticonsCore/EmojiModel>
17#include <TextEmoticonsCore/EmojiModelManager>
18#include <TextEmoticonsCore/EmojiSortFilterProxyModel>
19#include <TextEmoticonsCore/EmoticonUnicodeUtils>
20#include <TextEmoticonsCore/UnicodeEmoticonManager>
21
22using namespace TextEmoticonsWidgets;
23
24class EmoticonTextEditSelector::EmoticonTextEditSelectorPrivate
25{
26public:
27 EmoticonTextEditSelectorPrivate(EmoticonTextEditSelector *q)
28 : searchUnicodeLineEdit(new QLineEdit(q))
29 , categoryButtons(new EmoticonCategoryButtons(q))
30 , emoticonListView(new EmoticonListView(q))
31 , emoticonToneComboBox(new EmoticonToneComboBox(q))
32 , emojiSortFilterProxyModel(new TextEmoticonsCore::EmojiSortFilterProxyModel(q))
33 , qq(q)
34 {
35 }
36 void slotUsedIdentifierChanged(const QStringList &lst)
37 {
38 emojiSortFilterProxyModel->setRecentEmoticons(lst);
39 }
40 void slotCategorySelected(const QString &category)
41 {
42 searchUnicodeLineEdit->setText({});
43 emojiSortFilterProxyModel->setCategory(category);
44 emoticonListView->setIsRecentView(category == TextEmoticonsCore::EmoticonUnicodeUtils::recentIdentifier());
45 }
46
47 void slotSearchUnicode(const QString &str)
48 {
49 emojiSortFilterProxyModel->setSearchIdentifier(str);
50 }
51
52 void slotItemSelected(const QString &str, const QString &identifier)
53 {
54 TextEmoticonsCore::EmojiModelManager::self()->addIdentifier(identifier);
55 Q_EMIT qq->insertEmoji(str);
56 Q_EMIT qq->insertEmojiIdentifier(identifier);
57 if (qq->isVisible() && qq->parentWidget() && qq->parentWidget()->inherits("QMenu")) {
58 qq->parentWidget()->close();
59 }
60 }
61
62 QLineEdit *const searchUnicodeLineEdit;
63 EmoticonCategoryButtons *const categoryButtons;
64 EmoticonListView *const emoticonListView;
65 EmoticonToneComboBox *const emoticonToneComboBox;
66 TextEmoticonsCore::EmojiSortFilterProxyModel *const emojiSortFilterProxyModel;
67 bool customEmojiSupport = false;
68 EmoticonTextEditSelector *const qq;
69};
70
71EmoticonTextEditSelector::EmoticonTextEditSelector(QWidget *parent)
72 : QWidget(parent)
73 , d(new EmoticonTextEditSelectorPrivate(this))
74{
75 const int defaultFontSize{22};
76 QFont f;
77 f.setPointSize(defaultFontSize);
78 f.setFamily(TextEmoticonsCore::EmoticonUnicodeUtils::emojiFontName());
79 d->emoticonListView->setFontSize(defaultFontSize);
80 d->categoryButtons->setFont(f);
81 auto mainLayout = new QVBoxLayout(this);
82 mainLayout->setObjectName(QStringLiteral("mainLayout"));
83 mainLayout->setSpacing(0);
84 mainLayout->setContentsMargins({});
85
86 auto hLayout = new QHBoxLayout;
87 hLayout->setContentsMargins({});
88 mainLayout->addLayout(hLayout);
89
90 d->searchUnicodeLineEdit->setObjectName(QStringLiteral("mSearchUnicodeLineEdit"));
91 d->searchUnicodeLineEdit->setClearButtonEnabled(true);
92 d->searchUnicodeLineEdit->setPlaceholderText(i18nc("@info:placeholder", "Search Emoticon…"));
93 hLayout->addWidget(d->searchUnicodeLineEdit);
94 d->emoticonToneComboBox->setObjectName(QStringLiteral("emoticonToneComboBox"));
95 hLayout->addWidget(d->emoticonToneComboBox);
96 d->emoticonToneComboBox->setCurrentEmojiTone(TextEmoticonsCore::EmojiModelManager::self()->emojiTone());
97
98 d->categoryButtons->setObjectName(QStringLiteral("mCategoryButtons"));
99 mainLayout->addWidget(d->categoryButtons);
100 d->emoticonListView->setObjectName(QStringLiteral("mEmoticonListView"));
101 mainLayout->addWidget(d->emoticonListView);
102
103 d->emojiSortFilterProxyModel->setObjectName(QStringLiteral("mEmoticonProxyModel"));
104 d->emoticonListView->setModel(d->emojiSortFilterProxyModel);
105 connect(d->emoticonListView, &EmoticonListView::fontSizeChanged, d->emoticonListView, &EmoticonListView::setFontSize);
106 connect(d->emoticonListView, &EmoticonListView::emojiItemSelected, this, [this](const QString &str, const QString &identifier) {
107 d->slotItemSelected(str, identifier);
108 });
109 connect(d->categoryButtons, &EmoticonCategoryButtons::categorySelected, this, [this](const QString &category) {
110 d->slotCategorySelected(category);
111 });
112 connect(d->searchUnicodeLineEdit, &QLineEdit::textChanged, this, [this](const QString &str) {
113 d->slotSearchUnicode(str);
114 });
115 connect(TextEmoticonsCore::EmojiModelManager::self(), &TextEmoticonsCore::EmojiModelManager::usedIdentifierChanged, this, [this](const QStringList &lst) {
116 d->slotUsedIdentifierChanged(lst);
117 });
118
119 connect(d->emoticonListView, &EmoticonListView::clearHistory, this, []() {
120 TextEmoticonsCore::EmojiModelManager::self()->setRecentIdentifier(QStringList());
121 });
122
123 connect(d->emoticonToneComboBox, &TextEmoticonsWidgets::EmoticonToneComboBox::currentIndexChanged, this, [this]() {
124 TextEmoticonsCore::EmojiModelManager::self()->setEmojiTone(d->emoticonToneComboBox->currentEmojiTone());
125 });
126
127 connect(TextEmoticonsCore::EmojiModelManager::self(), &TextEmoticonsCore::EmojiModelManager::emojiToneChanged, this, [this]() {
128 d->emojiSortFilterProxyModel->setEmojiTone(TextEmoticonsCore::EmojiModelManager::self()->emojiTone());
129 });
130
131 d->emojiSortFilterProxyModel->setEmojiTone(TextEmoticonsCore::EmojiModelManager::self()->emojiTone());
132 const QSize popupMenuSize = QSize(400, 250);
133 setMinimumSize(popupMenuSize);
134}
135
137{
138 d->searchUnicodeLineEdit->setFocus();
139}
140
141EmoticonTextEditSelector::~EmoticonTextEditSelector() = default;
142
144{
145 if (!d->categoryButtons->wasLoaded()) {
146 TextEmoticonsCore::UnicodeEmoticonManager *emojiManager = TextEmoticonsCore::UnicodeEmoticonManager::self();
147 d->emojiSortFilterProxyModel->setSourceModel(TextEmoticonsCore::EmojiModelManager::self()->emojiModel());
148 const QList<TextEmoticonsCore::EmoticonCategory> categories = emojiManager->categories();
149 d->categoryButtons->setCategories(categories, d->customEmojiSupport);
150 d->emojiSortFilterProxyModel->setRecentEmoticons(TextEmoticonsCore::EmojiModelManager::self()->recentIdentifier());
151 }
152}
153
155{
156 d->customEmojiSupport = b;
157}
158
160{
161 return d->customEmojiSupport;
162}
163
164#include "moc_emoticontexteditselector.cpp"
void forceLineEditFocus()
Focus the line edit for search.
bool customEmojiSupport() const
Return whether the custom emoji category is enabled.
void loadEmoticons()
Do all the magic of creating an TextEmoticonsCore::UnicodeEmoticonManager and loading the categories ...
void setCustomEmojiSupport(bool b)
Set whether the custom emoji category should be shown.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void currentIndexChanged(int index)
void setFamily(const QString &family)
void setPointSize(int pointSize)
void setContentsMargins(const QMargins &margins)
void textChanged(const QString &text)
Q_EMITQ_EMIT
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 11:51:55 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.