diff --git a/asset/xml/emoji.xml b/asset/xml/emoji.xml
new file mode 100644
index 0000000..636f35a
--- /dev/null
+++ b/asset/xml/emoji.xml
@@ -0,0 +1,1077 @@
+
+
+
+ ๐ถ
+ ๐บ
+ ๐ฑ
+ ๐ญ
+ ๐น
+ ๐ฐ
+ ๐ธ
+ ๐ฏ
+ ๐จ
+ ๐ป
+ ๐ท
+ ๐ฝ
+ ๐ฎ
+ ๐
+ ๐ต
+ ๐
+ ๐ด
+ ๐
+ ๐
+ ๐ผ
+ ๐ง
+ ๐ฆ
+ ๐ค
+ ๐ฅ
+ ๐ฃ
+ ๐
+ ๐
+ ๐ข
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฌ
+ ๐ณ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฒ
+ ๐ก
+ ๐
+ ๐ซ
+ ๐ช
+ ๐
+ ๐
+ ๐ฉ
+ ๐พ
+ ๐
+ ๐ธ
+ ๐ท
+ ๐
+ ๐น
+ ๐ป
+ ๐บ
+ ๐
+ ๐
+ ๐
+ ๐ฟ
+ ๐พ
+ ๐
+ ๐ต
+ ๐ด
+ ๐ฒ
+ ๐ณ
+ ๐ฐ
+ ๐ฑ
+ ๐ผ
+
+
+ ๐บ
+ ๐ธ
+ ๐ป
+ ๐ฝ
+ ๐ผ
+ ๐
+ ๐ฟ
+ ๐น
+ ๐พ
+
+
+ ๐
+ ๐
+ ๐
+ ๐
+ โบ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ณ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฃ
+ ๐ข
+ ๐
+ ๐ญ
+ ๐ช
+ ๐ฅ
+ ๐ฐ
+ ๐
+ ๐
+ ๐ฉ
+ ๐ซ
+ ๐จ
+ ๐ฑ
+ ๐
+ ๐ก
+ ๐ค
+ ๐
+ ๐
+ ๐
+ ๐ท
+ ๐
+ ๐ด
+ ๐ต
+ ๐ฒ
+ ๐
+ ๐ฆ
+ ๐ง
+ ๐
+ ๐ฟ
+ ๐ฎ
+ ๐ฌ
+ ๐
+ ๐
+ ๐ฏ
+ ๐ถ
+ ๐
+ ๐
+ ๐
+ ๐ฒ
+ ๐ณ
+ ๐ฎ
+ ๐ท
+ ๐
+ ๐ถ
+ ๐ฆ
+ ๐ง
+ ๐จ
+ ๐ฉ
+ ๐ด
+ ๐ต
+ ๐ฑ
+ ๐ผ
+ ๐ธ
+ ๐น
+ ๐บ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฝ
+ ๐ฉ
+
+
+ โ
+ ๐ต
+ ๐ถ
+ ๐ผ
+ ๐บ
+ ๐ป
+ ๐ธ
+ ๐น
+ ๐ท
+ ๐ด
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ค
+ ๐ฑ
+ ๐ฃ
+ ๐ฅ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฒ
+ ๐ข
+ ๐ก
+ ๐ณ
+ ๐
+ ๐ฉ
+ ๐ฎ
+ ๐ฆ
+ ๐จ
+ ๐ง
+ ๐
+ ๐ฐ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ญ
+ ๐ฏ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฝ
+
+
+ ๐ฅ
+ โจ
+ ๐
+ ๐ซ
+ ๐ฅ
+ ๐ข
+ ๐ฆ
+ ๐ง
+ ๐ค
+ ๐จ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ โ
+ โ
+ ๐
+ โ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ โ
+ ๐
+ ๐ช
+ ๐ถ
+ ๐
+ ๐
+ ๐ซ
+ ๐ช
+ ๐ฌ
+ ๐ญ
+ ๐
+ ๐
+ ๐ฏ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฐ
+ ๐
+ ๐
+ ๐
+
+
+ ๐จ
+ ๐ฌ
+ ๐ค
+ ๐ง
+ ๐ผ
+ ๐ต
+ ๐ถ
+ ๐น
+ ๐ป
+ ๐บ
+ ๐ท
+ ๐ธ
+ ๐พ
+ ๐ฎ
+ ๐
+ ๐ด
+ ๐
+ ๐ฒ
+ ๐ฏ
+ ๐
+ ๐
+ โฝ
+ โพ
+ ๐พ
+ ๐ฑ
+ ๐
+ ๐ณ
+ โณ
+ ๐ต
+ ๐ด
+ ๐
+ ๐
+ ๐
+ ๐ฟ
+ ๐
+ ๐
+ ๐
+ ๐ฃ
+
+
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ป
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฎ
+ ๐ฅ
+ ๐ท
+ ๐น
+ ๐ผ
+ ๐ฟ
+ ๐
+ ๐ฝ
+ ๐พ
+ ๐ป
+ ๐ฑ
+ โ
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐บ
+ ๐ป
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ข
+ ๐ฃ
+ โณ
+ โ
+ โฐ
+ โ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐ฆ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฟ
+ ๐ฝ
+ ๐ง
+ ๐ฉ
+ ๐จ
+ ๐ช
+ ๐ฌ
+ ๐ฃ
+ ๐ซ
+ ๐ช
+ ๐
+ ๐
+ ๐ฐ
+ ๐ด
+ ๐ต
+ ๐ท
+ ๐ถ
+ ๐ณ
+ ๐ธ
+ ๐ฒ
+ ๐ง
+ ๐ฅ
+ ๐ค
+ โ
+ ๐ฉ
+ ๐จ
+ ๐ฏ
+ ๐ซ
+ ๐ช
+ ๐ฌ
+ ๐ญ
+ ๐ฎ
+ ๐ฆ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ โ
+ ๐
+ ๐
+ โ
+ โ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฌ
+ ๐ญ
+ ๐ฐ
+
+
+ ๐
+ ๐ก
+ ๐ซ
+ ๐ข
+ ๐ฃ
+ ๐ฅ
+ ๐ฆ
+ ๐ช
+ ๐ฉ
+ ๐จ
+ ๐
+ โช
+ ๐ฌ
+ ๐ค
+ ๐
+ ๐
+ ๐ฏ
+ ๐ฐ
+ โบ
+ ๐ญ
+ ๐ผ
+ ๐พ
+ ๐ป
+ ๐
+ ๐
+ ๐
+ ๐ฝ
+ ๐
+ ๐
+ ๐ก
+ โฒ
+ ๐ข
+ ๐ข
+
+
+ ๐ก
+ ๐ข
+ ๐ฃ
+ ๐ค
+ ๐ฅ
+ ๐ฆ
+ ๐ง
+ ๐จ
+ ๐ฉ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ถ
+ ๐ฝ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฑ
+ ๐ฒ
+ ๐ณ
+ ๐ด
+ ๐ต
+ ๐ถ
+ ๐ท
+ ๐ฟ
+ ๐
+ ๐ธ
+ ๐ฝ
+ ๐พ
+ ๐พ
+ ๐ฟ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐จ
+ ๐ฉ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ญ
+ ๐ฎ
+ ๐ฏ
+ ๐ฐ
+ ๐ฑ
+ ๐ฒ
+ ๐ณ
+ ๐ด
+ ๐ต
+ ๐ถ
+ ๐ท
+ ๐ธ
+ ๐น
+ ๐ป
+ ๐ผ
+ ๐ฝ
+ ๐พ
+ ๐ฟ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐ข
+ ๐ฃ
+ ๐ฅ
+ ๐ฆ
+ ๐ง
+ ๐จ
+ ๐ฉ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ญ
+ ๐ฎ
+ ๐ฏ
+ ๐ฐ
+ ๐ฑ
+ ๐ฒ
+ ๐ณ
+ ๐ด
+ ๐ต
+ ๐ถ
+ ๐ท
+ ๐ธ
+ ๐น
+ ๐บ
+ ๐ป
+ ๐ผ
+ ๐ฝ
+ ๐พ
+ ๐ฟ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐ข
+ ๐ฃ
+ ๐ค
+ ๐ฅ
+ ๐ฆ
+ ๐ง
+ ๐จ
+ ๐ฉ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ญ
+ ๐ฏ
+ ๐ฏ
+ ๐ฐ
+ ๐ฑ
+ ๐ฒ
+ ๐ณ
+ ๐ด
+ ๐ต
+ ๐ถ
+ ๐ท
+ ๐ธ
+ ๐น
+ ๐บ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐ข
+ ๐ฃ
+ ๐ค
+ ๐ฅ
+ ๐ฆ
+ ๐ง
+ ๐จ
+ ๐ฉ
+ ๐ช
+ ๐ซ
+ ๐ฌ
+ ๐ฐ
+ ๐ฑ
+ ๐ฒ
+ ๐ณ
+
+
+ 1โฃ
+ 2โฃ
+ 3โฃ
+ 4โฃ
+ 5โฃ
+ 6โฃ
+ 7โฃ
+ 8โฃ
+ 9โฃ
+ 0โฃ
+ ๐
+ ๐ข
+ #โฃ
+ ๐ฃ
+ โฌ
+ โฌ
+ โฌ
+ โก
+ ๐
+ ๐ก
+ ๐ค
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ ๐
+ โ
+ โถ
+ ๐ผ
+ ๐ฝ
+ โฉ
+ โช
+ โน
+ โช
+ โฉ
+ โซ
+ โฌ
+ โคต
+ โคด
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ถ
+ ๐ฆ
+ ๐
+ ๐ฏ
+ ๐ณ
+ ๐ต
+ ๐ด
+ ๐ฒ
+ ๐
+ ๐น
+ ๐บ
+ ๐ถ
+ ๐
+ ๐ป
+ ๐น
+ ๐บ
+ ๐ผ
+ ๐พ
+ ๐ฐ
+ ๐ฎ
+ ๐
ฟ
+ โฟ
+ ๐ญ
+ ๐ท
+ ๐ธ
+ ๐
+ โ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ใ
+ ใ
+ ๐
+ ๐
+ ๐
+ ๐ซ
+ ๐
+ ๐ต
+ ๐ฏ
+ ๐ฑ
+ ๐ณ
+ ๐ท
+ ๐ธ
+ โ
+ โณ
+ โ
+ โ
+ โ
+ โด
+ ๐
+ ๐
+ ๐ณ
+ ๐ด
+ ๐
ฐ
+ ๐
ฑ
+ ๐
+ ๐
พ
+ ๐
+ โฟ
+ โป
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โ๐ฏ
+ ๐ง
+ ๐น
+ ๐ฒ
+ ๐ฑ
+ ยฉ
+ ยฎ
+ โข
+ โ
+ โผ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โญ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ง
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ก
+ ๐ข
+ ๐ฃ
+ ๐ค
+ ๐ฅ
+ ๐ฆ
+ โ
+ โ
+ โ
+ โ
+ โ
+ โฅ
+ โฃ
+ โฆ
+ ๐ฎ
+ ๐ฏ
+ โ
+ โ
+ ๐
+ ๐
+ โฐ
+ ใฐ
+ ใฝ
+ ๐ฑ
+ โผ
+ โป
+ โพ
+ โฝ
+ โช
+ โซ
+ ๐บ
+ ๐ฒ
+ ๐ณ
+ โซ
+ โช
+ ๐ด
+ ๐ต
+ ๐ป
+ โฌ
+ โฌ
+ ๐ถ
+ ๐ท
+ ๐ธ
+ ๐น
+
+
+ โต
+ ๐ค
+ ๐ฃ
+ โ
+ ๐
+ โ
+ ๐บ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐จ
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ฒ
+ ๐ก
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐
+ ๐ซ
+ ๐ฆ
+ ๐ฅ
+ โ
+ ๐ง
+ ๐ฐ
+ โฝ
+ ๐ฎ
+ ๐ฐ
+ โจ
+ ๐ฟ
+ ๐ช
+ ๐ญ
+ ๐
+ ๐ฉ
+
+
+
+
+ Faces
+ ๐
+ faces
+
+
+ Faces of Cats
+ ๐ธ
+ cat_faces
+
+
+ Animals and Plants
+ ๐ง
+ animals_and_plants
+
+
+ Food and Drinks
+ ๐ป
+ food_and_drink
+
+
+ Places
+ ๐ฏ
+ places
+
+
+ Music and Sport
+ ๐ง
+ music_and_sport
+
+
+ Objects
+ ๐ฝ
+ objects
+
+
+ Miscellaneous
+ ๐
+ misc
+
+
+ Symbols
+ ๐
+ symbols
+
+
+ Transport
+ ๐
+ transport
+
+
+ Unicode 7.0
+ ๐ด
+ seven
+
+
+
diff --git a/qml/component/EmojiPicker.qml b/qml/component/EmojiPicker.qml
new file mode 100644
index 0000000..3cf17d2
--- /dev/null
+++ b/qml/component/EmojiPicker.qml
@@ -0,0 +1,93 @@
+import QtQuick 2.9
+import QtQuick.Controls 2.2
+import QtQuick.Layouts 1.3
+import QtQuick.XmlListModel 2.0
+
+Popup {
+ property var textArea
+ property string emojiCategory: "faces"
+
+ ColumnLayout {
+ anchors.fill: parent
+
+ GridView {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+
+ cellWidth: 36
+ cellHeight: 36
+
+ boundsBehavior: Flickable.DragOverBounds
+
+ clip: true
+
+ model: XmlListModel {
+ source: "qrc:/asset/xml/emoji.xml"
+ query: "/root/emoji_by_category/" +emojiCategory + "/element"
+
+ XmlRole { name: "emoji"; query: "string()" }
+ }
+
+ delegate: Label {
+ width: 36
+ height: 36
+
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+
+ font.pointSize: 20
+ text: emoji
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: textArea.insert(textArea.cursorPosition, emoji)
+ }
+ }
+
+ ScrollBar.vertical: ScrollBar {}
+ }
+
+ Rectangle {
+ Layout.fillWidth: true
+ Layout.preferredHeight: 2
+ color: "white"
+ }
+
+ ListView {
+ Layout.fillWidth: true
+ Layout.preferredHeight: 48
+
+ orientation: ListView.Horizontal
+
+ boundsBehavior: Flickable.DragOverBounds
+
+ clip: true
+
+ model: XmlListModel {
+ source: "qrc:/asset/xml/emoji.xml"
+ query: "/root/emoji_categories/element"
+
+ XmlRole { name: "emoji_unified"; query: "emoji_unified/string()" }
+ XmlRole { name: "name"; query: "name/string()" }
+ }
+
+ delegate: Label {
+ width: 48
+ height: 48
+
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+
+ font.pointSize: 20
+ text: emoji_unified
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: emojiCategory = name
+ }
+ }
+
+ ScrollBar.horizontal: ScrollBar {}
+ }
+ }
+}
diff --git a/qml/form/RoomForm.qml b/qml/form/RoomForm.qml
index c5588d7..a8ce137 100644
--- a/qml/form/RoomForm.qml
+++ b/qml/form/RoomForm.qml
@@ -385,12 +385,30 @@ Item {
}
ItemDelegate {
+ id: emojiButton
+
Layout.preferredWidth: height
Layout.fillHeight: true
contentItem: MaterialIcon { icon: "\ue24e" }
background: Rectangle { color: Material.theme == Material.Light ? "#eaeaea" : "#242424" }
+
+ onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.open()
+
+ EmojiPicker {
+ id: emojiPicker
+
+ parent: ApplicationWindow.overlay
+
+ x: window.width - 370
+ y: window.height - 440
+
+ width: 360
+ height: 360
+
+ textArea: inputField
+ }
}
}
}
diff --git a/res.qrc b/res.qrc
index 93f5142..b8e9e3b 100644
--- a/res.qrc
+++ b/res.qrc
@@ -30,5 +30,7 @@
qml/component/TextDelegate.qml
qml/component/MessageContextMenu.qml
qml/form/SettingGeneralForm.qml
+ qml/component/EmojiPicker.qml
+ asset/xml/emoji.xml