1 /*
2    SPDX-FileCopyrightText: 2019-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "unicodeemoticongui.h"
8 
9 #include <KListWidgetSearchLine>
10 #include <QApplication>
11 #include <QFile>
12 #include <QFormLayout>
13 #include <QHBoxLayout>
14 #include <QJsonDocument>
15 #include <QJsonObject>
16 #include <QLineEdit>
17 #include <QListWidget>
18 #include <QPushButton>
19 #include <QStandardPaths>
20 #include <QVBoxLayout>
21 
22 #include <emoticons/unicodeemoticonparser.h>
23 
UnicodeEmoticonGui(QWidget * parent)24 UnicodeEmoticonGui::UnicodeEmoticonGui(QWidget *parent)
25     : QWidget(parent)
26 {
27     auto mainLayout = new QVBoxLayout(this);
28     auto hboxLayout = new QHBoxLayout;
29     hboxLayout->setContentsMargins({});
30     mainLayout->addLayout(hboxLayout);
31 
32     auto mainComponentLayout = new QVBoxLayout;
33     mainComponentLayout->setContentsMargins({});
34 
35     mSearchEmoticon = new KListWidgetSearchLine(this);
36     mListWidget = new QListWidget(this);
37     mSearchEmoticon->setListWidget(mListWidget);
38     mainComponentLayout->addWidget(mSearchEmoticon);
39     mainComponentLayout->addWidget(mListWidget);
40     hboxLayout->addLayout(mainComponentLayout);
41 
42     mWidgetInfo = new UnicodeEmoticonInfo(this);
43     hboxLayout->addWidget(mWidgetInfo);
44 
45     auto save = new QPushButton(QStringLiteral("Save"), this);
46     mainLayout->addWidget(save);
47     connect(save, &QPushButton::clicked, this, &UnicodeEmoticonGui::save);
48 
49     connect(mListWidget, &QListWidget::itemClicked, this, &UnicodeEmoticonGui::slotItemChanged);
50     connect(mListWidget, &QListWidget::itemSelectionChanged, this, &UnicodeEmoticonGui::slotItemSelectionChanged);
51     load();
52 }
53 
54 UnicodeEmoticonGui::~UnicodeEmoticonGui() = default;
55 
slotItemSelectionChanged()56 void UnicodeEmoticonGui::slotItemSelectionChanged()
57 {
58     QListWidgetItem *item = mListWidget->currentItem();
59     slotItemChanged(item);
60 }
61 
slotItemChanged(QListWidgetItem * item)62 void UnicodeEmoticonGui::slotItemChanged(QListWidgetItem *item)
63 {
64     if (item) {
65         auto itemResult = static_cast<UnicodeEmoticonListWidgetItem *>(item);
66         UnicodeEmoticon info = itemResult->info();
67         mWidgetInfo->setInfo(info);
68     }
69 }
70 
load()71 void UnicodeEmoticonGui::load()
72 {
73     UnicodeEmoticonParser unicodeParser;
74     QFile file(QStringLiteral(":/emoji.json"));
75     if (!file.open(QFile::ReadOnly)) {
76         qWarning() << "Impossible to open file: " << file.errorString();
77         return;
78     }
79     const QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
80 
81     const QJsonObject obj = doc.object();
82     const QVector<UnicodeEmoticon> unicodeEmojiList = unicodeParser.parse(obj);
83     for (const UnicodeEmoticon &emoticon : unicodeEmojiList) {
84         auto item = new UnicodeEmoticonListWidgetItem(emoticon.identifier(), mListWidget);
85         item->setInfo(emoticon);
86     }
87 }
88 
save()89 void UnicodeEmoticonGui::save()
90 {
91     QJsonDocument doc;
92     QJsonObject o;
93     doc.setObject(o);
94     // TODO
95 }
96 
main(int argc,char * argv[])97 int main(int argc, char *argv[])
98 {
99     QApplication app(argc, argv);
100     QStandardPaths::setTestModeEnabled(true);
101 
102     UnicodeEmoticonGui w;
103     w.show();
104     return app.exec();
105 }
106 
UnicodeEmoticonInfo(QWidget * parent)107 UnicodeEmoticonInfo::UnicodeEmoticonInfo(QWidget *parent)
108     : QWidget(parent)
109 {
110     auto mainLayout = new QFormLayout(this);
111     mainLayout->setContentsMargins({});
112     mIdentifier = new QLineEdit(this);
113     mainLayout->addRow(QStringLiteral("identifier:"), mIdentifier);
114     mUnicode = new QLineEdit(this);
115     mainLayout->addRow(QStringLiteral("unicode:"), mUnicode);
116     mAliases = new QLineEdit(this);
117     mainLayout->addRow(QStringLiteral("aliases:"), mAliases);
118     mCategory = new QLineEdit(this);
119     mainLayout->addRow(QStringLiteral("category:"), mCategory);
120     mOrder = new QLineEdit(this);
121     mainLayout->addRow(QStringLiteral("order:"), mOrder);
122 }
123 
124 UnicodeEmoticonInfo::~UnicodeEmoticonInfo() = default;
125 
info() const126 UnicodeEmoticon UnicodeEmoticonInfo::info() const
127 {
128     return mInfo;
129 }
130 
setInfo(const UnicodeEmoticon & info)131 void UnicodeEmoticonInfo::setInfo(const UnicodeEmoticon &info)
132 {
133     mIdentifier->setText(info.identifier());
134     mUnicode->setText(info.unicode());
135     mAliases->setText(info.aliases().join(QLatin1Char(',')));
136     mCategory->setText(info.category());
137     mOrder->setText(QString::number(info.order()));
138     mInfo = info;
139 }
140 
UnicodeEmoticonListWidgetItem(const QString & str,QListWidget * parent)141 UnicodeEmoticonListWidgetItem::UnicodeEmoticonListWidgetItem(const QString &str, QListWidget *parent)
142     : QListWidgetItem(str, parent)
143 {
144 }
145 
info() const146 UnicodeEmoticon UnicodeEmoticonListWidgetItem::info() const
147 {
148     return mInfo;
149 }
150 
setInfo(const UnicodeEmoticon & info)151 void UnicodeEmoticonListWidgetItem::setInfo(const UnicodeEmoticon &info)
152 {
153     mInfo = info;
154 }
155