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