diff --git a/.ci/linux/deploy.sh b/.ci/linux/deploy.sh new file mode 100755 index 00000000..78245322 --- /dev/null +++ b/.ci/linux/deploy.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e + +mkdir -p appdir +cp build/nheko appdir/ +cp resources/nheko.desktop appdir/ +cp resources/nheko*.png appdir/ + +wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" +chmod a+x linuxdeployqt*.AppImage + +unset QTDIR +unset QT_PLUGIN_PATH +unset LD_LIBRARY_PATH + +./linuxdeployqt*.AppImage ./appdir/*.desktop -bundle-non-qt-libs +./linuxdeployqt*.AppImage ./appdir/*.desktop -appimage + +chmod +x nheko-x86_64.AppImage diff --git a/.ci/linux/install-deps.sh b/.ci/linux/install-deps.sh index 8c14f801..605e29b8 100755 --- a/.ci/linux/install-deps.sh +++ b/.ci/linux/install-deps.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -sudo add-apt-repository -y ppa:beineri/opt-qt58-trusty +sudo add-apt-repository -y ppa:beineri/opt-qt592-trusty sudo add-apt-repository -y ppa:george-edison55/cmake-3.x sudo apt-get update -qq -sudo apt-get install -qq -y qt58base qt58tools cmake liblmdb-dev +sudo apt-get install -qq -y qt59base qt59tools cmake liblmdb-dev diff --git a/.ci/macos/deploy.sh b/.ci/macos/deploy.sh new file mode 100755 index 00000000..76346d47 --- /dev/null +++ b/.ci/macos/deploy.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -e + +# Add Qt binaries to path +PATH=/usr/local/opt/qt/bin/:${PATH} + +sudo macdeployqt build/nheko.app -dmg +user=$(id -nu) +sudo chown ${user} build/nheko.dmg +mv build/nheko.dmg . diff --git a/.ci/windows/nheko.nsi b/.ci/windows/nheko.nsi deleted file mode 100644 index cc674249..00000000 --- a/.ci/windows/nheko.nsi +++ /dev/null @@ -1,225 +0,0 @@ -############################################################################################ -# NSIS Installation Script created by NSIS Quick Setup Script Generator v1.09.18 -# Entirely Edited with NullSoft Scriptable Installation System -# by Vlasis K. Barkas aka Red Wine red_wine@freemail.gr Sep 2006 -############################################################################################ - -!define APP_NAME "nheko" -!define COMP_NAME "mujx" -!define WEB_SITE "https://github.com/mujx/nheko" -!define VERSION "0.1.0.0" -!define COPYRIGHT "mujx � 2017" -!define DESCRIPTION "Desktop client for the Matrix protocol" -!define LICENSE_TXT "LICENSE.txt" -!define INSTALLER_NAME "..\..\nheko_setup.exe" -!define INPUT_DIR "..\..\NhekoRelease" -!define MAIN_APP_EXE "nheko.exe" -!define INSTALL_TYPE "SetShellVarContext all" -!define REG_ROOT "HKLM" -!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" -!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" - -!define REG_START_MENU "Start Menu Folder" - -var SM_Folder - -###################################################################### - -VIProductVersion "${VERSION}" -VIAddVersionKey "ProductName" "${APP_NAME}" -VIAddVersionKey "CompanyName" "${COMP_NAME}" -VIAddVersionKey "LegalCopyright" "${COPYRIGHT}" -VIAddVersionKey "FileDescription" "${DESCRIPTION}" -VIAddVersionKey "FileVersion" "${VERSION}" - -###################################################################### - -SetCompressor ZLIB -Name "${APP_NAME}" -Caption "${APP_NAME}" -OutFile "${INSTALLER_NAME}" -BrandingText "${APP_NAME}" -XPStyle on -InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" -InstallDir "$PROGRAMFILES\nheko" - -###################################################################### - -!include "MUI.nsh" - -!define MUI_ICON "..\..\resources\nheko.ico" -!define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "..\..\resources\nheko.bmp" -!define MUI_HEADERIMAGE_RIGHT - -!define MUI_ABORTWARNING -!define MUI_UNABORTWARNING - -!insertmacro MUI_PAGE_WELCOME - -!ifdef LICENSE_TXT -!insertmacro MUI_PAGE_LICENSE "${LICENSE_TXT}" -!endif - -!insertmacro MUI_PAGE_DIRECTORY - -!ifdef REG_START_MENU -!define MUI_STARTMENUPAGE_DEFAULTFOLDER "nheko" -!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}" -!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}" -!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}" -!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder -!endif - -!insertmacro MUI_PAGE_INSTFILES - -!define MUI_FINISHPAGE_RUN "$INSTDIR\${MAIN_APP_EXE}" -!insertmacro MUI_PAGE_FINISH - -!insertmacro MUI_UNPAGE_CONFIRM - -!insertmacro MUI_UNPAGE_INSTFILES - -!insertmacro MUI_UNPAGE_FINISH - -!insertmacro MUI_LANGUAGE "English" - -###################################################################### - -Section -MainProgram -${INSTALL_TYPE} -SetOverwrite ifnewer -SetOutPath "$INSTDIR" -File /r "${INPUT_DIR}\*" -SectionEnd - -###################################################################### - -Section -Icons_Reg -SetOutPath "$INSTDIR" -WriteUninstaller "$INSTDIR\uninstall.exe" - -!ifdef REG_START_MENU -!insertmacro MUI_STARTMENU_WRITE_BEGIN Application -CreateDirectory "$SMPROGRAMS\$SM_Folder" -CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" -CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" -CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" - -!ifdef WEB_SITE -WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" -CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" -!endif -!insertmacro MUI_STARTMENU_WRITE_END -!endif - -!ifndef REG_START_MENU -CreateDirectory "$SMPROGRAMS\nheko" -CreateShortCut "$SMPROGRAMS\nheko\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" -CreateShortCut "$DESKTOP\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}" -CreateShortCut "$SMPROGRAMS\nheko\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe" - -!ifdef WEB_SITE -WriteIniStr "$INSTDIR\${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}" -CreateShortCut "$SMPROGRAMS\nheko\${APP_NAME} Website.lnk" "$INSTDIR\${APP_NAME} website.url" -!endif -!endif - -WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}" -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayName" "${APP_NAME}" -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "UninstallString" "$INSTDIR\uninstall.exe" -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_EXE}" -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" - -!ifdef WEB_SITE -WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}" -!endif -SectionEnd - -###################################################################### - -Section Uninstall -${INSTALL_TYPE} - -######## - -!macro BadPathsCheck -StrCpy $R0 $INSTDIR "" -2 -StrCmp $R0 ":\" bad -StrCpy $R0 $INSTDIR "" -14 -StrCmp $R0 "\Program Files" bad -StrCpy $R0 $INSTDIR "" -8 -StrCmp $R0 "\Windows" bad -StrCpy $R0 $INSTDIR "" -6 -StrCmp $R0 "\WinNT" bad -StrCpy $R0 $INSTDIR "" -9 -StrCmp $R0 "\system32" bad -StrCpy $R0 $INSTDIR "" -8 -StrCmp $R0 "\Desktop" bad -StrCpy $R0 $INSTDIR "" -23 -StrCmp $R0 "\Documents and Settings" bad -StrCpy $R0 $INSTDIR "" -13 -StrCmp $R0 "\My Documents" bad done -bad: - MessageBox MB_OK|MB_ICONSTOP "Install path invalid!" - Abort -done: -!macroend - -StrCmp $INSTDIR "" 0 +2 - StrCpy $INSTDIR $EXEDIR - -# Check that the uninstall isn't dangerous. -!insertmacro BadPathsCheck - -# Does path end with "\nheko"? -!define CHECK_PATH "\nheko" -StrLen $R1 "${CHECK_PATH}" -StrCpy $R0 $INSTDIR "" -$R1 -StrCmp $R0 "${CHECK_PATH}" +3 - MessageBox MB_YESNO|MB_ICONQUESTION "Unrecognised uninstall path. Continue anyway?" IDYES +2 - Abort - -IfFileExists "$INSTDIR\*.*" 0 +2 -IfFileExists "$INSTDIR\nheko.exe" +3 - MessageBox MB_OK|MB_ICONSTOP "Install path invalid!" - Abort - -######## - -RMDir /r /REBOOTOK $INSTDIR - -Delete "$INSTDIR\uninstall.exe" -!ifdef WEB_SITE -Delete "$INSTDIR\${APP_NAME} website.url" -!endif - -!ifdef REG_START_MENU -!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder -Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" -Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" -!ifdef WEB_SITE -Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME} Website.lnk" -!endif -Delete "$DESKTOP\${APP_NAME}.lnk" - -RmDir "$SMPROGRAMS\$SM_Folder" -!endif - -!ifndef REG_START_MENU -Delete "$SMPROGRAMS\nheko\${APP_NAME}.lnk" -Delete "$SMPROGRAMS\nheko\Uninstall ${APP_NAME}.lnk" -!ifdef WEB_SITE -Delete "$SMPROGRAMS\nheko\${APP_NAME} Website.lnk" -!endif -Delete "$DESKTOP\${APP_NAME}.lnk" - -RmDir "$SMPROGRAMS\nheko" -!endif - -DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" -DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" -SectionEnd - -###################################################################### diff --git a/.clang-format b/.clang-format index 6dc5274b..059aee19 100644 --- a/.clang-format +++ b/.clang-format @@ -1,5 +1,6 @@ --- Language: Cpp +Standard: Cpp11 AccessModifierOffset: -8 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: true @@ -10,3 +11,4 @@ IndentCaseLabels: false IndentWidth: 8 KeepEmptyLinesAtTheStartOfBlocks: false PointerAlignment: Right +Cpp11BracedListStyle: true diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..1b8d5e07 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ + + +### System: + +- Nheko commit/version: +- Operating System: +- Qt version: +- C++ compiler: +- Desktop Environment: + +### Actual behavior + +### Expected behavior + +### Steps to reproduce + + +### Debugger traceback diff --git a/.travis.yml b/.travis.yml index b096b78e..3aa112d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,9 +21,33 @@ install: - if [ $TRAVIS_OS_NAME == osx ]; then export CMAKE_PREFIX_PATH=/usr/local/opt/qt5; fi - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/install-deps.sh; fi before_script: - - if [ $TRAVIS_OS_NAME == linux ]; then source /opt/qt58/bin/qt58-env.sh; fi + - if [ $TRAVIS_OS_NAME == linux ]; then source /opt/qt59/bin/qt59-env.sh; fi - cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release script: - make -C build -j2 - - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/run-tests.sh; fi - if [ $TRAVIS_OS_NAME == osx ]; then make lint; fi + - if [ $TRAVIS_OS_NAME == osx ]; then ./.ci/macos/deploy.sh; fi + - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/run-tests.sh; fi + - if [ $TRAVIS_OS_NAME == linux ]; then ./.ci/linux/deploy.sh; fi + +deploy: + - skip_cleanup: true + overwrite: true + provider: releases + api_key: + secure: oprXzESukFiXBeF2BXkXUlegsAQc95Ub4kc/OkoNFaYBvqpA+IGpWHmHCx5JPny/OT3Kc2Urpe2JUeGSWDHZ7UCKDjH+NzGP3uN82fHh/HiszG/Srw7+hWEHm1ve+gMK9GS8pr+yUsUrPP0UfVXlPoI4pBWa4zGi2Ndb/SqvjCgIHFLtGyoBo6CydKQ/AyWiXSMKDfJL+Dx4JLIPP4RTCBJy8ZrZ8m/a5Tgy4Ij6+djjrgYCZCEhGxSYw7xDIT/9SV8g9NkrbisqBDrILzAH8Yhe4XMRMXo88OAxV5+Vb9Rw1hrqczez6lpFDbJetv8MjofND+pSoAFwtjaL1wTFK9Ud6w4O9AuHlEQH9cGVdvsxFcosRwJVh58x51JM9ptoktqhx/HHJBTuCHCYYlHwtRwbwqnMYdLzKZG5FnujT8DG+9mcva1fL6tzW/XD505VPMWwXFC/2/pvolgAkTFFXYSALAwZlK3IgoXU8Gok/3B4iHofzQsFf6Yq3BI/88x7tVASUqiYhoKrO50+gb6pNIRCyWgGUiBEVXBp6Ziq3ORQPyQJg7i9HHUGTUu74yvGLHWLwjNQzZP/hxJZK3VlJxzyXntdOxiJc8iOzNrU+rPKBAlAaE6bQDOoniIysEgdD5BXHTLFzPvts4P1n2Ckor5/rNJ+qXR8GU+/y7e1GKU= + file: nheko-x86_64.AppImage + on: + condition: $TRAVIS_OS_NAME == linux + repo: mujx/nheko + tags: true + - skip_cleanup: true + overwrite: true + provider: releases + api_key: + secure: oprXzESukFiXBeF2BXkXUlegsAQc95Ub4kc/OkoNFaYBvqpA+IGpWHmHCx5JPny/OT3Kc2Urpe2JUeGSWDHZ7UCKDjH+NzGP3uN82fHh/HiszG/Srw7+hWEHm1ve+gMK9GS8pr+yUsUrPP0UfVXlPoI4pBWa4zGi2Ndb/SqvjCgIHFLtGyoBo6CydKQ/AyWiXSMKDfJL+Dx4JLIPP4RTCBJy8ZrZ8m/a5Tgy4Ij6+djjrgYCZCEhGxSYw7xDIT/9SV8g9NkrbisqBDrILzAH8Yhe4XMRMXo88OAxV5+Vb9Rw1hrqczez6lpFDbJetv8MjofND+pSoAFwtjaL1wTFK9Ud6w4O9AuHlEQH9cGVdvsxFcosRwJVh58x51JM9ptoktqhx/HHJBTuCHCYYlHwtRwbwqnMYdLzKZG5FnujT8DG+9mcva1fL6tzW/XD505VPMWwXFC/2/pvolgAkTFFXYSALAwZlK3IgoXU8Gok/3B4iHofzQsFf6Yq3BI/88x7tVASUqiYhoKrO50+gb6pNIRCyWgGUiBEVXBp6Ziq3ORQPyQJg7i9HHUGTUu74yvGLHWLwjNQzZP/hxJZK3VlJxzyXntdOxiJc8iOzNrU+rPKBAlAaE6bQDOoniIysEgdD5BXHTLFzPvts4P1n2Ckor5/rNJ+qXR8GU+/y7e1GKU= + file: nheko.dmg + on: + condition: $TRAVIS_OS_NAME == osx + repo: mujx/nheko + tags: true diff --git a/.vscode/.cmaketools.json b/.vscode/.cmaketools.json new file mode 100644 index 00000000..148ec937 --- /dev/null +++ b/.vscode/.cmaketools.json @@ -0,0 +1,810 @@ +{ + "variant": { + "label": "Debug", + "keywordSettings": { + "buildType": "debug" + }, + "description": "Emit debug information without performing optimizations" + }, + "activeEnvironments": [], + "codeModel": { + "configurations": [ + { + "name": "Debug", + "projects": [ + { + "buildDirectory": "/home/max/Program/nheko/build", + "name": "nheko", + "sourceDirectory": "/home/max/Program/nheko", + "targets": [ + { + "artifacts": [ + "/home/max/Program/nheko/build/nheko" + ], + "buildDirectory": "/home/max/Program/nheko/build", + "crossReferences": { + "backtrace": [ + { + "line": 355, + "name": "add_executable", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "relatedStatements": [ + { + "backtrace": [ + { + "line": 233, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 234, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 235, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 236, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 238, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 239, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 356, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + }, + { + "backtrace": [ + { + "line": 356, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + }, + { + "backtrace": [ + { + "line": 356, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + }, + { + "backtrace": [ + { + "line": 356, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + }, + { + "backtrace": [ + { + "line": 356, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + } + ] + }, + "fileGroups": [ + { + "isGenerated": false, + "sources": [ + "resources/res.qrc", + "build/translations.qrc" + ] + }, + { + "compileFlags": " -Wall -Wextra -march=native -Werror -pipe -pedantic -Wunreachable-code -fdiagnostics-color=always -g -fPIC -std=gnu++11", + "defines": [ + "QT_CONCURRENT_LIB", + "QT_CORE_LIB", + "QT_GUI_LIB", + "QT_NETWORK_LIB", + "QT_WIDGETS_LIB" + ], + "includePath": [ + { + "path": "/home/max/Program/nheko/build" + }, + { + "path": "/home/max/Program/nheko" + }, + { + "path": "/home/max/Program/nheko/include" + }, + { + "path": "/home/max/Program/nheko/include/ui" + }, + { + "path": "/home/max/Program/nheko/include/events" + }, + { + "path": "/home/max/Program/nheko/include/events/messages" + }, + { + "path": "/home/max/Program/nheko/libs/lmdbxx" + }, + { + "isSystem": true, + "path": "/usr/include/qt5" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtCore" + }, + { + "isSystem": true, + "path": "/usr/lib64/qt5/./mkspecs/linux-g++" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtWidgets" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtGui" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtNetwork" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtConcurrent" + } + ], + "isGenerated": false, + "language": "CXX", + "sources": [ + "src/AvatarProvider.cc", + "src/Cache.cc", + "src/ChatPage.cc", + "src/CommunitiesListItem.cc", + "src/CommunitiesList.cc", + "src/Community.cc", + "src/Deserializable.cc", + "src/EmojiCategory.cc", + "src/EmojiItemDelegate.cc", + "src/EmojiPanel.cc", + "src/EmojiPickButton.cc", + "src/EmojiProvider.cc", + "src/ImageItem.cc", + "src/ImageOverlayDialog.cc", + "src/InputValidator.cc", + "src/JoinRoomDialog.cc", + "src/LeaveRoomDialog.cc", + "src/Login.cc", + "src/LoginPage.cc", + "src/LogoutDialog.cc", + "src/MainWindow.cc", + "src/MatrixClient.cc", + "src/Profile.cc", + "src/QuickSwitcher.cc", + "src/Register.cc", + "src/RegisterPage.cc", + "src/RoomInfoListItem.cc", + "src/RoomList.cc", + "src/RoomMessages.cc", + "src/RoomState.cc", + "src/SideBarActions.cc", + "src/UserSettingsPage.cc", + "src/Splitter.cc", + "src/Sync.cc", + "src/TextInputWidget.cc", + "src/TimelineItem.cc", + "src/TimelineView.cc", + "src/TimelineViewManager.cc", + "src/TopRoomBar.cc", + "src/TrayIcon.cc", + "src/TypingDisplay.cc", + "src/UserInfoWidget.cc", + "src/Versions.cc", + "src/WelcomePage.cc", + "src/main.cc", + "src/ui/Avatar.cc", + "src/ui/Badge.cc", + "src/ui/LoadingIndicator.cc", + "src/ui/FlatButton.cc", + "src/ui/FloatingButton.cc", + "src/ui/Label.cc", + "src/ui/OverlayModal.cc", + "src/ui/ScrollBar.cc", + "src/ui/SnackBar.cc", + "src/ui/RaisedButton.cc", + "src/ui/Ripple.cc", + "src/ui/RippleOverlay.cc", + "src/ui/OverlayWidget.cc", + "src/ui/TextField.cc", + "src/ui/ToggleButton.cc", + "src/ui/Theme.cc", + "src/ui/ThemeManager.cc" + ] + }, + { + "isGenerated": true, + "sources": [ + "build/nheko_de.qm", + "build/nheko_el.qm", + "build/nheko_en.qm", + "build/nheko_nl.qm", + "build/include/moc_AvatarProvider.cpp.rule", + "build/include/moc_ChatPage.cpp.rule", + "build/include/moc_CommunitiesListItem.cpp.rule", + "build/include/moc_CommunitiesList.cpp.rule", + "build/include/moc_Community.cpp.rule", + "build/include/moc_EmojiCategory.cpp.rule", + "build/include/moc_EmojiItemDelegate.cpp.rule", + "build/include/moc_EmojiPanel.cpp.rule", + "build/include/moc_EmojiPickButton.cpp.rule", + "build/include/ui/moc_FloatingButton.cpp.rule", + "build/include/moc_ImageItem.cpp.rule", + "build/include/moc_ImageOverlayDialog.cpp.rule", + "build/include/moc_JoinRoomDialog.cpp.rule", + "build/include/moc_LeaveRoomDialog.cpp.rule", + "build/include/moc_LoginPage.cpp.rule", + "build/include/moc_LogoutDialog.cpp.rule", + "build/include/moc_MainWindow.cpp.rule", + "build/include/moc_MatrixClient.cpp.rule", + "build/include/moc_QuickSwitcher.cpp.rule", + "build/include/moc_RegisterPage.cpp.rule", + "build/include/moc_RoomInfoListItem.cpp.rule", + "build/include/moc_RoomList.cpp.rule", + "build/include/moc_SideBarActions.cpp.rule", + "build/include/moc_UserSettingsPage.cpp.rule", + "build/include/moc_Splitter.cpp.rule", + "build/include/moc_TextInputWidget.cpp.rule", + "build/include/moc_TimelineItem.cpp.rule", + "build/include/moc_TimelineView.cpp.rule", + "build/include/moc_TimelineViewManager.cpp.rule", + "build/include/moc_TopRoomBar.cpp.rule", + "build/include/moc_TrayIcon.cpp.rule", + "build/include/moc_TypingDisplay.cpp.rule", + "build/include/moc_UserInfoWidget.cpp.rule", + "build/include/moc_WelcomePage.cpp.rule", + "build/include/ui/moc_Avatar.cpp.rule", + "build/include/ui/moc_Badge.cpp.rule", + "build/include/ui/moc_LoadingIndicator.cpp.rule", + "build/include/ui/moc_FlatButton.cpp.rule", + "build/include/ui/moc_Label.cpp.rule", + "build/include/ui/moc_OverlayWidget.cpp.rule", + "build/include/ui/moc_ScrollBar.cpp.rule", + "build/include/ui/moc_SnackBar.cpp.rule", + "build/include/ui/moc_RaisedButton.cpp.rule", + "build/include/ui/moc_Ripple.cpp.rule", + "build/include/ui/moc_RippleOverlay.cpp.rule", + "build/include/ui/moc_TextField.cpp.rule", + "build/include/ui/moc_ToggleButton.cpp.rule", + "build/include/ui/moc_Theme.cpp.rule", + "build/include/ui/moc_ThemeManager.cpp.rule", + "build/nheko_de.qm.rule", + "build/nheko_el.qm.rule", + "build/nheko_en.qm.rule", + "build/nheko_nl.qm.rule" + ] + }, + { + "compileFlags": " -Wall -Wextra -march=native -Werror -pipe -pedantic -Wunreachable-code -fdiagnostics-color=always -g -fPIC -std=gnu++11", + "defines": [ + "QT_CONCURRENT_LIB", + "QT_CORE_LIB", + "QT_GUI_LIB", + "QT_NETWORK_LIB", + "QT_WIDGETS_LIB" + ], + "includePath": [ + { + "path": "/home/max/Program/nheko/build" + }, + { + "path": "/home/max/Program/nheko" + }, + { + "path": "/home/max/Program/nheko/include" + }, + { + "path": "/home/max/Program/nheko/include/ui" + }, + { + "path": "/home/max/Program/nheko/include/events" + }, + { + "path": "/home/max/Program/nheko/include/events/messages" + }, + { + "path": "/home/max/Program/nheko/libs/lmdbxx" + }, + { + "isSystem": true, + "path": "/usr/include/qt5" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtCore" + }, + { + "isSystem": true, + "path": "/usr/lib64/qt5/./mkspecs/linux-g++" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtWidgets" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtGui" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtNetwork" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtConcurrent" + } + ], + "isGenerated": true, + "language": "CXX", + "sources": [ + "build/include/moc_AvatarProvider.cpp", + "build/include/moc_ChatPage.cpp", + "build/include/moc_CommunitiesListItem.cpp", + "build/include/moc_CommunitiesList.cpp", + "build/include/moc_Community.cpp", + "build/include/moc_EmojiCategory.cpp", + "build/include/moc_EmojiItemDelegate.cpp", + "build/include/moc_EmojiPanel.cpp", + "build/include/moc_EmojiPickButton.cpp", + "build/include/ui/moc_FloatingButton.cpp", + "build/include/moc_ImageItem.cpp", + "build/include/moc_ImageOverlayDialog.cpp", + "build/include/moc_JoinRoomDialog.cpp", + "build/include/moc_LeaveRoomDialog.cpp", + "build/include/moc_LoginPage.cpp", + "build/include/moc_LogoutDialog.cpp", + "build/include/moc_MainWindow.cpp", + "build/include/moc_MatrixClient.cpp", + "build/include/moc_QuickSwitcher.cpp", + "build/include/moc_RegisterPage.cpp", + "build/include/moc_RoomInfoListItem.cpp", + "build/include/moc_RoomList.cpp", + "build/include/moc_SideBarActions.cpp", + "build/include/moc_UserSettingsPage.cpp", + "build/include/moc_Splitter.cpp", + "build/include/moc_TextInputWidget.cpp", + "build/include/moc_TimelineItem.cpp", + "build/include/moc_TimelineView.cpp", + "build/include/moc_TimelineViewManager.cpp", + "build/include/moc_TopRoomBar.cpp", + "build/include/moc_TrayIcon.cpp", + "build/include/moc_TypingDisplay.cpp", + "build/include/moc_UserInfoWidget.cpp", + "build/include/moc_WelcomePage.cpp", + "build/include/ui/moc_Avatar.cpp", + "build/include/ui/moc_Badge.cpp", + "build/include/ui/moc_LoadingIndicator.cpp", + "build/include/ui/moc_FlatButton.cpp", + "build/include/ui/moc_Label.cpp", + "build/include/ui/moc_OverlayWidget.cpp", + "build/include/ui/moc_ScrollBar.cpp", + "build/include/ui/moc_SnackBar.cpp", + "build/include/ui/moc_RaisedButton.cpp", + "build/include/ui/moc_Ripple.cpp", + "build/include/ui/moc_RippleOverlay.cpp", + "build/include/ui/moc_TextField.cpp", + "build/include/ui/moc_ToggleButton.cpp", + "build/include/ui/moc_Theme.cpp", + "build/include/ui/moc_ThemeManager.cpp", + "build/qrc_res.cpp", + "build/qrc_translations.cpp" + ] + } + ], + "fullName": "nheko", + "linkFlags": "-rdynamic", + "linkLanguageFlags": "-Wall -Wextra -march=native -Werror -pipe -pedantic -Wunreachable-code -fdiagnostics-color=always -g", + "linkLibraries": "libmatrix_events.a /usr/lib64/libQt5Widgets.so.5.9.2 /usr/lib64/libQt5Network.so.5.9.2 /usr/lib64/libQt5Concurrent.so.5.9.2 -llmdb /usr/lib64/libQt5Gui.so.5.9.2 /usr/lib64/libQt5Core.so.5.9.2", + "linkerLanguage": "CXX", + "name": "nheko", + "sourceDirectory": "/home/max/Program/nheko", + "type": "EXECUTABLE" + }, + { + "buildDirectory": "/home/max/Program/nheko/build", + "crossReferences": { + "backtrace": [ + { + "line": 300, + "name": "add_custom_target", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "relatedStatements": [ + { + "backtrace": [ + { + "line": 233, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 234, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 235, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 236, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 238, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 239, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + } + ] + }, + "fileGroups": [ + { + "isGenerated": true, + "sources": [ + "build/CMakeFiles/LANG_QRC", + "build/CMakeFiles/LANG_QRC.rule", + "build/nheko_de.qm.rule", + "build/nheko_el.qm.rule", + "build/nheko_en.qm.rule", + "build/nheko_nl.qm.rule" + ] + } + ], + "fullName": "LANG_QRC", + "name": "LANG_QRC", + "sourceDirectory": "/home/max/Program/nheko", + "type": "UTILITY" + }, + { + "artifacts": [ + "/home/max/Program/nheko/build/libmatrix_events.a" + ], + "buildDirectory": "/home/max/Program/nheko/build", + "crossReferences": { + "backtrace": [ + { + "line": 317, + "name": "add_library", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "relatedStatements": [ + { + "backtrace": [ + { + "line": 233, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 234, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 235, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 236, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 238, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 239, + "name": "include_directories", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_include_directories" + }, + { + "backtrace": [ + { + "line": 318, + "name": "target_link_libraries", + "path": "/home/max/Program/nheko/CMakeLists.txt" + }, + { + "path": "/home/max/Program/nheko/CMakeLists.txt" + } + ], + "type": "target_link_libraries" + } + ] + }, + "fileGroups": [ + { + "compileFlags": " -Wall -Wextra -march=native -Werror -pipe -pedantic -Wunreachable-code -fdiagnostics-color=always -g -fPIC -std=gnu++11", + "defines": [ + "QT_CORE_LIB" + ], + "includePath": [ + { + "path": "/home/max/Program/nheko/build" + }, + { + "path": "/home/max/Program/nheko" + }, + { + "path": "/home/max/Program/nheko/include" + }, + { + "path": "/home/max/Program/nheko/include/ui" + }, + { + "path": "/home/max/Program/nheko/include/events" + }, + { + "path": "/home/max/Program/nheko/include/events/messages" + }, + { + "path": "/home/max/Program/nheko/libs/lmdbxx" + }, + { + "isSystem": true, + "path": "/usr/include/qt5" + }, + { + "isSystem": true, + "path": "/usr/include/qt5/QtCore" + }, + { + "isSystem": true, + "path": "/usr/lib64/qt5/./mkspecs/linux-g++" + } + ], + "isGenerated": false, + "language": "CXX", + "sources": [ + "src/events/Event.cc", + "src/events/AliasesEventContent.cc", + "src/events/AvatarEventContent.cc", + "src/events/CanonicalAliasEventContent.cc", + "src/events/CreateEventContent.cc", + "src/events/HistoryVisibilityEventContent.cc", + "src/events/JoinRulesEventContent.cc", + "src/events/MemberEventContent.cc", + "src/events/MessageEventContent.cc", + "src/events/NameEventContent.cc", + "src/events/PowerLevelsEventContent.cc", + "src/events/TopicEventContent.cc", + "src/events/messages/Audio.cc", + "src/events/messages/Emote.cc", + "src/events/messages/File.cc", + "src/events/messages/Image.cc", + "src/events/messages/Location.cc", + "src/events/messages/Notice.cc", + "src/events/messages/Text.cc", + "src/events/messages/Video.cc", + "src/Deserializable.cc" + ] + } + ], + "fullName": "libmatrix_events.a", + "linkerLanguage": "CXX", + "name": "matrix_events", + "sourceDirectory": "/home/max/Program/nheko", + "type": "STATIC_LIBRARY" + } + ] + } + ] + } + ], + "cookie": "0.46582309898312313", + "inReplyTo": "codemodel", + "type": "reply" + } +} \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..2706fb5f --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "null", + "includePath": [], + "defines": [], + "browse": { + "path": [], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "intelliSenseMode": "clang-x64" + } + ], + "version": 3 +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..6c283859 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "echo", + "type": "shell", + "command": "echo Hello" + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f34d2ce6..6c10aca4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,25 @@ cmake_minimum_required(VERSION 3.1) -project(nheko C CXX) - option(BUILD_TESTS "Build all tests" OFF) option(APPVEYOR_BUILD "Build on appveyor" OFF) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +# Include Qt basic functions +include(QtCommon) + +project(nheko LANGUAGES C CXX VERSION 0.1.0) + +# Set PROJECT_VERSION_PATCH and PROJECT_VERSION_TWEAK to 0 if not present, needed by add_project_meta +fix_project_version() + +# Set additional project information +set(COMPANY "Nheko") +set(COPYRIGHT "Copyright (c) 2017 Mujx") +set(IDENTIFIER "com.mujx.nheko") + +add_project_meta(META_FILES_TO_INCLUDE) + # # LMDB # @@ -156,6 +171,7 @@ set(SRC_FILES src/RoomMessages.cc src/RoomState.cc src/SideBarActions.cc + src/UserSettingsPage.cc src/Splitter.cc src/Sync.cc src/TextInputWidget.cc @@ -184,6 +200,7 @@ set(SRC_FILES src/ui/RippleOverlay.cc src/ui/OverlayWidget.cc src/ui/TextField.cc + src/ui/ToggleButton.cc src/ui/Theme.cc src/ui/ThemeManager.cc ) @@ -245,6 +262,7 @@ qt5_wrap_cpp(MOC_HEADERS include/RoomInfoListItem.h include/RoomList.h include/SideBarActions.h + include/UserSettingsPage.h include/Splitter.h include/TextInputWidget.h include/TimelineItem.h @@ -268,6 +286,7 @@ qt5_wrap_cpp(MOC_HEADERS include/ui/Ripple.h include/ui/RippleOverlay.h include/ui/TextField.h + include/ui/ToggleButton.h include/ui/Theme.h include/ui/ThemeManager.h ) @@ -298,14 +317,6 @@ qt5_add_resources(QRC resources/res.qrc) add_library(matrix_events ${MATRIX_EVENTS} src/Deserializable.cc) target_link_libraries(matrix_events Qt5::Core) -# -# Bundle icons. -# -if (APPLE) - set(ICON_FILE resources/nheko.icns) - set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) -endif() - if (BUILD_TESTS) enable_testing() @@ -332,15 +343,15 @@ else() set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network Qt5::Concurrent ${LMDB_LIBRARY}) endif() -set (NHEKO_DEPS ${OS_BUNDLE} ${SRC_FILES} ${UI_HEADERS} ${MOC_HEADERS} ${QRC} ${LANG_QRC} ${QM_SRC}) +set (NHEKO_DEPS ${SRC_FILES} ${UI_HEADERS} ${MOC_HEADERS} ${QRC} ${LANG_QRC} ${QM_SRC} ${META_FILES_TO_INCLUDE}) if(APPLE) - add_executable (nheko ${NHEKO_DEPS}) + add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS}) target_link_libraries (nheko ${NHEKO_LIBS} Qt5::MacExtras) elseif(WIN32) - add_executable (nheko ${ICON_FILE} ${NHEKO_DEPS}) + add_executable (nheko ${OS_BUNDLE} ${ICON_FILE} ${NHEKO_DEPS}) target_link_libraries (nheko ${NTDLIB} ${NHEKO_LIBS} Qt5::WinMain) else() - add_executable (nheko ${NHEKO_DEPS}) + add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS}) target_link_libraries (nheko ${NHEKO_LIBS}) endif() diff --git a/Makefile b/Makefile index b4f3f470..cb0e6d1b 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,4 @@ -APP_NAME = nheko -MAC_DIST_DIR = dist/MacOS -APP_TEMPLATE = $(MAC_DIST_DIR)/Nheko.app - -# Linux specific helpers debug: @cmake -DBUILD_TESTS=OFF -H. -GNinja -Bbuild -DCMAKE_BUILD_TYPE=Debug @cmake --build build @@ -17,19 +12,14 @@ test: @cmake --build build @cd build && GTEST_COLOR=1 ctest --verbose -app: release-debug $(APP_TEMPLATE) - @cp -fp ./build/$(APP_NAME) $(APP_TEMPLATE)/Contents/MacOS - @echo "Created '$(APP_NAME).app' in '$(APP_TEMPLATE)'" +linux-appimage: + @./.ci/linux/deploy.sh -app-install: app - cp -Rf $(APP_TEMPLATE) /Applications/ +macos-app: release-debug + @./.ci/macos/deploy.sh -dmg: app - hdiutil create $(MAC_DIST_DIR)/Nheko.dmg \ - -volname "$(APP_NAME)" \ - -fs HFS+ \ - -srcfolder $(MAC_DIST_DIR) \ - -ov -format UDZO +macos-app-install: + cp -Rf build/nheko.app /Applications run: @./build/nheko diff --git a/README.md b/README.md index 26356ef6..41ee62a1 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,12 @@ but we are getting close to a more feature complete client. Specifically there is support for: - Joining & leaving rooms - Sending & receiving images and emoji. -- Receiving typing notifications. +- Typing notifications. ### Installation +There are pre-built nigtly releases [here](https://github.com/mujx/nheko/releases/tag/nightly) for Linux ([AppImage](https://appimage.org/)), Mac and Windows. + #### Arch Linux ```bash pacaur -S nheko-git @@ -37,10 +39,6 @@ sudo layman -a matrix sudo emerge -a nheko ``` -#### Windows - -You can find an installer [here](https://ci.appveyor.com/project/mujx/nheko/branch/master/artifacts). - ### Build Requirements - Qt5 (5.7 or greater). Qt 5.7 adds support for color font rendering with @@ -105,15 +103,7 @@ make -C build The `nheko` binary will be located in the `build` directory. -##### MacOS - -You can create an app bundle with `make app`. The output will be located at -`dist/MacOS/Nheko.app` which can be copied to `/Applications/Nheko.app`. - -You can also create a disk image with `make dmg`. The output will be located at -`dist/MacOS/Nheko.dmg` - -##### Nix +#### Nix Download the repo as mentioned above and run diff --git a/appveyor.yml b/appveyor.yml index b5625097..3f1a0e83 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,14 +15,32 @@ build: install: - set QT_DIR=C:\Qt\5.8\msvc2015_64 - set PATH=%PATH%;%QT_DIR%\bin;C:\MinGW\bin - - copy LICENSE .ci\windows\LICENSE.txt - - cinst nsis --version 3.0 -y -installArgs /D=C:\nsis build_script: - - cmake -G "Visual Studio 14 2015 Win64" -H. -Bbuild -DAPPVEYOR_BUILD=ON + # VERSION format: branch-master/branch-1.2 + # INSTVERSION format: x.y.z + # WINVERSION format: 9999.0.0.123/1.2.0.234 + - if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.1.0 + - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.1.0 + - if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0 + - if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER% + # VERSION format: v1.2.3/v1.3.4 + # INSTVERSION format: 1.2.3/1.3.4 + # WINVERSION format: 1.2.3.123/1.3.4.234 + - if "%APPVEYOR_REPO_TAG%"=="true" set VERSION=%APPVEYOR_REPO_TAG_NAME% + - if "%APPVEYOR_REPO_TAG%"=="true" set INSTVERSION=%VERSION:~1% + - if "%APPVEYOR_REPO_TAG%"=="true" set WINVERSION=%VERSION:~1%.%APPVEYOR_BUILD_NUMBER% + - set DATE=%date:~10,4%-%date:~4,2%-%date:~7,2% + - echo %VERSION% + - echo %INSTVERSION% + - echo %DATE% + - cmake -G "Visual Studio 14 2015 Win64" -H. -Bbuild -DAPPVEYOR_BUILD=ON -DCMAKE_BUILD_TYPE=Release - cmake --build build --config Release after_build: + # Variables + - set BUILD=%APPVEYOR_BUILD_FOLDER% + - echo %BUILD% - mkdir NhekoRelease - copy build\Release\nheko.exe NhekoRelease\nheko.exe - windeployqt --qmldir C:\Qt\5.8\msvc2015_64\qml\ --release NhekoRelease\nheko.exe @@ -31,9 +49,58 @@ after_build: - copy C:\OpenSSL-Win64\lib\libeay32.lib .\NhekoRelease\libeay32.lib - copy C:\OpenSSL-Win64\bin\ssleay32.dll .\NhekoRelease\ssleay32.dll - 7z a nheko_win_64.zip .\NhekoRelease\* - - C:\nsis\makensis .ci\windows\nheko.nsi + - ls -lh build\Release\ + - ls -lh NhekoRelease\ + - mkdir NhekoData + - xcopy .\NhekoRelease\*.* NhekoData\*.* /s /e /c /y + # + # Create the Qt Installer Framework version + # + - mkdir installer + - mkdir installer\config + - mkdir installer\packages + - mkdir installer\packages\com.mujx.nheko + - mkdir installer\packages\com.mujx.nheko\data + - mkdir installer\packages\com.mujx.nheko\meta + - mkdir installer\packages\com.mujx.nheko.cleanup\meta + # Copy installer data + - copy %BUILD%\resources\nheko.ico installer\config + - copy %BUILD%\resources\nheko.png installer\config + - copy %BUILD%\LICENSE installer\packages\com.mujx.nheko\meta\license.txt + - copy %BUILD%\LICENSE installer\packages\com.mujx.nheko.cleanup\meta\license.txt + - copy %BUILD%\deploy\installer\config.xml installer\config + - copy %BUILD%\deploy\installer\controlscript.qs installer\config + - copy %BUILD%\deploy\installer\uninstall.qs installer\packages\com.mujx.nheko\data + - copy %BUILD%\deploy\installer\gui\package.xml installer\packages\com.mujx.nheko\meta + - copy %BUILD%\deploy\installer\gui\installscript.qs installer\packages\com.mujx.nheko\meta + - copy %BUILD%\deploy\installer\cleanup\package.xml installer\packages\com.mujx.nheko.cleanup\meta + - copy %BUILD%\deploy\installer\cleanup\installscript.qs installer\packages\com.mujx.nheko.cleanup\meta + # Amend version and date + - sed -i "s/__VERSION__/0.1.0/" installer\config\config.xml + - sed -i "s/__VERSION__/0.1.0/" installer\packages\com.mujx.nheko\meta\package.xml + - sed -i "s/__VERSION__/0.1.0/" installer\packages\com.mujx.nheko.cleanup\meta\package.xml + - sed -i "s/__DATE__/%DATE%/" installer\packages\com.mujx.nheko\meta\package.xml + - sed -i "s/__DATE__/%DATE%/" installer\packages\com.mujx.nheko.cleanup\meta\package.xml + # Copy nheko data + - xcopy NhekoData\*.* installer\packages\com.mujx.nheko\data\*.* /s /e /c /y + - move NhekoRelease\nheko.exe installer\packages\com.mujx.nheko\data + - mkdir tools + - curl -L -O https://download.qt.io/official_releases/qt-installer-framework/3.0.1/QtInstallerFramework-win-x86.exe + - 7z x QtInstallerFramework-win-x86.exe -otools -aoa + - set PATH=%BUILD%\tools\bin;%PATH% + - binarycreator.exe -f -c installer\config\config.xml -p installer\packages nheko-installer.exe + +deploy: + description: "Development builds" + provider: GitHub + auth_token: + secure: YqB7hcM+4482eSHhtVR7ZA7N7lE78y8BC897/7UDTBQd+NWdWFW/6S+oKDie9TT7 + artifact: nheko-installer.exe + force_update: true + prerelease: true + on: + appveyor_repo_tag: true artifacts: - path: nheko_win_64.zip - - path: NhekoRelease\nheko.exe - - path: nheko_setup.exe + - path: nheko-installer.exe diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in new file mode 100644 index 00000000..7391a6fa --- /dev/null +++ b/cmake/MacOSXBundleInfo.plist.in @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + ${MACOSX_BUNDLE_INFO_STRING} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + ${MACOSX_BUNDLE_LONG_VERSION_STRING} + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CSResourcesFileMapped + + LSRequiresCarbon + + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + NSPrincipalClass + NSApplication + + diff --git a/cmake/QtCommon.cmake b/cmake/QtCommon.cmake new file mode 100644 index 00000000..2145019e --- /dev/null +++ b/cmake/QtCommon.cmake @@ -0,0 +1,76 @@ +macro(fix_project_version) +if (NOT PROJECT_VERSION_PATCH) + set(PROJECT_VERSION_PATCH 0) +endif() + +if (NOT PROJECT_VERSION_TWEAK) + set(PROJECT_VERSION_TWEAK 0) +endif() +endmacro() + +macro(add_project_meta FILES_TO_INCLUDE) +if (NOT RESOURCE_FOLDER) + set(RESOURCE_FOLDER resources) +endif() + +if (NOT ICON_NAME) + set(ICON_NAME nheko) +endif() + +if (APPLE) + set(ICON_FILE ${RESOURCE_FOLDER}/${ICON_NAME}.icns) +elseif (WIN32) + set(ICON_FILE ${RESOURCE_FOLDER}/${ICON_NAME}.ico) +endif() + +if (WIN32) + configure_file("${PROJECT_SOURCE_DIR}/cmake/windows_metafile.rc.in" + "windows_metafile.rc" + ) + set(RES_FILES "windows_metafile.rc") + set(CMAKE_RC_COMPILER_INIT windres) + ENABLE_LANGUAGE(RC) + SET(CMAKE_RC_COMPILE_OBJECT " -O coff -i -o ") +endif() + +if (APPLE) + set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + + # Identify MacOS bundle + set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}) + set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}) + set(MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION}) + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") + set(MACOSX_BUNDLE_COPYRIGHT ${COPYRIGHT}) + set(MACOSX_BUNDLE_GUI_IDENTIFIER ${IDENTIFIER}) + set(MACOSX_BUNDLE_ICON_FILE ${ICON_NAME}) +endif() + +if (APPLE) + set(${FILES_TO_INCLUDE} ${ICON_FILE}) +elseif (WIN32) + set(${FILES_TO_INCLUDE} ${RES_FILES}) +endif() +endmacro() + +macro(init_os_bundle) +if (APPLE) + set(OS_BUNDLE MACOSX_BUNDLE) +elseif (WIN32) + IF(CMAKE_BUILD_TYPE MATCHES Release) + set(OS_BUNDLE WIN32) + endif() +endif() +endmacro() + +macro(fix_win_compiler) +if (MSVC) + set_target_properties(${PROJECT_NAME} PROPERTIES + WIN32_EXECUTABLE YES + LINK_FLAGS "/ENTRY:mainCRTStartup" + ) +endif() +endmacro() + +init_os_bundle() +fix_win_compiler() diff --git a/cmake/windows_metafile.rc.in b/cmake/windows_metafile.rc.in new file mode 100644 index 00000000..02008697 --- /dev/null +++ b/cmake/windows_metafile.rc.in @@ -0,0 +1,28 @@ +#include "winver.h" + +IDI_ICON1 ICON DISCARDABLE "@ICON_FILE@" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,@PROJECT_VERSION_TWEAK@ + PRODUCTVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,@PROJECT_VERSION_TWEAK@ + FILEFLAGS 0x0L + FILEFLAGSMASK 0x3fL + FILEOS 0x00040004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "CompanyName", "@COMPANY@" + VALUE "FileDescription", "@PROJECT_NAME@" + VALUE "FileVersion", "@PROJECT_VERSION@" + VALUE "LegalCopyright", "@COPYRIGHT@" + VALUE "InternalName", "@PROJECT_NAME@" + VALUE "OriginalFilename", "@PROJECT_NAME@.exe" + VALUE "ProductName", "@PROJECT_NAME@" + VALUE "ProductVersion", "@PROJECT_VERSION@" + END + END +END diff --git a/deploy/installer/cleanup/installscript.qs b/deploy/installer/cleanup/installscript.qs new file mode 100644 index 00000000..46f8012c --- /dev/null +++ b/deploy/installer/cleanup/installscript.qs @@ -0,0 +1,28 @@ +function Component() +{ +} + +Component.prototype.createOperations = function() +{ + component.createOperations(); + + try + { + if( installer.value("os") === "win" ) + { + /** + * Cleanup AppData and registry + */ + component.addElevatedOperation("Execute","UNDOEXECUTE","cmd /C reg delete HKEY_CURRENT_USER\Software\nheko\nheko /f"); + var localappdata = installer.environmentVariable("LOCALAPPDATA"); + if( localappdata != "" ) + { + component.addElevatedOperation("Execute","UNDOEXECUTE","cmd /C rmdir "+localappdata+"\nheko /f"); + } + } + } + catch( e ) + { + print( e ); + } +} diff --git a/deploy/installer/cleanup/package.xml b/deploy/installer/cleanup/package.xml new file mode 100644 index 00000000..f43e5b78 --- /dev/null +++ b/deploy/installer/cleanup/package.xml @@ -0,0 +1,10 @@ + + + Cleanup AppData and Registry + Cleans up AppData and Registry when selected (logs you out) - Broken + __VERSION__ + __DATE__ + 80 + + false + diff --git a/deploy/installer/config.xml b/deploy/installer/config.xml new file mode 100644 index 00000000..2cf7d99c --- /dev/null +++ b/deploy/installer/config.xml @@ -0,0 +1,15 @@ + + + Nheko + __VERSION__ + Nheko Installer + Mujx + https://github.com/mujx/nheko + nheko + nheko + nheko.png + Nheko + @ApplicationsDir@/nheko + @TargetDir@/nheko.exe + controlscript.qs + diff --git a/deploy/installer/controlscript.qs b/deploy/installer/controlscript.qs new file mode 100644 index 00000000..a53c3e99 --- /dev/null +++ b/deploy/installer/controlscript.qs @@ -0,0 +1,25 @@ +/** + * Source: http://stackoverflow.com/questions/21389105/qt-installer-framework-offline-update-how + */ + +function Controller() +{ +} + +Controller.prototype.TargetDirectoryPageCallback = function() +{ + var widget = gui.currentPageWidget(); + widget.TargetDirectoryLineEdit.textChanged.connect( this, Controller.prototype.targetChanged ); + Controller.prototype.targetChanged( widget.TargetDirectoryLineEdit.text ); +} + +Controller.prototype.targetChanged = function( text ) +{ + if( text != "" && installer.fileExists(text + "/components.xml") ) + { + if( QMessageBox.question("PreviousInstallation", "Previous installation detected", "Do you want to uninstall the previous installation?", QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes ) + { + installer.execute( text+"/maintenancetool.exe", new Array("--script", text+"/uninstall.qs") ) + } + } +} diff --git a/deploy/installer/gui/installscript.qs b/deploy/installer/gui/installscript.qs new file mode 100644 index 00000000..4cfa284f --- /dev/null +++ b/deploy/installer/gui/installscript.qs @@ -0,0 +1,32 @@ +function Component() +{ +} + +Component.prototype.createOperations = function() +{ + component.createOperations(); + + try + { + if( installer.value("os") === "win" ) + { + /** + * Start Menu Shortcut + */ + component.addOperation( "CreateShortcut", "@TargetDir@\\nheko.exe", "@StartMenuDir@\\nheko.lnk", + "workingDirectory=@TargetDir@", "iconPath=@TargetDir@\\nheko.exe", + "iconId=0", "description=Desktop client for the Matrix protocol"); + + /** + * Desktop Shortcut + */ + component.addOperation( "CreateShortcut", "@TargetDir@\\nheko.exe", "@DesktopDir@\\nheko.lnk", + "workingDirectory=@TargetDir@", "iconPath=@TargetDir@\\nheko.exe", + "iconId=0", "description=Desktop client for the Matrix protocol"); + } + } + catch( e ) + { + print( e ); + } +} diff --git a/deploy/installer/gui/package.xml b/deploy/installer/gui/package.xml new file mode 100644 index 00000000..c28b7e60 --- /dev/null +++ b/deploy/installer/gui/package.xml @@ -0,0 +1,14 @@ + + + Nheko + Desktop client for the Matrix protocol + __VERSION__ + __DATE__ + + + + true + true + 100 + + diff --git a/deploy/installer/uninstall.qs b/deploy/installer/uninstall.qs new file mode 100644 index 00000000..43935d0f --- /dev/null +++ b/deploy/installer/uninstall.qs @@ -0,0 +1,18 @@ +function Controller() +{ +} + +Controller.prototype.IntroductionPageCallback = function() +{ + gui.clickButton( buttons.NextButton ); +} + +Controller.prototype.ReadyForInstallationPageCallback = function() +{ + gui.clickButton( buttons.CommitButton ); +} + +Controller.prototype.FinishedPageCallback = function() +{ + gui.clickButton( buttons.FinishButton ); +} diff --git a/dist/MacOS/nheko.app/Contents/Info.plist b/dist/MacOS/nheko.app/Contents/Info.plist deleted file mode 100644 index 59a123b1..00000000 --- a/dist/MacOS/nheko.app/Contents/Info.plist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - CFBundleDisplayName - Nheko - CFBundleExecutable - nheko - CFBundleIdentifier - nheko - CFBundleName - Nheko - CFBundleIconFile - nheko.icns - CFBundleShortVersionString - 0.1.0 - CFBundleVersion - 0.1.0 - CFBundleDevelopmentRegion - en - CFBundlePackageType - APPL - CFBundleInfoDictionaryVersion - 6.0 - NSHighResolutionCapable - - NSMainNibFile - - NSSupportsAutomaticGraphicsSwitching - - - diff --git a/dist/MacOS/nheko.app/Contents/MacOS/.gitkeep b/dist/MacOS/nheko.app/Contents/MacOS/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/dist/MacOS/nheko.app/Contents/Resources/nheko.icns b/dist/MacOS/nheko.app/Contents/Resources/nheko.icns deleted file mode 100644 index ecb66b6f..00000000 Binary files a/dist/MacOS/nheko.app/Contents/Resources/nheko.icns and /dev/null differ diff --git a/include/ChatPage.h b/include/ChatPage.h index 773e3bc5..e61d931d 100644 --- a/include/ChatPage.h +++ b/include/ChatPage.h @@ -17,6 +17,7 @@ #pragma once +#include #include #include #include @@ -47,8 +48,9 @@ class UserInfoWidget; class JoinedRoom; class LeftRoom; -constexpr int CONSENSUS_TIMEOUT = 1000; -constexpr int SHOW_CONTENT_TIMEOUT = 3000; +constexpr int CONSENSUS_TIMEOUT = 1000; +constexpr int SHOW_CONTENT_TIMEOUT = 3000; +constexpr int TYPING_REFRESH_TIMEOUT = 10000; class ChatPage : public QWidget { @@ -69,6 +71,7 @@ signals: void unreadMessages(int count); void showNotification(const QString &msg); void showLoginPage(const QString &msg); + void showUserSettingsPage(); private slots: void showUnreadMessageNotification(int count); @@ -119,10 +122,8 @@ private: QWidget *sideBarTopWidget_; QVBoxLayout *sideBarTopWidgetLayout_; - QWidget *content_; + QFrame *content_; QVBoxLayout *contentLayout_; - QHBoxLayout *topBarLayout_; - QVBoxLayout *mainContentLayout_; CommunitiesList *communitiesList_; RoomList *room_list_; @@ -153,6 +154,7 @@ private: // Keeps track of the users currently typing on each room. QMap> typingUsers_; + QTimer *typingRefresher_; QSharedPointer quickSwitcher_; QSharedPointer quickSwitcherModal_; diff --git a/include/MainWindow.h b/include/MainWindow.h index f56592c2..21530d07 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -30,6 +30,8 @@ class OverlayModal; class RegisterPage; class SnackBar; class TrayIcon; +class UserSettingsPage; +class UserSettings; class WelcomePage; class MainWindow : public QMainWindow @@ -59,6 +61,7 @@ private slots: // Show the register page in the main window. void showRegisterPage(); + void showUserSettingsPage(); // Show the chat page and start communicating with the given access token. void showChatPage(QString user_id, QString home_server, QString token); @@ -85,6 +88,8 @@ private: // The main chat area. ChatPage *chat_page_; + UserSettingsPage *userSettingsPage_; + QSharedPointer userSettings_; // Used to hide undefined states between page transitions. QSharedPointer progressModal_; diff --git a/include/MatrixClient.h b/include/MatrixClient.h index a10b1f7b..ca4824f8 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h @@ -19,6 +19,7 @@ #include #include +#include #include "MessageEvent.h" @@ -40,8 +41,10 @@ public: void initialSync() noexcept; void sync() noexcept; void sendRoomMessage(matrix::events::MessageEventType ty, + int txnId, const QString &roomid, const QString &msg, + const QFileInfo &fileinfo, const QString &url = "") noexcept; void login(const QString &username, const QString &password) noexcept; void registerUser(const QString &username, @@ -59,10 +62,12 @@ public: void uploadImage(const QString &roomid, const QString &filename); void joinRoom(const QString &roomIdOrAlias); void leaveRoom(const QString &roomId); + void sendTypingNotification(const QString &roomid, int timeoutInMillis = 20000); + void removeTypingNotification(const QString &roomid); QUrl getHomeServer() { return server_; }; int transactionId() { return txn_id_; }; - void incrementTransactionId() { txn_id_ += 1; }; + int incrementTransactionId() { return ++txn_id_; }; void reset() noexcept; @@ -109,6 +114,7 @@ signals: void syncFailed(const QString &msg); void joinFailed(const QString &msg); void messageSent(const QString &event_id, const QString &roomid, const int txn_id); + void messageSendFailed(const QString &roomid, const int txn_id); void emoteSent(const QString &event_id, const QString &roomid, const int txn_id); void messagesRetrieved(const QString &room_id, const RoomMessages &msgs); void joinedRoom(const QString &room_id); diff --git a/include/SideBarActions.h b/include/SideBarActions.h index 7b550578..bf48c4da 100644 --- a/include/SideBarActions.h +++ b/include/SideBarActions.h @@ -14,6 +14,9 @@ public: SideBarActions(QWidget *parent = nullptr); ~SideBarActions(); +signals: + void showSettings(); + protected: void resizeEvent(QResizeEvent *event) override; diff --git a/include/TextInputWidget.h b/include/TextInputWidget.h index 08b62f45..70b1c213 100644 --- a/include/TextInputWidget.h +++ b/include/TextInputWidget.h @@ -17,6 +17,8 @@ #pragma once +#include + #include #include #include @@ -29,18 +31,36 @@ namespace msgs = matrix::events::messages; -static const QString EMOTE_COMMAND("/me "); -static const QString JOIN_COMMAND("/join "); - class FilteredTextEdit : public QTextEdit { Q_OBJECT + public: explicit FilteredTextEdit(QWidget *parent = nullptr); - void keyPressEvent(QKeyEvent *event); + + void stopTyping(); + + QSize sizeHint() const override; + QSize minimumSizeHint() const override; + + void submit(); signals: - void enterPressed(); + void startedTyping(); + void stoppedTyping(); + void message(QString); + void command(QString name, QString args); + +protected: + void keyPressEvent(QKeyEvent *event) override; + +private: + std::deque true_history_, working_history_; + size_t history_index_; + QTimer *typingTimer_; + + void textChanged(); + void afterCompletion(int); }; class TextInputWidget : public QFrame @@ -51,8 +71,9 @@ public: TextInputWidget(QWidget *parent = 0); ~TextInputWidget(); + void stopTyping(); + public slots: - void onSendButtonClicked(); void openFileSelection(); void hideUploadSpinner(); void focusLineEdit() { input_->setFocus(); }; @@ -66,10 +87,15 @@ signals: void uploadImage(QString filename); void sendJoinRoomRequest(const QString &room); + void startedTyping(); + void stoppedTyping(); + +protected: + void focusInEvent(QFocusEvent *event); + private: void showUploadSpinner(); - QString parseEmoteCommand(const QString &cmd); - QString parseJoinCommand(const QString &cmd); + void command(QString name, QString args); QHBoxLayout *topLayout_; FilteredTextEdit *input_; diff --git a/include/TimelineView.h b/include/TimelineView.h index b1ebaa2d..7034881d 100644 --- a/include/TimelineView.h +++ b/include/TimelineView.h @@ -19,6 +19,7 @@ #include #include +#include #include #include "Emote.h" @@ -42,18 +43,26 @@ namespace events = matrix::events; // but not yet confirmed by the homeserver through sync. struct PendingMessage { + matrix::events::MessageEventType ty; int txn_id; QString body; + QString filename; QString event_id; TimelineItem *widget; - PendingMessage(int txn_id, QString body, QString event_id, TimelineItem *widget) - : txn_id(txn_id) + PendingMessage(matrix::events::MessageEventType ty, + int txn_id, + QString body, + QString filename, + QString event_id, + TimelineItem *widget) + : ty(ty) + , txn_id(txn_id) , body(body) + , filename(filename) , event_id(event_id) , widget(widget) - { - } + {} }; // In which place new TimelineItems should be inserted. @@ -87,8 +96,8 @@ public: // Add new events at the end of the timeline. int addEvents(const Timeline &timeline); - void addUserMessage(matrix::events::MessageEventType ty, const QString &msg, int txn_id); - void addUserMessage(const QString &url, const QString &filename, int txn_id); + void addUserMessage(matrix::events::MessageEventType ty, const QString &msg); + void addUserMessage(const QString &url, const QString &filename); void updatePendingMessage(int txn_id, QString event_id); void scrollDown(); @@ -103,6 +112,11 @@ public slots: // Whether or not the initial batch has been loaded. bool hasLoaded() { return scroll_layout_->count() > 1 || isTimelineFinished; }; + void handleFailedMessage(int txnid); + +private slots: + void sendNextPendingMessage(); + signals: void updateLastTimelineMessage(const QString &user, const DescInfo &info); @@ -116,13 +130,11 @@ private: // sender's name. bool isSenderRendered(const QString &user_id, TimelineDirection direction); - bool isPendingMessage(const QString &eventid, - const QString &body, - const QString &sender, - const QString &userid); - void removePendingMessage(const QString &eventid, const QString &body); + bool isPendingMessage(const QString &txnid, const QString &sender, const QString &userid); + void removePendingMessage(const QString &txnid); bool isDuplicate(const QString &event_id) { return eventIds_.contains(event_id); }; + void handleNewUserMessage(PendingMessage msg); // Return nullptr if the event couldn't be parsed. TimelineItem *parseMessageEvent(const QJsonObject &event, TimelineDirection direction); @@ -163,6 +175,7 @@ private: // The events currently rendered. Used for duplicate detection. QMap eventIds_; - QList pending_msgs_; + QQueue pending_msgs_; + QList pending_sent_msgs_; QSharedPointer client_; }; diff --git a/include/TimelineViewManager.h b/include/TimelineViewManager.h index 8ff49f20..5bd3054f 100644 --- a/include/TimelineViewManager.h +++ b/include/TimelineViewManager.h @@ -21,6 +21,8 @@ #include #include +#include "MessageEvent.h" + class JoinedRoom; class MatrixClient; class RoomInfoListItem; @@ -61,12 +63,13 @@ signals: public slots: void setHistoryView(const QString &room_id); - void sendTextMessage(const QString &msg); - void sendEmoteMessage(const QString &msg); - void sendImageMessage(const QString &roomid, const QString &filename, const QString &url); + void queueTextMessage(const QString &msg); + void queueEmoteMessage(const QString &msg); + void queueImageMessage(const QString &roomid, const QString &filename, const QString &url); private slots: void messageSent(const QString &eventid, const QString &roomid, int txnid); + void messageSendFailed(const QString &roomid, int txnid); private: QString active_room_; diff --git a/include/UserSettingsPage.h b/include/UserSettingsPage.h new file mode 100644 index 00000000..d8160cbe --- /dev/null +++ b/include/UserSettingsPage.h @@ -0,0 +1,86 @@ +/* + * nheko Copyright (C) 2017 Konstantinos Sideris + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include +#include +#include +#include + +class Toggle; + +constexpr int OptionMargin = 6; +constexpr int LayoutTopMargin = 50; +constexpr int LayoutBottomMargin = LayoutTopMargin; + +class UserSettings +{ +public: + UserSettings(); + + void save(); + void load(); + void setTheme(QString theme) { theme_ = theme; } + void setTray(bool state) { isTrayEnabled_ = state; } + + QString theme() const { return !theme_.isEmpty() ? theme_ : "default"; } + bool isTrayEnabled() const { return isTrayEnabled_; } + +private: + QString theme_; + bool isTrayEnabled_; +}; + +class HorizontalLine : public QFrame +{ + Q_OBJECT + +public: + HorizontalLine(QWidget *parent = nullptr); +}; + +class UserSettingsPage : public QWidget +{ + Q_OBJECT + +public: + UserSettingsPage(QSharedPointer settings, QWidget *parent = 0); + +protected: + void showEvent(QShowEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +signals: + void moveBack(); + void trayOptionChanged(bool value); + +private: + // Layouts + QVBoxLayout *topLayout_; + QVBoxLayout *mainLayout_; + QHBoxLayout *topBarLayout_; + + // Shared settings object. + QSharedPointer settings_; + + Toggle *trayToggle_; + QComboBox *themeCombo_; + + int sideMargin_ = 0; +}; diff --git a/include/events/Event.h b/include/events/Event.h index 81a91b8b..550c0d3b 100644 --- a/include/events/Event.h +++ b/include/events/Event.h @@ -60,12 +60,31 @@ isMessageEvent(EventType type); bool isStateEvent(EventType type); +class UnsignedData + : public Deserializable + , public Serializable +{ +public: + double age() const { return age_; } + QString transactionId() const { return transaction_id_; } + + bool isEmpty() const { return age_ <= 0 && transaction_id_.isEmpty(); } + + void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; + +private: + double age_ = 0; + QString transaction_id_; +}; + template class Event : public Deserializable, public Serializable { public: Content content() const; EventType eventType() const; + UnsignedData unsignedData() const { return unsignedData_; } void deserialize(const QJsonValue &data) override; QJsonObject serialize() const override; @@ -73,6 +92,7 @@ public: private: Content content_; EventType type_; + UnsignedData unsignedData_; }; template @@ -100,6 +120,9 @@ Event::deserialize(const QJsonValue &data) content_.deserialize(object.value("content")); type_ = extractEventType(object); + + if (object.contains("unsigned")) + unsignedData_.deserialize(object.value("unsigned")); } template @@ -149,6 +172,9 @@ Event::serialize() const object["content"] = content_.serialize(); + if (!unsignedData_.isEmpty()) + object["unsigned"] = unsignedData_.serialize(); + return object; } } // namespace events diff --git a/include/ui/Theme.h b/include/ui/Theme.h index a5fc6548..c2e4ab59 100644 --- a/include/ui/Theme.h +++ b/include/ui/Theme.h @@ -12,8 +12,7 @@ enum class AvatarType Letter }; -namespace sidebar -{ +namespace sidebar { static const int SmallSize = 60; static const int NormalSize = 300; static const int CommunitiesSidebarSize = 64; diff --git a/include/ui/ToggleButton.h b/include/ui/ToggleButton.h new file mode 100644 index 00000000..14c3450b --- /dev/null +++ b/include/ui/ToggleButton.h @@ -0,0 +1,110 @@ +#pragma once + +#include +#include + +class ToggleTrack; +class ToggleThumb; + +enum class Position +{ + Left, + Right +}; + +class Toggle : public QAbstractButton +{ + Q_OBJECT + + Q_PROPERTY(QColor activeColor WRITE setActiveColor READ activeColor) + Q_PROPERTY(QColor disabledColor WRITE setDisabledColor READ disabledColor) + Q_PROPERTY(QColor inactiveColor WRITE setInactiveColor READ inactiveColor) + Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) + +public: + Toggle(QWidget *parent = nullptr); + + void setState(bool isEnabled); + + void setActiveColor(const QColor &color); + void setDisabledColor(const QColor &color); + void setInactiveColor(const QColor &color); + void setTrackColor(const QColor &color); + + QColor activeColor() const { return activeColor_; }; + QColor disabledColor() const { return disabledColor_; }; + QColor inactiveColor() const { return inactiveColor_; }; + QColor trackColor() const { return trackColor_.isValid() ? trackColor_ : QColor("#eee"); }; + + QSize sizeHint() const override { return QSize(64, 48); }; + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + void init(); + void setupProperties(); + + ToggleTrack *track_; + ToggleThumb *thumb_; + + QColor disabledColor_; + QColor activeColor_; + QColor inactiveColor_; + QColor trackColor_; +}; + +class ToggleThumb : public QWidget +{ + Q_OBJECT + + Q_PROPERTY(QColor thumbColor WRITE setThumbColor READ thumbColor) + +public: + ToggleThumb(Toggle *parent); + + Position shift() const { return position_; }; + qreal offset() const { return offset_; }; + QColor thumbColor() const { return thumbColor_; }; + + void setShift(Position position); + void setThumbColor(const QColor &color) + { + thumbColor_ = color; + update(); + }; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private: + void updateOffset(); + + Toggle *const toggle_; + QColor thumbColor_; + + Position position_; + qreal offset_; +}; + +class ToggleTrack : public QWidget +{ + Q_OBJECT + + Q_PROPERTY(QColor trackColor WRITE setTrackColor READ trackColor) + +public: + ToggleTrack(Toggle *parent); + + void setTrackColor(const QColor &color); + QColor trackColor() const { return trackColor_; }; + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private: + Toggle *const toggle_; + QColor trackColor_; +}; diff --git a/src/Cache.cc b/src/Cache.cc index 99267343..dc2c8a9f 100644 --- a/src/Cache.cc +++ b/src/Cache.cc @@ -31,11 +31,11 @@ static const lmdb::val NEXT_BATCH_KEY("next_batch"); static const lmdb::val transactionID("transaction_id"); Cache::Cache(const QString &userId) - : env_{ nullptr } - , stateDb_{ 0 } - , roomDb_{ 0 } - , isMounted_{ false } - , userId_{ userId } + : env_{nullptr} + , stateDb_{0} + , roomDb_{0} + , isMounted_{false} + , userId_{userId} {} void diff --git a/src/ChatPage.cc b/src/ChatPage.cc index 8cd7007d..3fcd6a7f 100644 --- a/src/ChatPage.cc +++ b/src/ChatPage.cc @@ -72,8 +72,8 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) topLayout_->addWidget(splitter); // SideBar - sideBar_ = new QWidget(this); - sideBar_->setMinimumSize(QSize(ui::sidebar::NormalSize, 0)); + sideBar_ = new QFrame(this); + sideBar_->setMinimumSize(QSize(ui::sidebar::NormalSize, parent->height())); sideBarLayout_ = new QVBoxLayout(sideBar_); sideBarLayout_->setSpacing(0); sideBarLayout_->setMargin(0); @@ -93,40 +93,33 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) sideBarTopWidget_ = new QWidget(sideBar_); sideBarTopWidget_->setStyleSheet("background-color: #d6dde3; color: #ebebeb;"); + sidebarActions_ = new SideBarActions(this); + connect( + sidebarActions_, &SideBarActions::showSettings, this, &ChatPage::showUserSettingsPage); - sideBarTopLayout_->addWidget(sideBarTopWidget_); + user_info_widget_ = new UserInfoWidget(sideBar_); + room_list_ = new RoomList(client, sideBar_); - sideBarTopWidgetLayout_ = new QVBoxLayout(sideBarTopWidget_); - sideBarTopWidgetLayout_->setSpacing(0); - sideBarTopWidgetLayout_->setMargin(0); + sideBarLayout_->addWidget(user_info_widget_); + sideBarLayout_->addWidget(room_list_); + sideBarLayout_->addWidget(sidebarActions_); // Content - content_ = new QWidget(this); + content_ = new QFrame(this); contentLayout_ = new QVBoxLayout(content_); contentLayout_->setSpacing(0); contentLayout_->setMargin(0); - topBarLayout_ = new QHBoxLayout(); - topBarLayout_->setSpacing(0); - mainContentLayout_ = new QVBoxLayout(); - mainContentLayout_->setSpacing(0); - mainContentLayout_->setMargin(0); + top_bar_ = new TopRoomBar(this); + view_manager_ = new TimelineViewManager(client, this); - contentLayout_->addLayout(topBarLayout_); - contentLayout_->addLayout(mainContentLayout_); + contentLayout_->addWidget(top_bar_); + contentLayout_->addWidget(view_manager_); // Splitter splitter->addWidget(sideBar_); splitter->addWidget(content_); - - room_list_ = new RoomList(client, sideBar_); - sideBarMainLayout_->addWidget(room_list_); - - top_bar_ = new TopRoomBar(this); - topBarLayout_->addWidget(top_bar_); - - view_manager_ = new TimelineViewManager(client, this); - mainContentLayout_->addWidget(view_manager_); + splitter->setSizes({ui::sidebar::NormalSize, parent->width() - ui::sidebar::NormalSize}); text_input_ = new TextInputWidget(this); typingDisplay_ = new TypingDisplay(this); @@ -135,6 +128,8 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) user_info_widget_ = new UserInfoWidget(sideBarTopWidget_); sideBarTopWidgetLayout_->addWidget(user_info_widget_); + typingRefresher_ = new QTimer(this); + typingRefresher_->setInterval(TYPING_REFRESH_TIMEOUT); connect(user_info_widget_, SIGNAL(logout()), client_.data(), SLOT(logout())); connect(client_.data(), SIGNAL(loggedOut()), this, SLOT(logout())); @@ -150,6 +145,7 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) typingDisplay_->setUsers(users); }); + connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::stopTyping); connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo); connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::focusLineEdit); @@ -170,6 +166,20 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) room_list_->updateUnreadMessageCount(roomid, count); }); + connect(text_input_, &TextInputWidget::startedTyping, this, [=]() { + typingRefresher_->start(); + client_->sendTypingNotification(current_room_); + }); + + connect(text_input_, &TextInputWidget::stoppedTyping, this, [=]() { + typingRefresher_->stop(); + client_->removeTypingNotification(current_room_); + }); + + connect(typingRefresher_, &QTimer::timeout, this, [=]() { + client_->sendTypingNotification(current_room_); + }); + connect(view_manager_, &TimelineViewManager::updateRoomsLastMessage, room_list_, @@ -183,12 +193,12 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) connect(text_input_, SIGNAL(sendTextMessage(const QString &)), view_manager_, - SLOT(sendTextMessage(const QString &))); + SLOT(queueTextMessage(const QString &))); connect(text_input_, SIGNAL(sendEmoteMessage(const QString &)), view_manager_, - SLOT(sendEmoteMessage(const QString &))); + SLOT(queueEmoteMessage(const QString &))); connect(text_input_, &TextInputWidget::sendJoinRoomRequest, @@ -205,7 +215,7 @@ ChatPage::ChatPage(QSharedPointer client, QWidget *parent) this, [=](QString roomid, QString filename, QString url) { text_input_->hideUploadSpinner(); - view_manager_->sendImageMessage(roomid, filename, url); + view_manager_->queueImageMessage(roomid, filename, url); }); connect(client_.data(), @@ -604,6 +614,7 @@ ChatPage::showQuickSwitcher() connect(quickSwitcher_.data(), &QuickSwitcher::closing, this, [=]() { if (!this->quickSwitcherModal_.isNull()) this->quickSwitcherModal_->fadeOut(); + this->text_input_->setFocus(Qt::FocusReason::PopupFocusReason); }); } @@ -617,8 +628,12 @@ ChatPage::showQuickSwitcher() QMap rooms; - for (auto it = state_manager_.constBegin(); it != state_manager_.constEnd(); ++it) - rooms.insert(it.value().getName(), it.key()); + for (auto it = state_manager_.constBegin(); it != state_manager_.constEnd(); ++it) { + QString deambiguator = it.value().canonical_alias.content().alias(); + if (deambiguator == "") + deambiguator = it.key(); + rooms.insert(it.value().getName() + " (" + deambiguator + ")", it.key()); + } quickSwitcher_->setRoomList(rooms); quickSwitcherModal_->fadeIn(); @@ -662,13 +677,20 @@ ChatPage::updateTypingUsers(const QString &roomid, const QList &user_id { QStringList users; - for (const auto uid : user_ids) + QSettings settings; + QString user_id = settings.value("auth/user_id").toString(); + + for (const auto uid : user_ids) { + if (uid == user_id) + continue; users.append(TimelineViewManager::displayName(uid)); + } users.sort(); - if (current_room_ == roomid) + if (current_room_ == roomid) { typingDisplay_->setUsers(users); + } typingUsers_.insert(roomid, users); } diff --git a/src/EmojiPanel.cc b/src/EmojiPanel.cc index 71e2526c..3f5f8369 100644 --- a/src/EmojiPanel.cc +++ b/src/EmojiPanel.cc @@ -26,11 +26,11 @@ EmojiPanel::EmojiPanel(QWidget *parent) : QWidget(parent) - , shadowMargin_{ 2 } - , width_{ 370 } - , height_{ 350 } - , animationDuration_{ 100 } - , categoryIconSize_{ 20 } + , shadowMargin_{2} + , width_{370} + , height_{350} + , animationDuration_{100} + , categoryIconSize_{20} { setStyleSheet("QWidget {background: #fff; color: #e8e8e8; border: none;}" "QScrollBar:vertical { background-color: #fff; width: 8px; margin: 0px " diff --git a/src/EmojiPickButton.cc b/src/EmojiPickButton.cc index a63ca0b2..06aa3db9 100644 --- a/src/EmojiPickButton.cc +++ b/src/EmojiPickButton.cc @@ -20,7 +20,7 @@ EmojiPickButton::EmojiPickButton(QWidget *parent) : FlatButton(parent) - , panel_{ nullptr } + , panel_{nullptr} {} void diff --git a/src/EmojiProvider.cc b/src/EmojiProvider.cc index 0a602120..ec053046 100644 --- a/src/EmojiProvider.cc +++ b/src/EmojiProvider.cc @@ -20,1447 +20,1446 @@ #include "EmojiProvider.h" const QList EmojiProvider::people = { - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x80"), ":grinning:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x81"), ":grin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x82"), ":joy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa3"), ":rofl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x83"), ":smiley:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x84"), ":smile:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x85"), ":sweat_smile:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x86"), ":laughing:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x89"), ":wink:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8a"), ":blush:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8b"), ":yum:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8e"), ":sunglasses:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8d"), ":heart_eyes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x98"), ":kissing_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x97"), ":kissing:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x99"), ":kissing_smiling_eyes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9a"), ":kissing_closed_eyes:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xba"), ":relaxed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x82"), ":slight_smile:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x97"), ":hugging:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x94"), ":thinking:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x90"), ":neutral_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x91"), ":expressionless:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb6"), ":no_mouth:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x84"), ":rolling_eyes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8f"), ":smirk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa3"), ":persevere:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa5"), ":disappointed_relieved:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xae"), ":open_mouth:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x90"), ":zipper_mouth:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xaf"), ":hushed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xaa"), ":sleepy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xab"), ":tired_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb4"), ":sleeping:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x8c"), ":relieved:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x93"), ":nerd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9b"), ":stuck_out_tongue:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9c"), ":stuck_out_tongue_winking_eye:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9d"), ":stuck_out_tongue_closed_eyes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa4"), ":drooling_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x92"), ":unamused:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x93"), ":sweat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x94"), ":pensive:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x95"), ":confused:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x83"), ":upside_down:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x91"), ":money_mouth:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb2"), ":astonished:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xb9"), ":frowning2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x81"), ":slight_frown:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x96"), ":confounded:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9e"), ":disappointed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x9f"), ":worried:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa4"), ":triumph:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa2"), ":cry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xad"), ":sob:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa6"), ":frowning:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa7"), ":anguished:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa8"), ":fearful:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa9"), ":weary:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xac"), ":grimacing:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb0"), ":cold_sweat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb1"), ":scream:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb3"), ":flushed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb5"), ":dizzy_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa1"), ":rage:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xa0"), ":angry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x87"), ":innocent:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa0"), ":cowboy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa1"), ":clown:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa5"), ":lying_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb7"), ":mask:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x92"), ":thermometer_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x95"), ":head_bandage:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa2"), ":nauseated_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa7"), ":sneezing_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\x88"), ":smiling_imp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xbf"), ":imp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb9"), ":japanese_ogre:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xba"), ":japanese_goblin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x80"), ":skull:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xbb"), ":ghost:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xbd"), ":alien:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x96"), ":robot:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa9"), ":poop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xba"), ":smiley_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb8"), ":smile_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xb9"), ":joy_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xbb"), ":heart_eyes_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xbc"), ":smirk_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xbd"), ":kissing_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x80"), ":scream_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xbf"), ":crying_cat_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x98\xbe"), ":pouting_cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa6"), ":boy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa7"), ":girl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa8"), ":man:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa9"), ":woman:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb4"), ":older_man:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb5"), ":older_woman:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb6"), ":baby:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xbc"), ":angel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xae"), ":cop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb5"), ":spy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x82"), ":guardsman:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb7"), ":construction_worker:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb3"), ":man_with_turban:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb1"), ":person_with_blond_hair:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x85"), ":santa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb6"), ":mrs_claus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb8"), ":princess:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb4"), ":prince:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb0"), ":bride_with_veil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb5"), ":man_in_tuxedo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb0"), ":pregnant_woman:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xb2"), ":man_with_gua_pi_mao:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8d"), ":person_frowning:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8e"), ":person_with_pouting_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x85"), ":no_good:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x86"), ":ok_woman:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x81"), ":information_desk_person:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8b"), ":raising_hand:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x87"), ":bow:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xa6"), ":face_palm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb7"), ":shrug:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x86"), ":massage:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x87"), ":haircut:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb6"), ":walking:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x83"), ":runner:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x83"), ":dancer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xba"), ":man_dancing:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xaf"), ":dancers:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xa3"), ":speaking_head:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa4"), ":bust_in_silhouette:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa5"), ":busts_in_silhouette:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xab"), ":couple:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xac"), ":two_men_holding_hands:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xad"), ":two_women_holding_hands:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8f"), ":couplekiss:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x91"), ":couple_with_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xaa"), ":family:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xaa"), ":muscle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb3"), ":selfie:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x88"), ":point_left:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x89"), ":point_right:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x9d"), ":point_up:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x86"), ":point_up_2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x95"), ":middle_finger:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x87"), ":point_down:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x8c"), ":v:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x9e"), ":fingers_crossed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x96"), ":vulcan:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x98"), ":metal:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x99"), ":call_me:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x90"), ":hand_splayed:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x8b"), ":raised_hand:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8c"), ":ok_hand:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8d"), ":thumbsup:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8e"), ":thumbsdown:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x8a"), ":fist:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8a"), ":punch:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x9b"), ":left_facing_fist:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x9c"), ":right_facing_fist:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x9a"), ":raised_back_of_hand:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8b"), ":wave:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x8f"), ":clap:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x8d"), ":writing_hand:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x90"), ":open_hands:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8c"), ":raised_hands:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8f"), ":pray:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\x9d"), ":handshake:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x85"), ":nail_care:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x82"), ":ear:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x83"), ":nose:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa3"), ":footprints:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x80"), ":eyes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x81"), ":eye:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x85"), ":tongue:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x84"), ":lips:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8b"), ":kiss:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa4"), ":zzz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x93"), ":eyeglasses:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb6"), ":dark_sunglasses:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x94"), ":necktie:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x95"), ":shirt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x96"), ":jeans:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x97"), ":dress:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x98"), ":kimono:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x99"), ":bikini:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9a"), ":womans_clothes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9b"), ":purse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9c"), ":handbag:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9d"), ":pouch:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x92"), ":school_satchel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9e"), ":mans_shoe:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x9f"), ":athletic_shoe:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa0"), ":high_heel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa1"), ":sandal:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xa2"), ":boot:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x91"), ":crown:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x92"), ":womans_hat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa9"), ":tophat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x93"), ":mortar_board:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x91"), ":helmet_with_cross:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x84"), ":lipstick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8d"), ":ring:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x82"), ":closed_umbrella:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xbc"), ":briefcase:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x80"), ":grinning:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x81"), ":grin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x82"), ":joy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa3"), ":rofl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x83"), ":smiley:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x84"), ":smile:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x85"), ":sweat_smile:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x86"), ":laughing:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x89"), ":wink:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8a"), ":blush:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8b"), ":yum:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8e"), ":sunglasses:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8d"), ":heart_eyes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x98"), ":kissing_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x97"), ":kissing:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x99"), ":kissing_smiling_eyes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9a"), ":kissing_closed_eyes:"}, + Emoji{QString::fromUtf8("\xe2\x98\xba"), ":relaxed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x82"), ":slight_smile:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x97"), ":hugging:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x94"), ":thinking:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x90"), ":neutral_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x91"), ":expressionless:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb6"), ":no_mouth:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x84"), ":rolling_eyes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8f"), ":smirk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa3"), ":persevere:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa5"), ":disappointed_relieved:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xae"), ":open_mouth:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x90"), ":zipper_mouth:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xaf"), ":hushed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xaa"), ":sleepy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xab"), ":tired_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb4"), ":sleeping:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x8c"), ":relieved:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x93"), ":nerd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9b"), ":stuck_out_tongue:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9c"), ":stuck_out_tongue_winking_eye:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9d"), ":stuck_out_tongue_closed_eyes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa4"), ":drooling_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x92"), ":unamused:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x93"), ":sweat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x94"), ":pensive:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x95"), ":confused:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x83"), ":upside_down:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x91"), ":money_mouth:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb2"), ":astonished:"}, + Emoji{QString::fromUtf8("\xe2\x98\xb9"), ":frowning2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x81"), ":slight_frown:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x96"), ":confounded:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9e"), ":disappointed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x9f"), ":worried:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa4"), ":triumph:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa2"), ":cry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xad"), ":sob:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa6"), ":frowning:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa7"), ":anguished:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa8"), ":fearful:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa9"), ":weary:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xac"), ":grimacing:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb0"), ":cold_sweat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb1"), ":scream:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb3"), ":flushed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb5"), ":dizzy_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa1"), ":rage:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xa0"), ":angry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x87"), ":innocent:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa0"), ":cowboy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa1"), ":clown:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa5"), ":lying_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb7"), ":mask:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x92"), ":thermometer_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x95"), ":head_bandage:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa2"), ":nauseated_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa7"), ":sneezing_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\x88"), ":smiling_imp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xbf"), ":imp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb9"), ":japanese_ogre:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xba"), ":japanese_goblin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x80"), ":skull:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xbb"), ":ghost:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xbd"), ":alien:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x96"), ":robot:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa9"), ":poop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xba"), ":smiley_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb8"), ":smile_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xb9"), ":joy_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xbb"), ":heart_eyes_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xbc"), ":smirk_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xbd"), ":kissing_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x80"), ":scream_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xbf"), ":crying_cat_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x98\xbe"), ":pouting_cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6"), ":boy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7"), ":girl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8"), ":man:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9"), ":woman:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4"), ":older_man:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5"), ":older_woman:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6"), ":baby:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc"), ":angel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xae"), ":cop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5"), ":spy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x82"), ":guardsman:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7"), ":construction_worker:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3"), ":man_with_turban:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1"), ":person_with_blond_hair:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85"), ":santa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6"), ":mrs_claus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8"), ":princess:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4"), ":prince:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0"), ":bride_with_veil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5"), ":man_in_tuxedo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0"), ":pregnant_woman:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2"), ":man_with_gua_pi_mao:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d"), ":person_frowning:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e"), ":person_with_pouting_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x85"), ":no_good:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x86"), ":ok_woman:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x81"), ":information_desk_person:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b"), ":raising_hand:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x87"), ":bow:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6"), ":face_palm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7"), ":shrug:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x86"), ":massage:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x87"), ":haircut:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6"), ":walking:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83"), ":runner:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x83"), ":dancer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xba"), ":man_dancing:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xaf"), ":dancers:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xa3"), ":speaking_head:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa4"), ":bust_in_silhouette:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa5"), ":busts_in_silhouette:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xab"), ":couple:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xac"), ":two_men_holding_hands:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xad"), ":two_women_holding_hands:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8f"), ":couplekiss:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x91"), ":couple_with_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xaa"), ":family:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa"), ":muscle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3"), ":selfie:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x88"), ":point_left:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x89"), ":point_right:"}, + Emoji{QString::fromUtf8("\xe2\x98\x9d"), ":point_up:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x86"), ":point_up_2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x95"), ":middle_finger:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x87"), ":point_down:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x8c"), ":v:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e"), ":fingers_crossed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x96"), ":vulcan:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98"), ":metal:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99"), ":call_me:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x90"), ":hand_splayed:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x8b"), ":raised_hand:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c"), ":ok_hand:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d"), ":thumbsup:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e"), ":thumbsdown:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x8a"), ":fist:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a"), ":punch:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b"), ":left_facing_fist:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c"), ":right_facing_fist:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a"), ":raised_back_of_hand:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b"), ":wave:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f"), ":clap:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x8d"), ":writing_hand:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x90"), ":open_hands:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c"), ":raised_hands:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f"), ":pray:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9d"), ":handshake:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x85"), ":nail_care:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x82"), ":ear:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x83"), ":nose:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa3"), ":footprints:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x80"), ":eyes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x81"), ":eye:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x85"), ":tongue:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x84"), ":lips:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8b"), ":kiss:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa4"), ":zzz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x93"), ":eyeglasses:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb6"), ":dark_sunglasses:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x94"), ":necktie:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x95"), ":shirt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x96"), ":jeans:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x97"), ":dress:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x98"), ":kimono:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x99"), ":bikini:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9a"), ":womans_clothes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9b"), ":purse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9c"), ":handbag:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9d"), ":pouch:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x92"), ":school_satchel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9e"), ":mans_shoe:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x9f"), ":athletic_shoe:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa0"), ":high_heel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa1"), ":sandal:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\xa2"), ":boot:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x91"), ":crown:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x92"), ":womans_hat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa9"), ":tophat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x93"), ":mortar_board:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x91"), ":helmet_with_cross:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x84"), ":lipstick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8d"), ":ring:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x82"), ":closed_umbrella:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xbc"), ":briefcase:"}, }; const QList EmojiProvider::nature = { - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x88"), ":see_no_evil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x89"), ":hear_no_evil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x99\x8a"), ":speak_no_evil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa6"), ":sweat_drops:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa8"), ":dash:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb5"), ":monkey_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x92"), ":monkey:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8d"), ":gorilla:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb6"), ":dog:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x95"), ":dog2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa9"), ":poodle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xba"), ":wolf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8a"), ":fox:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb1"), ":cat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x88"), ":cat2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x81"), ":lion_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xaf"), ":tiger:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x85"), ":tiger2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x86"), ":leopard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb4"), ":horse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8e"), ":racehorse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8c"), ":deer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x84"), ":unicorn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xae"), ":cow:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x82"), ":ox:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x83"), ":water_buffalo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x84"), ":cow2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb7"), ":pig:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x96"), ":pig2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x97"), ":boar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xbd"), ":pig_nose:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8f"), ":ram:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x91"), ":sheep:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x90"), ":goat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xaa"), ":dromedary_camel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xab"), ":camel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x98"), ":elephant:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8f"), ":rhino:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xad"), ":mouse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x81"), ":mouse2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x80"), ":rat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb9"), ":hamster:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb0"), ":rabbit:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x87"), ":rabbit2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xbf"), ":chipmunk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x87"), ":bat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xbb"), ":bear:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa8"), ":koala:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xbc"), ":panda_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xbe"), ":feet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x83"), ":turkey:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x94"), ":chicken:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x93"), ":rooster:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa3"), ":hatching_chick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa4"), ":baby_chick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa5"), ":hatched_chick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa6"), ":bird:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa7"), ":penguin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x8a"), ":dove:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x85"), ":eagle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x86"), ":duck:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x89"), ":owl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb8"), ":frog:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8a"), ":crocodile:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa2"), ":turtle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8e"), ":lizard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8d"), ":snake:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb2"), ":dragon_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x89"), ":dragon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xb3"), ":whale:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8b"), ":whale2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xac"), ":dolphin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9f"), ":fish:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa0"), ":tropical_fish:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\xa1"), ":blowfish:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x88"), ":shark:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x99"), ":octopus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9a"), ":shell:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x80"), ":crab:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x90"), ":shrimp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x91"), ":squid:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x8b"), ":butterfly:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x8c"), ":snail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9b"), ":bug:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9c"), ":ant:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9d"), ":bee:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x90\x9e"), ":beetle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb7"), ":spider:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb8"), ":spider_web:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa6\x82"), ":scorpion:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x90"), ":bouquet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb8"), ":cherry_blossom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb5"), ":rosette:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb9"), ":rose:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x80"), ":wilted_rose:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xba"), ":hibiscus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xbb"), ":sunflower:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xbc"), ":blossom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb7"), ":tulip:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb1"), ":seedling:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb2"), ":evergreen_tree:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb3"), ":deciduous_tree:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb4"), ":palm_tree:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb5"), ":cactus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xbe"), ":ear_of_rice:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xbf"), ":herb:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x98"), ":shamrock:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x80"), ":four_leaf_clover:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x81"), ":maple_leaf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x82"), ":fallen_leaf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x83"), ":leaves:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x84"), ":mushroom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb0"), ":chestnut:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8d"), ":earth_africa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8e"), ":earth_americas:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8f"), ":earth_asia:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x91"), ":new_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x92"), ":waxing_crescent_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x93"), ":first_quarter_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x94"), ":waxing_gibbous_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x95"), ":full_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x96"), ":waning_gibbous_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x97"), ":last_quarter_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x98"), ":waning_crescent_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x99"), ":crescent_moon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9a"), ":new_moon_with_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9b"), ":first_quarter_moon_with_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9c"), ":last_quarter_moon_with_face:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x80"), ":sunny:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9d"), ":full_moon_with_face:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9e"), ":sun_with_face:" }, - Emoji{ QString::fromUtf8("\xe2\xad\x90"), ":star:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x9f"), ":star2:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x81"), ":cloud:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x85"), ":partly_sunny:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x88"), ":thunder_cloud_rain:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa4"), ":white_sun_small_cloud:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa5"), ":white_sun_cloud:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa6"), ":white_sun_rain_cloud:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa7"), ":cloud_rain:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa8"), ":cloud_snow:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa9"), ":cloud_lightning:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xaa"), ":cloud_tornado:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xab"), ":fog:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xac"), ":wind_blowing_face:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x82"), ":umbrella2:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x94"), ":umbrella:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xa1"), ":zap:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x84"), ":snowflake:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x83"), ":snowman2:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x84"), ":snowman:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x84"), ":comet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa5"), ":fire:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa7"), ":droplet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8a"), ":ocean:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x83"), ":jack_o_lantern:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x84"), ":christmas_tree:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\xa8"), ":sparkles:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8b"), ":tanabata_tree:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8d"), ":bamboo:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x88"), ":see_no_evil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x89"), ":hear_no_evil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x99\x8a"), ":speak_no_evil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa6"), ":sweat_drops:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa8"), ":dash:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb5"), ":monkey_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x92"), ":monkey:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8d"), ":gorilla:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb6"), ":dog:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x95"), ":dog2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa9"), ":poodle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xba"), ":wolf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8a"), ":fox:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb1"), ":cat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x88"), ":cat2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x81"), ":lion_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xaf"), ":tiger:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x85"), ":tiger2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x86"), ":leopard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb4"), ":horse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8e"), ":racehorse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8c"), ":deer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x84"), ":unicorn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xae"), ":cow:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x82"), ":ox:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x83"), ":water_buffalo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x84"), ":cow2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb7"), ":pig:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x96"), ":pig2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x97"), ":boar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xbd"), ":pig_nose:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8f"), ":ram:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x91"), ":sheep:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x90"), ":goat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xaa"), ":dromedary_camel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xab"), ":camel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x98"), ":elephant:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8f"), ":rhino:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xad"), ":mouse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x81"), ":mouse2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x80"), ":rat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb9"), ":hamster:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb0"), ":rabbit:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x87"), ":rabbit2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xbf"), ":chipmunk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x87"), ":bat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xbb"), ":bear:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa8"), ":koala:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xbc"), ":panda_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xbe"), ":feet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x83"), ":turkey:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x94"), ":chicken:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x93"), ":rooster:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa3"), ":hatching_chick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa4"), ":baby_chick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa5"), ":hatched_chick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa6"), ":bird:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa7"), ":penguin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x8a"), ":dove:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x85"), ":eagle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x86"), ":duck:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x89"), ":owl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb8"), ":frog:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8a"), ":crocodile:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa2"), ":turtle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8e"), ":lizard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8d"), ":snake:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb2"), ":dragon_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x89"), ":dragon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xb3"), ":whale:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8b"), ":whale2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xac"), ":dolphin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9f"), ":fish:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa0"), ":tropical_fish:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\xa1"), ":blowfish:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x88"), ":shark:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x99"), ":octopus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9a"), ":shell:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x80"), ":crab:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x90"), ":shrimp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x91"), ":squid:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8b"), ":butterfly:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x8c"), ":snail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9b"), ":bug:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9c"), ":ant:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9d"), ":bee:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x90\x9e"), ":beetle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb7"), ":spider:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb8"), ":spider_web:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa6\x82"), ":scorpion:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x90"), ":bouquet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb8"), ":cherry_blossom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb5"), ":rosette:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb9"), ":rose:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x80"), ":wilted_rose:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xba"), ":hibiscus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbb"), ":sunflower:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbc"), ":blossom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb7"), ":tulip:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb1"), ":seedling:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb2"), ":evergreen_tree:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb3"), ":deciduous_tree:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb4"), ":palm_tree:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb5"), ":cactus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbe"), ":ear_of_rice:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbf"), ":herb:"}, + Emoji{QString::fromUtf8("\xe2\x98\x98"), ":shamrock:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x80"), ":four_leaf_clover:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x81"), ":maple_leaf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x82"), ":fallen_leaf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x83"), ":leaves:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x84"), ":mushroom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb0"), ":chestnut:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8d"), ":earth_africa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8e"), ":earth_americas:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8f"), ":earth_asia:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x91"), ":new_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x92"), ":waxing_crescent_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x93"), ":first_quarter_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x94"), ":waxing_gibbous_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x95"), ":full_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x96"), ":waning_gibbous_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x97"), ":last_quarter_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x98"), ":waning_crescent_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x99"), ":crescent_moon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9a"), ":new_moon_with_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9b"), ":first_quarter_moon_with_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9c"), ":last_quarter_moon_with_face:"}, + Emoji{QString::fromUtf8("\xe2\x98\x80"), ":sunny:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9d"), ":full_moon_with_face:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9e"), ":sun_with_face:"}, + Emoji{QString::fromUtf8("\xe2\xad\x90"), ":star:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9f"), ":star2:"}, + Emoji{QString::fromUtf8("\xe2\x98\x81"), ":cloud:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x85"), ":partly_sunny:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x88"), ":thunder_cloud_rain:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa4"), ":white_sun_small_cloud:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa5"), ":white_sun_cloud:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa6"), ":white_sun_rain_cloud:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa7"), ":cloud_rain:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa8"), ":cloud_snow:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa9"), ":cloud_lightning:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xaa"), ":cloud_tornado:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xab"), ":fog:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xac"), ":wind_blowing_face:"}, + Emoji{QString::fromUtf8("\xe2\x98\x82"), ":umbrella2:"}, + Emoji{QString::fromUtf8("\xe2\x98\x94"), ":umbrella:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xa1"), ":zap:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x84"), ":snowflake:"}, + Emoji{QString::fromUtf8("\xe2\x98\x83"), ":snowman2:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x84"), ":snowman:"}, + Emoji{QString::fromUtf8("\xe2\x98\x84"), ":comet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa5"), ":fire:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa7"), ":droplet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8a"), ":ocean:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x83"), ":jack_o_lantern:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x84"), ":christmas_tree:"}, + Emoji{QString::fromUtf8("\xe2\x9c\xa8"), ":sparkles:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8b"), ":tanabata_tree:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8d"), ":bamboo:"}, }; const QList EmojiProvider::food = { - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x87"), ":grapes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x88"), ":melon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x89"), ":watermelon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8a"), ":tangerine:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8b"), ":lemon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8c"), ":banana:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8d"), ":pineapple:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8e"), ":apple:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x8f"), ":green_apple:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x90"), ":pear:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x91"), ":peach:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x92"), ":cherries:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x93"), ":strawberry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x9d"), ":kiwi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x85"), ":tomato:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x91"), ":avocado:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x86"), ":eggplant:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x94"), ":potato:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x95"), ":carrot:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xbd"), ":corn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xb6"), ":hot_pepper:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x92"), ":cucumber:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x9c"), ":peanuts:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9e"), ":bread:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x90"), ":croissant:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x96"), ":french_bread:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x9e"), ":pancakes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa7\x80"), ":cheese:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x96"), ":meat_on_bone:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x97"), ":poultry_leg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x93"), ":bacon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x94"), ":hamburger:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9f"), ":fries:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x95"), ":pizza:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xad"), ":hotdog:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xae"), ":taco:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xaf"), ":burrito:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x99"), ":stuffed_flatbread:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x9a"), ":egg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb3"), ":cooking:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x98"), ":shallow_pan_of_food:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb2"), ":stew:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x97"), ":salad:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xbf"), ":popcorn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb1"), ":bento:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x98"), ":rice_cracker:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x99"), ":rice_ball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9a"), ":rice:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9b"), ":curry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9c"), ":ramen:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\x9d"), ":spaghetti:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa0"), ":sweet_potato:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa2"), ":oden:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa3"), ":sushi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa4"), ":fried_shrimp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa5"), ":fish_cake:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa1"), ":dango:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa6"), ":icecream:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa7"), ":shaved_ice:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa8"), ":ice_cream:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xa9"), ":doughnut:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xaa"), ":cookie:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x82"), ":birthday:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb0"), ":cake:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xab"), ":chocolate_bar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xac"), ":candy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xad"), ":lollipop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xae"), ":custard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xaf"), ":honey_pot:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xbc"), ":baby_bottle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x9b"), ":milk:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x95"), ":coffee:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb5"), ":tea:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb6"), ":sake:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xbe"), ":champagne:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb7"), ":wine_glass:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb8"), ":cocktail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb9"), ":tropical_drink:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xba"), ":beer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xbb"), ":beers:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x82"), ":champagne_glass:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x83"), ":tumbler_glass:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xbd"), ":fork_knife_plate:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8d\xb4"), ":fork_and_knife:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x84"), ":spoon:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x87"), ":grapes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x88"), ":melon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x89"), ":watermelon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8a"), ":tangerine:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8b"), ":lemon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8c"), ":banana:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8d"), ":pineapple:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8e"), ":apple:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8f"), ":green_apple:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x90"), ":pear:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x91"), ":peach:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x92"), ":cherries:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x93"), ":strawberry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9d"), ":kiwi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x85"), ":tomato:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x91"), ":avocado:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x86"), ":eggplant:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x94"), ":potato:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x95"), ":carrot:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbd"), ":corn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb6"), ":hot_pepper:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x92"), ":cucumber:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9c"), ":peanuts:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9e"), ":bread:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x90"), ":croissant:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x96"), ":french_bread:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9e"), ":pancakes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa7\x80"), ":cheese:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x96"), ":meat_on_bone:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x97"), ":poultry_leg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x93"), ":bacon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x94"), ":hamburger:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9f"), ":fries:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x95"), ":pizza:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xad"), ":hotdog:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xae"), ":taco:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xaf"), ":burrito:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x99"), ":stuffed_flatbread:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9a"), ":egg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb3"), ":cooking:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x98"), ":shallow_pan_of_food:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb2"), ":stew:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x97"), ":salad:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbf"), ":popcorn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb1"), ":bento:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x98"), ":rice_cracker:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x99"), ":rice_ball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9a"), ":rice:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9b"), ":curry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9c"), ":ramen:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9d"), ":spaghetti:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa0"), ":sweet_potato:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa2"), ":oden:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa3"), ":sushi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa4"), ":fried_shrimp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa5"), ":fish_cake:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa1"), ":dango:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa6"), ":icecream:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa7"), ":shaved_ice:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa8"), ":ice_cream:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa9"), ":doughnut:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xaa"), ":cookie:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x82"), ":birthday:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb0"), ":cake:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xab"), ":chocolate_bar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xac"), ":candy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xad"), ":lollipop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xae"), ":custard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xaf"), ":honey_pot:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbc"), ":baby_bottle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9b"), ":milk:"}, + Emoji{QString::fromUtf8("\xe2\x98\x95"), ":coffee:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb5"), ":tea:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb6"), ":sake:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbe"), ":champagne:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb7"), ":wine_glass:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb8"), ":cocktail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb9"), ":tropical_drink:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xba"), ":beer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbb"), ":beers:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x82"), ":champagne_glass:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x83"), ":tumbler_glass:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbd"), ":fork_knife_plate:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb4"), ":fork_and_knife:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x84"), ":spoon:"}, }; -const QList EmojiProvider::activity = - { - Emoji{ QString::fromUtf8("\xf0\x9f\x91\xbe"), ":space_invader:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb4"), ":levitate:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xba"), ":fencer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87"), ":horse_racing:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbb"), ":horse_racing_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbc"), ":horse_racing_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbd"), ":horse_racing_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbe"), ":horse_racing_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbf"), ":horse_racing_tone5:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb7"), ":skier:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x82"), ":snowboarder:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8c"), ":golfer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84"), ":surfer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbb"), ":surfer_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbc"), ":surfer_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbd"), ":surfer_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbe"), ":surfer_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbf"), ":surfer_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3"), ":rowboat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbb"), ":rowboat_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbc"), ":rowboat_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbd"), ":rowboat_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbe"), ":rowboat_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbf"), ":rowboat_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a"), ":swimmer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbb"), ":swimmer_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbc"), ":swimmer_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbd"), ":swimmer_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbe"), ":swimmer_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbf"), ":swimmer_tone5:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9"), ":basketball_player:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbb"), ":basketball_player_tone1:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbc"), ":basketball_player_tone2:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbd"), ":basketball_player_tone3:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbe"), ":basketball_player_tone4:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbf"), ":basketball_player_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b"), ":lifter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbb"), ":lifter_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbc"), ":lifter_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbd"), ":lifter_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbe"), ":lifter_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbf"), ":lifter_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4"), ":bicyclist:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbb"), ":bicyclist_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbc"), ":bicyclist_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbd"), ":bicyclist_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbe"), ":bicyclist_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbf"), ":bicyclist_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5"), ":mountain_bicyclist:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbb"), ":mountain_bicyclist_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbc"), ":mountain_bicyclist_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbd"), ":mountain_bicyclist_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbe"), ":mountain_bicyclist_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbf"), ":mountain_bicyclist_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8"), ":cartwheel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbb"), ":cartwheel_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbc"), ":cartwheel_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbd"), ":cartwheel_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbe"), ":cartwheel_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbf"), ":cartwheel_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc"), ":wrestlers:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbb"), ":wrestlers_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbc"), ":wrestlers_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbd"), ":wrestlers_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbe"), ":wrestlers_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbf"), ":wrestlers_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd"), ":water_polo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbb"), ":water_polo_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbc"), ":water_polo_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbd"), ":water_polo_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbe"), ":water_polo_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbf"), ":water_polo_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe"), ":handball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbb"), ":handball_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbc"), ":handball_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbd"), ":handball_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbe"), ":handball_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbf"), ":handball_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9"), ":juggling:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbb"), ":juggling_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbc"), ":juggling_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbd"), ":juggling_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbe"), ":juggling_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbf"), ":juggling_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xaa"), ":circus_tent:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xad"), ":performing_arts:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa8"), ":art:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb0"), ":slot_machine:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80"), ":bath:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbb"), ":bath_tone1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbc"), ":bath_tone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbd"), ":bath_tone3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbe"), ":bath_tone4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbf"), ":bath_tone5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x97"), ":reminder_ribbon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x9f"), ":tickets:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xab"), ":ticket:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x96"), ":military_medal:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x86"), ":trophy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x85"), ":medal:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x87"), ":first_place:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x88"), ":second_place:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x89"), ":third_place:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xbd"), ":soccer:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xbe"), ":baseball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x80"), ":basketball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x90"), ":volleyball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x88"), ":football:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x89"), ":rugby_football:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xbe"), ":tennis:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb1"), ":8ball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb3"), ":bowling:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8f"), ":cricket:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x91"), ":field_hockey:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x92"), ":hockey:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x93"), ":ping_pong:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb8"), ":badminton:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x8a"), ":boxing_glove:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x8b"), ":martial_arts_uniform:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x85"), ":goal:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xaf"), ":dart:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb3"), ":golf:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb8"), ":ice_skate:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa3"), ":fishing_pole_and_fish:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xbd"), ":running_shirt_with_sash:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xbf"), ":ski:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xae"), ":video_game:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb2"), ":game_die:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xbc"), ":musical_score:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa4"), ":microphone:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa7"), ":headphones:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb7"), ":saxophone:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb8"), ":guitar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb9"), ":musical_keyboard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xba"), ":trumpet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xbb"), ":violin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\xa5\x81"), ":drum:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xac"), ":clapper:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb9"), ":bow_and_arrow:" }, - }; +const QList EmojiProvider::activity = { + Emoji{QString::fromUtf8("\xf0\x9f\x91\xbe"), ":space_invader:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4"), ":levitate:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xba"), ":fencer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87"), ":horse_racing:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbb"), ":horse_racing_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbc"), ":horse_racing_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbd"), ":horse_racing_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbe"), ":horse_racing_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbf"), ":horse_racing_tone5:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb7"), ":skier:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82"), ":snowboarder:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c"), ":golfer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84"), ":surfer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbb"), ":surfer_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbc"), ":surfer_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbd"), ":surfer_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbe"), ":surfer_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbf"), ":surfer_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3"), ":rowboat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbb"), ":rowboat_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbc"), ":rowboat_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbd"), ":rowboat_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbe"), ":rowboat_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbf"), ":rowboat_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a"), ":swimmer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbb"), ":swimmer_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbc"), ":swimmer_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbd"), ":swimmer_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbe"), ":swimmer_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbf"), ":swimmer_tone5:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9"), ":basketball_player:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbb"), ":basketball_player_tone1:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbc"), ":basketball_player_tone2:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbd"), ":basketball_player_tone3:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbe"), ":basketball_player_tone4:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbf"), ":basketball_player_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b"), ":lifter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbb"), ":lifter_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbc"), ":lifter_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbd"), ":lifter_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbe"), ":lifter_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbf"), ":lifter_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4"), ":bicyclist:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbb"), ":bicyclist_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbc"), ":bicyclist_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbd"), ":bicyclist_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbe"), ":bicyclist_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbf"), ":bicyclist_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5"), ":mountain_bicyclist:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbb"), ":mountain_bicyclist_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbc"), ":mountain_bicyclist_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbd"), ":mountain_bicyclist_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbe"), ":mountain_bicyclist_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbf"), ":mountain_bicyclist_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8"), ":cartwheel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbb"), ":cartwheel_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbc"), ":cartwheel_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbd"), ":cartwheel_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbe"), ":cartwheel_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbf"), ":cartwheel_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc"), ":wrestlers:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbb"), ":wrestlers_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbc"), ":wrestlers_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbd"), ":wrestlers_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbe"), ":wrestlers_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xf0\x9f\x8f\xbf"), ":wrestlers_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd"), ":water_polo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbb"), ":water_polo_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbc"), ":water_polo_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbd"), ":water_polo_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbe"), ":water_polo_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbf"), ":water_polo_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe"), ":handball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbb"), ":handball_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbc"), ":handball_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbd"), ":handball_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbe"), ":handball_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbf"), ":handball_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9"), ":juggling:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbb"), ":juggling_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbc"), ":juggling_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbd"), ":juggling_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbe"), ":juggling_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbf"), ":juggling_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xaa"), ":circus_tent:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xad"), ":performing_arts:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa8"), ":art:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb0"), ":slot_machine:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80"), ":bath:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbb"), ":bath_tone1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbc"), ":bath_tone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbd"), ":bath_tone3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbe"), ":bath_tone4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbf"), ":bath_tone5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x97"), ":reminder_ribbon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9f"), ":tickets:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xab"), ":ticket:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x96"), ":military_medal:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x86"), ":trophy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x85"), ":medal:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x87"), ":first_place:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x88"), ":second_place:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x89"), ":third_place:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xbd"), ":soccer:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xbe"), ":baseball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x80"), ":basketball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x90"), ":volleyball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x88"), ":football:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x89"), ":rugby_football:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbe"), ":tennis:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb1"), ":8ball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb3"), ":bowling:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8f"), ":cricket:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x91"), ":field_hockey:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x92"), ":hockey:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x93"), ":ping_pong:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb8"), ":badminton:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8a"), ":boxing_glove:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8b"), ":martial_arts_uniform:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x85"), ":goal:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xaf"), ":dart:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb3"), ":golf:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb8"), ":ice_skate:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa3"), ":fishing_pole_and_fish:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbd"), ":running_shirt_with_sash:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbf"), ":ski:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xae"), ":video_game:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb2"), ":game_die:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbc"), ":musical_score:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa4"), ":microphone:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa7"), ":headphones:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb7"), ":saxophone:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb8"), ":guitar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb9"), ":musical_keyboard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xba"), ":trumpet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbb"), ":violin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\xa5\x81"), ":drum:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xac"), ":clapper:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb9"), ":bow_and_arrow:"}, +}; const QList EmojiProvider::travel = { - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8e"), ":race_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x8d"), ":motorcycle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xbe"), ":japan:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x94"), ":mountain_snow:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb0"), ":mountain:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8b"), ":volcano:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xbb"), ":mount_fuji:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x95"), ":camping:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x96"), ":beach:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9c"), ":desert:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9d"), ":island:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9e"), ":park:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9f"), ":stadium:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9b"), ":classical_building:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x97"), ":construction_site:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x98"), ":homes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x99"), ":cityscape:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x9a"), ":house_abandoned:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa0"), ":house:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa1"), ":house_with_garden:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa2"), ":office:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa3"), ":post_office:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa4"), ":european_post_office:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa5"), ":hospital:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa6"), ":bank:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa8"), ":hotel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa9"), ":love_hotel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xaa"), ":convenience_store:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xab"), ":school:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xac"), ":department_store:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xad"), ":factory:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xaf"), ":japanese_castle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb0"), ":european_castle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x92"), ":wedding:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xbc"), ":tokyo_tower:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xbd"), ":statue_of_liberty:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xaa"), ":church:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x8c"), ":mosque:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x8d"), ":synagogue:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xa9"), ":shinto_shrine:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x8b"), ":kaaba:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb2"), ":fountain:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xba"), ":tent:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x81"), ":foggy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x83"), ":night_with_stars:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x84"), ":sunrise_over_mountains:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x85"), ":sunrise:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x86"), ":city_dusk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x87"), ":city_sunset:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x89"), ":bridge_at_night:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x8c"), ":milky_way:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa0"), ":carousel_horse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa1"), ":ferris_wheel:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa2"), ":roller_coaster:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x82"), ":steam_locomotive:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x83"), ":railway_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x84"), ":bullettrain_side:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x85"), ":bullettrain_front:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x86"), ":train2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x87"), ":metro:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x88"), ":light_rail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x89"), ":station:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8a"), ":tram:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9d"), ":monorail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9e"), ":mountain_railway:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8b"), ":train:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8c"), ":bus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8d"), ":oncoming_bus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8e"), ":trolleybus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x90"), ":minibus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x91"), ":ambulance:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x92"), ":fire_engine:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x93"), ":police_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x94"), ":oncoming_police_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x95"), ":taxi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x96"), ":oncoming_taxi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x97"), ":red_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x98"), ":oncoming_automobile:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x99"), ":blue_car:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9a"), ":truck:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9b"), ":articulated_lorry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9c"), ":tractor:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb2"), ":bike:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xb4"), ":scooter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xb5"), ":motor_scooter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x8f"), ":busstop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa3"), ":motorway:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa4"), ":railway_track:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xbd"), ":fuelpump:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa8"), ":rotating_light:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa5"), ":traffic_light:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa6"), ":vertical_traffic_light:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa7"), ":construction:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x93"), ":anchor:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb5"), ":sailboat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xb6"), ":canoe:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa4"), ":speedboat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xb3"), ":cruise_ship:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb4"), ":ferry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa5"), ":motorboat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa2"), ":ship:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x88"), ":airplane:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa9"), ":airplane_small:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xab"), ":airplane_departure:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xac"), ":airplane_arriving:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xba"), ":seat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x81"), ":helicopter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x9f"), ":suspension_railway:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa0"), ":mountain_cableway:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa1"), ":aerial_tramway:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\x80"), ":rocket:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xb0"), ":satellite_orbital:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa0"), ":stars:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x88"), ":rainbow:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x86"), ":fireworks:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x87"), ":sparkler:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x91"), ":rice_scene:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\x81"), ":checkered_flag:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8e"), ":race_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8d"), ":motorcycle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xbe"), ":japan:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x94"), ":mountain_snow:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb0"), ":mountain:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8b"), ":volcano:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xbb"), ":mount_fuji:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x95"), ":camping:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x96"), ":beach:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9c"), ":desert:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9d"), ":island:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9e"), ":park:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9f"), ":stadium:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9b"), ":classical_building:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x97"), ":construction_site:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x98"), ":homes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x99"), ":cityscape:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9a"), ":house_abandoned:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa0"), ":house:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa1"), ":house_with_garden:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa2"), ":office:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa3"), ":post_office:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa4"), ":european_post_office:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa5"), ":hospital:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa6"), ":bank:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa8"), ":hotel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa9"), ":love_hotel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xaa"), ":convenience_store:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xab"), ":school:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xac"), ":department_store:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xad"), ":factory:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xaf"), ":japanese_castle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb0"), ":european_castle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x92"), ":wedding:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xbc"), ":tokyo_tower:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xbd"), ":statue_of_liberty:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xaa"), ":church:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x8c"), ":mosque:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x8d"), ":synagogue:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xa9"), ":shinto_shrine:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x8b"), ":kaaba:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb2"), ":fountain:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xba"), ":tent:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x81"), ":foggy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x83"), ":night_with_stars:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x84"), ":sunrise_over_mountains:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x85"), ":sunrise:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x86"), ":city_dusk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x87"), ":city_sunset:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x89"), ":bridge_at_night:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8c"), ":milky_way:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa0"), ":carousel_horse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa1"), ":ferris_wheel:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa2"), ":roller_coaster:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x82"), ":steam_locomotive:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x83"), ":railway_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x84"), ":bullettrain_side:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x85"), ":bullettrain_front:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x86"), ":train2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x87"), ":metro:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x88"), ":light_rail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x89"), ":station:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8a"), ":tram:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9d"), ":monorail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9e"), ":mountain_railway:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8b"), ":train:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8c"), ":bus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8d"), ":oncoming_bus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8e"), ":trolleybus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x90"), ":minibus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x91"), ":ambulance:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x92"), ":fire_engine:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x93"), ":police_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x94"), ":oncoming_police_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x95"), ":taxi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x96"), ":oncoming_taxi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x97"), ":red_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x98"), ":oncoming_automobile:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x99"), ":blue_car:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9a"), ":truck:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9b"), ":articulated_lorry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9c"), ":tractor:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb2"), ":bike:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb4"), ":scooter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb5"), ":motor_scooter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8f"), ":busstop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa3"), ":motorway:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa4"), ":railway_track:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xbd"), ":fuelpump:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa8"), ":rotating_light:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa5"), ":traffic_light:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa6"), ":vertical_traffic_light:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa7"), ":construction:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x93"), ":anchor:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb5"), ":sailboat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb6"), ":canoe:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa4"), ":speedboat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb3"), ":cruise_ship:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb4"), ":ferry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa5"), ":motorboat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa2"), ":ship:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x88"), ":airplane:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa9"), ":airplane_small:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xab"), ":airplane_departure:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xac"), ":airplane_arriving:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xba"), ":seat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x81"), ":helicopter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9f"), ":suspension_railway:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa0"), ":mountain_cableway:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa1"), ":aerial_tramway:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\x80"), ":rocket:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb0"), ":satellite_orbital:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa0"), ":stars:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x88"), ":rainbow:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x86"), ":fireworks:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x87"), ":sparkler:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x91"), ":rice_scene:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\x81"), ":checkered_flag:"}, }; const QList EmojiProvider::objects = { - Emoji{ QString::fromUtf8("\xe2\x98\xa0"), ":skull_crossbones:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8c"), ":love_letter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa3"), ":bomb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb3"), ":hole:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x8d"), ":shopping_bags:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xbf"), ":prayer_beads:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8e"), ":gem:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xaa"), ":knife:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xba"), ":amphora:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xba"), ":map:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x88"), ":barber:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xbc"), ":frame_photo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x8e"), ":bellhop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xaa"), ":door:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x8c"), ":sleeping_accommodation:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x8f"), ":bed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x8b"), ":couch:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xbd"), ":toilet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xbf"), ":shower:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x81"), ":bathtub:" }, - Emoji{ QString::fromUtf8("\xe2\x8c\x9b"), ":hourglass:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb3"), ":hourglass_flowing_sand:" }, - Emoji{ QString::fromUtf8("\xe2\x8c\x9a"), ":watch:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb0"), ":alarm_clock:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb1"), ":stopwatch:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb2"), ":timer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb0"), ":clock:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\xa1"), ":thermometer:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\xb1"), ":beach_umbrella:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x88"), ":balloon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x89"), ":tada:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8a"), ":confetti_ball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8e"), ":dolls:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8f"), ":flags:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x90"), ":wind_chime:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x80"), ":ribbon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x81"), ":gift:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xb9"), ":joystick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xaf"), ":postal_horn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x99"), ":microphone2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x9a"), ":level_slider:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x9b"), ":control_knobs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xbb"), ":radio:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb1"), ":iphone:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb2"), ":calling:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x8e"), ":telephone:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9e"), ":telephone_receiver:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9f"), ":pager:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa0"), ":fax:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8b"), ":battery:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8c"), ":electric_plug:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xbb"), ":computer:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xa5"), ":desktop:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xa8"), ":printer:" }, - Emoji{ QString::fromUtf8("\xe2\x8c\xa8"), ":keyboard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xb1"), ":mouse_three_button:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xb2"), ":trackball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xbd"), ":minidisc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xbe"), ":floppy_disk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xbf"), ":cd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x80"), ":dvd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa5"), ":movie_camera:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x9e"), ":film_frames:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xbd"), ":projector:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xba"), ":tv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb7"), ":camera:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb8"), ":camera_with_flash:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb9"), ":video_camera:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xbc"), ":vhs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8d"), ":mag:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8e"), ":mag_right:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xac"), ":microscope:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xad"), ":telescope:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa1"), ":satellite:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xaf"), ":candle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa1"), ":bulb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa6"), ":flashlight:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xae"), ":izakaya_lantern:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x94"), ":notebook_with_decorative_cover:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x95"), ":closed_book:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x96"), ":book:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x97"), ":green_book:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x98"), ":blue_book:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x99"), ":orange_book:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9a"), ":books:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x93"), ":notebook:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x92"), ":ledger:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x83"), ":page_with_curl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9c"), ":scroll:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x84"), ":page_facing_up:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb0"), ":newspaper:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x9e"), ":newspaper2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x91"), ":bookmark_tabs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x96"), ":bookmark:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb7"), ":label:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb0"), ":moneybag:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb4"), ":yen:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb5"), ":dollar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb6"), ":euro:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb7"), ":pound:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb8"), ":money_with_wings:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb3"), ":credit_card:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x89"), ":envelope:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa7"), ":e-mail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa8"), ":incoming_envelope:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa9"), ":envelope_with_arrow:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa4"), ":outbox_tray:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa5"), ":inbox_tray:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa6"), ":package:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xab"), ":mailbox:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xaa"), ":mailbox_closed:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xac"), ":mailbox_with_mail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xad"), ":mailbox_with_no_mail:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xae"), ":postbox:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xb3"), ":ballot_box:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x8f"), ":pencil2:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x92"), ":black_nib:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x8b"), ":pen_fountain:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x8a"), ":pen_ballpoint:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x8c"), ":paintbrush:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x8d"), ":crayon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9d"), ":pencil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x81"), ":file_folder:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x82"), ":open_file_folder:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x82"), ":dividers:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x85"), ":date:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x86"), ":calendar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x92"), ":notepad_spiral:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x93"), ":calendar_spiral:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x87"), ":card_index:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x88"), ":chart_with_upwards_trend:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x89"), ":chart_with_downwards_trend:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8a"), ":bar_chart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8b"), ":clipboard:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8c"), ":pushpin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8d"), ":round_pushpin:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8e"), ":paperclip:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\x87"), ":paperclips:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x8f"), ":straight_ruler:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x90"), ":triangular_ruler:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x82"), ":scissors:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x83"), ":card_box:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x84"), ":file_cabinet:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x91"), ":wastebasket:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x92"), ":lock:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x93"), ":unlock:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8f"), ":lock_with_ink_pen:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x90"), ":closed_lock_with_key:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x91"), ":key:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x9d"), ":key2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa8"), ":hammer:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x8f"), ":pick:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x92"), ":hammer_pick:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa0"), ":tools:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xa1"), ":dagger:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x94"), ":crossed_swords:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xab"), ":gun:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa1"), ":shield:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa7"), ":wrench:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa9"), ":nut_and_bolt:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x99"), ":gear:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\x9c"), ":compression:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x97"), ":alembic:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x96"), ":scales:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x97"), ":link:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x93"), ":chains:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x89"), ":syringe:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x8a"), ":pill:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xac"), ":smoking:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xb0"), ":coffin:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xb1"), ":urn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xbf"), ":moyai:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\xa2"), ":oil:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xae"), ":crystal_ball:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x92"), ":shopping_cart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xa9"), ":triangular_flag_on_post:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\x8c"), ":crossed_flags:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb4"), ":flag_black:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb3"), ":flag_white:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xb3\xf0\x9f\x8c\x88"), ":rainbow_flag:" }, + Emoji{QString::fromUtf8("\xe2\x98\xa0"), ":skull_crossbones:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8c"), ":love_letter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa3"), ":bomb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb3"), ":hole:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8d"), ":shopping_bags:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xbf"), ":prayer_beads:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8e"), ":gem:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xaa"), ":knife:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xba"), ":amphora:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xba"), ":map:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x88"), ":barber:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xbc"), ":frame_photo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8e"), ":bellhop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xaa"), ":door:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c"), ":sleeping_accommodation:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8f"), ":bed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8b"), ":couch:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbd"), ":toilet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbf"), ":shower:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x81"), ":bathtub:"}, + Emoji{QString::fromUtf8("\xe2\x8c\x9b"), ":hourglass:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb3"), ":hourglass_flowing_sand:"}, + Emoji{QString::fromUtf8("\xe2\x8c\x9a"), ":watch:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb0"), ":alarm_clock:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb1"), ":stopwatch:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb2"), ":timer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb0"), ":clock:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa1"), ":thermometer:"}, + Emoji{QString::fromUtf8("\xe2\x9b\xb1"), ":beach_umbrella:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x88"), ":balloon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x89"), ":tada:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8a"), ":confetti_ball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8e"), ":dolls:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8f"), ":flags:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x90"), ":wind_chime:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x80"), ":ribbon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x81"), ":gift:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xb9"), ":joystick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xaf"), ":postal_horn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x99"), ":microphone2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9a"), ":level_slider:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9b"), ":control_knobs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xbb"), ":radio:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb1"), ":iphone:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb2"), ":calling:"}, + Emoji{QString::fromUtf8("\xe2\x98\x8e"), ":telephone:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9e"), ":telephone_receiver:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9f"), ":pager:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa0"), ":fax:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8b"), ":battery:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8c"), ":electric_plug:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xbb"), ":computer:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xa5"), ":desktop:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xa8"), ":printer:"}, + Emoji{QString::fromUtf8("\xe2\x8c\xa8"), ":keyboard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xb1"), ":mouse_three_button:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xb2"), ":trackball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xbd"), ":minidisc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xbe"), ":floppy_disk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xbf"), ":cd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x80"), ":dvd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa5"), ":movie_camera:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9e"), ":film_frames:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xbd"), ":projector:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xba"), ":tv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb7"), ":camera:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb8"), ":camera_with_flash:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb9"), ":video_camera:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xbc"), ":vhs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8d"), ":mag:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8e"), ":mag_right:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xac"), ":microscope:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xad"), ":telescope:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa1"), ":satellite:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xaf"), ":candle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa1"), ":bulb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa6"), ":flashlight:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xae"), ":izakaya_lantern:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x94"), ":notebook_with_decorative_cover:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x95"), ":closed_book:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x96"), ":book:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x97"), ":green_book:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x98"), ":blue_book:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x99"), ":orange_book:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9a"), ":books:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x93"), ":notebook:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x92"), ":ledger:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x83"), ":page_with_curl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9c"), ":scroll:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x84"), ":page_facing_up:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb0"), ":newspaper:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x9e"), ":newspaper2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x91"), ":bookmark_tabs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x96"), ":bookmark:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb7"), ":label:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb0"), ":moneybag:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb4"), ":yen:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb5"), ":dollar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb6"), ":euro:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb7"), ":pound:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb8"), ":money_with_wings:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb3"), ":credit_card:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x89"), ":envelope:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa7"), ":e-mail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa8"), ":incoming_envelope:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa9"), ":envelope_with_arrow:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa4"), ":outbox_tray:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa5"), ":inbox_tray:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa6"), ":package:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xab"), ":mailbox:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xaa"), ":mailbox_closed:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xac"), ":mailbox_with_mail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xad"), ":mailbox_with_no_mail:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xae"), ":postbox:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xb3"), ":ballot_box:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x8f"), ":pencil2:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x92"), ":black_nib:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x8b"), ":pen_fountain:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x8a"), ":pen_ballpoint:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x8c"), ":paintbrush:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x8d"), ":crayon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9d"), ":pencil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x81"), ":file_folder:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x82"), ":open_file_folder:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x82"), ":dividers:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x85"), ":date:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x86"), ":calendar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x92"), ":notepad_spiral:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x93"), ":calendar_spiral:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x87"), ":card_index:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x88"), ":chart_with_upwards_trend:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x89"), ":chart_with_downwards_trend:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8a"), ":bar_chart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8b"), ":clipboard:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8c"), ":pushpin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8d"), ":round_pushpin:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8e"), ":paperclip:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\x87"), ":paperclips:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x8f"), ":straight_ruler:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x90"), ":triangular_ruler:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x82"), ":scissors:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x83"), ":card_box:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x84"), ":file_cabinet:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x91"), ":wastebasket:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x92"), ":lock:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x93"), ":unlock:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8f"), ":lock_with_ink_pen:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x90"), ":closed_lock_with_key:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x91"), ":key:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x9d"), ":key2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa8"), ":hammer:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x8f"), ":pick:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x92"), ":hammer_pick:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa0"), ":tools:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xa1"), ":dagger:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x94"), ":crossed_swords:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xab"), ":gun:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa1"), ":shield:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa7"), ":wrench:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa9"), ":nut_and_bolt:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x99"), ":gear:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\x9c"), ":compression:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x97"), ":alembic:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x96"), ":scales:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x97"), ":link:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x93"), ":chains:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x89"), ":syringe:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x8a"), ":pill:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xac"), ":smoking:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xb0"), ":coffin:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xb1"), ":urn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xbf"), ":moyai:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa2"), ":oil:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xae"), ":crystal_ball:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x92"), ":shopping_cart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa9"), ":triangular_flag_on_post:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8c"), ":crossed_flags:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4"), ":flag_black:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3"), ":flag_white:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3\xf0\x9f\x8c\x88"), ":rainbow_flag:"}, }; const QList EmojiProvider::symbols = { - Emoji{ QString::fromUtf8("\xf0\x9f\x91\x81\xf0\x9f\x97\xa8"), ":eye_in_speech_bubble:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x98"), ":cupid:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\xa4"), ":heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x93"), ":heartbeat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x94"), ":broken_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x95"), ":two_hearts:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x96"), ":sparkling_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x97"), ":heartpulse:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x99"), ":blue_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9a"), ":green_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9b"), ":yellow_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9c"), ":purple_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x96\xa4"), ":black_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9d"), ":gift_heart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9e"), ":revolving_hearts:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\x9f"), ":heart_decoration:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\xa3"), ":heart_exclamation:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa2"), ":anger:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa5"), ":boom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xab"), ":dizzy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xac"), ":speech_balloon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xa8"), ":speech_left:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x97\xaf"), ":anger_right:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xad"), ":thought_balloon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xae"), ":white_flower:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x90"), ":globe_with_meridians:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xa8"), ":hotsprings:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x91"), ":octagonal_sign:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9b"), ":clock12:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa7"), ":clock1230:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x90"), ":clock1:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9c"), ":clock130:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x91"), ":clock2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9d"), ":clock230:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x92"), ":clock3:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9e"), ":clock330:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x93"), ":clock4:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9f"), ":clock430:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x94"), ":clock5:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa0"), ":clock530:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x95"), ":clock6:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa1"), ":clock630:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x96"), ":clock7:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa2"), ":clock730:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x97"), ":clock8:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa3"), ":clock830:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x98"), ":clock9:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa4"), ":clock930:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x99"), ":clock10:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa5"), ":clock1030:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x9a"), ":clock11:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\xa6"), ":clock1130:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8c\x80"), ":cyclone:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xa0"), ":spades:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xa5"), ":hearts:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xa6"), ":diamonds:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xa3"), ":clubs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x83\x8f"), ":black_joker:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x80\x84"), ":mahjong:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb4"), ":flower_playing_cards:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x87"), ":mute:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x88"), ":speaker:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x89"), ":sound:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x8a"), ":loud_sound:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa2"), ":loudspeaker:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xa3"), ":mega:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x94"), ":bell:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x95"), ":no_bell:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb5"), ":musical_note:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xb6"), ":notes:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb9"), ":chart:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb1"), ":currency_exchange:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xb2"), ":heavy_dollar_sign:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8f\xa7"), ":atm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xae"), ":put_litter_in_its_place:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb0"), ":potable_water:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xbf"), ":wheelchair:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb9"), ":mens:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xba"), ":womens:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xbb"), ":restroom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xbc"), ":baby_symbol:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xbe"), ":wc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x82"), ":passport_control:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x83"), ":customs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x84"), ":baggage_claim:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x85"), ":left_luggage:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xa0"), ":warning:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb8"), ":children_crossing:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x94"), ":no_entry:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xab"), ":no_entry_sign:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb3"), ":no_bicycles:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xad"), ":no_smoking:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xaf"), ":do_not_litter:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb1"), ":non-potable_water:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9a\xb7"), ":no_pedestrians:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb5"), ":no_mobile_phones:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9e"), ":underage:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xa2"), ":radioactive:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xa3"), ":biohazard:" }, - Emoji{ QString::fromUtf8("\xe2\xac\x86"), ":arrow_up:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x97"), ":arrow_upper_right:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\xa1"), ":arrow_right:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x98"), ":arrow_lower_right:" }, - Emoji{ QString::fromUtf8("\xe2\xac\x87"), ":arrow_down:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x99"), ":arrow_lower_left:" }, - Emoji{ QString::fromUtf8("\xe2\xac\x85"), ":arrow_left:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x96"), ":arrow_upper_left:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x95"), ":arrow_up_down:" }, - Emoji{ QString::fromUtf8("\xe2\x86\x94"), ":left_right_arrow:" }, - Emoji{ QString::fromUtf8("\xe2\x86\xa9"), ":leftwards_arrow_with_hook:" }, - Emoji{ QString::fromUtf8("\xe2\x86\xaa"), ":arrow_right_hook:" }, - Emoji{ QString::fromUtf8("\xe2\xa4\xb4"), ":arrow_heading_up:" }, - Emoji{ QString::fromUtf8("\xe2\xa4\xb5"), ":arrow_heading_down:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x83"), ":arrows_clockwise:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x84"), ":arrows_counterclockwise:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x99"), ":back:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9a"), ":end:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9b"), ":on:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9c"), ":soon:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9d"), ":top:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x9b\x90"), ":place_of_worship:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x9b"), ":atom:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x89"), ":om_symbol:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\xa1"), ":star_of_david:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xb8"), ":wheel_of_dharma:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xaf"), ":yin_yang:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x9d"), ":cross:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xa6"), ":orthodox_cross:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xaa"), ":star_and_crescent:" }, - Emoji{ QString::fromUtf8("\xe2\x98\xae"), ":peace:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x95\x8e"), ":menorah:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xaf"), ":six_pointed_star:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x88"), ":aries:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x89"), ":taurus:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8a"), ":gemini:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8b"), ":cancer:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8c"), ":leo:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8d"), ":virgo:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8e"), ":libra:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x8f"), ":scorpius:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x90"), ":sagittarius:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x91"), ":capricorn:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x92"), ":aquarius:" }, - Emoji{ QString::fromUtf8("\xe2\x99\x93"), ":pisces:" }, - Emoji{ QString::fromUtf8("\xe2\x9b\x8e"), ":ophiuchus:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x80"), ":twisted_rightwards_arrows:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x81"), ":repeat:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x82"), ":repeat_one:" }, - Emoji{ QString::fromUtf8("\xe2\x96\xb6"), ":arrow_forward:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xa9"), ":fast_forward:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xad"), ":track_next:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xaf"), ":play_pause:" }, - Emoji{ QString::fromUtf8("\xe2\x97\x80"), ":arrow_backward:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xaa"), ":rewind:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xae"), ":track_previous:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xbc"), ":arrow_up_small:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xab"), ":arrow_double_up:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xbd"), ":arrow_down_small:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xac"), ":arrow_double_down:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb8"), ":pause_button:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xb9"), ":stop_button:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\xba"), ":record_button:" }, - Emoji{ QString::fromUtf8("\xe2\x8f\x8f"), ":eject:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x8e\xa6"), ":cinema:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x85"), ":low_brightness:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x86"), ":high_brightness:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb6"), ":signal_strength:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb3"), ":vibration_mode:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\xb4"), ":mobile_phone_off:" }, - Emoji{ QString::fromUtf8("\xe2\x99\xbb"), ":recycle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x93\x9b"), ":name_badge:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\x9c"), ":fleur-de-lis:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb0"), ":beginner:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb1"), ":trident:" }, - Emoji{ QString::fromUtf8("\xe2\xad\x95"), ":o:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x85"), ":white_check_mark:" }, - Emoji{ QString::fromUtf8("\xe2\x98\x91"), ":ballot_box_with_check:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x94"), ":heavy_check_mark:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\x96"), ":heavy_multiplication_x:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x8c"), ":x:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x8e"), ":negative_squared_cross_mark:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\x95"), ":heavy_plus_sign:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\x96"), ":heavy_minus_sign:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\x97"), ":heavy_division_sign:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\xb0"), ":curly_loop:" }, - Emoji{ QString::fromUtf8("\xe2\x9e\xbf"), ":loop:" }, - Emoji{ QString::fromUtf8("\xe3\x80\xbd"), ":part_alternation_mark:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\xb3"), ":eight_spoked_asterisk:" }, - Emoji{ QString::fromUtf8("\xe2\x9c\xb4"), ":eight_pointed_black_star:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x87"), ":sparkle:" }, - Emoji{ QString::fromUtf8("\xe2\x80\xbc"), ":bangbang:" }, - Emoji{ QString::fromUtf8("\xe2\x81\x89"), ":interrobang:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x93"), ":question:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x94"), ":grey_question:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x95"), ":grey_exclamation:" }, - Emoji{ QString::fromUtf8("\xe2\x9d\x97"), ":exclamation:" }, - Emoji{ QString::fromUtf8("\xe3\x80\xb0"), ":wavy_dash:" }, - Emoji{ QString::fromUtf8("\xc2\xa9"), ":copyright:" }, - Emoji{ QString::fromUtf8("\xc2\xae"), ":registered:" }, - Emoji{ QString::fromUtf8("\xe2\x84\xa2"), ":tm:" }, - Emoji{ QString::fromUtf8("#\xe2\x83\xa3"), ":hash:" }, - Emoji{ QString::fromUtf8("*\xe2\x83\xa3"), ":asterisk:" }, - Emoji{ QString::fromUtf8("0\xe2\x83\xa3"), ":zero:" }, - Emoji{ QString::fromUtf8("1\xe2\x83\xa3"), ":one:" }, - Emoji{ QString::fromUtf8("2\xe2\x83\xa3"), ":two:" }, - Emoji{ QString::fromUtf8("3\xe2\x83\xa3"), ":three:" }, - Emoji{ QString::fromUtf8("4\xe2\x83\xa3"), ":four:" }, - Emoji{ QString::fromUtf8("5\xe2\x83\xa3"), ":five:" }, - Emoji{ QString::fromUtf8("6\xe2\x83\xa3"), ":six:" }, - Emoji{ QString::fromUtf8("7\xe2\x83\xa3"), ":seven:" }, - Emoji{ QString::fromUtf8("8\xe2\x83\xa3"), ":eight:" }, - Emoji{ QString::fromUtf8("9\xe2\x83\xa3"), ":nine:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x9f"), ":keycap_ten:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xaf"), ":100:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa0"), ":capital_abcd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa1"), ":abcd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa2"), ":1234:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa3"), ":symbols:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xa4"), ":abc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x85\xb0"), ":a:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x8e"), ":ab:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x85\xb1"), ":b:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x91"), ":cl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x92"), ":cool:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x93"), ":free:" }, - Emoji{ QString::fromUtf8("\xe2\x84\xb9"), ":information_source:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x94"), ":id:" }, - Emoji{ QString::fromUtf8("\xe2\x93\x82"), ":m:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x95"), ":new:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x96"), ":ng:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x85\xbe"), ":o2:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x97"), ":ok:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x85\xbf"), ":parking:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x98"), ":sos:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x99"), ":up:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x86\x9a"), ":vs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\x81"), ":koko:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\x82"), ":sa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb7"), ":u6708:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb6"), ":u6709:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xaf"), ":u6307:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x89\x90"), ":ideograph_advantage:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb9"), ":u5272:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\x9a"), ":u7121:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb2"), ":u7981:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x89\x91"), ":accept:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb8"), ":u7533:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb4"), ":u5408:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb3"), ":u7a7a:" }, - Emoji{ QString::fromUtf8("\xe3\x8a\x97"), ":congratulations:" }, - Emoji{ QString::fromUtf8("\xe3\x8a\x99"), ":secret:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xba"), ":u55b6:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x88\xb5"), ":u6e80:" }, - Emoji{ QString::fromUtf8("\xe2\x96\xaa"), ":black_small_square:" }, - Emoji{ QString::fromUtf8("\xe2\x96\xab"), ":white_small_square:" }, - Emoji{ QString::fromUtf8("\xe2\x97\xbb"), ":white_medium_square:" }, - Emoji{ QString::fromUtf8("\xe2\x97\xbc"), ":black_medium_square:" }, - Emoji{ QString::fromUtf8("\xe2\x97\xbd"), ":white_medium_small_square:" }, - Emoji{ QString::fromUtf8("\xe2\x97\xbe"), ":black_medium_small_square:" }, - Emoji{ QString::fromUtf8("\xe2\xac\x9b"), ":black_large_square:" }, - Emoji{ QString::fromUtf8("\xe2\xac\x9c"), ":white_large_square:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb6"), ":large_orange_diamond:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb7"), ":large_blue_diamond:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb8"), ":small_orange_diamond:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb9"), ":small_blue_diamond:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xba"), ":small_red_triangle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xbb"), ":small_red_triangle_down:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x92\xa0"), ":diamond_shape_with_a_dot_inside:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\x98"), ":radio_button:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb2"), ":black_square_button:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb3"), ":white_square_button:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xaa"), ":white_circle:" }, - Emoji{ QString::fromUtf8("\xe2\x9a\xab"), ":black_circle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb4"), ":red_circle:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x94\xb5"), ":blue_circle:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x91\x81\xf0\x9f\x97\xa8"), ":eye_in_speech_bubble:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x98"), ":cupid:"}, + Emoji{QString::fromUtf8("\xe2\x9d\xa4"), ":heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x93"), ":heartbeat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x94"), ":broken_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x95"), ":two_hearts:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x96"), ":sparkling_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x97"), ":heartpulse:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x99"), ":blue_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9a"), ":green_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9b"), ":yellow_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9c"), ":purple_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x96\xa4"), ":black_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9d"), ":gift_heart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9e"), ":revolving_hearts:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\x9f"), ":heart_decoration:"}, + Emoji{QString::fromUtf8("\xe2\x9d\xa3"), ":heart_exclamation:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa2"), ":anger:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa5"), ":boom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xab"), ":dizzy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xac"), ":speech_balloon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xa8"), ":speech_left:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x97\xaf"), ":anger_right:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xad"), ":thought_balloon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xae"), ":white_flower:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x90"), ":globe_with_meridians:"}, + Emoji{QString::fromUtf8("\xe2\x99\xa8"), ":hotsprings:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x91"), ":octagonal_sign:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9b"), ":clock12:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa7"), ":clock1230:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x90"), ":clock1:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9c"), ":clock130:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x91"), ":clock2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9d"), ":clock230:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x92"), ":clock3:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9e"), ":clock330:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x93"), ":clock4:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9f"), ":clock430:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x94"), ":clock5:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa0"), ":clock530:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x95"), ":clock6:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa1"), ":clock630:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x96"), ":clock7:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa2"), ":clock730:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x97"), ":clock8:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa3"), ":clock830:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x98"), ":clock9:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa4"), ":clock930:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x99"), ":clock10:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa5"), ":clock1030:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x9a"), ":clock11:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\xa6"), ":clock1130:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8c\x80"), ":cyclone:"}, + Emoji{QString::fromUtf8("\xe2\x99\xa0"), ":spades:"}, + Emoji{QString::fromUtf8("\xe2\x99\xa5"), ":hearts:"}, + Emoji{QString::fromUtf8("\xe2\x99\xa6"), ":diamonds:"}, + Emoji{QString::fromUtf8("\xe2\x99\xa3"), ":clubs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x83\x8f"), ":black_joker:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x80\x84"), ":mahjong:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb4"), ":flower_playing_cards:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x87"), ":mute:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x88"), ":speaker:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x89"), ":sound:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x8a"), ":loud_sound:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa2"), ":loudspeaker:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xa3"), ":mega:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x94"), ":bell:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x95"), ":no_bell:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb5"), ":musical_note:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb6"), ":notes:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb9"), ":chart:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb1"), ":currency_exchange:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xb2"), ":heavy_dollar_sign:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa7"), ":atm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xae"), ":put_litter_in_its_place:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb0"), ":potable_water:"}, + Emoji{QString::fromUtf8("\xe2\x99\xbf"), ":wheelchair:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb9"), ":mens:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xba"), ":womens:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbb"), ":restroom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbc"), ":baby_symbol:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbe"), ":wc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x82"), ":passport_control:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x83"), ":customs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x84"), ":baggage_claim:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x85"), ":left_luggage:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xa0"), ":warning:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb8"), ":children_crossing:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x94"), ":no_entry:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xab"), ":no_entry_sign:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb3"), ":no_bicycles:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xad"), ":no_smoking:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xaf"), ":do_not_litter:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb1"), ":non-potable_water:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb7"), ":no_pedestrians:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb5"), ":no_mobile_phones:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9e"), ":underage:"}, + Emoji{QString::fromUtf8("\xe2\x98\xa2"), ":radioactive:"}, + Emoji{QString::fromUtf8("\xe2\x98\xa3"), ":biohazard:"}, + Emoji{QString::fromUtf8("\xe2\xac\x86"), ":arrow_up:"}, + Emoji{QString::fromUtf8("\xe2\x86\x97"), ":arrow_upper_right:"}, + Emoji{QString::fromUtf8("\xe2\x9e\xa1"), ":arrow_right:"}, + Emoji{QString::fromUtf8("\xe2\x86\x98"), ":arrow_lower_right:"}, + Emoji{QString::fromUtf8("\xe2\xac\x87"), ":arrow_down:"}, + Emoji{QString::fromUtf8("\xe2\x86\x99"), ":arrow_lower_left:"}, + Emoji{QString::fromUtf8("\xe2\xac\x85"), ":arrow_left:"}, + Emoji{QString::fromUtf8("\xe2\x86\x96"), ":arrow_upper_left:"}, + Emoji{QString::fromUtf8("\xe2\x86\x95"), ":arrow_up_down:"}, + Emoji{QString::fromUtf8("\xe2\x86\x94"), ":left_right_arrow:"}, + Emoji{QString::fromUtf8("\xe2\x86\xa9"), ":leftwards_arrow_with_hook:"}, + Emoji{QString::fromUtf8("\xe2\x86\xaa"), ":arrow_right_hook:"}, + Emoji{QString::fromUtf8("\xe2\xa4\xb4"), ":arrow_heading_up:"}, + Emoji{QString::fromUtf8("\xe2\xa4\xb5"), ":arrow_heading_down:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x83"), ":arrows_clockwise:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x84"), ":arrows_counterclockwise:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x99"), ":back:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9a"), ":end:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9b"), ":on:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9c"), ":soon:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9d"), ":top:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x9b\x90"), ":place_of_worship:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x9b"), ":atom:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x89"), ":om_symbol:"}, + Emoji{QString::fromUtf8("\xe2\x9c\xa1"), ":star_of_david:"}, + Emoji{QString::fromUtf8("\xe2\x98\xb8"), ":wheel_of_dharma:"}, + Emoji{QString::fromUtf8("\xe2\x98\xaf"), ":yin_yang:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x9d"), ":cross:"}, + Emoji{QString::fromUtf8("\xe2\x98\xa6"), ":orthodox_cross:"}, + Emoji{QString::fromUtf8("\xe2\x98\xaa"), ":star_and_crescent:"}, + Emoji{QString::fromUtf8("\xe2\x98\xae"), ":peace:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x95\x8e"), ":menorah:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xaf"), ":six_pointed_star:"}, + Emoji{QString::fromUtf8("\xe2\x99\x88"), ":aries:"}, + Emoji{QString::fromUtf8("\xe2\x99\x89"), ":taurus:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8a"), ":gemini:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8b"), ":cancer:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8c"), ":leo:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8d"), ":virgo:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8e"), ":libra:"}, + Emoji{QString::fromUtf8("\xe2\x99\x8f"), ":scorpius:"}, + Emoji{QString::fromUtf8("\xe2\x99\x90"), ":sagittarius:"}, + Emoji{QString::fromUtf8("\xe2\x99\x91"), ":capricorn:"}, + Emoji{QString::fromUtf8("\xe2\x99\x92"), ":aquarius:"}, + Emoji{QString::fromUtf8("\xe2\x99\x93"), ":pisces:"}, + Emoji{QString::fromUtf8("\xe2\x9b\x8e"), ":ophiuchus:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x80"), ":twisted_rightwards_arrows:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x81"), ":repeat:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x82"), ":repeat_one:"}, + Emoji{QString::fromUtf8("\xe2\x96\xb6"), ":arrow_forward:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xa9"), ":fast_forward:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xad"), ":track_next:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xaf"), ":play_pause:"}, + Emoji{QString::fromUtf8("\xe2\x97\x80"), ":arrow_backward:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xaa"), ":rewind:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xae"), ":track_previous:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xbc"), ":arrow_up_small:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xab"), ":arrow_double_up:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xbd"), ":arrow_down_small:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xac"), ":arrow_double_down:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb8"), ":pause_button:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xb9"), ":stop_button:"}, + Emoji{QString::fromUtf8("\xe2\x8f\xba"), ":record_button:"}, + Emoji{QString::fromUtf8("\xe2\x8f\x8f"), ":eject:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa6"), ":cinema:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x85"), ":low_brightness:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x86"), ":high_brightness:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb6"), ":signal_strength:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb3"), ":vibration_mode:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\xb4"), ":mobile_phone_off:"}, + Emoji{QString::fromUtf8("\xe2\x99\xbb"), ":recycle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x93\x9b"), ":name_badge:"}, + Emoji{QString::fromUtf8("\xe2\x9a\x9c"), ":fleur-de-lis:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb0"), ":beginner:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb1"), ":trident:"}, + Emoji{QString::fromUtf8("\xe2\xad\x95"), ":o:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x85"), ":white_check_mark:"}, + Emoji{QString::fromUtf8("\xe2\x98\x91"), ":ballot_box_with_check:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x94"), ":heavy_check_mark:"}, + Emoji{QString::fromUtf8("\xe2\x9c\x96"), ":heavy_multiplication_x:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x8c"), ":x:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x8e"), ":negative_squared_cross_mark:"}, + Emoji{QString::fromUtf8("\xe2\x9e\x95"), ":heavy_plus_sign:"}, + Emoji{QString::fromUtf8("\xe2\x9e\x96"), ":heavy_minus_sign:"}, + Emoji{QString::fromUtf8("\xe2\x9e\x97"), ":heavy_division_sign:"}, + Emoji{QString::fromUtf8("\xe2\x9e\xb0"), ":curly_loop:"}, + Emoji{QString::fromUtf8("\xe2\x9e\xbf"), ":loop:"}, + Emoji{QString::fromUtf8("\xe3\x80\xbd"), ":part_alternation_mark:"}, + Emoji{QString::fromUtf8("\xe2\x9c\xb3"), ":eight_spoked_asterisk:"}, + Emoji{QString::fromUtf8("\xe2\x9c\xb4"), ":eight_pointed_black_star:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x87"), ":sparkle:"}, + Emoji{QString::fromUtf8("\xe2\x80\xbc"), ":bangbang:"}, + Emoji{QString::fromUtf8("\xe2\x81\x89"), ":interrobang:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x93"), ":question:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x94"), ":grey_question:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x95"), ":grey_exclamation:"}, + Emoji{QString::fromUtf8("\xe2\x9d\x97"), ":exclamation:"}, + Emoji{QString::fromUtf8("\xe3\x80\xb0"), ":wavy_dash:"}, + Emoji{QString::fromUtf8("\xc2\xa9"), ":copyright:"}, + Emoji{QString::fromUtf8("\xc2\xae"), ":registered:"}, + Emoji{QString::fromUtf8("\xe2\x84\xa2"), ":tm:"}, + Emoji{QString::fromUtf8("#\xe2\x83\xa3"), ":hash:"}, + Emoji{QString::fromUtf8("*\xe2\x83\xa3"), ":asterisk:"}, + Emoji{QString::fromUtf8("0\xe2\x83\xa3"), ":zero:"}, + Emoji{QString::fromUtf8("1\xe2\x83\xa3"), ":one:"}, + Emoji{QString::fromUtf8("2\xe2\x83\xa3"), ":two:"}, + Emoji{QString::fromUtf8("3\xe2\x83\xa3"), ":three:"}, + Emoji{QString::fromUtf8("4\xe2\x83\xa3"), ":four:"}, + Emoji{QString::fromUtf8("5\xe2\x83\xa3"), ":five:"}, + Emoji{QString::fromUtf8("6\xe2\x83\xa3"), ":six:"}, + Emoji{QString::fromUtf8("7\xe2\x83\xa3"), ":seven:"}, + Emoji{QString::fromUtf8("8\xe2\x83\xa3"), ":eight:"}, + Emoji{QString::fromUtf8("9\xe2\x83\xa3"), ":nine:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x9f"), ":keycap_ten:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xaf"), ":100:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa0"), ":capital_abcd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa1"), ":abcd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa2"), ":1234:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa3"), ":symbols:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xa4"), ":abc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x85\xb0"), ":a:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x8e"), ":ab:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x85\xb1"), ":b:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x91"), ":cl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x92"), ":cool:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x93"), ":free:"}, + Emoji{QString::fromUtf8("\xe2\x84\xb9"), ":information_source:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x94"), ":id:"}, + Emoji{QString::fromUtf8("\xe2\x93\x82"), ":m:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x95"), ":new:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x96"), ":ng:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x85\xbe"), ":o2:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x97"), ":ok:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x85\xbf"), ":parking:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x98"), ":sos:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x99"), ":up:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x86\x9a"), ":vs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\x81"), ":koko:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\x82"), ":sa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb7"), ":u6708:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb6"), ":u6709:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xaf"), ":u6307:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x89\x90"), ":ideograph_advantage:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb9"), ":u5272:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\x9a"), ":u7121:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb2"), ":u7981:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x89\x91"), ":accept:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb8"), ":u7533:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb4"), ":u5408:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb3"), ":u7a7a:"}, + Emoji{QString::fromUtf8("\xe3\x8a\x97"), ":congratulations:"}, + Emoji{QString::fromUtf8("\xe3\x8a\x99"), ":secret:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xba"), ":u55b6:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x88\xb5"), ":u6e80:"}, + Emoji{QString::fromUtf8("\xe2\x96\xaa"), ":black_small_square:"}, + Emoji{QString::fromUtf8("\xe2\x96\xab"), ":white_small_square:"}, + Emoji{QString::fromUtf8("\xe2\x97\xbb"), ":white_medium_square:"}, + Emoji{QString::fromUtf8("\xe2\x97\xbc"), ":black_medium_square:"}, + Emoji{QString::fromUtf8("\xe2\x97\xbd"), ":white_medium_small_square:"}, + Emoji{QString::fromUtf8("\xe2\x97\xbe"), ":black_medium_small_square:"}, + Emoji{QString::fromUtf8("\xe2\xac\x9b"), ":black_large_square:"}, + Emoji{QString::fromUtf8("\xe2\xac\x9c"), ":white_large_square:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb6"), ":large_orange_diamond:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb7"), ":large_blue_diamond:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb8"), ":small_orange_diamond:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb9"), ":small_blue_diamond:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xba"), ":small_red_triangle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xbb"), ":small_red_triangle_down:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x92\xa0"), ":diamond_shape_with_a_dot_inside:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\x98"), ":radio_button:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb2"), ":black_square_button:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb3"), ":white_square_button:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xaa"), ":white_circle:"}, + Emoji{QString::fromUtf8("\xe2\x9a\xab"), ":black_circle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb4"), ":red_circle:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x94\xb5"), ":blue_circle:"}, }; const QList EmojiProvider::flags = { - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa8"), ":flag_ac:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa9"), ":flag_ad:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xaa"), ":flag_ae:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xab"), ":flag_af:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xac"), ":flag_ag:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xae"), ":flag_ai:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb1"), ":flag_al:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb2"), ":flag_am:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb4"), ":flag_ao:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb6"), ":flag_aq:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb7"), ":flag_ar:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb8"), ":flag_as:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb9"), ":flag_at:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xba"), ":flag_au:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbc"), ":flag_aw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbd"), ":flag_ax:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbf"), ":flag_az:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa6"), ":flag_ba:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa7"), ":flag_bb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa9"), ":flag_bd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaa"), ":flag_be:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xab"), ":flag_bf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xac"), ":flag_bg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xad"), ":flag_bh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xae"), ":flag_bi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaf"), ":flag_bj:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb1"), ":flag_bl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb2"), ":flag_bm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb3"), ":flag_bn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb4"), ":flag_bo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb6"), ":flag_bq:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb7"), ":flag_br:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb8"), ":flag_bs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb9"), ":flag_bt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbb"), ":flag_bv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbc"), ":flag_bw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbe"), ":flag_by:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbf"), ":flag_bz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa6"), ":flag_ca:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa8"), ":flag_cc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa9"), ":flag_cd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xab"), ":flag_cf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xac"), ":flag_cg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xad"), ":flag_ch:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xae"), ":flag_ci:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb0"), ":flag_ck:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb1"), ":flag_cl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb2"), ":flag_cm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"), ":flag_cn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb4"), ":flag_co:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb5"), ":flag_cp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb7"), ":flag_cr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xba"), ":flag_cu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbb"), ":flag_cv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbc"), ":flag_cw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbd"), ":flag_cx:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbe"), ":flag_cy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbf"), ":flag_cz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"), ":flag_de:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xac"), ":flag_dg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaf"), ":flag_dj:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb0"), ":flag_dk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb2"), ":flag_dm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb4"), ":flag_do:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xbf"), ":flag_dz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa6"), ":flag_ea:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa8"), ":flag_ec:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xaa"), ":flag_ee:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xac"), ":flag_eg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xad"), ":flag_eh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb7"), ":flag_er:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"), ":flag_es:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb9"), ":flag_et:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xba"), ":flag_eu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xae"), ":flag_fi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xaf"), ":flag_fj:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb0"), ":flag_fk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb2"), ":flag_fm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb4"), ":flag_fo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"), ":flag_fr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa6"), ":flag_ga:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"), ":flag_gb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa9"), ":flag_gd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xaa"), ":flag_ge:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xab"), ":flag_gf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xac"), ":flag_gg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xad"), ":flag_gh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xae"), ":flag_gi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb1"), ":flag_gl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb2"), ":flag_gm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb3"), ":flag_gn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb5"), ":flag_gp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb6"), ":flag_gq:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb7"), ":flag_gr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb8"), ":flag_gs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb9"), ":flag_gt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xba"), ":flag_gu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbc"), ":flag_gw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbe"), ":flag_gy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb0"), ":flag_hk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb2"), ":flag_hm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb3"), ":flag_hn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb7"), ":flag_hr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb9"), ":flag_ht:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xba"), ":flag_hu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa8"), ":flag_ic:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa9"), ":flag_id:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xaa"), ":flag_ie:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb1"), ":flag_il:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb2"), ":flag_im:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb3"), ":flag_in:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb4"), ":flag_io:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb6"), ":flag_iq:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb7"), ":flag_ir:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb8"), ":flag_is:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"), ":flag_it:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xaa"), ":flag_je:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb2"), ":flag_jm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb4"), ":flag_jo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"), ":flag_jp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xaa"), ":flag_ke:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xac"), ":flag_kg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xad"), ":flag_kh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xae"), ":flag_ki:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb2"), ":flag_km:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb3"), ":flag_kn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb5"), ":flag_kp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"), ":flag_kr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbc"), ":flag_kw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbe"), ":flag_ky:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbf"), ":flag_kz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa6"), ":flag_la:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa7"), ":flag_lb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa8"), ":flag_lc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xae"), ":flag_li:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb0"), ":flag_lk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb7"), ":flag_lr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb8"), ":flag_ls:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb9"), ":flag_lt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xba"), ":flag_lu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbb"), ":flag_lv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbe"), ":flag_ly:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa6"), ":flag_ma:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa8"), ":flag_mc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa9"), ":flag_md:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xaa"), ":flag_me:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xab"), ":flag_mf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xac"), ":flag_mg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xad"), ":flag_mh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb0"), ":flag_mk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb1"), ":flag_ml:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb2"), ":flag_mm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb3"), ":flag_mn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb4"), ":flag_mo:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb5"), ":flag_mp:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb6"), ":flag_mq:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb7"), ":flag_mr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb8"), ":flag_ms:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb9"), ":flag_mt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xba"), ":flag_mu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbb"), ":flag_mv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbc"), ":flag_mw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbd"), ":flag_mx:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbe"), ":flag_my:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbf"), ":flag_mz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa6"), ":flag_na:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa8"), ":flag_nc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xaa"), ":flag_ne:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xab"), ":flag_nf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xac"), ":flag_ng:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xae"), ":flag_ni:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb1"), ":flag_nl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb4"), ":flag_no:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb5"), ":flag_np:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb7"), ":flag_nr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xba"), ":flag_nu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xbf"), ":flag_nz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb4\xf0\x9f\x87\xb2"), ":flag_om:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xa6"), ":flag_pa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xaa"), ":flag_pe:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xab"), ":flag_pf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xac"), ":flag_pg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xad"), ":flag_ph:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb0"), ":flag_pk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb1"), ":flag_pl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb2"), ":flag_pm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb3"), ":flag_pn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb7"), ":flag_pr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb8"), ":flag_ps:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb9"), ":flag_pt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbc"), ":flag_pw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbe"), ":flag_py:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb6\xf0\x9f\x87\xa6"), ":flag_qa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xaa"), ":flag_re:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb4"), ":flag_ro:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb8"), ":flag_rs:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"), ":flag_ru:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xbc"), ":flag_rw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa6"), ":flag_sa:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa7"), ":flag_sb:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa8"), ":flag_sc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa9"), ":flag_sd:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaa"), ":flag_se:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xac"), ":flag_sg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xad"), ":flag_sh:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xae"), ":flag_si:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaf"), ":flag_sj:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb0"), ":flag_sk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb1"), ":flag_sl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb2"), ":flag_sm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb3"), ":flag_sn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb4"), ":flag_so:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb7"), ":flag_sr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb8"), ":flag_ss:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb9"), ":flag_st:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbb"), ":flag_sv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbd"), ":flag_sx:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbe"), ":flag_sy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbf"), ":flag_sz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa6"), ":flag_ta:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa8"), ":flag_tc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa9"), ":flag_td:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xab"), ":flag_tf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xac"), ":flag_tg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xad"), ":flag_th:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xaf"), ":flag_tj:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb0"), ":flag_tk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb1"), ":flag_tl:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb2"), ":flag_tm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb3"), ":flag_tn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb4"), ":flag_to:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb7"), ":flag_tr:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb9"), ":flag_tt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbb"), ":flag_tv:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbc"), ":flag_tw:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbf"), ":flag_tz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xa6"), ":flag_ua:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xac"), ":flag_ug:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb2"), ":flag_um:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"), ":flag_us:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbe"), ":flag_uy:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbf"), ":flag_uz:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa6"), ":flag_va:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa8"), ":flag_vc:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xaa"), ":flag_ve:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xac"), ":flag_vg:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xae"), ":flag_vi:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xb3"), ":flag_vn:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xba"), ":flag_vu:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xab"), ":flag_wf:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xb8"), ":flag_ws:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbd\xf0\x9f\x87\xb0"), ":flag_xk:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xaa"), ":flag_ye:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xb9"), ":flag_yt:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xa6"), ":flag_za:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xb2"), ":flag_zm:" }, - Emoji{ QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xbc"), ":flag_zw:" }, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa8"), ":flag_ac:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa9"), ":flag_ad:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xaa"), ":flag_ae:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xab"), ":flag_af:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xac"), ":flag_ag:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xae"), ":flag_ai:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb1"), ":flag_al:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb2"), ":flag_am:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb4"), ":flag_ao:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb6"), ":flag_aq:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb7"), ":flag_ar:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb8"), ":flag_as:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb9"), ":flag_at:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xba"), ":flag_au:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbc"), ":flag_aw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbd"), ":flag_ax:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbf"), ":flag_az:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa6"), ":flag_ba:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa7"), ":flag_bb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa9"), ":flag_bd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaa"), ":flag_be:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xab"), ":flag_bf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xac"), ":flag_bg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xad"), ":flag_bh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xae"), ":flag_bi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaf"), ":flag_bj:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb1"), ":flag_bl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb2"), ":flag_bm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb3"), ":flag_bn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb4"), ":flag_bo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb6"), ":flag_bq:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb7"), ":flag_br:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb8"), ":flag_bs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb9"), ":flag_bt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbb"), ":flag_bv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbc"), ":flag_bw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbe"), ":flag_by:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbf"), ":flag_bz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa6"), ":flag_ca:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa8"), ":flag_cc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa9"), ":flag_cd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xab"), ":flag_cf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xac"), ":flag_cg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xad"), ":flag_ch:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xae"), ":flag_ci:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb0"), ":flag_ck:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb1"), ":flag_cl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb2"), ":flag_cm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"), ":flag_cn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb4"), ":flag_co:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb5"), ":flag_cp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb7"), ":flag_cr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xba"), ":flag_cu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbb"), ":flag_cv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbc"), ":flag_cw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbd"), ":flag_cx:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbe"), ":flag_cy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbf"), ":flag_cz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"), ":flag_de:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xac"), ":flag_dg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaf"), ":flag_dj:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb0"), ":flag_dk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb2"), ":flag_dm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb4"), ":flag_do:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xbf"), ":flag_dz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa6"), ":flag_ea:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa8"), ":flag_ec:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xaa"), ":flag_ee:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xac"), ":flag_eg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xad"), ":flag_eh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb7"), ":flag_er:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"), ":flag_es:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb9"), ":flag_et:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xba"), ":flag_eu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xae"), ":flag_fi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xaf"), ":flag_fj:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb0"), ":flag_fk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb2"), ":flag_fm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb4"), ":flag_fo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"), ":flag_fr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa6"), ":flag_ga:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"), ":flag_gb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa9"), ":flag_gd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xaa"), ":flag_ge:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xab"), ":flag_gf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xac"), ":flag_gg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xad"), ":flag_gh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xae"), ":flag_gi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb1"), ":flag_gl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb2"), ":flag_gm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb3"), ":flag_gn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb5"), ":flag_gp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb6"), ":flag_gq:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb7"), ":flag_gr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb8"), ":flag_gs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb9"), ":flag_gt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xba"), ":flag_gu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbc"), ":flag_gw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbe"), ":flag_gy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb0"), ":flag_hk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb2"), ":flag_hm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb3"), ":flag_hn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb7"), ":flag_hr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb9"), ":flag_ht:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xba"), ":flag_hu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa8"), ":flag_ic:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa9"), ":flag_id:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xaa"), ":flag_ie:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb1"), ":flag_il:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb2"), ":flag_im:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb3"), ":flag_in:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb4"), ":flag_io:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb6"), ":flag_iq:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb7"), ":flag_ir:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb8"), ":flag_is:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"), ":flag_it:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xaa"), ":flag_je:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb2"), ":flag_jm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb4"), ":flag_jo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"), ":flag_jp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xaa"), ":flag_ke:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xac"), ":flag_kg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xad"), ":flag_kh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xae"), ":flag_ki:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb2"), ":flag_km:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb3"), ":flag_kn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb5"), ":flag_kp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"), ":flag_kr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbc"), ":flag_kw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbe"), ":flag_ky:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbf"), ":flag_kz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa6"), ":flag_la:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa7"), ":flag_lb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa8"), ":flag_lc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xae"), ":flag_li:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb0"), ":flag_lk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb7"), ":flag_lr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb8"), ":flag_ls:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb9"), ":flag_lt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xba"), ":flag_lu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbb"), ":flag_lv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbe"), ":flag_ly:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa6"), ":flag_ma:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa8"), ":flag_mc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa9"), ":flag_md:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xaa"), ":flag_me:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xab"), ":flag_mf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xac"), ":flag_mg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xad"), ":flag_mh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb0"), ":flag_mk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb1"), ":flag_ml:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb2"), ":flag_mm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb3"), ":flag_mn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb4"), ":flag_mo:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb5"), ":flag_mp:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb6"), ":flag_mq:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb7"), ":flag_mr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb8"), ":flag_ms:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb9"), ":flag_mt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xba"), ":flag_mu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbb"), ":flag_mv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbc"), ":flag_mw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbd"), ":flag_mx:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbe"), ":flag_my:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbf"), ":flag_mz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa6"), ":flag_na:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa8"), ":flag_nc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xaa"), ":flag_ne:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xab"), ":flag_nf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xac"), ":flag_ng:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xae"), ":flag_ni:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb1"), ":flag_nl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb4"), ":flag_no:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb5"), ":flag_np:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb7"), ":flag_nr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xba"), ":flag_nu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xbf"), ":flag_nz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb4\xf0\x9f\x87\xb2"), ":flag_om:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xa6"), ":flag_pa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xaa"), ":flag_pe:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xab"), ":flag_pf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xac"), ":flag_pg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xad"), ":flag_ph:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb0"), ":flag_pk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb1"), ":flag_pl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb2"), ":flag_pm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb3"), ":flag_pn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb7"), ":flag_pr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb8"), ":flag_ps:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb9"), ":flag_pt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbc"), ":flag_pw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbe"), ":flag_py:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb6\xf0\x9f\x87\xa6"), ":flag_qa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xaa"), ":flag_re:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb4"), ":flag_ro:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb8"), ":flag_rs:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"), ":flag_ru:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xbc"), ":flag_rw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa6"), ":flag_sa:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa7"), ":flag_sb:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa8"), ":flag_sc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa9"), ":flag_sd:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaa"), ":flag_se:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xac"), ":flag_sg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xad"), ":flag_sh:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xae"), ":flag_si:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaf"), ":flag_sj:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb0"), ":flag_sk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb1"), ":flag_sl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb2"), ":flag_sm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb3"), ":flag_sn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb4"), ":flag_so:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb7"), ":flag_sr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb8"), ":flag_ss:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb9"), ":flag_st:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbb"), ":flag_sv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbd"), ":flag_sx:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbe"), ":flag_sy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbf"), ":flag_sz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa6"), ":flag_ta:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa8"), ":flag_tc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa9"), ":flag_td:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xab"), ":flag_tf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xac"), ":flag_tg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xad"), ":flag_th:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xaf"), ":flag_tj:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb0"), ":flag_tk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb1"), ":flag_tl:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb2"), ":flag_tm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb3"), ":flag_tn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb4"), ":flag_to:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb7"), ":flag_tr:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb9"), ":flag_tt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbb"), ":flag_tv:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbc"), ":flag_tw:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbf"), ":flag_tz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xa6"), ":flag_ua:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xac"), ":flag_ug:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb2"), ":flag_um:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"), ":flag_us:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbe"), ":flag_uy:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbf"), ":flag_uz:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa6"), ":flag_va:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa8"), ":flag_vc:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xaa"), ":flag_ve:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xac"), ":flag_vg:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xae"), ":flag_vi:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xb3"), ":flag_vn:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xba"), ":flag_vu:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xab"), ":flag_wf:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xb8"), ":flag_ws:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbd\xf0\x9f\x87\xb0"), ":flag_xk:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xaa"), ":flag_ye:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xb9"), ":flag_yt:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xa6"), ":flag_za:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xb2"), ":flag_zm:"}, + Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xbc"), ":flag_zw:"}, }; diff --git a/src/ImageItem.cc b/src/ImageItem.cc index 39fa630f..333fd296 100644 --- a/src/ImageItem.cc +++ b/src/ImageItem.cc @@ -32,8 +32,8 @@ ImageItem::ImageItem(QSharedPointer client, const events::MessageEvent &event, QWidget *parent) : QWidget(parent) - , event_{ event } - , client_{ client } + , event_{event} + , client_{client} { setMouseTracking(true); setCursor(Qt::PointingHandCursor); @@ -66,9 +66,9 @@ ImageItem::ImageItem(QSharedPointer client, const QString &filename, QWidget *parent) : QWidget(parent) - , url_{ url } - , text_{ QFileInfo(filename).fileName() } - , client_{ client } + , url_{url} + , text_{QFileInfo(filename).fileName()} + , client_{client} { setMouseTracking(true); setCursor(Qt::PointingHandCursor); diff --git a/src/ImageOverlayDialog.cc b/src/ImageOverlayDialog.cc index 8d6db45e..7dd4a226 100644 --- a/src/ImageOverlayDialog.cc +++ b/src/ImageOverlayDialog.cc @@ -22,8 +22,8 @@ #include "ImageOverlayDialog.h" ImageOverlayDialog::ImageOverlayDialog(QPixmap image, QWidget *parent) - : QWidget{ parent } - , originalImage_{ image } + : QWidget{parent} + , originalImage_{image} { setMouseTracking(true); setParent(0); diff --git a/src/Login.cc b/src/Login.cc index 32652cd8..09c333ca 100644 --- a/src/Login.cc +++ b/src/Login.cc @@ -41,10 +41,10 @@ LoginRequest::serialize() noexcept #endif QJsonObject body{ - { "type", "m.login.password" }, - { "user", user_ }, - { "password", password_ }, - { "initial_device_display_name", initialDeviceName }, + {"type", "m.login.password"}, + {"user", user_}, + {"password", password_}, + {"initial_device_display_name", initialDeviceName}, }; return QJsonDocument(body).toJson(QJsonDocument::Compact); diff --git a/src/LoginPage.cc b/src/LoginPage.cc index 85378c53..e4c55c0d 100644 --- a/src/LoginPage.cc +++ b/src/LoginPage.cc @@ -28,7 +28,7 @@ LoginPage::LoginPage(QSharedPointer client, QWidget *parent) : QWidget(parent) , inferredServerAddress_() - , client_{ client } + , client_{client} { setStyleSheet("background-color: #fff"); diff --git a/src/MainWindow.cc b/src/MainWindow.cc index 23937d5e..4e3389ef 100644 --- a/src/MainWindow.cc +++ b/src/MainWindow.cc @@ -31,36 +31,36 @@ #include "RegisterPage.h" #include "SnackBar.h" #include "TrayIcon.h" +#include "UserSettingsPage.h" #include "WelcomePage.h" MainWindow *MainWindow::instance_ = nullptr; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) - , progressModal_{ nullptr } - , spinner_{ nullptr } + , progressModal_{nullptr} + , spinner_{nullptr} { - QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - setSizePolicy(sizePolicy); setWindowTitle("nheko"); setObjectName("MainWindow"); setStyleSheet("QWidget#MainWindow {background-color: #fff}"); restoreWindowSize(); - setMinimumSize(QSize(conf::window::minWidth, conf::window::minHeight)); QFont font("Open Sans"); font.setPixelSize(conf::fontSize); font.setStyleStrategy(QFont::PreferAntialias); setFont(font); - client_ = QSharedPointer(new MatrixClient("matrix.org")); - trayIcon_ = new TrayIcon(":/logos/nheko-32.png", this); + client_ = QSharedPointer(new MatrixClient("matrix.org")); + userSettings_ = QSharedPointer(new UserSettings); + trayIcon_ = new TrayIcon(":/logos/nheko-32.png", this); - welcome_page_ = new WelcomePage(this); - login_page_ = new LoginPage(client_, this); - register_page_ = new RegisterPage(client_, this); - chat_page_ = new ChatPage(client_, this); + welcome_page_ = new WelcomePage(this); + login_page_ = new LoginPage(client_, this); + register_page_ = new RegisterPage(client_, this); + chat_page_ = new ChatPage(client_, this); + userSettingsPage_ = new UserSettingsPage(userSettings_, this); // Initialize sliding widget manager. pageStack_ = new QStackedWidget(this); @@ -68,6 +68,7 @@ MainWindow::MainWindow(QWidget *parent) pageStack_->addWidget(login_page_); pageStack_->addWidget(register_page_); pageStack_->addWidget(chat_page_); + pageStack_->addWidget(userSettingsPage_); setCentralWidget(pageStack_); @@ -86,12 +87,21 @@ MainWindow::MainWindow(QWidget *parent) showLoginPage(); }); + connect(userSettingsPage_, &UserSettingsPage::moveBack, this, [=]() { + pageStack_->setCurrentWidget(chat_page_); + }); + + connect( + userSettingsPage_, SIGNAL(trayOptionChanged(bool)), trayIcon_, SLOT(setVisible(bool))); + connect(trayIcon_, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); connect(chat_page_, SIGNAL(contentLoaded()), this, SLOT(removeOverlayProgressBar())); + connect( + chat_page_, &ChatPage::showUserSettingsPage, this, &MainWindow::showUserSettingsPage); connect(client_.data(), SIGNAL(loginSuccess(QString, QString, QString)), @@ -101,8 +111,15 @@ MainWindow::MainWindow(QWidget *parent) QShortcut *quitShortcut = new QShortcut(QKeySequence::Quit, this); connect(quitShortcut, &QShortcut::activated, this, QApplication::quit); + QShortcut *quickSwitchShortcut = new QShortcut(QKeySequence("Ctrl+K"), this); + connect(quickSwitchShortcut, &QShortcut::activated, this, [=]() { + chat_page_->showQuickSwitcher(); + }); + QSettings settings; + trayIcon_->setVisible(userSettings_->isTrayEnabled()); + if (hasActiveUser()) { QString token = settings.value("auth/access_token").toString(); QString home_server = settings.value("auth/home_server").toString(); @@ -234,10 +251,16 @@ MainWindow::showRegisterPage() pageStack_->setCurrentWidget(register_page_); } +void +MainWindow::showUserSettingsPage() +{ + pageStack_->setCurrentWidget(userSettingsPage_); +} + void MainWindow::closeEvent(QCloseEvent *event) { - if (isVisible()) { + if (isVisible() && userSettings_->isTrayEnabled()) { event->ignore(); hide(); } diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc index 1c0658a6..c3edf997 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc @@ -38,9 +38,9 @@ MatrixClient::MatrixClient(QString server, QObject *parent) : QNetworkAccessManager(parent) - , clientApiUrl_{ "/_matrix/client/r0" } - , mediaApiUrl_{ "/_matrix/media/r0" } - , server_{ "https://" + server } + , clientApiUrl_{"/_matrix/client/r0"} + , mediaApiUrl_{"/_matrix/media/r0"} + , server_{"https://" + server} { QSettings settings; txn_id_ = settings.value("client/transaction_id", 1).toInt(); @@ -69,7 +69,7 @@ MatrixClient::login(const QString &username, const QString &password) noexcept { QUrl endpoint(server_); endpoint.setPath(clientApiUrl_ + "/login"); - + QNetworkRequest request(endpoint); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); @@ -119,7 +119,6 @@ MatrixClient::login(const QString &username, const QString &password) noexcept } }); } - void MatrixClient::logout() noexcept { @@ -260,9 +259,11 @@ MatrixClient::sync() noexcept } void -MatrixClient::sendRoomMessage(matrix::events::MessageEventType ty, +MatrixClient::sendRoomMessage(mtx::events::MessageType ty, + int txnId, const QString &roomid, const QString &msg, + const QFileInfo &fileinfo, const QString &url) noexcept { QUrlQuery query; @@ -940,3 +941,53 @@ MatrixClient::leaveRoom(const QString &roomId) emit leftRoom(roomId); }); } + +void +MatrixClient::sendTypingNotification(const QString &roomid, int timeoutInMillis) +{ + QSettings settings; + QString user_id = settings.value("auth/user_id").toString(); + + QUrlQuery query; + query.addQueryItem("access_token", token_); + + QUrl endpoint(server_); + endpoint.setPath(clientApiUrl_ + QString("/rooms/%1/typing/%2").arg(roomid).arg(user_id)); + + endpoint.setQuery(query); + + QString msgType(""); + QJsonObject body; + + body = {{"typing", true}, {"timeout", timeoutInMillis}}; + + QNetworkRequest request(QString(endpoint.toEncoded())); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + put(request, QJsonDocument(body).toJson(QJsonDocument::Compact)); +} + +void +MatrixClient::removeTypingNotification(const QString &roomid) +{ + QSettings settings; + QString user_id = settings.value("auth/user_id").toString(); + + QUrlQuery query; + query.addQueryItem("access_token", token_); + + QUrl endpoint(server_); + endpoint.setPath(clientApiUrl_ + QString("/rooms/%1/typing/%2").arg(roomid).arg(user_id)); + + endpoint.setQuery(query); + + QString msgType(""); + QJsonObject body; + + body = {{"typing", false}}; + + QNetworkRequest request(QString(endpoint.toEncoded())); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + put(request, QJsonDocument(body).toJson(QJsonDocument::Compact)); +} diff --git a/src/QuickSwitcher.cc b/src/QuickSwitcher.cc index 542eebd9..2be636a4 100644 --- a/src/QuickSwitcher.cc +++ b/src/QuickSwitcher.cc @@ -122,7 +122,16 @@ QuickSwitcher::QuickSwitcher(QWidget *parent) roomSearch_, &RoomSearchInput::hiding, this, [=]() { completer_->popup()->hide(); }); connect(roomSearch_, &QLineEdit::returnPressed, this, [=]() { emit closing(); - emit roomSelected(rooms_[this->roomSearch_->text().trimmed()]); + + QString text(""); + + if (selection_ == -1) { + completer_->setCurrentRow(0); + text = completer_->currentCompletion(); + } else { + text = this->roomSearch_->text().trimmed(); + } + emit roomSelected(rooms_[text]); roomSearch_->clear(); }); diff --git a/src/Register.cc b/src/Register.cc index 7453c943..84ba82e7 100644 --- a/src/Register.cc +++ b/src/Register.cc @@ -27,7 +27,7 @@ RegisterRequest::RegisterRequest(const QString &username, const QString &passwor QByteArray RegisterRequest::serialize() noexcept { - QJsonObject body{ { "username", user_ }, { "password", password_ } }; + QJsonObject body{{"username", user_}, {"password", password_}}; return QJsonDocument(body).toJson(QJsonDocument::Compact); } diff --git a/src/RoomInfoListItem.cc b/src/RoomInfoListItem.cc index 7692dce6..23fabb4f 100644 --- a/src/RoomInfoListItem.cc +++ b/src/RoomInfoListItem.cc @@ -33,7 +33,7 @@ RoomInfoListItem::RoomInfoListItem(QSharedPointer settings, : QWidget(parent) , state_(state) , roomId_(room_id) - , roomSettings_{ settings } + , roomSettings_{settings} , isPressed_(false) , maxHeight_(IconSize + 2 * Padding) , unreadMsgCount_(0) diff --git a/src/RoomList.cc b/src/RoomList.cc index 30397dd0..edb1aaaf 100644 --- a/src/RoomList.cc +++ b/src/RoomList.cc @@ -33,12 +33,8 @@ RoomList::RoomList(QSharedPointer client, QWidget *parent) : QWidget(parent) , client_(client) { - setStyleSheet("QWidget { border: none; }"); - - QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - setSizePolicy(sizePolicy); + setStyleSheet( + "border: 1px solid #ccc; border-right: 0px solid #000; border-left: 0px solid #000;"); topLayout_ = new QVBoxLayout(this); topLayout_->setSpacing(0); @@ -51,7 +47,7 @@ RoomList::RoomList(QSharedPointer client, QWidget *parent) scrollArea_->setWidgetResizable(true); scrollArea_->setAlignment(Qt::AlignLeading | Qt::AlignTop | Qt::AlignVCenter); - scrollAreaContents_ = new QWidget(); + scrollAreaContents_ = new QWidget(this); contentsLayout_ = new QVBoxLayout(scrollAreaContents_); contentsLayout_->setSpacing(0); diff --git a/src/SideBarActions.cc b/src/SideBarActions.cc index 1484bd00..3e741406 100644 --- a/src/SideBarActions.cc +++ b/src/SideBarActions.cc @@ -5,13 +5,10 @@ #include "Theme.h" SideBarActions::SideBarActions(QWidget *parent) - : QWidget{ parent } + : QWidget{parent} { setFixedHeight(conf::sidebarActions::height); - QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - setSizePolicy(sizePolicy); - layout_ = new QHBoxLayout(this); layout_->setMargin(0); @@ -45,6 +42,8 @@ SideBarActions::SideBarActions(QWidget *parent) layout_->addWidget(createRoomBtn_); layout_->addWidget(joinRoomBtn_); layout_->addWidget(settingsBtn_); + + connect(settingsBtn_, &QPushButton::clicked, this, &SideBarActions::showSettings); } SideBarActions::~SideBarActions() {} diff --git a/src/TextInputWidget.cc b/src/TextInputWidget.cc index eba66fc7..ad053ea3 100644 --- a/src/TextInputWidget.cc +++ b/src/TextInputWidget.cc @@ -15,6 +15,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -25,19 +26,143 @@ #include "Config.h" #include "TextInputWidget.h" +static constexpr size_t INPUT_HISTORY_SIZE = 127; + FilteredTextEdit::FilteredTextEdit(QWidget *parent) - : QTextEdit(parent) + : QTextEdit{parent} + , history_index_{0} { + connect(document()->documentLayout(), + &QAbstractTextDocumentLayout::documentSizeChanged, + this, + &FilteredTextEdit::updateGeometry); + QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Fixed); + policy.setHeightForWidth(true); + setSizePolicy(policy); + working_history_.push_back(""); + connect(this, &QTextEdit::textChanged, this, &FilteredTextEdit::textChanged); setAcceptRichText(false); + + typingTimer_ = new QTimer(this); + typingTimer_->setInterval(1000); + typingTimer_->setSingleShot(true); + + connect(typingTimer_, &QTimer::timeout, this, &FilteredTextEdit::stopTyping); } void FilteredTextEdit::keyPressEvent(QKeyEvent *event) { - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) - emit enterPressed(); - else + const bool isModifier = (event->modifiers() != Qt::NoModifier); + + if (!isModifier) { + if (!typingTimer_->isActive()) + emit startedTyping(); + + typingTimer_->start(); + } + + switch (event->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + if (!(event->modifiers() & Qt::ShiftModifier)) { + stopTyping(); + submit(); + } else { + QTextEdit::keyPressEvent(event); + } + break; + case Qt::Key_Up: { + auto initial_cursor = textCursor(); QTextEdit::keyPressEvent(event); + if (textCursor() == initial_cursor && + history_index_ + 1 < working_history_.size()) { + ++history_index_; + setPlainText(working_history_[history_index_]); + moveCursor(QTextCursor::End); + } + break; + } + case Qt::Key_Down: { + auto initial_cursor = textCursor(); + QTextEdit::keyPressEvent(event); + if (textCursor() == initial_cursor && history_index_ > 0) { + --history_index_; + setPlainText(working_history_[history_index_]); + moveCursor(QTextCursor::End); + } + break; + } + default: + QTextEdit::keyPressEvent(event); + break; + } +} + +void +FilteredTextEdit::stopTyping() +{ + typingTimer_->stop(); + emit stoppedTyping(); +} + +QSize +FilteredTextEdit::sizeHint() const +{ + ensurePolished(); + auto margins = viewportMargins(); + margins += document()->documentMargin(); + QSize size = document()->size().toSize(); + size.rwidth() += margins.left() + margins.right(); + size.rheight() += margins.top() + margins.bottom(); + return size; +} + +QSize +FilteredTextEdit::minimumSizeHint() const +{ + ensurePolished(); + auto margins = viewportMargins(); + margins += document()->documentMargin(); + margins += contentsMargins(); + QSize size(fontMetrics().averageCharWidth() * 10, + fontMetrics().lineSpacing() + margins.top() + margins.bottom()); + return size; +} + +void +FilteredTextEdit::submit() +{ + if (true_history_.size() == INPUT_HISTORY_SIZE) + true_history_.pop_back(); + true_history_.push_front(toPlainText()); + working_history_ = true_history_; + working_history_.push_front(""); + history_index_ = 0; + + QString text = toPlainText(); + if (text.startsWith('/')) { + int command_end = text.indexOf(' '); + if (command_end == -1) + command_end = text.size(); + auto name = text.mid(1, command_end - 1); + auto args = text.mid(command_end + 1); + if (name.isEmpty() || name == "/") { + message(args); + } else { + command(name, args); + } + } else { + message(std::move(text)); + } + + clear(); +} + +void +FilteredTextEdit::textChanged() +{ + working_history_[history_index_] = toPlainText(); } TextInputWidget::TextInputWidget(QWidget *parent) @@ -97,13 +222,18 @@ TextInputWidget::TextInputWidget(QWidget *parent) setLayout(topLayout_); - connect(sendMessageBtn_, SIGNAL(clicked()), this, SLOT(onSendButtonClicked())); + connect(sendMessageBtn_, &FlatButton::clicked, input_, &FilteredTextEdit::submit); connect(sendFileBtn_, SIGNAL(clicked()), this, SLOT(openFileSelection())); - connect(input_, SIGNAL(enterPressed()), sendMessageBtn_, SIGNAL(clicked())); + connect(input_, &FilteredTextEdit::message, this, &TextInputWidget::sendTextMessage); + connect(input_, &FilteredTextEdit::command, this, &TextInputWidget::command); connect(emojiBtn_, SIGNAL(emojiSelected(const QString &)), this, SLOT(addSelectedEmoji(const QString &))); + + connect(input_, &FilteredTextEdit::startedTyping, this, &TextInputWidget::startedTyping); + + connect(input_, &FilteredTextEdit::stoppedTyping, this, &TextInputWidget::stoppedTyping); } void @@ -131,50 +261,13 @@ TextInputWidget::addSelectedEmoji(const QString &emoji) } void -TextInputWidget::onSendButtonClicked() +TextInputWidget::command(QString command, QString args) { - auto msgText = input_->document()->toPlainText().trimmed(); - - if (msgText.isEmpty()) - return; - - if (msgText.startsWith(EMOTE_COMMAND)) { - auto text = parseEmoteCommand(msgText); - - if (!text.isEmpty()) - emit sendEmoteMessage(text); - } else if (msgText.startsWith(JOIN_COMMAND)) { - auto room = parseJoinCommand(msgText); - - if (!room.isEmpty()) - emit sendJoinRoomRequest(room); - } else { - emit sendTextMessage(msgText); + if (command == "me") { + sendEmoteMessage(args); + } else if (command == "join") { + sendJoinRoomRequest(args); } - - input_->clear(); -} - -QString -TextInputWidget::parseJoinCommand(const QString &cmd) -{ - auto room = cmd.right(cmd.size() - JOIN_COMMAND.size()).trimmed(); - - if (!room.isEmpty()) - return room; - - return QString(""); -} - -QString -TextInputWidget::parseEmoteCommand(const QString &cmd) -{ - auto text = cmd.right(cmd.size() - EMOTE_COMMAND.size()).trimmed(); - - if (!text.isEmpty()) - return text; - - return QString(""); } void @@ -226,6 +319,16 @@ TextInputWidget::hideUploadSpinner() spinner_->stop(); } -TextInputWidget::~TextInputWidget() +TextInputWidget::~TextInputWidget() {} + +void +TextInputWidget::stopTyping() { + input_->stopTyping(); +} + +void +TextInputWidget::focusInEvent(QFocusEvent *event) +{ + input_->setFocus(event->reason()); } diff --git a/src/TimelineItem.cc b/src/TimelineItem.cc index 1f310a77..21e9a875 100644 --- a/src/TimelineItem.cc +++ b/src/TimelineItem.cc @@ -85,15 +85,15 @@ TimelineItem::TimelineItem(events::MessageEventType ty, if (ty == events::MessageEventType::Emote) { body = QString("* %1 %2").arg(displayName).arg(body); - descriptionMsg_ = { "", userid, body, descriptiveTime(timestamp) }; + descriptionMsg_ = {"", userid, body, descriptiveTime(timestamp)}; } else { descriptionMsg_ = { - "You: ", userid, body, descriptiveTime(QDateTime::currentDateTime()) - }; + "You: ", userid, body, descriptiveTime(QDateTime::currentDateTime())}; } body = body.toHtmlEscaped(); body.replace(URL_REGEX, URL_HTML); + body.replace("\n", "
"); generateTimestamp(timestamp); if (withSender) { @@ -114,14 +114,14 @@ TimelineItem::TimelineItem(ImageItem *image, const QString &userid, bool withSender, QWidget *parent) - : QWidget{ parent } + : QWidget{parent} { init(); auto displayName = TimelineViewManager::displayName(userid); auto timestamp = QDateTime::currentDateTime(); - descriptionMsg_ = { "You", userid, " sent an image", descriptiveTime(timestamp) }; + descriptionMsg_ = {"You", userid, " sent an image", descriptiveTime(timestamp)}; generateTimestamp(timestamp); @@ -158,10 +158,10 @@ TimelineItem::TimelineItem(ImageItem *image, auto displayName = TimelineViewManager::displayName(event.sender()); QSettings settings; - descriptionMsg_ = { event.sender() == settings.value("auth/user_id") ? "You" : displayName, - event.sender(), - " sent an image", - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp())) }; + descriptionMsg_ = {event.sender() == settings.value("auth/user_id") ? "You" : displayName, + event.sender(), + " sent an image", + descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp()))}; generateTimestamp(timestamp); @@ -193,10 +193,10 @@ TimelineItem::TimelineItem(const events::MessageEvent &event, : QWidget(parent) { init(); - descriptionMsg_ = { TimelineViewManager::displayName(event.sender()), - event.sender(), - " sent a notification", - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp())) }; + descriptionMsg_ = {TimelineViewManager::displayName(event.sender()), + event.sender(), + " sent a notification", + descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp()))}; auto body = event.content().body().trimmed().toHtmlEscaped(); auto timestamp = QDateTime::fromMSecsSinceEpoch(event.timestamp()); @@ -204,6 +204,7 @@ TimelineItem::TimelineItem(const events::MessageEvent &event, generateTimestamp(timestamp); body.replace(URL_REGEX, URL_HTML); + body.replace("\n", "
"); body = "" + body + ""; if (with_sender) { @@ -238,14 +239,15 @@ TimelineItem::TimelineItem(const events::MessageEvent &event, auto displayName = TimelineViewManager::displayName(event.sender()); auto emoteMsg = QString("* %1 %2").arg(displayName).arg(body); - descriptionMsg_ = { "", - event.sender(), - emoteMsg, - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp())) }; + descriptionMsg_ = {"", + event.sender(), + emoteMsg, + descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp()))}; generateTimestamp(timestamp); emoteMsg = emoteMsg.toHtmlEscaped(); emoteMsg.replace(URL_REGEX, URL_HTML); + emoteMsg.replace("\n", "
"); if (with_sender) { generateBody(displayName, emoteMsg); @@ -276,15 +278,16 @@ TimelineItem::TimelineItem(const events::MessageEvent &event, auto displayName = TimelineViewManager::displayName(event.sender()); QSettings settings; - descriptionMsg_ = { event.sender() == settings.value("auth/user_id") ? "You" : displayName, - event.sender(), - QString(": %1").arg(body), - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp())) }; + descriptionMsg_ = {event.sender() == settings.value("auth/user_id") ? "You" : displayName, + event.sender(), + QString(": %1").arg(body), + descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp()))}; generateTimestamp(timestamp); body = body.toHtmlEscaped(); body.replace(URL_REGEX, URL_HTML); + body.replace("\n", "
"); if (with_sender) { generateBody(displayName, body); diff --git a/src/TimelineView.cc b/src/TimelineView.cc index 354a725c..5cc5b149 100644 --- a/src/TimelineView.cc +++ b/src/TimelineView.cc @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -49,8 +50,8 @@ TimelineView::TimelineView(const Timeline &timeline, const QString &room_id, QWidget *parent) : QWidget(parent) - , room_id_{ room_id } - , client_{ client } + , room_id_{room_id} + , client_{client} { init(); addEvents(timeline); @@ -60,8 +61,8 @@ TimelineView::TimelineView(QSharedPointer client, const QString &room_id, QWidget *parent) : QWidget(parent) - , room_id_{ room_id } - , client_{ client } + , room_id_{room_id} + , client_{client} { init(); client_->messages(room_id_, ""); @@ -179,6 +180,10 @@ TimelineView::addBackwardsEvents(const QString &room_id, const RoomMessages &msg isTimelineFinished = false; QList items; + // Reset the sender of the first message in the timeline + // cause we're about to insert a new one. + firstSender_.clear(); + // Parse in reverse order to determine where we should not show sender's // name. auto ii = msgs.chunk().size(); @@ -241,9 +246,10 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire eventIds_[text.eventId()] = true; - if (isPendingMessage( - text.eventId(), text.content().body(), text.sender(), local_user_)) { - removePendingMessage(text.eventId(), text.content().body()); + QString txnid = text.unsignedData().transactionId(); + if (!txnid.isEmpty() && + isPendingMessage(txnid, text.sender(), local_user_)) { + removePendingMessage(txnid); return nullptr; } @@ -287,9 +293,10 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire eventIds_[img.eventId()] = true; - if (isPendingMessage( - img.eventId(), img.msgContent().url(), img.sender(), local_user_)) { - removePendingMessage(img.eventId(), img.msgContent().url()); + QString txnid = img.unsignedData().transactionId(); + if (!txnid.isEmpty() && + isPendingMessage(txnid, img.sender(), local_user_)) { + removePendingMessage(txnid); return nullptr; } @@ -313,11 +320,10 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire eventIds_[emote.eventId()] = true; - if (isPendingMessage(emote.eventId(), - emote.content().body(), - emote.sender(), - local_user_)) { - removePendingMessage(emote.eventId(), emote.content().body()); + QString txnid = emote.unsignedData().transactionId(); + if (!txnid.isEmpty() && + isPendingMessage(txnid, emote.sender(), local_user_)) { + removePendingMessage(txnid); return nullptr; } @@ -495,16 +501,16 @@ TimelineView::addTimelineItem(TimelineItem *item, TimelineDirection direction) void TimelineView::updatePendingMessage(int txn_id, QString event_id) { - for (auto &msg : pending_msgs_) { - if (msg.txn_id == txn_id) { - msg.event_id = event_id; - break; - } + if (pending_msgs_.head().txn_id == txn_id) { // We haven't received it yet + auto msg = pending_msgs_.dequeue(); + msg.event_id = event_id; + pending_sent_msgs_.append(msg); } + sendNextPendingMessage(); } void -TimelineView::addUserMessage(matrix::events::MessageEventType ty, const QString &body, int txn_id) +TimelineView::addUserMessage(matrix::events::MessageEventType ty, const QString &body) { QSettings settings; auto user_id = settings.value("auth/user_id").toString(); @@ -519,12 +525,13 @@ TimelineView::addUserMessage(matrix::events::MessageEventType ty, const QString lastSender_ = user_id; - PendingMessage message(txn_id, body, "", view_item); - pending_msgs_.push_back(message); + int txn_id = client_->incrementTransactionId(); + PendingMessage message(ty, txn_id, body, "", "", view_item); + handleNewUserMessage(message); } void -TimelineView::addUserMessage(const QString &url, const QString &filename, int txn_id) +TimelineView::addUserMessage(const QString &url, const QString &filename) { QSettings settings; auto user_id = settings.value("auth/user_id").toString(); @@ -541,8 +548,36 @@ TimelineView::addUserMessage(const QString &url, const QString &filename, int tx lastSender_ = user_id; - PendingMessage message(txn_id, url, "", view_item); - pending_msgs_.push_back(message); + int txn_id = client_->incrementTransactionId(); + PendingMessage message( + matrix::events::MessageEventType::Image, txn_id, url, filename, "", view_item); + handleNewUserMessage(message); +} + +void +TimelineView::handleNewUserMessage(PendingMessage msg) +{ + pending_msgs_.enqueue(msg); + if (pending_msgs_.size() == 1 && pending_sent_msgs_.size() == 0) + sendNextPendingMessage(); +} + +void +TimelineView::sendNextPendingMessage() +{ + if (pending_msgs_.size() == 0) + return; + + PendingMessage &m = pending_msgs_.head(); + switch (m.ty) { + case matrix::events::MessageEventType::Image: + client_->sendRoomMessage( + m.ty, m.txn_id, room_id_, QFileInfo(m.filename).fileName(), QFileInfo(m.filename), m.body); + break; + default: + client_->sendRoomMessage(m.ty, m.txn_id, room_id_, m.body, QFileInfo()); + break; + } } void @@ -558,8 +593,7 @@ TimelineView::notifyForLastEvent() } bool -TimelineView::isPendingMessage(const QString &eventid, - const QString &body, +TimelineView::isPendingMessage(const QString &txnid, const QString &sender, const QString &local_userid) { @@ -567,7 +601,12 @@ TimelineView::isPendingMessage(const QString &eventid, return false; for (const auto &msg : pending_msgs_) { - if (msg.event_id == eventid || msg.body == body) + if (QString::number(msg.txn_id) == txnid) + return true; + } + + for (const auto &msg : pending_sent_msgs_) { + if (QString::number(msg.txn_id) == txnid) return true; } @@ -575,14 +614,28 @@ TimelineView::isPendingMessage(const QString &eventid, } void -TimelineView::removePendingMessage(const QString &eventid, const QString &body) +TimelineView::removePendingMessage(const QString &txnid) { + for (auto it = pending_sent_msgs_.begin(); it != pending_sent_msgs_.end(); ++it) { + if (QString::number(it->txn_id) == txnid) { + int index = std::distance(pending_sent_msgs_.begin(), it); + pending_sent_msgs_.removeAt(index); + return; + } + } for (auto it = pending_msgs_.begin(); it != pending_msgs_.end(); ++it) { - int index = std::distance(pending_msgs_.begin(), it); - - if (it->event_id == eventid || it->body == body) { + if (QString::number(it->txn_id) == txnid) { + int index = std::distance(pending_msgs_.begin(), it); pending_msgs_.removeAt(index); - break; + return; } } } + +void +TimelineView::handleFailedMessage(int txnid) +{ + Q_UNUSED(txnid); + // Note: We do this even if the message has already been echoed. + QTimer::singleShot(500, this, SLOT(sendNextPendingMessage())); +} diff --git a/src/TimelineViewManager.cc b/src/TimelineViewManager.cc index c67372da..80e32a92 100644 --- a/src/TimelineViewManager.cc +++ b/src/TimelineViewManager.cc @@ -31,10 +31,15 @@ TimelineViewManager::TimelineViewManager(QSharedPointer client, QW : QStackedWidget(parent) , client_(client) { - setStyleSheet("QWidget { background: #fff; color: #e8e8e8; border: none;}"); + setStyleSheet("border: none;"); connect( client_.data(), &MatrixClient::messageSent, this, &TimelineViewManager::messageSent); + + connect(client_.data(), + &MatrixClient::messageSendFailed, + this, + &TimelineViewManager::messageSendFailed); } TimelineViewManager::~TimelineViewManager() @@ -53,30 +58,34 @@ TimelineViewManager::messageSent(const QString &event_id, const QString &roomid, } void -TimelineViewManager::sendTextMessage(const QString &msg) +TimelineViewManager::messageSendFailed(const QString &roomid, int txn_id) +{ + auto view = views_[roomid]; + view->handleFailedMessage(txn_id); +} + +void +TimelineViewManager::queueTextMessage(const QString &msg) { auto room_id = active_room_; auto view = views_[room_id]; - view->addUserMessage(matrix::events::MessageEventType::Text, msg, client_->transactionId()); - client_->sendRoomMessage(matrix::events::MessageEventType::Text, room_id, msg); + view->addUserMessage(matrix::events::MessageEventType::Text, msg); } void -TimelineViewManager::sendEmoteMessage(const QString &msg) +TimelineViewManager::queueEmoteMessage(const QString &msg) { auto room_id = active_room_; auto view = views_[room_id]; - view->addUserMessage( - matrix::events::MessageEventType::Emote, msg, client_->transactionId()); - client_->sendRoomMessage(matrix::events::MessageEventType::Emote, room_id, msg); + view->addUserMessage(matrix::events::MessageEventType::Emote, msg); } void -TimelineViewManager::sendImageMessage(const QString &roomid, - const QString &filename, - const QString &url) +TimelineViewManager::queueImageMessage(const QString &roomid, + const QString &filename, + const QString &url) { if (!views_.contains(roomid)) { qDebug() << "Cannot send m.image message to a non-managed view"; @@ -85,9 +94,7 @@ TimelineViewManager::sendImageMessage(const QString &roomid, auto view = views_[roomid]; - view->addUserMessage(url, filename, client_->transactionId()); - client_->sendRoomMessage( - matrix::events::MessageEventType::Image, roomid, QFileInfo(filename).fileName(), url); + view->addUserMessage(url, filename); } void @@ -196,7 +203,7 @@ QString TimelineViewManager::chooseRandomColor() { std::random_device random_device; - std::mt19937 engine{ random_device() }; + std::mt19937 engine{random_device()}; std::uniform_real_distribution dist(0, 1); float hue = dist(engine); diff --git a/src/TopRoomBar.cc b/src/TopRoomBar.cc index 0361bd47..7bec888d 100644 --- a/src/TopRoomBar.cc +++ b/src/TopRoomBar.cc @@ -30,11 +30,10 @@ TopRoomBar::TopRoomBar(QWidget *parent) : QWidget(parent) - , buttonSize_{ 32 } + , buttonSize_{32} { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setMinimumSize(QSize(0, 65)); - setStyleSheet("background-color: #fff; color: #171919;"); + setFixedHeight(65); topLayout_ = new QHBoxLayout(); topLayout_->setSpacing(10); diff --git a/src/TrayIcon.cc b/src/TrayIcon.cc index ad644ed9..ac84aaca 100644 --- a/src/TrayIcon.cc +++ b/src/TrayIcon.cc @@ -123,9 +123,6 @@ TrayIcon::TrayIcon(const QString &filename, QWidget *parent) menu->addAction(quitAction_); setContextMenu(menu); - - // We wait a little for the icon to load. - QTimer::singleShot(500, this, [=]() { show(); }); } void diff --git a/src/TypingDisplay.cc b/src/TypingDisplay.cc index e3eb9db9..da9c1679 100644 --- a/src/TypingDisplay.cc +++ b/src/TypingDisplay.cc @@ -6,7 +6,7 @@ TypingDisplay::TypingDisplay(QWidget *parent) : QWidget(parent) - , leftPadding_{ 24 } + , leftPadding_{24} { QFont font; font.setPixelSize(conf::typingNotificationFontSize); diff --git a/src/UserInfoWidget.cc b/src/UserInfoWidget.cc index 2981db2d..19417c00 100644 --- a/src/UserInfoWidget.cc +++ b/src/UserInfoWidget.cc @@ -29,13 +29,11 @@ UserInfoWidget::UserInfoWidget(QWidget *parent) : QWidget(parent) , display_name_("User") , user_id_("@user:homeserver.org") - , logoutModal_{ nullptr } - , logoutDialog_{ nullptr } - , logoutButtonSize_{ 20 } + , logoutModal_{nullptr} + , logoutDialog_{nullptr} + , logoutButtonSize_{20} { - QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - setSizePolicy(sizePolicy); - setMinimumSize(QSize(0, 65)); + setFixedHeight(65); topLayout_ = new QHBoxLayout(this); topLayout_->setSpacing(0); @@ -142,6 +140,8 @@ UserInfoWidget::resizeEvent(QResizeEvent *event) displayNameLabel_->show(); userIdLabel_->show(); } + + QWidget::resizeEvent(event); } void diff --git a/src/UserSettingsPage.cc b/src/UserSettingsPage.cc new file mode 100644 index 00000000..10754cfd --- /dev/null +++ b/src/UserSettingsPage.cc @@ -0,0 +1,155 @@ +/* + * nheko Copyright (C) 2017 Konstantinos Sideris + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "Config.h" +#include "FlatButton.h" +#include "UserSettingsPage.h" +#include + +UserSettings::UserSettings() { load(); } + +void +UserSettings::load() +{ + QSettings settings; + isTrayEnabled_ = settings.value("user/window/tray", true).toBool(); + theme_ = settings.value("user/theme", "default").toString(); +} + +void +UserSettings::save() +{ + QSettings settings; + settings.beginGroup("user"); + + settings.beginGroup("window"); + settings.setValue("tray", isTrayEnabled_); + settings.endGroup(); + + settings.setValue("theme", theme()); + settings.endGroup(); +} + +HorizontalLine::HorizontalLine(QWidget *parent) + : QFrame{parent} +{ + setFrameShape(QFrame::HLine); + setFrameShadow(QFrame::Sunken); +} + +UserSettingsPage::UserSettingsPage(QSharedPointer settings, QWidget *parent) + : QWidget{parent} + , settings_{settings} +{ + topLayout_ = new QVBoxLayout(this); + + QIcon icon; + icon.addFile(":/icons/icons/ui/angle-pointing-to-left.png"); + + auto backBtn_ = new FlatButton(this); + backBtn_->setMinimumSize(QSize(24, 24)); + backBtn_->setIcon(icon); + backBtn_->setIconSize(QSize(24, 24)); + + auto heading_ = new QLabel(tr("User Settings")); + heading_->setFont(QFont("Open Sans Bold", 22)); + + topBarLayout_ = new QHBoxLayout; + topBarLayout_->setSpacing(0); + topBarLayout_->setMargin(0); + topBarLayout_->addWidget(backBtn_, 1, Qt::AlignLeft | Qt::AlignVCenter); + topBarLayout_->addWidget(heading_, 0, Qt::AlignBottom); + topBarLayout_->addStretch(1); + + auto trayOptionLayout_ = new QHBoxLayout; + trayOptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin); + auto trayLabel = new QLabel(tr("Minimize to tray"), this); + trayToggle_ = new Toggle(this); + trayToggle_->setActiveColor(QColor("#38A3D8")); + trayToggle_->setInactiveColor(QColor("gray")); + trayLabel->setFont(QFont("Open Sans", 15)); + + trayOptionLayout_->addWidget(trayLabel); + trayOptionLayout_->addWidget(trayToggle_, 0, Qt::AlignBottom | Qt::AlignRight); + + auto themeOptionLayout_ = new QHBoxLayout; + themeOptionLayout_->setContentsMargins(0, OptionMargin, 0, OptionMargin); + auto themeLabel_ = new QLabel(tr("App theme"), this); + themeCombo_ = new QComboBox(this); + themeCombo_->addItem("Default"); + themeCombo_->addItem("System"); + themeLabel_->setFont(QFont("Open Sans", 15)); + + themeOptionLayout_->addWidget(themeLabel_); + themeOptionLayout_->addWidget(themeCombo_, 0, Qt::AlignBottom | Qt::AlignRight); + + auto general_ = new QLabel(tr("GENERAL"), this); + general_->setFont(QFont("Open Sans Bold", 17)); + general_->setStyleSheet("color: #5d6565"); + + mainLayout_ = new QVBoxLayout; + mainLayout_->setSpacing(7); + mainLayout_->setContentsMargins( + sideMargin_, LayoutTopMargin, sideMargin_, LayoutBottomMargin); + mainLayout_->addWidget(general_, 1, Qt::AlignLeft | Qt::AlignVCenter); + mainLayout_->addWidget(new HorizontalLine(this)); + mainLayout_->addLayout(trayOptionLayout_); + mainLayout_->addWidget(new HorizontalLine(this)); + mainLayout_->addLayout(themeOptionLayout_); + mainLayout_->addWidget(new HorizontalLine(this)); + + topLayout_->addLayout(topBarLayout_); + topLayout_->addLayout(mainLayout_); + topLayout_->addStretch(1); + + connect(themeCombo_, + static_cast(&QComboBox::activated), + [=](const QString &text) { settings_->setTheme(text.toLower()); }); + + connect(trayToggle_, &Toggle::toggled, this, [=](bool isDisabled) { + settings_->setTray(!isDisabled); + emit trayOptionChanged(!isDisabled); + }); + + connect(backBtn_, &QPushButton::clicked, this, [=]() { + settings_->save(); + emit moveBack(); + }); +} + +void +UserSettingsPage::showEvent(QShowEvent *) +{ + themeCombo_->setCurrentIndex((settings_->theme() == "default" ? 0 : 1)); + trayToggle_->setState(!settings_->isTrayEnabled()); // Treats true as "off" +} + +void +UserSettingsPage::resizeEvent(QResizeEvent *event) +{ + sideMargin_ = width() * 0.2; + mainLayout_->setContentsMargins( + sideMargin_, LayoutTopMargin, sideMargin_, LayoutBottomMargin); + + QWidget::resizeEvent(event); +} diff --git a/src/events/Event.cc b/src/events/Event.cc index 1b03e1e6..7e5bd1db 100644 --- a/src/events/Event.cc +++ b/src/events/Event.cc @@ -78,3 +78,29 @@ matrix::events::isMessageEvent(EventType type) { return type == EventType::RoomMessage; } + +void +matrix::events::UnsignedData::deserialize(const QJsonValue &data) +{ + if (!data.isObject()) + throw DeserializationException("UnsignedData is not a JSON object"); + + auto object = data.toObject(); + + transaction_id_ = object.value("transaction_id").toString(); + age_ = object.value("age").toDouble(); +} + +QJsonObject +matrix::events::UnsignedData::serialize() const +{ + QJsonObject object; + + if (!transaction_id_.isEmpty()) + object["transaction_id"] = transaction_id_; + + if (age_ > 0) + object["age"] = age_; + + return object; +} diff --git a/src/main.cc b/src/main.cc index 2d059788..8bd77254 100644 --- a/src/main.cc +++ b/src/main.cc @@ -19,11 +19,38 @@ #include #include #include +#include #include #include #include "MainWindow.h" +void +setupProxy() +{ + QSettings settings; + + /** + To set up a SOCKS proxy: + [user] + proxy\socks\host=<> + proxy\socks\port=<> + proxy\socks\user=<> + proxy\socks\password=<> + **/ + if (settings.contains("user/proxy/socks/host")) { + QNetworkProxy proxy; + proxy.setType(QNetworkProxy::Socks5Proxy); + proxy.setHostName(settings.value("user/proxy/socks/host").toString()); + proxy.setPort(settings.value("user/proxy/socks/port").toInt()); + if (settings.contains("user/proxy/socks/user")) + proxy.setUser(settings.value("user/proxy/socks/user").toString()); + if (settings.contains("user/proxy/socks/password")) + proxy.setPassword(settings.value("user/proxy/socks/password").toString()); + QNetworkProxy::setApplicationProxy(proxy); + } +} + int main(int argc, char *argv[]) { @@ -62,6 +89,8 @@ main(int argc, char *argv[]) appTranslator.load("nheko_" + lang, ":/translations"); app.installTranslator(&appTranslator); + setupProxy(); + MainWindow w; // Move the MainWindow to the center diff --git a/src/ui/OverlayModal.cc b/src/ui/OverlayModal.cc index 05bd7d03..4fb57175 100644 --- a/src/ui/OverlayModal.cc +++ b/src/ui/OverlayModal.cc @@ -22,8 +22,8 @@ OverlayModal::OverlayModal(QWidget *parent, QWidget *content) : OverlayWidget(parent) - , duration_{ 500 } - , color_{ QColor(55, 55, 55) } + , duration_{500} + , color_{QColor(55, 55, 55)} { setAttribute(Qt::WA_TranslucentBackground); diff --git a/src/ui/ScrollBar.cc b/src/ui/ScrollBar.cc index b186be23..24f97461 100644 --- a/src/ui/ScrollBar.cc +++ b/src/ui/ScrollBar.cc @@ -23,7 +23,7 @@ ScrollBar::ScrollBar(QScrollArea *area, QWidget *parent) : QScrollBar(parent) - , area_{ area } + , area_{area} { hideTimer_.setSingleShot(true); diff --git a/src/ui/Theme.cc b/src/ui/Theme.cc index 1560cf12..dd47f6b2 100644 --- a/src/ui/Theme.cc +++ b/src/ui/Theme.cc @@ -56,15 +56,21 @@ void Theme::setColor(const QString &key, ui::Color color) { static const QColor palette[] = { - QColor("#171919"), + QColor("#171919"), - QColor("#EBEBEB"), QColor("#C9C9C9"), QColor("#929292"), + QColor("#EBEBEB"), + QColor("#C9C9C9"), + QColor("#929292"), - QColor("#1C3133"), QColor("#577275"), QColor("#46A451"), + QColor("#1C3133"), + QColor("#577275"), + QColor("#46A451"), - QColor("#5D6565"), QColor("#E22826"), QColor("#81B3A9"), + QColor("#5D6565"), + QColor("#E22826"), + QColor("#81B3A9"), - rgba(0, 0, 0, 0), + rgba(0, 0, 0, 0), }; colors_.insert(key, palette[static_cast(color)]); diff --git a/src/ui/ToggleButton.cc b/src/ui/ToggleButton.cc new file mode 100644 index 00000000..e7b242b8 --- /dev/null +++ b/src/ui/ToggleButton.cc @@ -0,0 +1,212 @@ +#include +#include +#include +#include + +#include "ToggleButton.h" + +void +Toggle::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); +} + +Toggle::Toggle(QWidget *parent) + : QAbstractButton{parent} +{ + init(); + + connect(this, &QAbstractButton::toggled, this, &Toggle::setState); +} + +void +Toggle::setState(bool isEnabled) +{ + thumb_->setShift(isEnabled ? Position::Right : Position::Left); + setupProperties(); +} + +void +Toggle::init() +{ + track_ = new ToggleTrack(this); + thumb_ = new ToggleThumb(this); + + setCursor(QCursor(Qt::PointingHandCursor)); + setCheckable(true); + setChecked(false); + setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + + setState(false); + setupProperties(); + + QCoreApplication::processEvents(); +} + +void +Toggle::setupProperties() +{ + if (isEnabled()) { + Position position = thumb_->shift(); + + thumb_->setThumbColor(trackColor()); + + if (position == Position::Left) + track_->setTrackColor(activeColor()); + else if (position == Position::Right) + track_->setTrackColor(inactiveColor()); + } + + update(); +} + +void +Toggle::setDisabledColor(const QColor &color) +{ + disabledColor_ = color; + setupProperties(); +} + +void +Toggle::setActiveColor(const QColor &color) +{ + activeColor_ = color; + setupProperties(); +} + +void +Toggle::setInactiveColor(const QColor &color) +{ + inactiveColor_ = color; + setupProperties(); +} + +void +Toggle::setTrackColor(const QColor &color) +{ + trackColor_ = color; + setupProperties(); +} + +ToggleThumb::ToggleThumb(Toggle *parent) + : QWidget{parent} + , toggle_{parent} + , position_{Position::Right} + , offset_{0} +{ + parent->installEventFilter(this); +} + +void +ToggleThumb::setShift(Position position) +{ + if (position_ != position) { + position_ = position; + updateOffset(); + } +} + +bool +ToggleThumb::eventFilter(QObject *obj, QEvent *event) +{ + const QEvent::Type type = event->type(); + + if (QEvent::Resize == type || QEvent::Move == type) { + setGeometry(toggle_->rect().adjusted(8, 8, -8, -8)); + updateOffset(); + } + + return QWidget::eventFilter(obj, event); +} + +void +ToggleThumb::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor(toggle_->isEnabled() ? thumbColor_ : Qt::white); + + painter.setBrush(brush); + painter.setPen(Qt::NoPen); + + int s; + QRectF r; + + s = height() - 10; + r = QRectF(5 + offset_, 5, s, s); + + painter.drawEllipse(r); + + if (!toggle_->isEnabled()) { + brush.setColor(toggle_->disabledColor()); + painter.setBrush(brush); + painter.drawEllipse(r); + } +} + +void +ToggleThumb::updateOffset() +{ + const QSize s(size()); + offset_ = position_ == Position::Left ? static_cast(s.width() - s.height()) : 0; + update(); +} + +ToggleTrack::ToggleTrack(Toggle *parent) + : QWidget{parent} + , toggle_{parent} +{ + Q_ASSERT(parent); + + parent->installEventFilter(this); +} + +void +ToggleTrack::setTrackColor(const QColor &color) +{ + trackColor_ = color; + update(); +} + +bool +ToggleTrack::eventFilter(QObject *obj, QEvent *event) +{ + const QEvent::Type type = event->type(); + + if (QEvent::Resize == type || QEvent::Move == type) { + setGeometry(toggle_->rect()); + } + + return QWidget::eventFilter(obj, event); +} + +void +ToggleTrack::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + QBrush brush; + if (toggle_->isEnabled()) { + brush.setColor(trackColor_); + painter.setOpacity(0.8); + } else { + brush.setColor(toggle_->disabledColor()); + painter.setOpacity(0.6); + } + + brush.setStyle(Qt::SolidPattern); + painter.setBrush(brush); + painter.setPen(Qt::NoPen); + + const int h = height() / 2; + const QRect r(0, h / 2, width(), h); + painter.drawRoundedRect(r.adjusted(14, 4, -14, -4), h / 2 - 4, h / 2 - 4); +} diff --git a/tests/events.cc b/tests/events.cc index ee1f9560..a4f6fedf 100644 --- a/tests/events.cc +++ b/tests/events.cc @@ -22,8 +22,8 @@ using namespace matrix::events; TEST(BaseEvent, Deserialization) { // NameEventContent - auto data = QJsonObject{ { "content", QJsonObject{ { "name", "Room Name" } } }, - { "type", "m.room.name" } }; + auto data = + QJsonObject{{"content", QJsonObject{{"name", "Room Name"}}}, {"type", "m.room.name"}}; Event name_event; name_event.deserialize(data); @@ -31,47 +31,57 @@ TEST(BaseEvent, Deserialization) EXPECT_EQ(name_event.serialize(), data); // TopicEventContent - data = QJsonObject{ { "content", QJsonObject{ { "topic", "Room Topic" } } }, - { "type", "m.room.topic" } }; + data = QJsonObject{{"content", QJsonObject{{"topic", "Room Topic"}}}, + {"unsigned", QJsonObject{{"age", 22}, {"transaction_id", "randomid"}}}, + {"type", "m.room.topic"}}; Event topic_event; topic_event.deserialize(data); EXPECT_EQ(topic_event.content().topic(), "Room Topic"); + EXPECT_EQ(topic_event.unsignedData().age(), 22); + EXPECT_EQ(topic_event.unsignedData().transactionId(), "randomid"); EXPECT_EQ(topic_event.serialize(), data); // AvatarEventContent - data = QJsonObject{ { "content", QJsonObject{ { "url", "https://matrix.org" } } }, - { "type", "m.room.avatar" } }; + data = QJsonObject{ + {"content", QJsonObject{{"url", "https://matrix.org"}}}, + {"unsigned", QJsonObject{{"age", 1343434343}, {"transaction_id", "m33434.33"}}}, + {"type", "m.room.avatar"}}; Event avatar_event; avatar_event.deserialize(data); EXPECT_EQ(avatar_event.content().url().toString(), "https://matrix.org"); + EXPECT_EQ(avatar_event.unsignedData().age(), 1343434343); + EXPECT_EQ(avatar_event.unsignedData().transactionId(), "m33434.33"); EXPECT_EQ(avatar_event.serialize(), data); // AliasesEventContent - data = - QJsonObject{ { "content", - QJsonObject{ - { "aliases", QJsonArray{ "#test:matrix.org", "#test2:matrix.org" } } } }, - { "type", "m.room.aliases" } }; + data = QJsonObject{ + {"content", + QJsonObject{{"aliases", QJsonArray{"#test:matrix.org", "#test2:matrix.org"}}}}, + {"unsigned", QJsonObject{{"transaction_id", "m33434.33"}}}, + {"type", "m.room.aliases"}}; Event aliases_event; aliases_event.deserialize(data); EXPECT_EQ(aliases_event.content().aliases().size(), 2); + EXPECT_EQ(aliases_event.unsignedData().transactionId(), "m33434.33"); EXPECT_EQ(aliases_event.serialize(), data); // CreateEventContent - data = QJsonObject{ { "content", QJsonObject{ { "creator", "@alice:matrix.org" } } }, - { "type", "m.room.create" } }; + data = QJsonObject{{"content", QJsonObject{{"creator", "@alice:matrix.org"}}}, + {"unsigned", QJsonObject{{"age", 2233}}}, + {"type", "m.room.create"}}; Event create_event; create_event.deserialize(data); EXPECT_EQ(create_event.content().creator(), "@alice:matrix.org"); + EXPECT_EQ(create_event.unsignedData().age(), 2233); EXPECT_EQ(create_event.serialize(), data); // JoinRulesEventContent - data = QJsonObject{ { "content", QJsonObject{ { "join_rule", "private" } } }, - { "type", "m.room.join_rules" } }; + data = QJsonObject{{"content", QJsonObject{{"join_rule", "private"}}}, + {"type", "m.room.join_rules"}}; Event join_rules_event; join_rules_event.deserialize(data); @@ -81,27 +91,34 @@ TEST(BaseEvent, Deserialization) TEST(BaseEvent, DeserializationException) { - auto data = QJsonObject{ { "content", QJsonObject{ { "rule", "private" } } }, - { "type", "m.room.join_rules" } }; + auto data = + QJsonObject{{"content", QJsonObject{{"rule", "private"}}}, {"type", "m.room.join_rules"}}; Event event1; ASSERT_THROW(event1.deserialize(data), DeserializationException); - data = QJsonObject{ { "contents", QJsonObject{ { "join_rule", "private" } } }, - { "type", "m.room.join_rules" } }; + data = QJsonObject{{"contents", QJsonObject{{"join_rule", "private"}}}, + {"type", "m.room.join_rules"}}; Event event2; ASSERT_THROW(event2.deserialize(data), DeserializationException); + + data = QJsonObject{{"contents", QJsonObject{{"join_rule", "private"}}}, + {"unsigned", QJsonObject{{"age", "222"}}}, + {"type", "m.room.join_rules"}}; + + Event event3; + ASSERT_THROW(event3.deserialize(data), DeserializationException); } TEST(RoomEvent, Deserialization) { - auto data = QJsonObject{ { "content", QJsonObject{ { "name", "Name" } } }, - { "event_id", "$asdfafdf8af:matrix.org" }, - { "room_id", "!aasdfaeae23r9:matrix.org" }, - { "sender", "@alice:matrix.org" }, - { "origin_server_ts", 1323238293289323LL }, - { "type", "m.room.name" } }; + auto data = QJsonObject{{"content", QJsonObject{{"name", "Name"}}}, + {"event_id", "$asdfafdf8af:matrix.org"}, + {"room_id", "!aasdfaeae23r9:matrix.org"}, + {"sender", "@alice:matrix.org"}, + {"origin_server_ts", 1323238293289323LL}, + {"type", "m.room.name"}}; RoomEvent event; event.deserialize(data); @@ -116,11 +133,11 @@ TEST(RoomEvent, Deserialization) TEST(RoomEvent, DeserializationException) { - auto data = QJsonObject{ { "content", QJsonObject{ { "name", "Name" } } }, - { "event_id", "$asdfafdf8af:matrix.org" }, - { "room_id", "!aasdfaeae23r9:matrix.org" }, - { "origin_server_ts", 1323238293289323LL }, - { "type", "m.room.name" } }; + auto data = QJsonObject{{"content", QJsonObject{{"name", "Name"}}}, + {"event_id", "$asdfafdf8af:matrix.org"}, + {"room_id", "!aasdfaeae23r9:matrix.org"}, + {"origin_server_ts", 1323238293289323LL}, + {"type", "m.room.name"}}; RoomEvent event; @@ -133,14 +150,14 @@ TEST(RoomEvent, DeserializationException) TEST(StateEvent, Deserialization) { - auto data = QJsonObject{ { "content", QJsonObject{ { "name", "Name" } } }, - { "event_id", "$asdfafdf8af:matrix.org" }, - { "state_key", "some_state_key" }, - { "prev_content", QJsonObject{ { "name", "Previous Name" } } }, - { "room_id", "!aasdfaeae23r9:matrix.org" }, - { "sender", "@alice:matrix.org" }, - { "origin_server_ts", 1323238293289323LL }, - { "type", "m.room.name" } }; + auto data = QJsonObject{{"content", QJsonObject{{"name", "Name"}}}, + {"event_id", "$asdfafdf8af:matrix.org"}, + {"state_key", "some_state_key"}, + {"prev_content", QJsonObject{{"name", "Previous Name"}}}, + {"room_id", "!aasdfaeae23r9:matrix.org"}, + {"sender", "@alice:matrix.org"}, + {"origin_server_ts", 1323238293289323LL}, + {"type", "m.room.name"}}; StateEvent event; event.deserialize(data); @@ -157,13 +174,13 @@ TEST(StateEvent, Deserialization) TEST(StateEvent, DeserializationException) { - auto data = QJsonObject{ { "content", QJsonObject{ { "name", "Name" } } }, - { "event_id", "$asdfafdf8af:matrix.org" }, - { "prev_content", QJsonObject{ { "name", "Previous Name" } } }, - { "room_id", "!aasdfaeae23r9:matrix.org" }, - { "sender", "@alice:matrix.org" }, - { "origin_server_ts", 1323238293289323LL }, - { "type", "m.room.name" } }; + auto data = QJsonObject{{"content", QJsonObject{{"name", "Name"}}}, + {"event_id", "$asdfafdf8af:matrix.org"}, + {"prev_content", QJsonObject{{"name", "Previous Name"}}}, + {"room_id", "!aasdfaeae23r9:matrix.org"}, + {"sender", "@alice:matrix.org"}, + {"origin_server_ts", 1323238293289323LL}, + {"type", "m.room.name"}}; StateEvent event; @@ -176,35 +193,30 @@ TEST(StateEvent, DeserializationException) TEST(EventType, Mapping) { - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.aliases" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.aliases"}}), EventType::RoomAliases); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.avatar" } }), - EventType::RoomAvatar); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.canonical_alias" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.avatar"}}), EventType::RoomAvatar); + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.canonical_alias"}}), EventType::RoomCanonicalAlias); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.create" } }), - EventType::RoomCreate); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.history_visibility" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.create"}}), EventType::RoomCreate); + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.history_visibility"}}), EventType::RoomHistoryVisibility); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.join_rules" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.join_rules"}}), EventType::RoomJoinRules); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.member" } }), - EventType::RoomMember); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.message" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.member"}}), EventType::RoomMember); + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.message"}}), EventType::RoomMessage); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.name" } }), EventType::RoomName); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.power_levels" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.name"}}), EventType::RoomName); + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.power_levels"}}), EventType::RoomPowerLevels); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.topic" } }), - EventType::RoomTopic); - EXPECT_EQ(extractEventType(QJsonObject{ { "type", "m.room.unknown" } }), + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.topic"}}), EventType::RoomTopic); + EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.unknown"}}), EventType::Unsupported); } TEST(AliasesEventContent, Deserialization) { - auto data = - QJsonObject{ { "aliases", QJsonArray{ "#test:matrix.org", "#test2:matrix.org" } } }; + auto data = QJsonObject{{"aliases", QJsonArray{"#test:matrix.org", "#test2:matrix.org"}}}; AliasesEventContent content; content.deserialize(data); @@ -215,7 +227,7 @@ TEST(AliasesEventContent, Deserialization) TEST(AliasesEventContent, NotAnObject) { - auto data = QJsonArray{ "#test:matrix.org", "#test2:matrix.org" }; + auto data = QJsonArray{"#test:matrix.org", "#test2:matrix.org"}; AliasesEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -223,7 +235,7 @@ TEST(AliasesEventContent, NotAnObject) TEST(AliasesEventContent, MissingKey) { - auto data = QJsonObject{ { "key", QJsonArray{ "#test:matrix.org", "#test2:matrix.org" } } }; + auto data = QJsonObject{{"key", QJsonArray{"#test:matrix.org", "#test2:matrix.org"}}}; AliasesEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -237,7 +249,7 @@ TEST(AliasesEventContent, MissingKey) TEST(AvatarEventContent, Deserialization) { - auto data = QJsonObject{ { "url", "https://matrix.org/avatar.png" } }; + auto data = QJsonObject{{"url", "https://matrix.org/avatar.png"}}; AvatarEventContent content; content.deserialize(data); @@ -248,7 +260,7 @@ TEST(AvatarEventContent, Deserialization) TEST(AvatarEventContent, NotAnObject) { - auto data = QJsonArray{ "key", "url" }; + auto data = QJsonArray{"key", "url"}; AvatarEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -256,7 +268,7 @@ TEST(AvatarEventContent, NotAnObject) TEST(AvatarEventContent, MissingKey) { - auto data = QJsonObject{ { "key", "https://matrix.org" } }; + auto data = QJsonObject{{"key", "https://matrix.org"}}; AvatarEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -270,7 +282,7 @@ TEST(AvatarEventContent, MissingKey) TEST(CreateEventContent, Deserialization) { - auto data = QJsonObject{ { "creator", "@alice:matrix.org" } }; + auto data = QJsonObject{{"creator", "@alice:matrix.org"}}; CreateEventContent content; content.deserialize(data); @@ -281,7 +293,7 @@ TEST(CreateEventContent, Deserialization) TEST(CreateEventContent, NotAnObject) { - auto data = QJsonArray{ "creator", "alice" }; + auto data = QJsonArray{"creator", "alice"}; CreateEventContent content; @@ -290,7 +302,7 @@ TEST(CreateEventContent, NotAnObject) TEST(CreateEventContent, MissingKey) { - auto data = QJsonObject{ { "key", "@alice:matrix.org" } }; + auto data = QJsonObject{{"key", "@alice:matrix.org"}}; CreateEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -304,23 +316,23 @@ TEST(CreateEventContent, MissingKey) TEST(HistoryVisibilityEventContent, Deserialization) { - auto data = QJsonObject{ { "history_visibility", "invited" } }; + auto data = QJsonObject{{"history_visibility", "invited"}}; HistoryVisibilityEventContent content; content.deserialize(data); EXPECT_EQ(content.historyVisibility(), HistoryVisibility::Invited); - data = QJsonObject{ { "history_visibility", "joined" } }; + data = QJsonObject{{"history_visibility", "joined"}}; content.deserialize(data); EXPECT_EQ(content.historyVisibility(), HistoryVisibility::Joined); - data = QJsonObject{ { "history_visibility", "shared" } }; + data = QJsonObject{{"history_visibility", "shared"}}; content.deserialize(data); EXPECT_EQ(content.historyVisibility(), HistoryVisibility::Shared); - data = QJsonObject{ { "history_visibility", "world_readable" } }; + data = QJsonObject{{"history_visibility", "world_readable"}}; content.deserialize(data); EXPECT_EQ(content.historyVisibility(), HistoryVisibility::WorldReadable); @@ -328,7 +340,7 @@ TEST(HistoryVisibilityEventContent, Deserialization) TEST(HistoryVisibilityEventContent, NotAnObject) { - auto data = QJsonArray{ "history_visibility", "alice" }; + auto data = QJsonArray{"history_visibility", "alice"}; HistoryVisibilityEventContent content; @@ -337,7 +349,7 @@ TEST(HistoryVisibilityEventContent, NotAnObject) TEST(HistoryVisibilityEventContent, InvalidHistoryVisibility) { - auto data = QJsonObject{ { "history_visibility", "wrong" } }; + auto data = QJsonObject{{"history_visibility", "wrong"}}; HistoryVisibilityEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -351,7 +363,7 @@ TEST(HistoryVisibilityEventContent, InvalidHistoryVisibility) TEST(HistoryVisibilityEventContent, MissingKey) { - auto data = QJsonObject{ { "key", "joined" } }; + auto data = QJsonObject{{"key", "joined"}}; HistoryVisibilityEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -365,23 +377,23 @@ TEST(HistoryVisibilityEventContent, MissingKey) TEST(JoinRulesEventContent, Deserialization) { - auto data = QJsonObject{ { "join_rule", "invite" } }; + auto data = QJsonObject{{"join_rule", "invite"}}; JoinRulesEventContent content; content.deserialize(data); EXPECT_EQ(content.joinRule(), JoinRule::Invite); - data = QJsonObject{ { "join_rule", "knock" } }; + data = QJsonObject{{"join_rule", "knock"}}; content.deserialize(data); EXPECT_EQ(content.joinRule(), JoinRule::Knock); - data = QJsonObject{ { "join_rule", "private" } }; + data = QJsonObject{{"join_rule", "private"}}; content.deserialize(data); EXPECT_EQ(content.joinRule(), JoinRule::Private); - data = QJsonObject{ { "join_rule", "public" } }; + data = QJsonObject{{"join_rule", "public"}}; content.deserialize(data); EXPECT_EQ(content.joinRule(), JoinRule::Public); @@ -389,7 +401,7 @@ TEST(JoinRulesEventContent, Deserialization) TEST(JoinRulesEventContent, NotAnObject) { - auto data = QJsonArray{ "rule", "alice" }; + auto data = QJsonArray{"rule", "alice"}; JoinRulesEventContent content; @@ -398,7 +410,7 @@ TEST(JoinRulesEventContent, NotAnObject) TEST(JoinRulesEventContent, InvalidHistoryVisibility) { - auto data = QJsonObject{ { "join_rule", "wrong" } }; + auto data = QJsonObject{{"join_rule", "wrong"}}; JoinRulesEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -412,7 +424,7 @@ TEST(JoinRulesEventContent, InvalidHistoryVisibility) TEST(JoinRulesEventContent, MissingKey) { - auto data = QJsonObject{ { "key", "invite" } }; + auto data = QJsonObject{{"key", "invite"}}; JoinRulesEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -426,7 +438,7 @@ TEST(JoinRulesEventContent, MissingKey) TEST(CanonicalAliasEventContent, Deserialization) { - auto data = QJsonObject{ { "alias", "Room Alias" } }; + auto data = QJsonObject{{"alias", "Room Alias"}}; CanonicalAliasEventContent content; content.deserialize(data); @@ -437,7 +449,7 @@ TEST(CanonicalAliasEventContent, Deserialization) TEST(CanonicalAliasEventContent, NotAnObject) { - auto data = QJsonArray{ "alias", "Room Alias" }; + auto data = QJsonArray{"alias", "Room Alias"}; CanonicalAliasEventContent content; @@ -446,7 +458,7 @@ TEST(CanonicalAliasEventContent, NotAnObject) TEST(CanonicalAliasEventContent, MissingKey) { - auto data = QJsonObject{ { "key", "alias" } }; + auto data = QJsonObject{{"key", "alias"}}; CanonicalAliasEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -462,29 +474,29 @@ TEST(MemberEventContent, Deserialization) { MemberEventContent content; - auto data = QJsonObject{ { "membership", "join" } }; + auto data = QJsonObject{{"membership", "join"}}; content.deserialize(data); EXPECT_EQ(content.membershipState(), Membership::Join); - data = QJsonObject{ { "membership", "invite" }, { "displayname", "Username" } }; + data = QJsonObject{{"membership", "invite"}, {"displayname", "Username"}}; content.deserialize(data); EXPECT_EQ(content.membershipState(), Membership::Invite); EXPECT_EQ(content.displayName(), "Username"); - data = QJsonObject{ { "membership", "leave" }, { "avatar_url", "https://matrix.org" } }; + data = QJsonObject{{"membership", "leave"}, {"avatar_url", "https://matrix.org"}}; content.deserialize(data); EXPECT_EQ(content.membershipState(), Membership::Leave); EXPECT_EQ(content.avatarUrl().toString(), "https://matrix.org"); - data = QJsonObject{ { "membership", "ban" } }; + data = QJsonObject{{"membership", "ban"}}; content.deserialize(data); EXPECT_EQ(content.membershipState(), Membership::Ban); - data = QJsonObject{ { "membership", "knock" } }; + data = QJsonObject{{"membership", "knock"}}; content.deserialize(data); EXPECT_EQ(content.membershipState(), Membership::Knock); @@ -492,7 +504,7 @@ TEST(MemberEventContent, Deserialization) TEST(MemberEventContent, InvalidMembership) { - auto data = QJsonObject{ { "membership", "wrong" } }; + auto data = QJsonObject{{"membership", "wrong"}}; MemberEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -506,7 +518,7 @@ TEST(MemberEventContent, InvalidMembership) TEST(MemberEventContent, NotAnObject) { - auto data = QJsonArray{ "name", "join" }; + auto data = QJsonArray{"name", "join"}; MemberEventContent content; @@ -515,7 +527,7 @@ TEST(MemberEventContent, NotAnObject) TEST(MemberEventContent, MissingName) { - auto data = QJsonObject{ { "key", "random" } }; + auto data = QJsonObject{{"key", "random"}}; MemberEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -529,7 +541,7 @@ TEST(MemberEventContent, MissingName) TEST(NameEventContent, Deserialization) { - auto data = QJsonObject{ { "name", "Room Name" } }; + auto data = QJsonObject{{"name", "Room Name"}}; NameEventContent content; content.deserialize(data); @@ -540,7 +552,7 @@ TEST(NameEventContent, Deserialization) TEST(NameEventContent, NotAnObject) { - auto data = QJsonArray{ "name", "Room Name" }; + auto data = QJsonArray{"name", "Room Name"}; NameEventContent content; @@ -549,7 +561,7 @@ TEST(NameEventContent, NotAnObject) TEST(NameEventContent, MissingName) { - auto data = QJsonObject{ { "key", "Room Name" } }; + auto data = QJsonObject{{"key", "Room Name"}}; NameEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException); @@ -582,17 +594,17 @@ TEST(PowerLevelsEventContent, DefaultValues) TEST(PowerLevelsEventContent, FullDeserialization) { auto data = QJsonObject{ - { "ban", 1 }, - { "invite", 2 }, - { "kick", 3 }, - { "redact", 4 }, + {"ban", 1}, + {"invite", 2}, + {"kick", 3}, + {"redact", 4}, - { "events_default", 5 }, - { "state_default", 6 }, - { "users_default", 7 }, + {"events_default", 5}, + {"state_default", 6}, + {"users_default", 7}, - { "events", QJsonObject{ { "m.message.text", 8 }, { "m.message.image", 9 } } }, - { "users", QJsonObject{ { "@alice:matrix.org", 10 }, { "@bob:matrix.org", 11 } } }, + {"events", QJsonObject{{"m.message.text", 8}, {"m.message.image", 9}}}, + {"users", QJsonObject{{"@alice:matrix.org", 10}, {"@bob:matrix.org", 11}}}, }; PowerLevelsEventContent power_levels; @@ -621,13 +633,13 @@ TEST(PowerLevelsEventContent, FullDeserialization) TEST(PowerLevelsEventContent, PartialDeserialization) { auto data = QJsonObject{ - { "ban", 1 }, - { "invite", 2 }, + {"ban", 1}, + {"invite", 2}, - { "events_default", 5 }, - { "users_default", 7 }, + {"events_default", 5}, + {"users_default", 7}, - { "users", QJsonObject{ { "@alice:matrix.org", 10 }, { "@bob:matrix.org", 11 } } }, + {"users", QJsonObject{{"@alice:matrix.org", 10}, {"@bob:matrix.org", 11}}}, }; PowerLevelsEventContent power_levels; @@ -653,7 +665,7 @@ TEST(PowerLevelsEventContent, PartialDeserialization) TEST(PowerLevelsEventContent, NotAnObject) { - auto data = QJsonArray{ "test", "test2" }; + auto data = QJsonArray{"test", "test2"}; PowerLevelsEventContent power_levels; @@ -662,7 +674,7 @@ TEST(PowerLevelsEventContent, NotAnObject) TEST(TopicEventContent, Deserialization) { - auto data = QJsonObject{ { "topic", "Room Topic" } }; + auto data = QJsonObject{{"topic", "Room Topic"}}; TopicEventContent content; content.deserialize(data); @@ -673,7 +685,7 @@ TEST(TopicEventContent, Deserialization) TEST(TopicEventContent, NotAnObject) { - auto data = QJsonArray{ "topic", "Room Topic" }; + auto data = QJsonArray{"topic", "Room Topic"}; TopicEventContent content; @@ -682,7 +694,7 @@ TEST(TopicEventContent, NotAnObject) TEST(TopicEventContent, MissingName) { - auto data = QJsonObject{ { "key", "Room Name" } }; + auto data = QJsonObject{{"key", "Room Name"}}; TopicEventContent content; ASSERT_THROW(content.deserialize(data), DeserializationException);