From 8f6dd0cf852c63fa1df17a12ec4f28b11c3a9aff Mon Sep 17 00:00:00 2001 From: ByteDream Date: Tue, 9 Mar 2021 00:07:31 +0100 Subject: [PATCH] Added the main components --- QOptionObjects.py | 2589 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 149 ++- 2 files changed, 2737 insertions(+), 1 deletion(-) create mode 100644 QOptionObjects.py diff --git a/QOptionObjects.py b/QOptionObjects.py new file mode 100644 index 0000000..681f196 --- /dev/null +++ b/QOptionObjects.py @@ -0,0 +1,2589 @@ +from PyQt5 import QtGui, QtCore, QtWidgets +import typing + + +class QEmojiPicker(QtWidgets.QDialog): + """A simple emoji picker""" + + def __init__(self, parent: QtWidgets = None, flags: typing.Union[QtCore.Qt.WindowFlags, QtCore.Qt.WindowType] = None, items_per_row=8, performance_search=True): + """ + Args: + parent: The parent window + flags: Qt flags + items_per_row: How many items per row should be displayed + performance_search: If True, the search input will display the emojis faster. See `self.on_input(...)` for more details + """ + if flags: + super().__init__(parent, flags) + else: + super().__init__(parent) + # initializes the ui + self.setupUi(self) + self.retranslateUi(self) + + self.items_per_row = items_per_row + self.performance_search = performance_search + + self.selected_emoji = None + + # connects `self.on_input(...)` whenever the search input text is changed + self.search_line_edit.textChanged.connect(self.on_input) + + # the emojis. a pretty long dict... + self.emojis = { + 'Smileys & People': { + "๐Ÿ˜€": "Grinning Face", + "๐Ÿ˜ƒ": "Grinning Face with Big Eyes", + "๐Ÿ˜„": "Grinning Face with Smiling Eyes", + "๐Ÿ˜": "Beaming Face with Smiling Eyes", + "๐Ÿ˜†": "Grinning Squinting Face", + "๐Ÿ˜…": "Grinning Face with Sweat", + "๐Ÿคฃ": "Rolling on the Floor Laughing", + "๐Ÿ˜‚": "Face with Tears of Joy", + "๐Ÿ™‚": "Slightly Smiling Face", + "๐Ÿ™ƒ": "Upside-Down Face", + "๐Ÿ˜‰": "Winking Face", + "๐Ÿ˜Š": "Smiling Face with Smiling Eyes", + "๐Ÿ˜‡": "Smiling Face with Halo", + "๐Ÿฅฐ": "Smiling Face with Hearts", + "๐Ÿ˜": "Smiling Face with Heart-Eyes", + "๐Ÿคฉ": "Star-Struck", + "๐Ÿ˜˜": "Face Blowing a Kiss", + "๐Ÿ˜—": "Kissing Face", + "โ˜บ๏ธ": "Smiling Face", + "๐Ÿ˜š": "Kissing Face with Closed Eyes", + "๐Ÿ˜™": "Kissing Face with Smiling Eyes", + "๐Ÿฅฒ": "Smiling Face with Tear", + "๐Ÿ˜‹": "Face Savoring Food", + "๐Ÿ˜›": "Face with Tongue", + "๐Ÿ˜œ": "Winking Face with Tongue", + "๐Ÿคช": "Zany Face", + "๐Ÿ˜": "Squinting Face with Tongue", + "๐Ÿค‘": "Money-Mouth Face", + "๐Ÿค—": "Hugging Face", + "๐Ÿคญ": "Face with Hand Over Mouth", + "๐Ÿคซ": "Shushing Face", + "๐Ÿค”": "Thinking Face", + "๐Ÿค": "Zipper-Mouth Face", + "๐Ÿคจ": "Face with Raised Eyebrow", + "๐Ÿ˜": "Neutral Face", + "๐Ÿ˜‘": "Expressionless Face", + "๐Ÿ˜ถ": "Face Without Mouth", + "๐Ÿ˜": "Smirking Face", + "๐Ÿ˜’": "Unamused Face", + "๐Ÿ™„": "Face with Rolling Eyes", + "๐Ÿ˜ฌ": "Grimacing Face", + "๐Ÿคฅ": "Lying Face", + "๐Ÿ˜Œ": "Relieved Face", + "๐Ÿ˜”": "Pensive Face", + "๐Ÿ˜ช": "Sleepy Face", + "๐Ÿคค": "Drooling Face", + "๐Ÿ˜ด": "Sleeping Face", + "๐Ÿ˜ท": "Face with Medical Mask", + "๐Ÿค’": "Face with Thermometer", + "๐Ÿค•": "Face with Head-Bandage", + "๐Ÿคข": "Nauseated Face", + "๐Ÿคฎ": "Face Vomiting", + "๐Ÿคง": "Sneezing Face", + "๐Ÿฅต": "Hot Face", + "๐Ÿฅถ": "Cold Face", + "๐Ÿฅด": "Woozy Face", + "๐Ÿ˜ต": "Dizzy Face", + "๐Ÿคฏ": "Exploding Head", + "๐Ÿค ": "Cowboy Hat Face", + "๐Ÿฅณ": "Partying Face", + "๐Ÿฅธ": "Disguised Face", + "๐Ÿ˜Ž": "Smiling Face with Sunglasses", + "๐Ÿค“": "Nerd Face", + "๐Ÿง": "Face with Monocle", + "๐Ÿ˜•": "Confused Face", + "๐Ÿ˜Ÿ": "Worried Face", + "๐Ÿ™": "Slightly Frowning Face", + "โ˜น๏ธ": "Frowning Face", + "๐Ÿ˜ฎ": "Face with Open Mouth", + "๐Ÿ˜ฏ": "Hushed Face", + "๐Ÿ˜ฒ": "Astonished Face", + "๐Ÿ˜ณ": "Flushed Face", + "๐Ÿฅบ": "Pleading Face", + "๐Ÿ˜ฆ": "Frowning Face with Open Mouth", + "๐Ÿ˜ง": "Anguished Face", + "๐Ÿ˜จ": "Fearful Face", + "๐Ÿ˜ฐ": "Anxious Face with Sweat", + "๐Ÿ˜ฅ": "Sad but Relieved Face", + "๐Ÿ˜ข": "Crying Face", + "๐Ÿ˜ญ": "Loudly Crying Face", + "๐Ÿ˜ฑ": "Face Screaming in Fear", + "๐Ÿ˜–": "Confounded Face", + "๐Ÿ˜ฃ": "Persevering Face", + "๐Ÿ˜ž": "Disappointed Face", + "๐Ÿ˜“": "Downcast Face with Sweat", + "๐Ÿ˜ฉ": "Weary Face", + "๐Ÿ˜ซ": "Tired Face", + "๐Ÿฅฑ": "Yawning Face", + "๐Ÿ˜ค": "Face with Steam From Nose", + "๐Ÿ˜ก": "Pouting Face", + "๐Ÿ˜ ": "Angry Face", + "๐Ÿคฌ": "Face with Symbols on Mouth", + "๐Ÿ˜ˆ": "Smiling Face with Horns", + "๐Ÿ‘ฟ": "Angry Face with Horns", + "๐Ÿ’€": "Skull", + "โ˜ ๏ธ": "Skull and Crossbones", + "๐Ÿ’ฉ": "Pile of Poo", + "๐Ÿคก": "Clown Face", + "๐Ÿ‘น": "Ogre", + "๐Ÿ‘บ": "Goblin", + "๐Ÿ‘ป": "Ghost", + "๐Ÿ‘ฝ": "Alien", + "๐Ÿ‘พ": "Alien Monster", + "๐Ÿค–": "Robot", + "๐Ÿ˜บ": "Grinning Cat", + "๐Ÿ˜ธ": "Grinning Cat with Smiling Eyes", + "๐Ÿ˜น": "Cat with Tears of Joy", + "๐Ÿ˜ป": "Smiling Cat with Heart-Eyes", + "๐Ÿ˜ผ": "Cat with Wry Smile", + "๐Ÿ˜ฝ": "Kissing Cat", + "๐Ÿ™€": "Weary Cat", + "๐Ÿ˜ฟ": "Crying Cat", + "๐Ÿ˜พ": "Pouting Cat", + "๐Ÿ’‹": "Kiss Mark", + "๐Ÿ‘‹": "Waving Hand", + "๐Ÿคš": "Raised Back of Hand", + "๐Ÿ–๏ธ": "Hand with Fingers Splayed", + "โœ‹": "Raised Hand", + "๐Ÿ––": "Vulcan Salute", + "๐Ÿ‘Œ": "OK Hand", + "๐ŸคŒ": "Pinched Fingers", + "๐Ÿค": "Pinching Hand", + "โœŒ๏ธ": "Victory Hand", + "๐Ÿคž": "Crossed Fingers", + "๐ŸคŸ": "Love-You Gesture", + "๐Ÿค˜": "Sign of the Horns", + "๐Ÿค™": "Call Me Hand", + "๐Ÿ‘ˆ": "Backhand Index Pointing Left", + "๐Ÿ‘‰": "Backhand Index Pointing Right", + "๐Ÿ‘†": "Backhand Index Pointing Up", + "๐Ÿ–•": "Middle Finger", + "๐Ÿ‘‡": "Backhand Index Pointing Down", + "โ˜๏ธ": "Index Pointing Up", + "๐Ÿ‘": "Thumbs Up", + "๐Ÿ‘Ž": "Thumbs Down", + "โœŠ": "Raised Fist", + "๐Ÿ‘Š": "Oncoming Fist", + "๐Ÿค›": "Left-Facing Fist", + "๐Ÿคœ": "Right-Facing Fist", + "๐Ÿ‘": "Clapping Hands", + "๐Ÿ™Œ": "Raising Hands", + "๐Ÿ‘": "Open Hands", + "๐Ÿคฒ": "Palms Up Together", + "๐Ÿค": "Handshake", + "๐Ÿ™": "Folded Hands", + "โœ๏ธ": "Writing Hand", + "๐Ÿ’…": "Nail Polish", + "๐Ÿคณ": "Selfie", + "๐Ÿ’ช": "Flexed Biceps", + "๐Ÿฆพ": "Mechanical Arm", + "๐Ÿฆฟ": "Mechanical Leg", + "๐Ÿฆต": "Leg", + "๐Ÿฆถ": "Foot", + "๐Ÿ‘‚": "Ear", + "๐Ÿฆป": "Ear with Hearing Aid", + "๐Ÿ‘ƒ": "Nose", + "๐Ÿง ": "Brain", + "๐Ÿซ€": "Anatomical Heart", + "๐Ÿซ": "Lungs", + "๐Ÿฆท": "Tooth", + "๐Ÿฆด": "Bone", + "๐Ÿ‘€": "Eyes", + "๐Ÿ‘๏ธ": "Eye", + "๐Ÿ‘…": "Tongue", + "๐Ÿ‘„": "Mouth", + "๐Ÿ‘ถ": "Baby", + "๐Ÿง’": "Child", + "๐Ÿ‘ฆ": "Boy", + "๐Ÿ‘ง": "Girl", + "๐Ÿง‘": "Person", + "๐Ÿ‘ฑ": "Person: Blond Hair", + "๐Ÿ‘จ": "Man", + "๐Ÿง”": "Person: Beard", + "๐Ÿ‘จโ€๐Ÿฆฐ": "Man: Red Hair", + "๐Ÿ‘จโ€๐Ÿฆฑ": "Man: Curly Hair", + "๐Ÿ‘จโ€๐Ÿฆณ": "Man: White Hair", + "๐Ÿ‘จโ€๐Ÿฆฒ": "Man: Bald", + "๐Ÿ‘ฉ": "Woman", + "๐Ÿ‘ฉโ€๐Ÿฆฐ": "Woman: Red Hair", + "๐Ÿง‘โ€๐Ÿฆฐ": "Person: Red Hair", + "๐Ÿ‘ฉโ€๐Ÿฆฑ": "Woman: Curly Hair", + "๐Ÿง‘โ€๐Ÿฆฑ": "Person: Curly Hair", + "๐Ÿ‘ฉโ€๐Ÿฆณ": "Woman: White Hair", + "๐Ÿง‘โ€๐Ÿฆณ": "Person: White Hair", + "๐Ÿ‘ฉโ€๐Ÿฆฒ": "Woman: Bald", + "๐Ÿง‘โ€๐Ÿฆฒ": "Person: Bald", + "๐Ÿ‘ฑโ€โ™€๏ธ": "Woman: Blond Hair", + "๐Ÿ‘ฑโ€โ™‚๏ธ": "Man: Blond Hair", + "๐Ÿง“": "Older Person", + "๐Ÿ‘ด": "Old Man", + "๐Ÿ‘ต": "Old Woman", + "๐Ÿ™": "Person Frowning", + "๐Ÿ™โ€โ™‚๏ธ": "Man Frowning", + "๐Ÿ™โ€โ™€๏ธ": "Woman Frowning", + "๐Ÿ™Ž": "Person Pouting", + "๐Ÿ™Žโ€โ™‚๏ธ": "Man Pouting", + "๐Ÿ™Žโ€โ™€๏ธ": "Woman Pouting", + "๐Ÿ™…": "Person Gesturing No", + "๐Ÿ™…โ€โ™‚๏ธ": "Man Gesturing No", + "๐Ÿ™…โ€โ™€๏ธ": "Woman Gesturing No", + "๐Ÿ™†": "Person Gesturing OK", + "๐Ÿ™†โ€โ™‚๏ธ": "Man Gesturing OK", + "๐Ÿ™†โ€โ™€๏ธ": "Woman Gesturing OK", + "๐Ÿ’": "Person Tipping Hand", + "๐Ÿ’โ€โ™‚๏ธ": "Man Tipping Hand", + "๐Ÿ’โ€โ™€๏ธ": "Woman Tipping Hand", + "๐Ÿ™‹": "Person Raising Hand", + "๐Ÿ™‹โ€โ™‚๏ธ": "Man Raising Hand", + "๐Ÿ™‹โ€โ™€๏ธ": "Woman Raising Hand", + "๐Ÿง": "Deaf Person", + "๐Ÿงโ€โ™‚๏ธ": "Deaf Man", + "๐Ÿงโ€โ™€๏ธ": "Deaf Woman", + "๐Ÿ™‡": "Person Bowing", + "๐Ÿ™‡โ€โ™‚๏ธ": "Man Bowing", + "๐Ÿ™‡โ€โ™€๏ธ": "Woman Bowing", + "๐Ÿคฆ": "Person Facepalming", + "๐Ÿคฆโ€โ™‚๏ธ": "Man Facepalming", + "๐Ÿคฆโ€โ™€๏ธ": "Woman Facepalming", + "๐Ÿคท": "Person Shrugging", + "๐Ÿคทโ€โ™‚๏ธ": "Man Shrugging", + "๐Ÿคทโ€โ™€๏ธ": "Woman Shrugging", + "๐Ÿง‘โ€โš•๏ธ": "Health Worker", + "๐Ÿ‘จโ€โš•๏ธ": "Man Health Worker", + "๐Ÿ‘ฉโ€โš•๏ธ": "Woman Health Worker", + "๐Ÿง‘โ€๐ŸŽ“": "Student", + "๐Ÿ‘จโ€๐ŸŽ“": "Man Student", + "๐Ÿ‘ฉโ€๐ŸŽ“": "Woman Student", + "๐Ÿง‘โ€๐Ÿซ": "Teacher", + "๐Ÿ‘จโ€๐Ÿซ": "Man Teacher", + "๐Ÿ‘ฉโ€๐Ÿซ": "Woman Teacher", + "๐Ÿง‘โ€โš–๏ธ": "Judge", + "๐Ÿ‘จโ€โš–๏ธ": "Man Judge", + "๐Ÿ‘ฉโ€โš–๏ธ": "Woman Judge", + "๐Ÿง‘โ€๐ŸŒพ": "Farmer", + "๐Ÿ‘จโ€๐ŸŒพ": "Man Farmer", + "๐Ÿ‘ฉโ€๐ŸŒพ": "Woman Farmer", + "๐Ÿง‘โ€๐Ÿณ": "Cook", + "๐Ÿ‘จโ€๐Ÿณ": "Man Cook", + "๐Ÿ‘ฉโ€๐Ÿณ": "Woman Cook", + "๐Ÿง‘โ€๐Ÿ”ง": "Mechanic", + "๐Ÿ‘จโ€๐Ÿ”ง": "Man Mechanic", + "๐Ÿ‘ฉโ€๐Ÿ”ง": "Woman Mechanic", + "๐Ÿง‘โ€๐Ÿญ": "Factory Worker", + "๐Ÿ‘จโ€๐Ÿญ": "Man Factory Worker", + "๐Ÿ‘ฉโ€๐Ÿญ": "Woman Factory Worker", + "๐Ÿง‘โ€๐Ÿ’ผ": "Office Worker", + "๐Ÿ‘จโ€๐Ÿ’ผ": "Man Office Worker", + "๐Ÿ‘ฉโ€๐Ÿ’ผ": "Woman Office Worker", + "๐Ÿง‘โ€๐Ÿ”ฌ": "Scientist", + "๐Ÿ‘จโ€๐Ÿ”ฌ": "Man Scientist", + "๐Ÿ‘ฉโ€๐Ÿ”ฌ": "Woman Scientist", + "๐Ÿง‘โ€๐Ÿ’ป": "Technologist", + "๐Ÿ‘จโ€๐Ÿ’ป": "Man Technologist", + "๐Ÿ‘ฉโ€๐Ÿ’ป": "Woman Technologist", + "๐Ÿง‘โ€๐ŸŽค": "Singer", + "๐Ÿ‘จโ€๐ŸŽค": "Man Singer", + "๐Ÿ‘ฉโ€๐ŸŽค": "Woman Singer", + "๐Ÿง‘โ€๐ŸŽจ": "Artist", + "๐Ÿ‘จโ€๐ŸŽจ": "Man Artist", + "๐Ÿ‘ฉโ€๐ŸŽจ": "Woman Artist", + "๐Ÿง‘โ€โœˆ๏ธ": "Pilot", + "๐Ÿ‘จโ€โœˆ๏ธ": "Man Pilot", + "๐Ÿ‘ฉโ€โœˆ๏ธ": "Woman Pilot", + "๐Ÿง‘โ€๐Ÿš€": "Astronaut", + "๐Ÿ‘จโ€๐Ÿš€": "Man Astronaut", + "๐Ÿ‘ฉโ€๐Ÿš€": "Woman Astronaut", + "๐Ÿง‘โ€๐Ÿš’": "Firefighter", + "๐Ÿ‘จโ€๐Ÿš’": "Man Firefighter", + "๐Ÿ‘ฉโ€๐Ÿš’": "Woman Firefighter", + "๐Ÿ‘ฎ": "Police Officer", + "๐Ÿ‘ฎโ€โ™‚๏ธ": "Man Police Officer", + "๐Ÿ‘ฎโ€โ™€๏ธ": "Woman Police Officer", + "๐Ÿ•ต๏ธ": "Detective", + "๐Ÿ•ต๏ธโ€โ™‚๏ธ": "Man Detective", + "๐Ÿ•ต๏ธโ€โ™€๏ธ": "Woman Detective", + "๐Ÿ’‚": "Guard", + "๐Ÿ’‚โ€โ™‚๏ธ": "Man Guard", + "๐Ÿ’‚โ€โ™€๏ธ": "Woman Guard", + "๐Ÿฅท": "Ninja", + "๐Ÿ‘ท": "Construction Worker", + "๐Ÿ‘ทโ€โ™‚๏ธ": "Man Construction Worker", + "๐Ÿ‘ทโ€โ™€๏ธ": "Woman Construction Worker", + "๐Ÿคด": "Prince", + "๐Ÿ‘ธ": "Princess", + "๐Ÿ‘ณ": "Person Wearing Turban", + "๐Ÿ‘ณโ€โ™‚๏ธ": "Man Wearing Turban", + "๐Ÿ‘ณโ€โ™€๏ธ": "Woman Wearing Turban", + "๐Ÿ‘ฒ": "Person With Skullcap", + "๐Ÿง•": "Woman with Headscarf", + "๐Ÿคต": "Person in Tuxedo", + "๐Ÿคตโ€โ™‚๏ธ": "Man in Tuxedo", + "๐Ÿคตโ€โ™€๏ธ": "Woman in Tuxedo", + "๐Ÿ‘ฐ": "Person With Veil", + "๐Ÿ‘ฐโ€โ™‚๏ธ": "Man with Veil", + "๐Ÿ‘ฐโ€โ™€๏ธ": "Woman with Veil", + "๐Ÿคฐ": "Pregnant Woman", + "๐Ÿคฑ": "Breast-Feeding", + "๐Ÿ‘ฉโ€๐Ÿผ": "Woman Feeding Baby", + "๐Ÿ‘จโ€๐Ÿผ": "Man Feeding Baby", + "๐Ÿง‘โ€๐Ÿผ": "Person Feeding Baby", + "๐Ÿ‘ผ": "Baby Angel", + "๐ŸŽ…": "Santa Claus", + "๐Ÿคถ": "Mrs. Claus", + "๐Ÿง‘โ€๐ŸŽ„": "Mx Claus", + "๐Ÿฆธ": "Superhero", + "๐Ÿฆธโ€โ™‚๏ธ": "Man Superhero", + "๐Ÿฆธโ€โ™€๏ธ": "Woman Superhero", + "๐Ÿฆน": "Supervillain", + "๐Ÿฆนโ€โ™‚๏ธ": "Man Supervillain", + "๐Ÿฆนโ€โ™€๏ธ": "Woman Supervillain", + "๐Ÿง™": "Mage", + "๐Ÿง™โ€โ™‚๏ธ": "Man Mage", + "๐Ÿง™โ€โ™€๏ธ": "Woman Mage", + "๐Ÿงš": "Fairy", + "๐Ÿงšโ€โ™‚๏ธ": "Man Fairy", + "๐Ÿงšโ€โ™€๏ธ": "Woman Fairy", + "๐Ÿง›": "Vampire", + "๐Ÿง›โ€โ™‚๏ธ": "Man Vampire", + "๐Ÿง›โ€โ™€๏ธ": "Woman Vampire", + "๐Ÿงœ": "Merperson", + "๐Ÿงœโ€โ™‚๏ธ": "Merman", + "๐Ÿงœโ€โ™€๏ธ": "Mermaid", + "๐Ÿง": "Elf", + "๐Ÿงโ€โ™‚๏ธ": "Man Elf", + "๐Ÿงโ€โ™€๏ธ": "Woman Elf", + "๐Ÿงž": "Genie", + "๐Ÿงžโ€โ™‚๏ธ": "Man Genie", + "๐Ÿงžโ€โ™€๏ธ": "Woman Genie", + "๐ŸงŸ": "Zombie", + "๐ŸงŸโ€โ™‚๏ธ": "Man Zombie", + "๐ŸงŸโ€โ™€๏ธ": "Woman Zombie", + "๐Ÿ’†": "Person Getting Massage", + "๐Ÿ’†โ€โ™‚๏ธ": "Man Getting Massage", + "๐Ÿ’†โ€โ™€๏ธ": "Woman Getting Massage", + "๐Ÿ’‡": "Person Getting Haircut", + "๐Ÿ’‡โ€โ™‚๏ธ": "Man Getting Haircut", + "๐Ÿ’‡โ€โ™€๏ธ": "Woman Getting Haircut", + "๐Ÿšถ": "Person Walking", + "๐Ÿšถโ€โ™‚๏ธ": "Man Walking", + "๐Ÿšถโ€โ™€๏ธ": "Woman Walking", + "๐Ÿง": "Person Standing", + "๐Ÿงโ€โ™‚๏ธ": "Man Standing", + "๐Ÿงโ€โ™€๏ธ": "Woman Standing", + "๐ŸงŽ": "Person Kneeling", + "๐ŸงŽโ€โ™‚๏ธ": "Man Kneeling", + "๐ŸงŽโ€โ™€๏ธ": "Woman Kneeling", + "๐Ÿง‘โ€๐Ÿฆฏ": "Person with White Cane", + "๐Ÿ‘จโ€๐Ÿฆฏ": "Man with White Cane", + "๐Ÿ‘ฉโ€๐Ÿฆฏ": "Woman with White Cane", + "๐Ÿง‘โ€๐Ÿฆผ": "Person in Motorized Wheelchair", + "๐Ÿ‘จโ€๐Ÿฆผ": "Man in Motorized Wheelchair", + "๐Ÿ‘ฉโ€๐Ÿฆผ": "Woman in Motorized Wheelchair", + "๐Ÿง‘โ€๐Ÿฆฝ": "Person in Manual Wheelchair", + "๐Ÿ‘จโ€๐Ÿฆฝ": "Man in Manual Wheelchair", + "๐Ÿ‘ฉโ€๐Ÿฆฝ": "Woman in Manual Wheelchair", + "๐Ÿƒ": "Person Running", + "๐Ÿƒโ€โ™‚๏ธ": "Man Running", + "๐Ÿƒโ€โ™€๏ธ": "Woman Running", + "๐Ÿ’ƒ": "Woman Dancing", + "๐Ÿ•บ": "Man Dancing", + "๐Ÿ•ด๏ธ": "Person in Suit Levitating", + "๐Ÿ‘ฏ": "People with Bunny Ears", + "๐Ÿ‘ฏโ€โ™‚๏ธ": "Men with Bunny Ears", + "๐Ÿ‘ฏโ€โ™€๏ธ": "Women with Bunny Ears", + "๐Ÿง–": "Person in Steamy Room", + "๐Ÿง–โ€โ™‚๏ธ": "Man in Steamy Room", + "๐Ÿง–โ€โ™€๏ธ": "Woman in Steamy Room", + "๐Ÿง˜": "Person in Lotus Position", + "๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘": "People Holding Hands", + "๐Ÿ‘ญ": "Women Holding Hands", + "๐Ÿ‘ซ": "Woman and Man Holding Hands", + "๐Ÿ‘ฌ": "Men Holding Hands", + "๐Ÿ’": "Kiss", + "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ": "Kiss: Woman, Man", + "๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ": "Kiss: Man, Man", + "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ": "Kiss: Woman, Woman", + "๐Ÿ’‘": "Couple with Heart", + "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ": "Couple with Heart: Woman, Man", + "๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ": "Couple with Heart: Man, Man", + "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ": "Couple with Heart: Woman, Woman", + "๐Ÿ‘ช": "Family", + "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ": "Family: Man, Woman, Boy", + "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง": "Family: Man, Woman, Girl", + "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ": "Family: Man, Woman, Girl, Boy", + "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ": "Family: Man, Woman, Boy, Boy", + "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง": "Family: Man, Woman, Girl, Girl", + "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ": "Family: Man, Man, Boy", + "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง": "Family: Man, Man, Girl", + "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ": "Family: Man, Man, Girl, Boy", + "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ": "Family: Man, Man, Boy, Boy", + "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง": "Family: Man, Man, Girl, Girl", + "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ": "Family: Woman, Woman, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง": "Family: Woman, Woman, Girl", + "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ": "Family: Woman, Woman, Girl, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ": "Family: Woman, Woman, Boy, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง": "Family: Woman, Woman, Girl, Girl", + "๐Ÿ‘จโ€๐Ÿ‘ฆ": "Family: Man, Boy", + "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ": "Family: Man, Boy, Boy", + "๐Ÿ‘จโ€๐Ÿ‘ง": "Family: Man, Girl", + "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ": "Family: Man, Girl, Boy", + "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง": "Family: Man, Girl, Girl", + "๐Ÿ‘ฉโ€๐Ÿ‘ฆ": "Family: Woman, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ": "Family: Woman, Boy, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘ง": "Family: Woman, Girl", + "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ": "Family: Woman, Girl, Boy", + "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง": "Family: Woman, Girl, Girl", + "๐Ÿ—ฃ๏ธ": "Speaking Head", + "๐Ÿ‘ค": "Bust in Silhouette", + "๐Ÿ‘ฅ": "Busts in Silhouette", + "๐Ÿซ‚": "People Hugging", + "๐Ÿ‘ฃ": "Footprints", + "๐Ÿงณ": "Luggage", + "๐ŸŒ‚": "Closed Umbrella", + "โ˜‚๏ธ": "Umbrella", + "๐ŸŽƒ": "Jack-O-Lantern", + "๐Ÿงต": "Thread", + "๐Ÿงถ": "Yarn", + "๐Ÿ‘“": "Glasses", + "๐Ÿ•ถ๏ธ": "Sunglasses", + "๐Ÿฅฝ": "Goggles", + "๐Ÿฅผ": "Lab Coat", + "๐Ÿฆบ": "Safety Vest", + "๐Ÿ‘”": "Necktie", + "๐Ÿ‘•": "T-Shirt", + "๐Ÿ‘–": "Jeans", + "๐Ÿงฃ": "Scarf", + "๐Ÿงค": "Gloves", + "๐Ÿงฅ": "Coat", + "๐Ÿงฆ": "Socks", + "๐Ÿ‘—": "Dress", + "๐Ÿ‘˜": "Kimono", + "๐Ÿฅป": "Sari", + "๐Ÿฉฑ": "One-Piece Swimsuit", + "๐Ÿฉฒ": "Briefs", + "๐Ÿฉณ": "Shorts", + "๐Ÿ‘™": "Bikini", + "๐Ÿ‘š": "Womanโ€™s Clothes", + "๐Ÿ‘›": "Purse", + "๐Ÿ‘œ": "Handbag", + "๐Ÿ‘": "Clutch Bag", + "๐ŸŽ’": "Backpack", + "๐Ÿฉด": "Thong Sandal", + "๐Ÿ‘ž": "Manโ€™s Shoe", + "๐Ÿ‘Ÿ": "Running Shoe", + "๐Ÿฅพ": "Hiking Boot", + "๐Ÿฅฟ": "Flat Shoe", + "๐Ÿ‘ ": "High-Heeled Shoe", + "๐Ÿ‘ก": "Womanโ€™s Sandal", + "๐Ÿฉฐ": "Ballet Shoes", + "๐Ÿ‘ข": "Womanโ€™s Boot", + "๐Ÿ‘‘": "Crown", + "๐Ÿ‘’": "Womanโ€™s Hat", + "๐ŸŽฉ": "Top Hat", + "๐ŸŽ“": "Graduation Cap", + "๐Ÿงข": "Billed Cap", + "๐Ÿช–": "Military Helmet", + "โ›‘๏ธ": "Rescue Workerโ€™s Helmet", + "๐Ÿ’„": "Lipstick", + "๐Ÿ’": "Ring", + "๐Ÿ’ผ": "Briefcase", + "๐Ÿฉธ": "Drop of Blood", + "๐Ÿ˜ฎโ€๐Ÿ’จ": "Face Exhaling", + "๐Ÿ˜ตโ€๐Ÿ’ซ": "Face with Spiral Eyes", + "๐Ÿ˜ถโ€๐ŸŒซ๏ธ": "Face in Clouds" + }, + 'Animals & Nature': { + "๐Ÿ™ˆ": "See-No-Evil Monkey", + "๐Ÿ™‰": "Hear-No-Evil Monkey", + "๐Ÿ™Š": "Speak-No-Evil Monkey", + "๐Ÿ’ฅ": "Collision", + "๐Ÿ’ซ": "Dizzy", + "๐Ÿ’ฆ": "Sweat Droplets", + "๐Ÿ’จ": "Dashing Away", + "๐Ÿต": "Monkey Face", + "๐Ÿ’": "Monkey", + "๐Ÿฆ": "Gorilla", + "๐Ÿฆง": "Orangutan", + "๐Ÿถ": "Dog Face", + "๐Ÿ•": "Dog", + "๐Ÿฆฎ": "Guide Dog", + "๐Ÿ•โ€๐Ÿฆบ": "Service Dog", + "๐Ÿฉ": "Poodle", + "๐Ÿบ": "Wolf", + "๐ŸฆŠ": "Fox", + "๐Ÿฆ": "Raccoon", + "๐Ÿฑ": "Cat Face", + "๐Ÿˆ": "Cat", + "๐Ÿˆโ€โฌ›": "Black Cat", + "๐Ÿฆ": "Lion", + "๐Ÿฏ": "Tiger Face", + "๐Ÿ…": "Tiger", + "๐Ÿ†": "Leopard", + "๐Ÿด": "Horse Face", + "๐ŸŽ": "Horse", + "๐Ÿฆ„": "Unicorn", + "๐Ÿฆ“": "Zebra", + "๐ŸฆŒ": "Deer", + "๐Ÿฆฌ": "Bison", + "๐Ÿฎ": "Cow Face", + "๐Ÿ‚": "Ox", + "๐Ÿƒ": "Water Buffalo", + "๐Ÿ„": "Cow", + "๐Ÿท": "Pig Face", + "๐Ÿ–": "Pig", + "๐Ÿ—": "Boar", + "๐Ÿฝ": "Pig Nose", + "๐Ÿ": "Ram", + "๐Ÿ‘": "Ewe", + "๐Ÿ": "Goat", + "๐Ÿช": "Camel", + "๐Ÿซ": "Two-Hump Camel", + "๐Ÿฆ™": "Llama", + "๐Ÿฆ’": "Giraffe", + "๐Ÿ˜": "Elephant", + "๐Ÿฆฃ": "Mammoth", + "๐Ÿฆ": "Rhinoceros", + "๐Ÿฆ›": "Hippopotamus", + "๐Ÿญ": "Mouse Face", + "๐Ÿ": "Mouse", + "๐Ÿ€": "Rat", + "๐Ÿน": "Hamster", + "๐Ÿฐ": "Rabbit Face", + "๐Ÿ‡": "Rabbit", + "๐Ÿฟ๏ธ": "Chipmunk", + "๐Ÿฆซ": "Beaver", + "๐Ÿฆ”": "Hedgehog", + "๐Ÿฆ‡": "Bat", + "๐Ÿป": "Bear", + "๐Ÿปโ€โ„๏ธ": "Polar Bear", + "๐Ÿจ": "Koala", + "๐Ÿผ": "Panda", + "๐Ÿฆฅ": "Sloth", + "๐Ÿฆฆ": "Otter", + "๐Ÿฆจ": "Skunk", + "๐Ÿฆ˜": "Kangaroo", + "๐Ÿฆก": "Badger", + "๐Ÿพ": "Paw Prints", + "๐Ÿฆƒ": "Turkey", + "๐Ÿ”": "Chicken", + "๐Ÿ“": "Rooster", + "๐Ÿฃ": "Hatching Chick", + "๐Ÿค": "Baby Chick", + "๐Ÿฅ": "Front-Facing Baby Chick", + "๐Ÿฆ": "Bird", + "๐Ÿง": "Penguin", + "๐Ÿ•Š๏ธ": "Dove", + "๐Ÿฆ…": "Eagle", + "๐Ÿฆ†": "Duck", + "๐Ÿฆข": "Swan", + "๐Ÿฆ‰": "Owl", + "๐Ÿฆค": "Dodo", + "๐Ÿชถ": "Feather", + "๐Ÿฆฉ": "Flamingo", + "๐Ÿฆš": "Peacock", + "๐Ÿฆœ": "Parrot", + "๐Ÿธ": "Frog", + "๐ŸŠ": "Crocodile", + "๐Ÿข": "Turtle", + "๐ŸฆŽ": "Lizard", + "๐Ÿ": "Snake", + "๐Ÿฒ": "Dragon Face", + "๐Ÿ‰": "Dragon", + "๐Ÿฆ•": "Sauropod", + "๐Ÿฆ–": "T-Rex", + "๐Ÿณ": "Spouting Whale", + "๐Ÿ‹": "Whale", + "๐Ÿฌ": "Dolphin", + "๐Ÿฆญ": "Seal", + "๐ŸŸ": "Fish", + "๐Ÿ ": "Tropical Fish", + "๐Ÿก": "Blowfish", + "๐Ÿฆˆ": "Shark", + "๐Ÿ™": "Octopus", + "๐Ÿš": "Spiral Shell", + "๐ŸŒ": "Snail", + "๐Ÿฆ‹": "Butterfly", + "๐Ÿ›": "Bug", + "๐Ÿœ": "Ant", + "๐Ÿ": "Honeybee", + "๐Ÿชฒ": "Beetle", + "๐Ÿž": "Lady Beetle", + "๐Ÿฆ—": "Cricket", + "๐Ÿชณ": "Cockroach", + "๐Ÿ•ท๏ธ": "Spider", + "๐Ÿ•ธ๏ธ": "Spider Web", + "๐Ÿฆ‚": "Scorpion", + "๐ŸฆŸ": "Mosquito", + "๐Ÿชฐ": "Fly", + "๐Ÿชฑ": "Worm", + "๐Ÿฆ ": "Microbe", + "๐Ÿ’": "Bouquet", + "๐ŸŒธ": "Cherry Blossom", + "๐Ÿ’ฎ": "White Flower", + "๐Ÿต๏ธ": "Rosette", + "๐ŸŒน": "Rose", + "๐Ÿฅ€": "Wilted Flower", + "๐ŸŒบ": "Hibiscus", + "๐ŸŒป": "Sunflower", + "๐ŸŒผ": "Blossom", + "๐ŸŒท": "Tulip", + "๐ŸŒฑ": "Seedling", + "๐Ÿชด": "Potted Plant", + "๐ŸŒฒ": "Evergreen Tree", + "๐ŸŒณ": "Deciduous Tree", + "๐ŸŒด": "Palm Tree", + "๐ŸŒต": "Cactus", + "๐ŸŒพ": "Sheaf of Rice", + "๐ŸŒฟ": "Herb", + "โ˜˜๏ธ": "Shamrock", + "๐Ÿ€": "Four Leaf Clover", + "๐Ÿ": "Maple Leaf", + "๐Ÿ‚": "Fallen Leaf", + "๐Ÿƒ": "Leaf Fluttering in Wind", + "๐Ÿ„": "Mushroom", + "๐ŸŒฐ": "Chestnut", + "๐Ÿฆ€": "Crab", + "๐Ÿฆž": "Lobster", + "๐Ÿฆ": "Shrimp", + "๐Ÿฆ‘": "Squid", + "๐ŸŒ": "Globe Showing Europe-Africa", + "๐ŸŒŽ": "Globe Showing Americas", + "๐ŸŒ": "Globe Showing Asia-Australia", + "๐ŸŒ": "Globe with Meridians", + "๐Ÿชจ": "Rock", + "๐ŸŒ‘": "New Moon", + "๐ŸŒ’": "Waxing Crescent Moon", + "๐ŸŒ“": "First Quarter Moon", + "๐ŸŒ”": "Waxing Gibbous Moon", + "๐ŸŒ•": "Full Moon", + "๐ŸŒ–": "Waning Gibbous Moon", + "๐ŸŒ—": "Last Quarter Moon", + "๐ŸŒ˜": "Waning Crescent Moon", + "๐ŸŒ™": "Crescent Moon", + "๐ŸŒš": "New Moon Face", + "๐ŸŒ›": "First Quarter Moon Face", + "๐ŸŒœ": "Last Quarter Moon Face", + "โ˜€๏ธ": "Sun", + "๐ŸŒ": "Full Moon Face", + "๐ŸŒž": "Sun with Face", + "โญ": "Star", + "๐ŸŒŸ": "Glowing Star", + "๐ŸŒ ": "Shooting Star", + "โ˜๏ธ": "Cloud", + "โ›…": "Sun Behind Cloud", + "โ›ˆ๏ธ": "Cloud with Lightning and Rain", + "๐ŸŒค๏ธ": "Sun Behind Small Cloud", + "๐ŸŒฅ๏ธ": "Sun Behind Large Cloud", + "๐ŸŒฆ๏ธ": "Sun Behind Rain Cloud", + "๐ŸŒง๏ธ": "Cloud with Rain", + "๐ŸŒจ๏ธ": "Cloud with Snow", + "๐ŸŒฉ๏ธ": "Cloud with Lightning", + "๐ŸŒช๏ธ": "Tornado", + "๐ŸŒซ๏ธ": "Fog", + "๐ŸŒฌ๏ธ": "Wind Face", + "๐ŸŒˆ": "Rainbow", + "โ˜‚๏ธ": "Umbrella", + "โ˜”": "Umbrella with Rain Drops", + "โšก": "High Voltage", + "โ„๏ธ": "Snowflake", + "โ˜ƒ๏ธ": "Snowman", + "โ›„": "Snowman Without Snow", + "โ˜„๏ธ": "Comet", + "๐Ÿ”ฅ": "Fire", + "๐Ÿ’ง": "Droplet", + "๐ŸŒŠ": "Water Wave", + "๐ŸŽ„": "Christmas Tree", + "โœจ": "Sparkles", + "๐ŸŽ‹": "Tanabata Tree", + "๐ŸŽ": "Pine Decoration" + }, + 'Food & Drink': { + "๐Ÿ‡": "Grapes", + "๐Ÿˆ": "Melon", + "๐Ÿ‰": "Watermelon", + "๐ŸŠ": "Tangerine", + "๐Ÿ‹": "Lemon", + "๐ŸŒ": "Banana", + "๐Ÿ": "Pineapple", + "๐Ÿฅญ": "Mango", + "๐ŸŽ": "Red Apple", + "๐Ÿ": "Green Apple", + "๐Ÿ": "Pear", + "๐Ÿ‘": "Peach", + "๐Ÿ’": "Cherries", + "๐Ÿ“": "Strawberry", + "๐Ÿซ": "Blueberries", + "๐Ÿฅ": "Kiwi Fruit", + "๐Ÿ…": "Tomato", + "๐Ÿซ’": "Olive", + "๐Ÿฅฅ": "Coconut", + "๐Ÿฅ‘": "Avocado", + "๐Ÿ†": "Eggplant", + "๐Ÿฅ”": "Potato", + "๐Ÿฅ•": "Carrot", + "๐ŸŒฝ": "Ear of Corn", + "๐ŸŒถ๏ธ": "Hot Pepper", + "๐Ÿซ‘": "Bell Pepper", + "๐Ÿฅ’": "Cucumber", + "๐Ÿฅฌ": "Leafy Green", + "๐Ÿฅฆ": "Broccoli", + "๐Ÿง„": "Garlic", + "๐Ÿง…": "Onion", + "๐Ÿ„": "Mushroom", + "๐Ÿฅœ": "Peanuts", + "๐ŸŒฐ": "Chestnut", + "๐Ÿž": "Bread", + "๐Ÿฅ": "Croissant", + "๐Ÿฅ–": "Baguette Bread", + "๐Ÿซ“": "Flatbread", + "๐Ÿฅจ": "Pretzel", + "๐Ÿฅฏ": "Bagel", + "๐Ÿฅž": "Pancakes", + "๐Ÿง‡": "Waffle", + "๐Ÿง€": "Cheese Wedge", + "๐Ÿ–": "Meat on Bone", + "๐Ÿ—": "Poultry Leg", + "๐Ÿฅฉ": "Cut of Meat", + "๐Ÿฅ“": "Bacon", + "๐Ÿ”": "Hamburger", + "๐ŸŸ": "French Fries", + "๐Ÿ•": "Pizza", + "๐ŸŒญ": "Hot Dog", + "๐Ÿฅช": "Sandwich", + "๐ŸŒฎ": "Taco", + "๐ŸŒฏ": "Burrito", + "๐Ÿซ”": "Tamale", + "๐Ÿฅ™": "Stuffed Flatbread", + "๐Ÿง†": "Falafel", + "๐Ÿฅš": "Egg", + "๐Ÿณ": "Cooking", + "๐Ÿฅ˜": "Shallow Pan of Food", + "๐Ÿฒ": "Pot of Food", + "๐Ÿซ•": "Fondue", + "๐Ÿฅฃ": "Bowl with Spoon", + "๐Ÿฅ—": "Green Salad", + "๐Ÿฟ": "Popcorn", + "๐Ÿงˆ": "Butter", + "๐Ÿง‚": "Salt", + "๐Ÿฅซ": "Canned Food", + "๐Ÿฑ": "Bento Box", + "๐Ÿ˜": "Rice Cracker", + "๐Ÿ™": "Rice Ball", + "๐Ÿš": "Cooked Rice", + "๐Ÿ›": "Curry Rice", + "๐Ÿœ": "Steaming Bowl", + "๐Ÿ": "Spaghetti", + "๐Ÿ ": "Roasted Sweet Potato", + "๐Ÿข": "Oden", + "๐Ÿฃ": "Sushi", + "๐Ÿค": "Fried Shrimp", + "๐Ÿฅ": "Fish Cake with Swirl", + "๐Ÿฅฎ": "Moon Cake", + "๐Ÿก": "Dango", + "๐ŸฅŸ": "Dumpling", + "๐Ÿฅ ": "Fortune Cookie", + "๐Ÿฅก": "Takeout Box", + "๐Ÿฆช": "Oyster", + "๐Ÿฆ": "Soft Ice Cream", + "๐Ÿง": "Shaved Ice", + "๐Ÿจ": "Ice Cream", + "๐Ÿฉ": "Doughnut", + "๐Ÿช": "Cookie", + "๐ŸŽ‚": "Birthday Cake", + "๐Ÿฐ": "Shortcake", + "๐Ÿง": "Cupcake", + "๐Ÿฅง": "Pie", + "๐Ÿซ": "Chocolate Bar", + "๐Ÿฌ": "Candy", + "๐Ÿญ": "Lollipop", + "๐Ÿฎ": "Custard", + "๐Ÿฏ": "Honey Pot", + "๐Ÿผ": "Baby Bottle", + "๐Ÿฅ›": "Glass of Milk", + "โ˜•": "Hot Beverage", + "๐Ÿซ–": "Teapot", + "๐Ÿต": "Teacup Without Handle", + "๐Ÿถ": "Sake", + "๐Ÿพ": "Bottle with Popping Cork", + "๐Ÿท": "Wine Glass", + "๐Ÿธ": "Cocktail Glass", + "๐Ÿน": "Tropical Drink", + "๐Ÿบ": "Beer Mug", + "๐Ÿป": "Clinking Beer Mugs", + "๐Ÿฅ‚": "Clinking Glasses", + "๐Ÿฅƒ": "Tumbler Glass", + "๐Ÿฅค": "Cup with Straw", + "๐Ÿง‹": "Bubble Tea", + "๐Ÿงƒ": "Beverage Box", + "๐Ÿง‰": "Mate", + "๐ŸงŠ": "Ice", + "๐Ÿฅข": "Chopsticks", + "๐Ÿฝ๏ธ": "Fork and Knife with Plate", + "๐Ÿด": "Fork and Knife", + "๐Ÿฅ„": "Spoon" + }, + 'Activity': { + "๐Ÿ•ด๏ธ": "Person in Suit Levitating", + "๐Ÿง—": "Person Climbing", + "๐Ÿง—โ€โ™‚๏ธ": "Man Climbing", + "๐Ÿง—โ€โ™€๏ธ": "Woman Climbing", + "๐Ÿคบ": "Person Fencing", + "๐Ÿ‡": "Horse Racing", + "โ›ท๏ธ": "Skier", + "๐Ÿ‚": "Snowboarder", + "๐ŸŒ๏ธ": "Person Golfing", + "๐ŸŒ๏ธโ€โ™‚๏ธ": "Man Golfing", + "๐ŸŒ๏ธโ€โ™€๏ธ": "Woman Golfing", + "๐Ÿ„": "Person Surfing", + "๐Ÿ„โ€โ™‚๏ธ": "Man Surfing", + "๐Ÿ„โ€โ™€๏ธ": "Woman Surfing", + "๐Ÿšฃ": "Person Rowing Boat", + "๐Ÿšฃโ€โ™‚๏ธ": "Man Rowing Boat", + "๐Ÿšฃโ€โ™€๏ธ": "Woman Rowing Boat", + "๐ŸŠ": "Person Swimming", + "๐ŸŠโ€โ™‚๏ธ": "Man Swimming", + "๐ŸŠโ€โ™€๏ธ": "Woman Swimming", + "โ›น๏ธ": "Person Bouncing Ball", + "โ›น๏ธโ€โ™‚๏ธ": "Man Bouncing Ball", + "โ›น๏ธโ€โ™€๏ธ": "Woman Bouncing Ball", + "๐Ÿ‹๏ธ": "Person Lifting Weights", + "๐Ÿ‹๏ธโ€โ™‚๏ธ": "Man Lifting Weights", + "๐Ÿ‹๏ธโ€โ™€๏ธ": "Woman Lifting Weights", + "๐Ÿšด": "Person Biking", + "๐Ÿšดโ€โ™‚๏ธ": "Man Biking", + "๐Ÿšดโ€โ™€๏ธ": "Woman Biking", + "๐Ÿšต": "Person Mountain Biking", + "๐Ÿšตโ€โ™‚๏ธ": "Man Mountain Biking", + "๐Ÿšตโ€โ™€๏ธ": "Woman Mountain Biking", + "๐Ÿคธ": "Person Cartwheeling", + "๐Ÿคธโ€โ™‚๏ธ": "Man Cartwheeling", + "๐Ÿคธโ€โ™€๏ธ": "Woman Cartwheeling", + "๐Ÿคผ": "People Wrestling", + "๐Ÿคผโ€โ™‚๏ธ": "Men Wrestling", + "๐Ÿคผโ€โ™€๏ธ": "Women Wrestling", + "๐Ÿคฝ": "Person Playing Water Polo", + "๐Ÿคฝโ€โ™‚๏ธ": "Man Playing Water Polo", + "๐Ÿคฝโ€โ™€๏ธ": "Woman Playing Water Polo", + "๐Ÿคพ": "Person Playing Handball", + "๐Ÿคพโ€โ™‚๏ธ": "Man Playing Handball", + "๐Ÿคพโ€โ™€๏ธ": "Woman Playing Handball", + "๐Ÿคน": "Person Juggling", + "๐Ÿคนโ€โ™‚๏ธ": "Man Juggling", + "๐Ÿคนโ€โ™€๏ธ": "Woman Juggling", + "๐Ÿง˜": "Person in Lotus Position", + "๐Ÿง˜โ€โ™‚๏ธ": "Man in Lotus Position", + "๐Ÿง˜โ€โ™€๏ธ": "Woman in Lotus Position", + "๐ŸŽช": "Circus Tent", + "๐Ÿ›น": "Skateboard", + "๐Ÿ›ผ": "Roller Skate", + "๐Ÿ›ถ": "Canoe", + "๐ŸŽ—๏ธ": "Reminder Ribbon", + "๐ŸŽŸ๏ธ": "Admission Tickets", + "๐ŸŽซ": "Ticket", + "๐ŸŽ–๏ธ": "Military Medal", + "๐Ÿ†": "Trophy", + "๐Ÿ…": "Sports Medal", + "๐Ÿฅ‡": "1st Place Medal", + "๐Ÿฅˆ": "2nd Place Medal", + "๐Ÿฅ‰": "3rd Place Medal", + "โšฝ": "Soccer Ball", + "โšพ": "Baseball", + "๐ŸฅŽ": "Softball", + "๐Ÿ€": "Basketball", + "๐Ÿ": "Volleyball", + "๐Ÿˆ": "American Football", + "๐Ÿ‰": "Rugby Football", + "๐ŸŽพ": "Tennis", + "๐Ÿฅ": "Flying Disc", + "๐ŸŽณ": "Bowling", + "๐Ÿ": "Cricket Game", + "๐Ÿ‘": "Field Hockey", + "๐Ÿ’": "Ice Hockey", + "๐Ÿฅ": "Lacrosse", + "๐Ÿ“": "Ping Pong", + "๐Ÿธ": "Badminton", + "๐ŸฅŠ": "Boxing Glove", + "๐Ÿฅ‹": "Martial Arts Uniform", + "๐Ÿฅ…": "Goal Net", + "โ›ณ": "Flag in Hole", + "โ›ธ๏ธ": "Ice Skate", + "๐ŸŽฃ": "Fishing Pole", + "๐ŸŽฝ": "Running Shirt", + "๐ŸŽฟ": "Skis", + "๐Ÿ›ท": "Sled", + "๐ŸฅŒ": "Curling Stone", + "๐ŸŽฏ": "Direct Hit", + "๐ŸŽฑ": "Pool 8 Ball", + "๐ŸŽฎ": "Video Game", + "๐ŸŽฐ": "Slot Machine", + "๐ŸŽฒ": "Game Die", + "๐Ÿงฉ": "Puzzle Piece", + "โ™Ÿ๏ธ": "Chess Pawn", + "๐ŸŽญ": "Performing Arts", + "๐ŸŽจ": "Artist Palette", + "๐Ÿงต": "Thread", + "๐Ÿงถ": "Yarn", + "๐ŸŽผ": "Musical Score", + "๐ŸŽค": "Microphone", + "๐ŸŽง": "Headphone", + "๐ŸŽท": "Saxophone", + "๐Ÿช—": "Accordion", + "๐ŸŽธ": "Guitar", + "๐ŸŽน": "Musical Keyboard", + "๐ŸŽบ": "Trumpet", + "๐ŸŽป": "Violin", + "๐Ÿฅ": "Drum", + "๐Ÿช˜": "Long Drum", + "๐ŸŽฌ": "Clapper Board", + "๐Ÿน": "Bow and Arrow" + }, + 'Travel & Places': { + "๐Ÿšฃ": "Person Rowing Boat", + "๐Ÿ—พ": "Map of Japan", + "๐Ÿ”๏ธ": "Snow-Capped Mountain", + "โ›ฐ๏ธ": "Mountain", + "๐ŸŒ‹": "Volcano", + "๐Ÿ—ป": "Mount Fuji", + "๐Ÿ•๏ธ": "Camping", + "๐Ÿ–๏ธ": "Beach with Umbrella", + "๐Ÿœ๏ธ": "Desert", + "๐Ÿ๏ธ": "Desert Island", + "๐Ÿž๏ธ": "National Park", + "๐ŸŸ๏ธ": "Stadium", + "๐Ÿ›๏ธ": "Classical Building", + "๐Ÿ—๏ธ": "Building Construction", + "๐Ÿ›–": "Hut", + "๐Ÿ˜๏ธ": "Houses", + "๐Ÿš๏ธ": "Derelict House", + "๐Ÿ ": "House", + "๐Ÿก": "House with Garden", + "๐Ÿข": "Office Building", + "๐Ÿฃ": "Japanese Post Office", + "๐Ÿค": "Post Office", + "๐Ÿฅ": "Hospital", + "๐Ÿฆ": "Bank", + "๐Ÿจ": "Hotel", + "๐Ÿฉ": "Love Hotel", + "๐Ÿช": "Convenience Store", + "๐Ÿซ": "School", + "๐Ÿฌ": "Department Store", + "๐Ÿญ": "Factory", + "๐Ÿฏ": "Japanese Castle", + "๐Ÿฐ": "Castle", + "๐Ÿ’’": "Wedding", + "๐Ÿ—ผ": "Tokyo Tower", + "๐Ÿ—ฝ": "Statue of Liberty", + "โ›ช": "Church", + "๐Ÿ•Œ": "Mosque", + "๐Ÿ›•": "Hindu Temple", + "๐Ÿ•": "Synagogue", + "โ›ฉ๏ธ": "Shinto Shrine", + "๐Ÿ•‹": "Kaaba", + "โ›ฒ": "Fountain", + "โ›บ": "Tent", + "๐ŸŒ": "Foggy", + "๐ŸŒƒ": "Night with Stars", + "๐Ÿ™๏ธ": "Cityscape", + "๐ŸŒ„": "Sunrise Over Mountains", + "๐ŸŒ…": "Sunrise", + "๐ŸŒ†": "Cityscape at Dusk", + "๐ŸŒ‡": "Sunset", + "๐ŸŒ‰": "Bridge at Night", + "๐ŸŽ ": "Carousel Horse", + "๐ŸŽก": "Ferris Wheel", + "๐ŸŽข": "Roller Coaster", + "๐Ÿš‚": "Locomotive", + "๐Ÿšƒ": "Railway Car", + "๐Ÿš„": "High-Speed Train", + "๐Ÿš…": "Bullet Train", + "๐Ÿš†": "Train", + "๐Ÿš‡": "Metro", + "๐Ÿšˆ": "Light Rail", + "๐Ÿš‰": "Station", + "๐ŸšŠ": "Tram", + "๐Ÿš": "Monorail", + "๐Ÿšž": "Mountain Railway", + "๐Ÿš‹": "Tram Car", + "๐ŸšŒ": "Bus", + "๐Ÿš": "Oncoming Bus", + "๐ŸšŽ": "Trolleybus", + "๐Ÿš": "Minibus", + "๐Ÿš‘": "Ambulance", + "๐Ÿš’": "Fire Engine", + "๐Ÿš“": "Police Car", + "๐Ÿš”": "Oncoming Police Car", + "๐Ÿš•": "Taxi", + "๐Ÿš–": "Oncoming Taxi", + "๐Ÿš—": "Automobile", + "๐Ÿš˜": "Oncoming Automobile", + "๐Ÿš™": "Sport Utility Vehicle", + "๐Ÿ›ป": "Pickup Truck", + "๐Ÿšš": "Delivery Truck", + "๐Ÿš›": "Articulated Lorry", + "๐Ÿšœ": "Tractor", + "๐ŸŽ๏ธ": "Racing Car", + "๐Ÿ๏ธ": "Motorcycle", + "๐Ÿ›ต": "Motor Scooter", + "๐Ÿ›บ": "Auto Rickshaw", + "๐Ÿšฒ": "Bicycle", + "๐Ÿ›ด": "Kick Scooter", + "๐Ÿš": "Bus Stop", + "๐Ÿ›ฃ๏ธ": "Motorway", + "๐Ÿ›ค๏ธ": "Railway Track", + "โ›ฝ": "Fuel Pump", + "๐Ÿšจ": "Police Car Light", + "๐Ÿšฅ": "Horizontal Traffic Light", + "๐Ÿšฆ": "Vertical Traffic Light", + "๐Ÿšง": "Construction", + "โš“": "Anchor", + "โ›ต": "Sailboat", + "๐Ÿšค": "Speedboat", + "๐Ÿ›ณ๏ธ": "Passenger Ship", + "โ›ด๏ธ": "Ferry", + "๐Ÿ›ฅ๏ธ": "Motor Boat", + "๐Ÿšข": "Ship", + "โœˆ๏ธ": "Airplane", + "๐Ÿ›ฉ๏ธ": "Small Airplane", + "๐Ÿ›ซ": "Airplane Departure", + "๐Ÿ›ฌ": "Airplane Arrival", + "๐Ÿช‚": "Parachute", + "๐Ÿ’บ": "Seat", + "๐Ÿš": "Helicopter", + "๐ŸšŸ": "Suspension Railway", + "๐Ÿš ": "Mountain Cableway", + "๐Ÿšก": "Aerial Tramway", + "๐Ÿ›ฐ๏ธ": "Satellite", + "๐Ÿš€": "Rocket", + "๐Ÿ›ธ": "Flying Saucer", + "๐Ÿช": "Ringed Planet", + "๐ŸŒ ": "Shooting Star", + "๐ŸŒŒ": "Milky Way", + "โ›ฑ๏ธ": "Umbrella on Ground", + "๐ŸŽ†": "Fireworks", + "๐ŸŽ‡": "Sparkler", + "๐ŸŽ‘": "Moon Viewing Ceremony", + "๐Ÿ’ด": "Yen Banknote", + "๐Ÿ’ต": "Dollar Banknote", + "๐Ÿ’ถ": "Euro Banknote", + "๐Ÿ’ท": "Pound Banknote", + "๐Ÿ—ฟ": "Moai", + "๐Ÿ›‚": "Passport Control", + "๐Ÿ›ƒ": "Customs", + "๐Ÿ›„": "Baggage Claim", + "๐Ÿ›…": "Left Luggage" + }, + 'Objects': { + "๐Ÿ’Œ": "Love Letter", + "๐Ÿ•ณ๏ธ": "Hole", + "๐Ÿ’ฃ": "Bomb", + "๐Ÿ›€": "Person Taking Bath", + "๐Ÿ›Œ": "Person in Bed", + "๐Ÿ”ช": "Kitchen Knife", + "๐Ÿบ": "Amphora", + "๐Ÿ—บ๏ธ": "World Map", + "๐Ÿงญ": "Compass", + "๐Ÿงฑ": "Brick", + "๐Ÿ’ˆ": "Barber Pole", + "๐Ÿฆฝ": "Manual Wheelchair", + "๐Ÿฆผ": "Motorized Wheelchair", + "๐Ÿ›ข๏ธ": "Oil Drum", + "๐Ÿ›Ž๏ธ": "Bellhop Bell", + "๐Ÿงณ": "Luggage", + "โŒ›": "Hourglass Done", + "โณ": "Hourglass Not Done", + "โŒš": "Watch", + "โฐ": "Alarm Clock", + "โฑ๏ธ": "Stopwatch", + "โฒ๏ธ": "Timer Clock", + "๐Ÿ•ฐ๏ธ": "Mantelpiece Clock", + "๐ŸŒก๏ธ": "Thermometer", + "โ›ฑ๏ธ": "Umbrella on Ground", + "๐Ÿงจ": "Firecracker", + "๐ŸŽˆ": "Balloon", + "๐ŸŽ‰": "Party Popper", + "๐ŸŽŠ": "Confetti Ball", + "๐ŸŽŽ": "Japanese Dolls", + "๐ŸŽ": "Carp Streamer", + "๐ŸŽ": "Wind Chime", + "๐Ÿงง": "Red Envelope", + "๐ŸŽ€": "Ribbon", + "๐ŸŽ": "Wrapped Gift", + "๐Ÿคฟ": "Diving Mask", + "๐Ÿช€": "Yo-Yo", + "๐Ÿช": "Kite", + "๐Ÿ”ฎ": "Crystal Ball", + "๐Ÿช„": "Magic Wand", + "๐Ÿงฟ": "Nazar Amulet", + "๐Ÿ•น๏ธ": "Joystick", + "๐Ÿงธ": "Teddy Bear", + "๐Ÿช…": "Piรฑata", + "๐Ÿช†": "Nesting Dolls", + "๐Ÿ–ผ๏ธ": "Framed Picture", + "๐Ÿงต": "Thread", + "๐Ÿชก": "Sewing Needle", + "๐Ÿงถ": "Yarn", + "๐Ÿชข": "Knot", + "๐Ÿ›๏ธ": "Shopping Bags", + "๐Ÿ“ฟ": "Prayer Beads", + "๐Ÿ’Ž": "Gem Stone", + "๐Ÿ“ฏ": "Postal Horn", + "๐ŸŽ™๏ธ": "Studio Microphone", + "๐ŸŽš๏ธ": "Level Slider", + "๐ŸŽ›๏ธ": "Control Knobs", + "๐Ÿ“ป": "Radio", + "๐Ÿช•": "Banjo", + "๐Ÿ“ฑ": "Mobile Phone", + "๐Ÿ“ฒ": "Mobile Phone with Arrow", + "โ˜Ž๏ธ": "Telephone", + "๐Ÿ“ž": "Telephone Receiver", + "๐Ÿ“Ÿ": "Pager", + "๐Ÿ“ ": "Fax Machine", + "๐Ÿ”‹": "Battery", + "๐Ÿ”Œ": "Electric Plug", + "๐Ÿ’ป": "Laptop", + "๐Ÿ–ฅ๏ธ": "Desktop Computer", + "๐Ÿ–จ๏ธ": "Printer", + "โŒจ๏ธ": "Keyboard", + "๐Ÿ–ฑ๏ธ": "Computer Mouse", + "๐Ÿ–ฒ๏ธ": "Trackball", + "๐Ÿ’ฝ": "Computer Disk", + "๐Ÿ’พ": "Floppy Disk", + "๐Ÿ’ฟ": "Optical Disk", + "๐Ÿ“€": "DVD", + "๐Ÿงฎ": "Abacus", + "๐ŸŽฅ": "Movie Camera", + "๐ŸŽž๏ธ": "Film Frames", + "๐Ÿ“ฝ๏ธ": "Film Projector", + "๐Ÿ“บ": "Television", + "๐Ÿ“ท": "Camera", + "๐Ÿ“ธ": "Camera with Flash", + "๐Ÿ“น": "Video Camera", + "๐Ÿ“ผ": "Videocassette", + "๐Ÿ”": "Magnifying Glass Tilted Left", + "๐Ÿ”Ž": "Magnifying Glass Tilted Right", + "๐Ÿ•ฏ๏ธ": "Candle", + "๐Ÿ’ก": "Light Bulb", + "๐Ÿ”ฆ": "Flashlight", + "๐Ÿฎ": "Red Paper Lantern", + "๐Ÿช”": "Diya Lamp", + "๐Ÿ“”": "Notebook with Decorative Cover", + "๐Ÿ“•": "Closed Book", + "๐Ÿ“–": "Open Book", + "๐Ÿ“—": "Green Book", + "๐Ÿ“˜": "Blue Book", + "๐Ÿ“™": "Orange Book", + "๐Ÿ“š": "Books", + "๐Ÿ““": "Notebook", + "๐Ÿ“’": "Ledger", + "๐Ÿ“ƒ": "Page with Curl", + "๐Ÿ“œ": "Scroll", + "๐Ÿ“„": "Page Facing Up", + "๐Ÿ“ฐ": "Newspaper", + "๐Ÿ—ž๏ธ": "Rolled-Up Newspaper", + "๐Ÿ“‘": "Bookmark Tabs", + "๐Ÿ”–": "Bookmark", + "๐Ÿท๏ธ": "Label", + "๐Ÿ’ฐ": "Money Bag", + "๐Ÿช™": "Coin", + "๐Ÿ’ด": "Yen Banknote", + "๐Ÿ’ต": "Dollar Banknote", + "๐Ÿ’ถ": "Euro Banknote", + "๐Ÿ’ท": "Pound Banknote", + "๐Ÿ’ธ": "Money with Wings", + "๐Ÿ’ณ": "Credit Card", + "๐Ÿงพ": "Receipt", + "โœ‰๏ธ": "Envelope", + "๐Ÿ“ง": "E-Mail", + "๐Ÿ“จ": "Incoming Envelope", + "๐Ÿ“ฉ": "Envelope with Arrow", + "๐Ÿ“ค": "Outbox Tray", + "๐Ÿ“ฅ": "Inbox Tray", + "๐Ÿ“ฆ": "Package", + "๐Ÿ“ซ": "Closed Mailbox with Raised Flag", + "๐Ÿ“ช": "Closed Mailbox with Lowered Flag", + "๐Ÿ“ฌ": "Open Mailbox with Raised Flag", + "๐Ÿ“ญ": "Open Mailbox with Lowered Flag", + "๐Ÿ“ฎ": "Postbox", + "๐Ÿ—ณ๏ธ": "Ballot Box with Ballot", + "โœ๏ธ": "Pencil", + "โœ’๏ธ": "Black Nib", + "๐Ÿ–‹๏ธ": "Fountain Pen", + "๐Ÿ–Š๏ธ": "Pen", + "๐Ÿ–Œ๏ธ": "Paintbrush", + "๐Ÿ–๏ธ": "Crayon", + "๐Ÿ“": "Memo", + "๐Ÿ“": "File Folder", + "๐Ÿ“‚": "Open File Folder", + "๐Ÿ—‚๏ธ": "Card Index Dividers", + "๐Ÿ“…": "Calendar", + "๐Ÿ“†": "Tear-Off Calendar", + "๐Ÿ—’๏ธ": "Spiral Notepad", + "๐Ÿ—“๏ธ": "Spiral Calendar", + "๐Ÿ“‡": "Card Index", + "๐Ÿ“ˆ": "Chart Increasing", + "๐Ÿ“‰": "Chart Decreasing", + "๐Ÿ“Š": "Bar Chart", + "๐Ÿ“‹": "Clipboard", + "๐Ÿ“Œ": "Pushpin", + "๐Ÿ“": "Round Pushpin", + "๐Ÿ“Ž": "Paperclip", + "๐Ÿ–‡๏ธ": "Linked Paperclips", + "๐Ÿ“": "Straight Ruler", + "๐Ÿ“": "Triangular Ruler", + "โœ‚๏ธ": "Scissors", + "๐Ÿ—ƒ๏ธ": "Card File Box", + "๐Ÿ—„๏ธ": "File Cabinet", + "๐Ÿ—‘๏ธ": "Wastebasket", + "๐Ÿ”’": "Locked", + "๐Ÿ”“": "Unlocked", + "๐Ÿ”": "Locked with Pen", + "๐Ÿ”": "Locked with Key", + "๐Ÿ”‘": "Key", + "๐Ÿ—๏ธ": "Old Key", + "๐Ÿ”จ": "Hammer", + "๐Ÿช“": "Axe", + "โ›๏ธ": "Pick", + "โš’๏ธ": "Hammer and Pick", + "๐Ÿ› ๏ธ": "Hammer and Wrench", + "๐Ÿ—ก๏ธ": "Dagger", + "โš”๏ธ": "Crossed Swords", + "๐Ÿ”ซ": "Pistol", + "๐Ÿชƒ": "Boomerang", + "๐Ÿ›ก๏ธ": "Shield", + "๐Ÿชš": "Carpentry Saw", + "๐Ÿ”ง": "Wrench", + "๐Ÿช›": "Screwdriver", + "๐Ÿ”ฉ": "Nut and Bolt", + "โš™๏ธ": "Gear", + "๐Ÿ—œ๏ธ": "Clamp", + "โš–๏ธ": "Balance Scale", + "๐Ÿฆฏ": "White Cane", + "๐Ÿ”—": "Link", + "โ›“๏ธ": "Chains", + "๐Ÿช": "Hook", + "๐Ÿงฐ": "Toolbox", + "๐Ÿงฒ": "Magnet", + "๐Ÿชœ": "Ladder", + "โš—๏ธ": "Alembic", + "๐Ÿงช": "Test Tube", + "๐Ÿงซ": "Petri Dish", + "๐Ÿงฌ": "DNA", + "๐Ÿ”ฌ": "Microscope", + "๐Ÿ”ญ": "Telescope", + "๐Ÿ“ก": "Satellite Antenna", + "๐Ÿ’‰": "Syringe", + "๐Ÿฉธ": "Drop of Blood", + "๐Ÿ’Š": "Pill", + "๐Ÿฉน": "Adhesive Bandage", + "๐Ÿฉบ": "Stethoscope", + "๐Ÿšช": "Door", + "๐Ÿชž": "Mirror", + "๐ŸชŸ": "Window", + "๐Ÿ›๏ธ": "Bed", + "๐Ÿ›‹๏ธ": "Couch and Lamp", + "๐Ÿช‘": "Chair", + "๐Ÿšฝ": "Toilet", + "๐Ÿช ": "Plunger", + "๐Ÿšฟ": "Shower", + "๐Ÿ›": "Bathtub", + "๐Ÿชค": "Mouse Trap", + "๐Ÿช’": "Razor", + "๐Ÿงด": "Lotion Bottle", + "๐Ÿงท": "Safety Pin", + "๐Ÿงน": "Broom", + "๐Ÿงบ": "Basket", + "๐Ÿงป": "Roll of Paper", + "๐Ÿชฃ": "Bucket", + "๐Ÿงผ": "Soap", + "๐Ÿชฅ": "Toothbrush", + "๐Ÿงฝ": "Sponge", + "๐Ÿงฏ": "Fire Extinguisher", + "๐Ÿ›’": "Shopping Cart", + "๐Ÿšฌ": "Cigarette", + "โšฐ๏ธ": "Coffin", + "๐Ÿชฆ": "Headstone", + "โšฑ๏ธ": "Funeral Urn", + "๐Ÿ—ฟ": "Moai", + "๐Ÿชง": "Placard", + "๐Ÿšฐ": "Potable Water" + }, + 'Symbols': { + "๐Ÿ’˜": "Heart with Arrow", + "๐Ÿ’": "Heart with Ribbon", + "๐Ÿ’–": "Sparkling Heart", + "๐Ÿ’—": "Growing Heart", + "๐Ÿ’“": "Beating Heart", + "๐Ÿ’ž": "Revolving Hearts", + "๐Ÿ’•": "Two Hearts", + "๐Ÿ’Ÿ": "Heart Decoration", + "โฃ๏ธ": "Heart Exclamation", + "๐Ÿ’”": "Broken Heart", + "โค๏ธ": "Red Heart", + "๐Ÿงก": "Orange Heart", + "๐Ÿ’›": "Yellow Heart", + "๐Ÿ’š": "Green Heart", + "๐Ÿ’™": "Blue Heart", + "๐Ÿ’œ": "Purple Heart", + "๐ŸคŽ": "Brown Heart", + "๐Ÿ–ค": "Black Heart", + "๐Ÿค": "White Heart", + "๐Ÿ’ฏ": "Hundred Points", + "๐Ÿ’ข": "Anger Symbol", + "๐Ÿ’ฌ": "Speech Balloon", + "๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ": "Eye in Speech Bubble", + "๐Ÿ—จ๏ธ": "Left Speech Bubble", + "๐Ÿ—ฏ๏ธ": "Right Anger Bubble", + "๐Ÿ’ญ": "Thought Balloon", + "๐Ÿ’ค": "Zzz", + "๐Ÿ’ฎ": "White Flower", + "โ™จ๏ธ": "Hot Springs", + "๐Ÿ’ˆ": "Barber Pole", + "๐Ÿ›‘": "Stop Sign", + "๐Ÿ•›": "Twelve Oโ€™Clock", + "๐Ÿ•ง": "Twelve-Thirty", + "๐Ÿ•": "One Oโ€™Clock", + "๐Ÿ•œ": "One-Thirty", + "๐Ÿ•‘": "Two Oโ€™Clock", + "๐Ÿ•": "Two-Thirty", + "๐Ÿ•’": "Three Oโ€™Clock", + "๐Ÿ•ž": "Three-Thirty", + "๐Ÿ•“": "Four Oโ€™Clock", + "๐Ÿ•Ÿ": "Four-Thirty", + "๐Ÿ•”": "Five Oโ€™Clock", + "๐Ÿ• ": "Five-Thirty", + "๐Ÿ••": "Six Oโ€™Clock", + "๐Ÿ•ก": "Six-Thirty", + "๐Ÿ•–": "Seven Oโ€™Clock", + "๐Ÿ•ข": "Seven-Thirty", + "๐Ÿ•—": "Eight Oโ€™Clock", + "๐Ÿ•ฃ": "Eight-Thirty", + "๐Ÿ•˜": "Nine Oโ€™Clock", + "๐Ÿ•ค": "Nine-Thirty", + "๐Ÿ•™": "Ten Oโ€™Clock", + "๐Ÿ•ฅ": "Ten-Thirty", + "๐Ÿ•š": "Eleven Oโ€™Clock", + "๐Ÿ•ฆ": "Eleven-Thirty", + "๐ŸŒ€": "Cyclone", + "โ™ ๏ธ": "Spade Suit", + "โ™ฅ๏ธ": "Heart Suit", + "โ™ฆ๏ธ": "Diamond Suit", + "โ™ฃ๏ธ": "Club Suit", + "๐Ÿƒ": "Joker", + "๐Ÿ€„": "Mahjong Red Dragon", + "๐ŸŽด": "Flower Playing Cards", + "๐Ÿ”‡": "Muted Speaker", + "๐Ÿ”ˆ": "Speaker Low Volume", + "๐Ÿ”‰": "Speaker Medium Volume", + "๐Ÿ”Š": "Speaker High Volume", + "๐Ÿ“ข": "Loudspeaker", + "๐Ÿ“ฃ": "Megaphone", + "๐Ÿ“ฏ": "Postal Horn", + "๐Ÿ””": "Bell", + "๐Ÿ”•": "Bell with Slash", + "๐ŸŽต": "Musical Note", + "๐ŸŽถ": "Musical Notes", + "๐Ÿ’น": "Chart Increasing with Yen", + "๐Ÿ›—": "Elevator", + "๐Ÿง": "ATM Sign", + "๐Ÿšฎ": "Litter in Bin Sign", + "๐Ÿšฐ": "Potable Water", + "โ™ฟ": "Wheelchair Symbol", + "๐Ÿšน": "Menโ€™s Room", + "๐Ÿšบ": "Womenโ€™s Room", + "๐Ÿšป": "Restroom", + "๐Ÿšผ": "Baby Symbol", + "๐Ÿšพ": "Water Closet", + "โš ๏ธ": "Warning", + "๐Ÿšธ": "Children Crossing", + "โ›”": "No Entry", + "๐Ÿšซ": "Prohibited", + "๐Ÿšณ": "No Bicycles", + "๐Ÿšญ": "No Smoking", + "๐Ÿšฏ": "No Littering", + "๐Ÿšฑ": "Non-Potable Water", + "๐Ÿšท": "No Pedestrians", + "๐Ÿ“ต": "No Mobile Phones", + "๐Ÿ”ž": "No One Under Eighteen", + "โ˜ข๏ธ": "Radioactive", + "โ˜ฃ๏ธ": "Biohazard", + "โฌ†๏ธ": "Up Arrow", + "โ†—๏ธ": "Up-Right Arrow", + "โžก๏ธ": "Right Arrow", + "โ†˜๏ธ": "Down-Right Arrow", + "โฌ‡๏ธ": "Down Arrow", + "โ†™๏ธ": "Down-Left Arrow", + "โฌ…๏ธ": "Left Arrow", + "โ†–๏ธ": "Up-Left Arrow", + "โ†•๏ธ": "Up-Down Arrow", + "โ†”๏ธ": "Left-Right Arrow", + "โ†ฉ๏ธ": "Right Arrow Curving Left", + "โ†ช๏ธ": "Left Arrow Curving Right", + "โคด๏ธ": "Right Arrow Curving Up", + "โคต๏ธ": "Right Arrow Curving Down", + "๐Ÿ”ƒ": "Clockwise Vertical Arrows", + "๐Ÿ”„": "Counterclockwise Arrows Button", + "๐Ÿ”™": "Back Arrow", + "๐Ÿ”š": "End Arrow", + "๐Ÿ”›": "On! Arrow", + "๐Ÿ”œ": "Soon Arrow", + "๐Ÿ”": "Top Arrow", + "๐Ÿ›": "Place of Worship", + "โš›๏ธ": "Atom Symbol", + "๐Ÿ•‰๏ธ": "Om", + "โœก๏ธ": "Star of David", + "โ˜ธ๏ธ": "Wheel of Dharma", + "โ˜ฏ๏ธ": "Yin Yang", + "โœ๏ธ": "Latin Cross", + "โ˜ฆ๏ธ": "Orthodox Cross", + "โ˜ช๏ธ": "Star and Crescent", + "โ˜ฎ๏ธ": "Peace Symbol", + "๐Ÿ•Ž": "Menorah", + "๐Ÿ”ฏ": "Dotted Six-Pointed Star", + "โ™ˆ": "Aries", + "โ™‰": "Taurus", + "โ™Š": "Gemini", + "โ™‹": "Cancer", + "โ™Œ": "Leo", + "โ™": "Virgo", + "โ™Ž": "Libra", + "โ™": "Scorpio", + "โ™": "Sagittarius", + "โ™‘": "Capricorn", + "โ™’": "Aquarius", + "โ™“": "Pisces", + "โ›Ž": "Ophiuchus", + "๐Ÿ”€": "Shuffle Tracks Button", + "๐Ÿ”": "Repeat Button", + "๐Ÿ”‚": "Repeat Single Button", + "โ–ถ๏ธ": "Play Button", + "โฉ": "Fast-Forward Button", + "โญ๏ธ": "Next Track Button", + "โฏ๏ธ": "Play or Pause Button", + "โ—€๏ธ": "Reverse Button", + "โช": "Fast Reverse Button", + "โฎ๏ธ": "Last Track Button", + "๐Ÿ”ผ": "Upwards Button", + "โซ": "Fast Up Button", + "๐Ÿ”ฝ": "Downwards Button", + "โฌ": "Fast Down Button", + "โธ๏ธ": "Pause Button", + "โน๏ธ": "Stop Button", + "โบ๏ธ": "Record Button", + "โ๏ธ": "Eject Button", + "๐ŸŽฆ": "Cinema", + "๐Ÿ”…": "Dim Button", + "๐Ÿ”†": "Bright Button", + "๐Ÿ“ถ": "Antenna Bars", + "๐Ÿ“ณ": "Vibration Mode", + "๐Ÿ“ด": "Mobile Phone Off", + "โ™€๏ธ": "Female Sign", + "โ™‚๏ธ": "Male Sign", + "โœ–๏ธ": "Multiply", + "โž•": "Plus", + "โž–": "Minus", + "โž—": "Divide", + "โ™พ๏ธ": "Infinity", + "โ€ผ๏ธ": "Double Exclamation Mark", + "โ‰๏ธ": "Exclamation Question Mark", + "โ“": "Question Mark", + "โ”": "White Question Mark", + "โ•": "White Exclamation Mark", + "โ—": "Exclamation Mark", + "ใ€ฐ๏ธ": "Wavy Dash", + "๐Ÿ’ฑ": "Currency Exchange", + "๐Ÿ’ฒ": "Heavy Dollar Sign", + "โš•๏ธ": "Medical Symbol", + "โ™ป๏ธ": "Recycling Symbol", + "โšœ๏ธ": "Fleur-de-lis", + "๐Ÿ”ฑ": "Trident Emblem", + "๐Ÿ“›": "Name Badge", + "๐Ÿ”ฐ": "Japanese Symbol for Beginner", + "โญ•": "Hollow Red Circle", + "โœ…": "Check Mark Button", + "โ˜‘๏ธ": "Check Box with Check", + "โœ”๏ธ": "Check Mark", + "โŒ": "Cross Mark", + "โŽ": "Cross Mark Button", + "โžฐ": "Curly Loop", + "โžฟ": "Double Curly Loop", + "ใ€ฝ๏ธ": "Part Alternation Mark", + "โœณ๏ธ": "Eight-Spoked Asterisk", + "โœด๏ธ": "Eight-Pointed Star", + "โ‡๏ธ": "Sparkle", + "ยฉ๏ธ": "Copyright", + "ยฎ๏ธ": "Registered", + "โ„ข๏ธ": "Trade Mark", + "#๏ธโƒฃ": "Keycap Number Sign", + "*๏ธโƒฃ": "Keycap Asterisk", + "0๏ธโƒฃ": "Keycap Digit Zero", + "1๏ธโƒฃ": "Keycap Digit One", + "2๏ธโƒฃ": "Keycap Digit Two", + "3๏ธโƒฃ": "Keycap Digit Three", + "4๏ธโƒฃ": "Keycap Digit Four", + "5๏ธโƒฃ": "Keycap Digit Five", + "6๏ธโƒฃ": "Keycap Digit Six", + "7๏ธโƒฃ": "Keycap Digit Seven", + "8๏ธโƒฃ": "Keycap Digit Eight", + "9๏ธโƒฃ": "Keycap Digit Nine", + "๐Ÿ”Ÿ": "Keycap: 10", + "๐Ÿ” ": "Input Latin Uppercase", + "๐Ÿ”ก": "Input Latin Lowercase", + "๐Ÿ”ข": "Input Numbers", + "๐Ÿ”ฃ": "Input Symbols", + "๐Ÿ”ค": "Input Latin Letters", + "๐Ÿ…ฐ๏ธ": "A Button (Blood Type)", + "๐Ÿ†Ž": "AB Button (Blood Type)", + "๐Ÿ…ฑ๏ธ": "B Button (Blood Type)", + "๐Ÿ†‘": "CL Button", + "๐Ÿ†’": "Cool Button", + "๐Ÿ†“": "Free Button", + "โ„น๏ธ": "Information", + "๐Ÿ†”": "ID Button", + "โ“‚๏ธ": "Circled M", + "๐Ÿ†•": "New Button", + "๐Ÿ†–": "NG Button", + "๐Ÿ…พ๏ธ": "O Button (Blood Type)", + "๐Ÿ†—": "OK Button", + "๐Ÿ…ฟ๏ธ": "P Button", + "๐Ÿ†˜": "SOS Button", + "๐Ÿ†™": "Up! Button", + "๐Ÿ†š": "Vs Button", + "๐Ÿˆ": "Japanese โ€œHereโ€ Button", + "๐Ÿˆ‚๏ธ": "Japanese โ€œService Chargeโ€ Button", + "๐Ÿˆท๏ธ": "Japanese โ€œMonthly Amountโ€ Button", + "๐Ÿˆถ": "Japanese โ€œNot Free of Chargeโ€ Button", + "๐Ÿˆฏ": "Japanese โ€œReservedโ€ Button", + "๐Ÿ‰": "Japanese โ€œBargainโ€ Button", + "๐Ÿˆน": "Japanese โ€œDiscountโ€ Button", + "๐Ÿˆš": "Japanese โ€œFree of Chargeโ€ Button", + "๐Ÿˆฒ": "Japanese โ€œProhibitedโ€ Button", + "๐Ÿ‰‘": "Japanese โ€œAcceptableโ€ Button", + "๐Ÿˆธ": "Japanese โ€œApplicationโ€ Button", + "๐Ÿˆด": "Japanese โ€œPassing Gradeโ€ Button", + "๐Ÿˆณ": "Japanese โ€œVacancyโ€ Button", + "ใŠ—๏ธ": "Japanese โ€œCongratulationsโ€ Button", + "ใŠ™๏ธ": "Japanese โ€œSecretโ€ Button", + "๐Ÿˆบ": "Japanese โ€œOpen for Businessโ€ Button", + "๐Ÿˆต": "Japanese โ€œNo Vacancyโ€ Button", + "๐Ÿ”ด": "Red Circle", + "๐ŸŸ ": "Orange Circle", + "๐ŸŸก": "Yellow Circle", + "๐ŸŸข": "Green Circle", + "๐Ÿ”ต": "Blue Circle", + "๐ŸŸฃ": "Purple Circle", + "๐ŸŸค": "Brown Circle", + "โšซ": "Black Circle", + "โšช": "White Circle", + "๐ŸŸฅ": "Red Square", + "๐ŸŸง": "Orange Square", + "๐ŸŸจ": "Yellow Square", + "๐ŸŸฉ": "Green Square", + "๐ŸŸฆ": "Blue Square", + "๐ŸŸช": "Purple Square", + "๐ŸŸซ": "Brown Square", + "โฌ›": "Black Large Square", + "โฌœ": "White Large Square", + "โ—ผ๏ธ": "Black Medium Square", + "โ—ป๏ธ": "White Medium Square", + "โ—พ": "Black Medium-Small Square", + "โ—ฝ": "White Medium-Small Square", + "โ–ช๏ธ": "Black Small Square", + "โ–ซ๏ธ": "White Small Square", + "๐Ÿ”ถ": "Large Orange Diamond", + "๐Ÿ”ท": "Large Blue Diamond", + "๐Ÿ”ธ": "Small Orange Diamond", + "๐Ÿ”น": "Small Blue Diamond", + "๐Ÿ”บ": "Red Triangle Pointed Up", + "๐Ÿ”ป": "Red Triangle Pointed Down", + "๐Ÿ’ ": "Diamond with a Dot", + "๐Ÿ”˜": "Radio Button", + "๐Ÿ”ณ": "White Square Button", + "๐Ÿ”ฒ": "Black Square Button", + "โค๏ธโ€๐Ÿ”ฅ": "Heart on Fire", + "โค๏ธโ€๐Ÿฉน": "Mending Heart" + }, + 'Flags': { + "๐Ÿ": "Chequered Flag", + "๐Ÿšฉ": "Triangular Flag", + "๐ŸŽŒ": "Crossed Flags", + "๐Ÿด": "Black Flag", + "๐Ÿณ๏ธ": "White Flag", + "๐Ÿณ๏ธโ€๐ŸŒˆ": "Rainbow Flag", + "๐Ÿณ๏ธโ€โšง๏ธ": "Transgender Flag", + "๐Ÿดโ€โ˜ ๏ธ": "Pirate Flag", + "๐Ÿ‡ฆ๐Ÿ‡จ": "Flag: Ascension Island", + "๐Ÿ‡ฆ๐Ÿ‡ฉ": "Flag: Andorra", + "๐Ÿ‡ฆ๐Ÿ‡ช": "Flag: United Arab Emirates", + "๐Ÿ‡ฆ๐Ÿ‡ซ": "Flag: Afghanistan", + "๐Ÿ‡ฆ๐Ÿ‡ฌ": "Flag: Antigua & Barbuda", + "๐Ÿ‡ฆ๐Ÿ‡ฎ": "Flag: Anguilla", + "๐Ÿ‡ฆ๐Ÿ‡ฑ": "Flag: Albania", + "๐Ÿ‡ฆ๐Ÿ‡ฒ": "Flag: Armenia", + "๐Ÿ‡ฆ๐Ÿ‡ด": "Flag: Angola", + "๐Ÿ‡ฆ๐Ÿ‡ถ": "Flag: Antarctica", + "๐Ÿ‡ฆ๐Ÿ‡ท": "Flag: Argentina", + "๐Ÿ‡ฆ๐Ÿ‡ธ": "Flag: American Samoa", + "๐Ÿ‡ฆ๐Ÿ‡น": "Flag: Austria", + "๐Ÿ‡ฆ๐Ÿ‡บ": "Flag: Australia", + "๐Ÿ‡ฆ๐Ÿ‡ผ": "Flag: Aruba", + "๐Ÿ‡ฆ๐Ÿ‡ฝ": "Flag: ร…land Islands", + "๐Ÿ‡ฆ๐Ÿ‡ฟ": "Flag: Azerbaijan", + "๐Ÿ‡ง๐Ÿ‡ฆ": "Flag: Bosnia & Herzegovina", + "๐Ÿ‡ง๐Ÿ‡ง": "Flag: Barbados", + "๐Ÿ‡ง๐Ÿ‡ฉ": "Flag: Bangladesh", + "๐Ÿ‡ง๐Ÿ‡ช": "Flag: Belgium", + "๐Ÿ‡ง๐Ÿ‡ซ": "Flag: Burkina Faso", + "๐Ÿ‡ง๐Ÿ‡ฌ": "Flag: Bulgaria", + "๐Ÿ‡ง๐Ÿ‡ญ": "Flag: Bahrain", + "๐Ÿ‡ง๐Ÿ‡ฎ": "Flag: Burundi", + "๐Ÿ‡ง๐Ÿ‡ฏ": "Flag: Benin", + "๐Ÿ‡ง๐Ÿ‡ฑ": "Flag: St. Barthรฉlemy", + "๐Ÿ‡ง๐Ÿ‡ฒ": "Flag: Bermuda", + "๐Ÿ‡ง๐Ÿ‡ณ": "Flag: Brunei", + "๐Ÿ‡ง๐Ÿ‡ด": "Flag: Bolivia", + "๐Ÿ‡ง๐Ÿ‡ถ": "Flag: Caribbean Netherlands", + "๐Ÿ‡ง๐Ÿ‡ท": "Flag: Brazil", + "๐Ÿ‡ง๐Ÿ‡ธ": "Flag: Bahamas", + "๐Ÿ‡ง๐Ÿ‡น": "Flag: Bhutan", + "๐Ÿ‡ง๐Ÿ‡ป": "Flag: Bouvet Island", + "๐Ÿ‡ง๐Ÿ‡ผ": "Flag: Botswana", + "๐Ÿ‡ง๐Ÿ‡พ": "Flag: Belarus", + "๐Ÿ‡ง๐Ÿ‡ฟ": "Flag: Belize", + "๐Ÿ‡จ๐Ÿ‡ฆ": "Flag: Canada", + "๐Ÿ‡จ๐Ÿ‡จ": "Flag: Cocos (Keeling) Islands", + "๐Ÿ‡จ๐Ÿ‡ฉ": "Flag: Congo - Kinshasa", + "๐Ÿ‡จ๐Ÿ‡ซ": "Flag: Central African Republic", + "๐Ÿ‡จ๐Ÿ‡ฌ": "Flag: Congo - Brazzaville", + "๐Ÿ‡จ๐Ÿ‡ญ": "Flag: Switzerland", + "๐Ÿ‡จ๐Ÿ‡ฎ": "Flag: Cรดte dโ€™Ivoire", + "๐Ÿ‡จ๐Ÿ‡ฐ": "Flag: Cook Islands", + "๐Ÿ‡จ๐Ÿ‡ฑ": "Flag: Chile", + "๐Ÿ‡จ๐Ÿ‡ฒ": "Flag: Cameroon", + "๐Ÿ‡จ๐Ÿ‡ณ": "Flag: China", + "๐Ÿ‡จ๐Ÿ‡ด": "Flag: Colombia", + "๐Ÿ‡จ๐Ÿ‡ต": "Flag: Clipperton Island", + "๐Ÿ‡จ๐Ÿ‡ท": "Flag: Costa Rica", + "๐Ÿ‡จ๐Ÿ‡บ": "Flag: Cuba", + "๐Ÿ‡จ๐Ÿ‡ป": "Flag: Cape Verde", + "๐Ÿ‡จ๐Ÿ‡ผ": "Flag: Curaรงao", + "๐Ÿ‡จ๐Ÿ‡ฝ": "Flag: Christmas Island", + "๐Ÿ‡จ๐Ÿ‡พ": "Flag: Cyprus", + "๐Ÿ‡จ๐Ÿ‡ฟ": "Flag: Czechia", + "๐Ÿ‡ฉ๐Ÿ‡ช": "Flag: Germany", + "๐Ÿ‡ฉ๐Ÿ‡ฌ": "Flag: Diego Garcia", + "๐Ÿ‡ฉ๐Ÿ‡ฏ": "Flag: Djibouti", + "๐Ÿ‡ฉ๐Ÿ‡ฐ": "Flag: Denmark", + "๐Ÿ‡ฉ๐Ÿ‡ฒ": "Flag: Dominica", + "๐Ÿ‡ฉ๐Ÿ‡ด": "Flag: Dominican Republic", + "๐Ÿ‡ฉ๐Ÿ‡ฟ": "Flag: Algeria", + "๐Ÿ‡ช๐Ÿ‡ฆ": "Flag: Ceuta & Melilla", + "๐Ÿ‡ช๐Ÿ‡จ": "Flag: Ecuador", + "๐Ÿ‡ช๐Ÿ‡ช": "Flag: Estonia", + "๐Ÿ‡ช๐Ÿ‡ฌ": "Flag: Egypt", + "๐Ÿ‡ช๐Ÿ‡ญ": "Flag: Western Sahara", + "๐Ÿ‡ช๐Ÿ‡ท": "Flag: Eritrea", + "๐Ÿ‡ช๐Ÿ‡ธ": "Flag: Spain", + "๐Ÿ‡ช๐Ÿ‡น": "Flag: Ethiopia", + "๐Ÿ‡ช๐Ÿ‡บ": "Flag: European Union", + "๐Ÿ‡ซ๐Ÿ‡ฎ": "Flag: Finland", + "๐Ÿ‡ซ๐Ÿ‡ฏ": "Flag: Fiji", + "๐Ÿ‡ซ๐Ÿ‡ฐ": "Flag: Falkland Islands", + "๐Ÿ‡ซ๐Ÿ‡ฒ": "Flag: Micronesia", + "๐Ÿ‡ซ๐Ÿ‡ด": "Flag: Faroe Islands", + "๐Ÿ‡ซ๐Ÿ‡ท": "Flag: France", + "๐Ÿ‡ฌ๐Ÿ‡ฆ": "Flag: Gabon", + "๐Ÿ‡ฌ๐Ÿ‡ง": "Flag: United Kingdom", + "๐Ÿ‡ฌ๐Ÿ‡ฉ": "Flag: Grenada", + "๐Ÿ‡ฌ๐Ÿ‡ช": "Flag: Georgia", + "๐Ÿ‡ฌ๐Ÿ‡ซ": "Flag: French Guiana", + "๐Ÿ‡ฌ๐Ÿ‡ฌ": "Flag: Guernsey", + "๐Ÿ‡ฌ๐Ÿ‡ญ": "Flag: Ghana", + "๐Ÿ‡ฌ๐Ÿ‡ฎ": "Flag: Gibraltar", + "๐Ÿ‡ฌ๐Ÿ‡ฑ": "Flag: Greenland", + "๐Ÿ‡ฌ๐Ÿ‡ฒ": "Flag: Gambia", + "๐Ÿ‡ฌ๐Ÿ‡ณ": "Flag: Guinea", + "๐Ÿ‡ฌ๐Ÿ‡ต": "Flag: Guadeloupe", + "๐Ÿ‡ฌ๐Ÿ‡ถ": "Flag: Equatorial Guinea", + "๐Ÿ‡ฌ๐Ÿ‡ท": "Flag: Greece", + "๐Ÿ‡ฌ๐Ÿ‡ธ": "Flag: South Georgia & South Sandwich Islands", + "๐Ÿ‡ฌ๐Ÿ‡น": "Flag: Guatemala", + "๐Ÿ‡ฌ๐Ÿ‡บ": "Flag: Guam", + "๐Ÿ‡ฌ๐Ÿ‡ผ": "Flag: Guinea-Bissau", + "๐Ÿ‡ฌ๐Ÿ‡พ": "Flag: Guyana", + "๐Ÿ‡ญ๐Ÿ‡ฐ": "Flag: Hong Kong SAR China", + "๐Ÿ‡ญ๐Ÿ‡ฒ": "Flag: Heard & McDonald Islands", + "๐Ÿ‡ญ๐Ÿ‡ณ": "Flag: Honduras", + "๐Ÿ‡ญ๐Ÿ‡ท": "Flag: Croatia", + "๐Ÿ‡ญ๐Ÿ‡น": "Flag: Haiti", + "๐Ÿ‡ญ๐Ÿ‡บ": "Flag: Hungary", + "๐Ÿ‡ฎ๐Ÿ‡จ": "Flag: Canary Islands", + "๐Ÿ‡ฎ๐Ÿ‡ฉ": "Flag: Indonesia", + "๐Ÿ‡ฎ๐Ÿ‡ช": "Flag: Ireland", + "๐Ÿ‡ฎ๐Ÿ‡ฑ": "Flag: Israel", + "๐Ÿ‡ฎ๐Ÿ‡ฒ": "Flag: Isle of Man", + "๐Ÿ‡ฎ๐Ÿ‡ณ": "Flag: India", + "๐Ÿ‡ฎ๐Ÿ‡ด": "Flag: British Indian Ocean Territory", + "๐Ÿ‡ฎ๐Ÿ‡ถ": "Flag: Iraq", + "๐Ÿ‡ฎ๐Ÿ‡ท": "Flag: Iran", + "๐Ÿ‡ฎ๐Ÿ‡ธ": "Flag: Iceland", + "๐Ÿ‡ฎ๐Ÿ‡น": "Flag: Italy", + "๐Ÿ‡ฏ๐Ÿ‡ช": "Flag: Jersey", + "๐Ÿ‡ฏ๐Ÿ‡ฒ": "Flag: Jamaica", + "๐Ÿ‡ฏ๐Ÿ‡ด": "Flag: Jordan", + "๐Ÿ‡ฏ๐Ÿ‡ต": "Flag: Japan", + "๐Ÿ‡ฐ๐Ÿ‡ช": "Flag: Kenya", + "๐Ÿ‡ฐ๐Ÿ‡ฌ": "Flag: Kyrgyzstan", + "๐Ÿ‡ฐ๐Ÿ‡ญ": "Flag: Cambodia", + "๐Ÿ‡ฐ๐Ÿ‡ฎ": "Flag: Kiribati", + "๐Ÿ‡ฐ๐Ÿ‡ฒ": "Flag: Comoros", + "๐Ÿ‡ฐ๐Ÿ‡ณ": "Flag: St. Kitts & Nevis", + "๐Ÿ‡ฐ๐Ÿ‡ต": "Flag: North Korea", + "๐Ÿ‡ฐ๐Ÿ‡ท": "Flag: South Korea", + "๐Ÿ‡ฐ๐Ÿ‡ผ": "Flag: Kuwait", + "๐Ÿ‡ฐ๐Ÿ‡พ": "Flag: Cayman Islands", + "๐Ÿ‡ฐ๐Ÿ‡ฟ": "Flag: Kazakhstan", + "๐Ÿ‡ฑ๐Ÿ‡ฆ": "Flag: Laos", + "๐Ÿ‡ฑ๐Ÿ‡ง": "Flag: Lebanon", + "๐Ÿ‡ฑ๐Ÿ‡จ": "Flag: St. Lucia", + "๐Ÿ‡ฑ๐Ÿ‡ฎ": "Flag: Liechtenstein", + "๐Ÿ‡ฑ๐Ÿ‡ฐ": "Flag: Sri Lanka", + "๐Ÿ‡ฑ๐Ÿ‡ท": "Flag: Liberia", + "๐Ÿ‡ฑ๐Ÿ‡ธ": "Flag: Lesotho", + "๐Ÿ‡ฑ๐Ÿ‡น": "Flag: Lithuania", + "๐Ÿ‡ฑ๐Ÿ‡บ": "Flag: Luxembourg", + "๐Ÿ‡ฑ๐Ÿ‡ป": "Flag: Latvia", + "๐Ÿ‡ฑ๐Ÿ‡พ": "Flag: Libya", + "๐Ÿ‡ฒ๐Ÿ‡ฆ": "Flag: Morocco", + "๐Ÿ‡ฒ๐Ÿ‡จ": "Flag: Monaco", + "๐Ÿ‡ฒ๐Ÿ‡ฉ": "Flag: Moldova", + "๐Ÿ‡ฒ๐Ÿ‡ช": "Flag: Montenegro", + "๐Ÿ‡ฒ๐Ÿ‡ซ": "Flag: St. Martin", + "๐Ÿ‡ฒ๐Ÿ‡ฌ": "Flag: Madagascar", + "๐Ÿ‡ฒ๐Ÿ‡ญ": "Flag: Marshall Islands", + "๐Ÿ‡ฒ๐Ÿ‡ฐ": "Flag: North Macedonia", + "๐Ÿ‡ฒ๐Ÿ‡ฑ": "Flag: Mali", + "๐Ÿ‡ฒ๐Ÿ‡ฒ": "Flag: Myanmar (Burma)", + "๐Ÿ‡ฒ๐Ÿ‡ณ": "Flag: Mongolia", + "๐Ÿ‡ฒ๐Ÿ‡ด": "Flag: Macao Sar China", + "๐Ÿ‡ฒ๐Ÿ‡ต": "Flag: Northern Mariana Islands", + "๐Ÿ‡ฒ๐Ÿ‡ถ": "Flag: Martinique", + "๐Ÿ‡ฒ๐Ÿ‡ท": "Flag: Mauritania", + "๐Ÿ‡ฒ๐Ÿ‡ธ": "Flag: Montserrat", + "๐Ÿ‡ฒ๐Ÿ‡น": "Flag: Malta", + "๐Ÿ‡ฒ๐Ÿ‡บ": "Flag: Mauritius", + "๐Ÿ‡ฒ๐Ÿ‡ป": "Flag: Maldives", + "๐Ÿ‡ฒ๐Ÿ‡ผ": "Flag: Malawi", + "๐Ÿ‡ฒ๐Ÿ‡ฝ": "Flag: Mexico", + "๐Ÿ‡ฒ๐Ÿ‡พ": "Flag: Malaysia", + "๐Ÿ‡ฒ๐Ÿ‡ฟ": "Flag: Mozambique", + "๐Ÿ‡ณ๐Ÿ‡ฆ": "Flag: Namibia", + "๐Ÿ‡ณ๐Ÿ‡จ": "Flag: New Caledonia", + "๐Ÿ‡ณ๐Ÿ‡ช": "Flag: Niger", + "๐Ÿ‡ณ๐Ÿ‡ซ": "Flag: Norfolk Island", + "๐Ÿ‡ณ๐Ÿ‡ฌ": "Flag: Nigeria", + "๐Ÿ‡ณ๐Ÿ‡ฎ": "Flag: Nicaragua", + "๐Ÿ‡ณ๐Ÿ‡ฑ": "Flag: Netherlands", + "๐Ÿ‡ณ๐Ÿ‡ด": "Flag: Norway", + "๐Ÿ‡ณ๐Ÿ‡ต": "Flag: Nepal", + "๐Ÿ‡ณ๐Ÿ‡ท": "Flag: Nauru", + "๐Ÿ‡ณ๐Ÿ‡บ": "Flag: Niue", + "๐Ÿ‡ณ๐Ÿ‡ฟ": "Flag: New Zealand", + "๐Ÿ‡ด๐Ÿ‡ฒ": "Flag: Oman", + "๐Ÿ‡ต๐Ÿ‡ฆ": "Flag: Panama", + "๐Ÿ‡ต๐Ÿ‡ช": "Flag: Peru", + "๐Ÿ‡ต๐Ÿ‡ซ": "Flag: French Polynesia", + "๐Ÿ‡ต๐Ÿ‡ฌ": "Flag: Papua New Guinea", + "๐Ÿ‡ต๐Ÿ‡ญ": "Flag: Philippines", + "๐Ÿ‡ต๐Ÿ‡ฐ": "Flag: Pakistan", + "๐Ÿ‡ต๐Ÿ‡ฑ": "Flag: Poland", + "๐Ÿ‡ต๐Ÿ‡ฒ": "Flag: St. Pierre & Miquelon", + "๐Ÿ‡ต๐Ÿ‡ณ": "Flag: Pitcairn Islands", + "๐Ÿ‡ต๐Ÿ‡ท": "Flag: Puerto Rico", + "๐Ÿ‡ต๐Ÿ‡ธ": "Flag: Palestinian Territories", + "๐Ÿ‡ต๐Ÿ‡น": "Flag: Portugal", + "๐Ÿ‡ต๐Ÿ‡ผ": "Flag: Palau", + "๐Ÿ‡ต๐Ÿ‡พ": "Flag: Paraguay", + "๐Ÿ‡ถ๐Ÿ‡ฆ": "Flag: Qatar", + "๐Ÿ‡ท๐Ÿ‡ช": "Flag: Rรฉunion", + "๐Ÿ‡ท๐Ÿ‡ด": "Flag: Romania", + "๐Ÿ‡ท๐Ÿ‡ธ": "Flag: Serbia", + "๐Ÿ‡ท๐Ÿ‡บ": "Flag: Russia", + "๐Ÿ‡ท๐Ÿ‡ผ": "Flag: Rwanda", + "๐Ÿ‡ธ๐Ÿ‡ฆ": "Flag: Saudi Arabia", + "๐Ÿ‡ธ๐Ÿ‡ง": "Flag: Solomon Islands", + "๐Ÿ‡ธ๐Ÿ‡จ": "Flag: Seychelles", + "๐Ÿ‡ธ๐Ÿ‡ฉ": "Flag: Sudan", + "๐Ÿ‡ธ๐Ÿ‡ช": "Flag: Sweden", + "๐Ÿ‡ธ๐Ÿ‡ฌ": "Flag: Singapore", + "๐Ÿ‡ธ๐Ÿ‡ญ": "Flag: St. Helena", + "๐Ÿ‡ธ๐Ÿ‡ฎ": "Flag: Slovenia", + "๐Ÿ‡ธ๐Ÿ‡ฏ": "Flag: Svalbard & Jan Mayen", + "๐Ÿ‡ธ๐Ÿ‡ฐ": "Flag: Slovakia", + "๐Ÿ‡ธ๐Ÿ‡ฑ": "Flag: Sierra Leone", + "๐Ÿ‡ธ๐Ÿ‡ฒ": "Flag: San Marino", + "๐Ÿ‡ธ๐Ÿ‡ณ": "Flag: Senegal", + "๐Ÿ‡ธ๐Ÿ‡ด": "Flag: Somalia", + "๐Ÿ‡ธ๐Ÿ‡ท": "Flag: Suriname", + "๐Ÿ‡ธ๐Ÿ‡ธ": "Flag: South Sudan", + "๐Ÿ‡ธ๐Ÿ‡น": "Flag: Sรฃo Tomรฉ & Prรญncipe", + "๐Ÿ‡ธ๐Ÿ‡ป": "Flag: El Salvador", + "๐Ÿ‡ธ๐Ÿ‡ฝ": "Flag: Sint Maarten", + "๐Ÿ‡ธ๐Ÿ‡พ": "Flag: Syria", + "๐Ÿ‡ธ๐Ÿ‡ฟ": "Flag: Eswatini", + "๐Ÿ‡น๐Ÿ‡ฆ": "Flag: Tristan Da Cunha", + "๐Ÿ‡น๐Ÿ‡จ": "Flag: Turks & Caicos Islands", + "๐Ÿ‡น๐Ÿ‡ฉ": "Flag: Chad", + "๐Ÿ‡น๐Ÿ‡ซ": "Flag: French Southern Territories", + "๐Ÿ‡น๐Ÿ‡ฌ": "Flag: Togo", + "๐Ÿ‡น๐Ÿ‡ญ": "Flag: Thailand", + "๐Ÿ‡น๐Ÿ‡ฏ": "Flag: Tajikistan", + "๐Ÿ‡น๐Ÿ‡ฐ": "Flag: Tokelau", + "๐Ÿ‡น๐Ÿ‡ฑ": "Flag: Timor-Leste", + "๐Ÿ‡น๐Ÿ‡ฒ": "Flag: Turkmenistan", + "๐Ÿ‡น๐Ÿ‡ณ": "Flag: Tunisia", + "๐Ÿ‡น๐Ÿ‡ด": "Flag: Tonga", + "๐Ÿ‡น๐Ÿ‡ท": "Flag: Turkey", + "๐Ÿ‡น๐Ÿ‡น": "Flag: Trinidad & Tobago", + "๐Ÿ‡น๐Ÿ‡ป": "Flag: Tuvalu", + "๐Ÿ‡น๐Ÿ‡ผ": "Flag: Taiwan", + "๐Ÿ‡น๐Ÿ‡ฟ": "Flag: Tanzania", + "๐Ÿ‡บ๐Ÿ‡ฆ": "Flag: Ukraine", + "๐Ÿ‡บ๐Ÿ‡ฌ": "Flag: Uganda", + "๐Ÿ‡บ๐Ÿ‡ฒ": "Flag: U.S. Outlying Islands", + "๐Ÿ‡บ๐Ÿ‡ณ": "Flag: United Nations", + "๐Ÿ‡บ๐Ÿ‡ธ": "Flag: United States", + "๐Ÿ‡บ๐Ÿ‡พ": "Flag: Uruguay", + "๐Ÿ‡บ๐Ÿ‡ฟ": "Flag: Uzbekistan", + "๐Ÿ‡ป๐Ÿ‡ฆ": "Flag: Vatican City", + "๐Ÿ‡ป๐Ÿ‡จ": "Flag: St. Vincent & Grenadines", + "๐Ÿ‡ป๐Ÿ‡ช": "Flag: Venezuela", + "๐Ÿ‡ป๐Ÿ‡ฌ": "Flag: British Virgin Islands", + "๐Ÿ‡ป๐Ÿ‡ฎ": "Flag: U.S. Virgin Islands", + "๐Ÿ‡ป๐Ÿ‡ณ": "Flag: Vietnam", + "๐Ÿ‡ป๐Ÿ‡บ": "Flag: Vanuatu", + "๐Ÿ‡ผ๐Ÿ‡ซ": "Flag: Wallis & Futuna", + "๐Ÿ‡ผ๐Ÿ‡ธ": "Flag: Samoa", + "๐Ÿ‡ฝ๐Ÿ‡ฐ": "Flag: Kosovo", + "๐Ÿ‡พ๐Ÿ‡ช": "Flag: Yemen", + "๐Ÿ‡พ๐Ÿ‡น": "Flag: Mayotte", + "๐Ÿ‡ฟ๐Ÿ‡ฆ": "Flag: South Africa", + "๐Ÿ‡ฟ๐Ÿ‡ฒ": "Flag: Zambia", + "๐Ÿ‡ฟ๐Ÿ‡ผ": "Flag: Zimbabwe", + "๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ": "Flag: England", + "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ": "Flag: Scotland", + "๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ": "Flag: Wales", + "๐Ÿด๓ ต๓ ณ๓ ด๓ ธ๓ ฟ": "Flag for Texas (US-TX)" + } + } + + self.total_emojis = {} + + for group, items in self.emojis.items(): + box = QtWidgets.QGroupBox(group) + layout = QtWidgets.QGridLayout() + for i, (emoji, name) in enumerate(items.items()): + # uses a little modified push button which recognizes when the mouse is over the button + button = self.__QHoverPushButton(text=emoji, parent_emoji_picker=self) + + button.setFlat(True) + button.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + button.setFixedSize(30, 30) + # the button style + button.setStyleSheet('QPushButton {' + ' font-size: 20px;' + ' border-radius: 50%%;' + '}' + 'QPushButton:hover {' + ' background-color: %s' + '}' % button.palette().button().color().darker().name()) + layout.addWidget(button, int(i / self.items_per_row), i % self.items_per_row) + + # adds the current emoji with its name to a dict where are all emojis without groups are listed + self.total_emojis[emoji] = name + + box.setLayout(layout) + self.emoji_scroll_area_vlayout.addWidget(box) + + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(400, 300) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) + Form.setSizePolicy(sizePolicy) + self.verticalLayout = QtWidgets.QVBoxLayout(Form) + self.verticalLayout.setObjectName("verticalLayout") + self.search_line_edit = QtWidgets.QLineEdit(Form) + self.search_line_edit.setObjectName("search_line_edit") + self.verticalLayout.addWidget(self.search_line_edit) + self.emoji_scroll_area = QtWidgets.QScrollArea(Form) + self.emoji_scroll_area.setWidgetResizable(True) + self.emoji_scroll_area.setObjectName("emoji_scroll_area") + self.emoji_scroll_area_widgets = QtWidgets.QWidget() + self.emoji_scroll_area_widgets.setGeometry(QtCore.QRect(0, 0, 384, 198)) + self.emoji_scroll_area_widgets.setObjectName("emoji_scroll_area_widgets") + self.emoji_scroll_area_vlayout = QtWidgets.QVBoxLayout(self.emoji_scroll_area_widgets) + self.emoji_scroll_area_vlayout.setObjectName("emoji_scroll_area_vlayout") + self.emoji_scroll_area.setWidget(self.emoji_scroll_area_widgets) + self.verticalLayout.addWidget(self.emoji_scroll_area) + self.emoji_information_hlayout = QtWidgets.QHBoxLayout() + self.emoji_information_hlayout.setObjectName("emoji_information_hlayout") + self.emoji_image_label = QtWidgets.QLabel(Form) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.emoji_image_label.sizePolicy().hasHeightForWidth()) + self.emoji_image_label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(22) + self.emoji_image_label.setFont(font) + self.emoji_image_label.setText("") + self.emoji_image_label.setObjectName("emoji_image_label") + self.emoji_information_hlayout.addWidget(self.emoji_image_label) + self.emoji_name_label = QtWidgets.QLabel(Form) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.emoji_name_label.sizePolicy().hasHeightForWidth()) + self.emoji_name_label.setSizePolicy(sizePolicy) + font = QtGui.QFont() + font.setPointSize(10) + self.emoji_name_label.setFont(font) + self.emoji_name_label.setText("") + self.emoji_name_label.setObjectName("emoji_name_label") + self.emoji_information_hlayout.addWidget(self.emoji_name_label) + self.verticalLayout.addLayout(self.emoji_information_hlayout) + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.search_line_edit.setPlaceholderText(_translate("Form", "Search...")) + + def select(self) -> typing.Union[str, None]: + """Shows this window and returns the selected emoji if a button was pressed or none, if the window was closed without choosing an emoji""" + self.exec() + return self.selected_emoji + + def on_input(self, text: str): + """This method gets called if the text in the search input changes and selects all emojis which correspond with the search input text""" + for i in range(self.emoji_scroll_area_vlayout.count()): + group = self.emoji_scroll_area_vlayout.itemAt(i).widget() + # hides and deletes the previous 'Search results' group box + if group.title() == 'Search results': + group.hide() + group.deleteLater() + # if no text is given / the search input is empty, every group which is hidden will be shown + elif not text and group.isHidden(): + group.show() + # if a text is given / the search input has text, every group which is not hidden will be shown + elif text and not group.isHidden(): + group.hide() + + if text: + search_results = QtWidgets.QGroupBox('Search results') + layout = QtWidgets.QGridLayout() + + items = -1 + + def add_item(): + # `items` is readonly in inner functions, so it can't increased here and has to be increases in the two loop below + + # uses a little modified push button which recognizes when the mouse is over the button + button = self.__QHoverPushButton(text=emoji, parent_emoji_picker=self) + + button.setFlat(True) + button.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + button.setFixedSize(30, 30) + # the button style + button.setStyleSheet('QPushButton {' + ' font-size: 20px;' + ' border-radius: 50%%;' + '}' + 'QPushButton:hover {' + ' background-color: %s' + '}' % button.palette().button().color().darker().name()) + layout.addWidget(button, int(items / self.items_per_row), items % self.items_per_row) + + lower_text = text.lower() + # if `self.performance_search` is True, only emoji names starting with the specified text are displayed + if self.performance_search: + for emoji, name in self.total_emojis.items(): + if name.lower().startswith(lower_text): + items += 1 + add_item() + # but if `self.performance_search` is False, emoji texts which containing the specified text are displayed + else: + for emoji, name in self.total_emojis.items(): + if lower_text in name.lower(): + items += 1 + add_item() + + # adds a spacer below the found emojis to "order" them properly + layout.addItem(QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding), int(items / self.items_per_row) + 1, 0, columnSpan=self.items_per_row) + + search_results.setLayout(layout) + self.emoji_scroll_area_vlayout.insertWidget(0, search_results) + + class __QHoverPushButton(QtWidgets.QPushButton): + """A custom QPushButton which detects when a mouse hovers it""" + + def __init__(self, text: str, parent_emoji_picker): + """ + Args: + text: The button text + parent_emoji_picker (QEmojiPicker): The parent emoji picker + """ + super().__init__(text) + self.clicked.connect(self.on_click) + + self.parent_emoji_picker = parent_emoji_picker + + def enterEvent(self, a0: QtCore.QEvent) -> None: + """On mouse hover / when the mouse is over the button""" + self.parent_emoji_picker.emoji_image_label.setText(self.text()) + group_title = self.parentWidget().title() + # when the group title is 'Search results' the user has used the search input + if group_title == 'Search results': + self.parent_emoji_picker.emoji_name_label.setText(self.parent_emoji_picker.total_emojis[self.text()]) + else: + self.parent_emoji_picker.emoji_name_label.setText(self.parent_emoji_picker.emojis[group_title][self.text()]) + + def leaveEvent(self, a0: QtCore.QEvent) -> None: + """When the mouse leaves the button""" + self.parent_emoji_picker.emoji_image_label.setText('') + self.parent_emoji_picker.emoji_name_label.setText('') + + def on_click(self): + """Gets called if the button is pressed. Closes the emoji picker and if it was called via `QEmojiPicker.select()` the current button emoji will be returned""" + self.parent_emoji_picker.selected_emoji = self.text() + self.parent_emoji_picker.close() + + +# https://github.com/baoboa/pyqt5/blob/master/examples/layouts/flowlayout.py +class QFlowLayout(QtWidgets.QLayout): + def __init__(self, parent=None, margin=0, spacing=-1): + super().__init__(parent) + + if parent is not None: + self.setContentsMargins(margin, margin, margin, margin) + + self.setSpacing(spacing) + + self._items = [] + self.__pending_positions = {} + + def __del__(self): + item = self.takeAt(0) + while item: + item = self.takeAt(0) + + def addItem(self, a0: QtWidgets.QLayoutItem) -> None: + try: + position = self.__pending_positions[a0.widget()] + self._items.insert(position, a0) + del self.__pending_positions[a0.widget()] + except KeyError: + self._items.append(a0) + + def addWidget(self, w: QtWidgets.QWidget, position: int = None) -> None: + if position: + self.__pending_positions[w] = position + super().addWidget(w) + + def count(self): + return len(self._items) + + def expandingDirections(self): + return QtCore.Qt.Orientations(QtCore.Qt.Orientation(0)) + + def itemAt(self, index: int) -> QtWidgets.QLayoutItem: + if 0 <= index < len(self._items): + return self._items[index] + + return None + + def hasHeightForWidth(self): + return True + + def heightForWidth(self, width): + height = self._doLayout(QtCore.QRect(0, 0, width, 0), True) + return height + + def minimumSize(self): + size = QtCore.QSize() + + for item in self._items: + size = size.expandedTo(item.minimumSize()) + + margin, _, _, _ = self.getContentsMargins() + + size += QtCore.QSize(2 * margin, 2 * margin) + return size + + def removeItem(self, a0: QtWidgets.QLayoutItem) -> None: + a0.widget().deleteLater() + + def removeWidget(self, w: QtWidgets.QWidget) -> None: + w.deleteLater() + + def setGeometry(self, rect): + super().setGeometry(rect) + self._doLayout(rect, False) + + def sizeHint(self): + return self.minimumSize() + + def takeAt(self, index: int) -> QtWidgets.QLayoutItem: + if 0 <= index < len(self._items): + return self._items.pop(index) + + return None + + def _doLayout(self, rect, testOnly): + """This does the layout. Dont ask me how. Source: https://github.com/baoboa/pyqt5/blob/master/examples/layouts/flowlayout.py""" + x = rect.x() + y = rect.y() + line_height = 0 + + for item in self._items: + wid = item.widget() + space_x = self.spacing() + wid.style().layoutSpacing( + QtWidgets.QSizePolicy.PushButton, + QtWidgets.QSizePolicy.PushButton, + QtCore.Qt.Horizontal) + space_y = self.spacing() + wid.style().layoutSpacing( + QtWidgets.QSizePolicy.PushButton, + QtWidgets.QSizePolicy.PushButton, + QtCore.Qt.Vertical) + next_x = x + item.sizeHint().width() + space_x + if next_x - space_x > rect.right() and line_height > 0: + x = rect.x() + y = y + line_height + space_y + next_x = x + item.sizeHint().width() + space_x + line_height = 0 + + if not testOnly: + item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint())) + + x = next_x + line_height = max(line_height, item.sizeHint().height()) + + return y + line_height - rect.y() + + +# https://stackoverflow.com/questions/14780517/toggle-switch-in-qt +class QSwitch(QtWidgets.QAbstractButton): + def __init__(self, parent=None, track_radius=10, thumb_radius=8): + super().__init__(parent=parent) + self.setCheckable(True) + self.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + + self._track_radius = track_radius + self._thumb_radius = thumb_radius + + self._margin = max(0, self._thumb_radius - self._track_radius) + self._base_offset = max(self._thumb_radius, self._track_radius) + self._end_offset = { + True: lambda: self.width() - self._base_offset, + False: lambda: self._base_offset, + } + self._offset = self._base_offset + + palette = self.palette() + if self._thumb_radius > self._track_radius: + self._track_color = { + True: palette.highlight(), + False: palette.dark(), + } + self._thumb_color = { + True: palette.highlight(), + False: palette.light(), + } + self._text_color = { + True: palette.highlightedText().color(), + False: palette.dark().color(), + } + self._thumb_text = { + True: '', + False: '', + } + self._track_opacity = 0.5 + else: + self._thumb_color = { + True: palette.highlightedText(), + False: palette.light(), + } + self._track_color = { + True: palette.highlight(), + False: palette.dark(), + } + self._text_color = { + True: palette.highlight().color(), + False: palette.dark().color(), + } + self._thumb_text = { + True: 'โœ”', + False: 'โœ•', + } + self._track_opacity = 1 + + @QtCore.pyqtProperty(int) + def offset(self): + return self._offset + + @offset.setter + def offset(self, value): + self._offset = value + self.update() + + def sizeHint(self): # pylint: disable=invalid-name + return QtCore.QSize( + 4 * self._track_radius + 2 * self._margin, + 2 * self._track_radius + 2 * self._margin, + ) + + def setChecked(self, checked): + super().setChecked(checked) + self.offset = self._end_offset[checked]() + + def resizeEvent(self, event): + super().resizeEvent(event) + self.offset = self._end_offset[self.isChecked()]() + + def paintEvent(self, event): # pylint: disable=invalid-name, unused-argument + p = QtGui.QPainter(self) + p.setRenderHint(QtGui.QPainter.Antialiasing, True) + p.setPen(QtCore.Qt.NoPen) + track_opacity = self._track_opacity + thumb_opacity = 1.0 + text_opacity = 1.0 + if self.isEnabled(): + track_brush = self._track_color[self.isChecked()] + thumb_brush = self._thumb_color[self.isChecked()] + text_color = self._text_color[self.isChecked()] + else: + track_opacity *= 0.8 + track_brush = self.palette().shadow() + thumb_brush = self.palette().mid() + text_color = self.palette().shadow().color() + + p.setBrush(track_brush) + p.setOpacity(track_opacity) + p.drawRoundedRect( + self._margin, + self._margin, + self.width() - 2 * self._margin, + self.height() - 2 * self._margin, + self._track_radius, + self._track_radius, + ) + p.setBrush(thumb_brush) + p.setOpacity(thumb_opacity) + p.drawEllipse( + self.offset - self._thumb_radius, + self._base_offset - self._thumb_radius, + 2 * self._thumb_radius, + 2 * self._thumb_radius, + ) + p.setPen(text_color) + p.setOpacity(text_opacity) + font = p.font() + font.setPixelSize(int(1.5 * self._thumb_radius)) + p.setFont(font) + p.drawText( + QtCore.QRectF( + self.offset - self._thumb_radius, + self._base_offset - self._thumb_radius, + 2 * self._thumb_radius, + 2 * self._thumb_radius, + ), + QtCore.Qt.AlignCenter, + self._thumb_text[self.isChecked()], + ) + + def mouseReleaseEvent(self, event): # pylint: disable=invalid-name + super().mouseReleaseEvent(event) + if event.button() == QtCore.Qt.LeftButton: + anim = QtCore.QPropertyAnimation(self, b'offset', self) + anim.setDuration(120) + anim.setStartValue(self.offset) + anim.setEndValue(self._end_offset[self.isChecked()]()) + anim.start() + + def enterEvent(self, event): # pylint: disable=invalid-name + self.setCursor(QtCore.Qt.PointingHandCursor) + super().enterEvent(event) + + +class QTagEdit(QtWidgets.QScrollArea): + """A tag based edit""" + + def __init__(self, parent: QtWidgets = None, tag_suggestions: typing.List[str] = []): + super().__init__(parent) + + # setup the ui stuff + self.setWidgetResizable(True) + + self._main_widget = QtWidgets.QWidget() + self._layout = QFlowLayout(self._main_widget) + + self._tag_input = QtWidgets.QLineEdit() + # self._tag_input.setPlaceholderText('Type in a new tag and hit enter...') + self._tag_input.setFixedWidth(10) + self._tag_input.setStyleSheet('border: 0px') + self._tag_input.setContentsMargins(0, 5, 0, 0) + self._tag_input.keyReleaseEvent = self.__tag_input_key_release_event + + self._layout.addWidget(self._tag_input) + + self._tag_input.palette().color(QtGui.QPalette.Background) + tag_input_color = self._tag_input.palette().color(QtGui.QPalette.Background) + self.setStyleSheet(f'background-color: rgb({tag_input_color.red()}, {tag_input_color.green()}, {tag_input_color.blue()})') + + self.setWidget(self._main_widget) + + # setup all other things + self.__font_calculator = QtGui.QFontMetrics(QtWidgets.QApplication.font()) + self.__tags = {} + self.__tag_suggestions = tag_suggestions + self._tag_suggestions = False + self._check_for_doubles = True + + def focusInEvent(self, a0: QtGui.QFocusEvent) -> None: + """Sets the focus always to `self._tag_input`""" + self._tag_input.setFocus() + + def addTag(self, text: str) -> bool: + """ + Adds a new tag + + Args: + text: The text of the new tag + + Returns: + If the tag was added successfully + """ + # if `self._check_for_doubles` is True, it checks if the tag already exists + if self._check_for_doubles and text.lower() in (tag.lower() for tag in self.__tags.keys()): + self.onDoubledTag(text) + return False + else: + # a new tag + tag = self.__QTagFrame(self, text) + # tag.setStyleSheet('border: 0px; margin: 0px; padding: 0px') + + self.__tags[text] = tag + for tag_name in self.__tag_suggestions: + # if the tag is in `self.__tag_suggestions` it will be removed from there + if tag_name.lower() == text: + self.__tag_suggestions.remove(tag_name) + self.enableTagSuggestions(self._tag_suggestions) + break + # insert the tag before the line edit + self._layout.addWidget(tag, -1) + return True + + def clear(self, input=True) -> None: + """ + Clears all tags + + Args: + input: If True, the current text in the line edit will be cleared as well + """ + for i in range(self._layout.count()): + widget = self._layout.itemAt(i).widget() + if type(widget) == QtWidgets.QLineEdit and input: + widget.clear() + elif type(widget) == self.__QTagFrame: + self.removeTag(widget.text()) + + def enableCheckForDoubles(self, check_for_doubles) -> None: + """ + Enables if a new tag, when its going to be added, should be checked if it already exists + + Args: + check_for_doubles: True if double checking should be active, False if not + """ + self._check_for_doubles = check_for_doubles + + def enableTagSuggestions(self, tag_suggestions: bool) -> None: + """ + Enables whenever a new tag is typed in that suggestions from `self.__tag_suggestions(...)` should be showing or not. + They can be added on the class initialization or via `setTagSuggestions` + + Args: + tag_suggestions: If tag suggestions should be active or not + """ + self._tag_suggestions = tag_suggestions + if tag_suggestions: + # sets the completer for the line edit + completer = QtWidgets.QCompleter(self.__tag_suggestions) + completer.setCompletionMode(completer.InlineCompletion) + completer.setCaseSensitivity(QtCore.Qt.CaseSensitive) + self._tag_input.setCompleter(completer) + else: + self._tag_input.setCompleter(None) + + def onDoubledTag(self, text: str) -> None: + """ + This method gets called if `self._check_for_doubles` is True (can be set via `enableCheckForDoubles(...)`) + and a new tag which already exists are going to be added. + This method is actually there to display an error message + + Args: + text: The text of the new tag + """ + button = QtWidgets.QMessageBox() + + # if `self.tag_input.keyReleaseEvent`is not overridden, it would trigger itself when the enter key is pressed + # to close the popup and open it again. idk why + def reset(a0: QtGui.QKeyEvent): + if a0.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter): + button.destroy() + self._tag_input.keyReleaseEvent = self.__tag_input_key_release_event + + self._tag_input.keyReleaseEvent = reset + + # shows the warning + button.warning(self, 'Tag already exists', f'The tag {text} already exists') + + def removeTag(self, tag: str) -> None: + """ + Removes a tag + + Args: + The tag to remove + """ + if tag in self.__tags: + self._layout.removeWidget(self.__tags[tag]) + del self.__tags[tag] + + def setTags(self, tags: typing.List[str]) -> None: + """ + Replaces all current tags with tag from the `tags` argument + + Args: + tags: The new tags to be set + """ + self.clear() + for tag in tags: + self.addTag(tag) + + def setTagSuggestions(self, suggestions: typing.List[str]) -> None: + """ + Sets the tag suggestions. They will be used if `self._tag_suggestions` is True (can be set via `enableTagSuggestions(...)`) + and will be shown if a new tag is typed in + + Args: + suggestions: The new tag suggestions + """ + self.__tag_suggestions = suggestions + self.enableTagSuggestions(self._tag_suggestions) + + def tags(self) -> typing.Union[typing.List[str]]: + """ + Returns all tag names + + Returns: + All tag names + """ + return list(self.__tags.keys()) + + def __tag_input_key_release_event(self, a0: QtGui.QKeyEvent) -> None: + """ + The `keyReleaseEvent(...)` of the line edit. Whenever return / enter is pressed, the current text in the line edit + will be added as new tag. It also expands the width of the line edit if the text in it is over an specific limit + """ + if a0.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): + # adds the tag + if self.addTag(self._tag_input.text()): + self._tag_input.clear() + self._tag_input.setFixedWidth(10) + return + elif a0.key() in (QtCore.Qt.Key_Backspace, QtCore.Qt.Key_Delete): + # calculates the current line edit text width + width = self.__font_calculator.width(self._tag_input.text()) + if width + 10 < self._tag_input.width(): + self._tag_input.setFixedWidth(width + 10) + else: + # calculates the current line edit text width + width = self.__font_calculator.width(self._tag_input.text()) + # this resizes the tag input if the text in it will be longer than it's width. + # not the best way, but it does what it does + if width + 20 > self._tag_input.width(): + self._tag_input.setFixedWidth(width + 20) + + class __QTagFrame(QtWidgets.QFrame): + """The tag class for the QTagEdit tags""" + + def __init__(self, parent, text: str): + super().__init__() + + # setup the ui stuff + self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)) + self.setLayout(QtWidgets.QHBoxLayout()) + self.setContentsMargins(3, 0, 3, 0) + + # the tag name label + self._name = QtWidgets.QLabel() + self._name.setText(text) + self._name.setStyleSheet('background: transparent') + + # the tag delete button + self._delete_button = QtWidgets.QPushButton() + self._delete_button.setStyleSheet('QPushButton {' + ' background: transparent;' + ' border: 0px;' + '}') + self._delete_button.clicked.connect(self.onDeleteButtonClick) + self._delete_button.setCursor(QtCore.Qt.PointingHandCursor) + + self.layout().addWidget(self._name) + self.layout().addWidget(self._delete_button) + + # setup all other things + self.__parent = parent + self._text = text + + def onDeleteButtonClick(self) -> None: + """This will get triggered if the delete button on a tag is pressed""" + self.__parent.removeTag(self.text()) + self.__parent._tag_input.setFocus() + + def paintEvent(self, a0: QtGui.QPaintEvent) -> None: + """Styles the tag""" + dark_color = self.palette().color(QtGui.QPalette.Background).darker() + light_color = self.palette().color(QtGui.QPalette.Background).lighter() + + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + painter.setPen(QtGui.QPen(dark_color, 1, QtCore.Qt.SolidLine)) + painter.setBrush(QtGui.QBrush(dark_color, QtCore.Qt.SolidPattern)) + + # draws the tag 'filling' + painter.drawRoundedRect(0, 0, self.width() - 5, self.height(), self.height() / 2, self.height() / 2) + painter.setPen(QtGui.QPen(dark_color, 1, QtCore.Qt.SolidLine)) + painter.setBrush(QtGui.QBrush(light_color, QtCore.Qt.SolidPattern)) + painter.drawEllipse(QtCore.QPointF(self.width() - 25, self.height() / 2), 8, 8) + painter.drawText(QtCore.QRectF(self.width() - 35, 0, 20, 30), + QtCore.Qt.AlignCenter, + 'โœ•') + + def text(self) -> str: + """ + Returns the current tag text + + Returns: + The tag text + + """ + return self._text diff --git a/README.md b/README.md index 6105cb1..b2ad84c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,149 @@ # PyQt5-expansion -A collection of custom PyQt5 classes +This is a collection of PyQt5 classes, which I'm using or I have used. + +Because i use KDE Plasma, the look of the objects on your system may be different than my [demonstrations](/assets) + +## QEmojiPicker + +A resizable widget which let you choose from various emojis. +NOTE: Not every emoji looks "nice" in PyQt5 so you may have to install a custom font + +
+ Demonstration + +
+ +```python +from PyQt5 import QtWidgets # import pyqt5 +from QOptionObjects import QEmojiPicker # import the emoji picker + +if __name__ == '__main__': + # create a new app + app = QtWidgets.QApplication([]) + + # initializes the emoji picker + emoji_picker = QEmojiPicker( + # this option can say how many emojis are in a row + items_per_row=8, + # with this enabled, the emoji search will be faster but less accurate + performance_search=True + ) + + # this will open the emoji picker and return the selected emoji + print(emoji_picker.select()) +``` + +## QFlowLayout +*Inspired from https://github.com/baoboa/pyqt5/blob/master/examples/layouts/flowlayout.py* + +A hydrodynamic layout which rearranges the items in it dynamically if its resized + +
+ Demonstration + +
+ +```python +from PyQt5 import QtWidgets # import pyqt5 +from QOptionObjects import QFlowLayout # import the flow layout + +if __name__ == '__main__': + # create a new app + app = QtWidgets.QApplication([]) + widget = QtWidgets.QWidget() + + # initializes the layout + layout = QFlowLayout() + + # add 100 labels to see its resize function + for i in range(100): + layout.addWidget(QtWidgets.QLabel(f'Text {i}')) + + # set the layout to the widget and show it + widget.setLayout(layout) + widget.show() + + app.exec() +``` + +## QSwitch +*Inspired from https://stackoverflow.com/questions/14780517/toggle-switch-in-qt* + +A simple toggle switch + +
+ Demonstration + +
+ +```python +from PyQt5 import QtWidgets # import pyqt5 +from QOptionObjects import QSwitch # import the switch + +if __name__ == '__main__': + # create a new app + app = QtWidgets.QApplication([]) + widget = QtWidgets.QWidget() + layout = QtWidgets.QHBoxLayout() + + # initializes the switch + switch = QSwitch() + + # add the switch to the layout + layout.addWidget(switch) + + # set the layout to the widget and show it + widget.setLayout(layout) + widget.show() + + app.exec() +``` + +# QTagEdit + +A widget where you can create, delete and edit tags + +
+ Demonstration + +
+ +```python +from PyQt5 import QtWidgets # import pyqt5 +from QOptionObjects import QTagEdit # import the tag edit + +if __name__ == '__main__': + # create a new app + app = QtWidgets.QApplication([]) + + # creates the tag edit + tag_edit = QTagEdit( + # here you can set some suggestion that will be shown if the user types in something + tag_suggestions=['tag 1' 'tag 2', 'tag 3'] + ) + # manually add a tag + tag_edit.addTag('a tag') + # manually remove a tag + tag_edit.removeTag('a tag') + + # clear all tags + tag_edit.clear() + # clear all tags and add the given tag after this operation + tag_edit.setTags(['a tag', 'another tag']) + + # sets the tag suggestions you can also define when initializing the class + tag_edit.setTagSuggestions(['1 tag', '2 tag', '3 tag']) + + # if True, the user will be unable to define a tag with the same name twice + tag_edit.enableCheckForDoubles(True) + # if True, the tag suggestions will e shown + tag_edit.enableTagSuggestions(True) + + # print all tags + print(tag_edit.tags()) + + # show the tag edit + tag_edit.show() + + app.exec() +```