From 7c9ad6cc2f296a22202586eb8b4f7e1f0747f55e Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 7 Sep 2022 15:50:45 -0400 Subject: [PATCH] LibGUI: Add Unicode emoji group filters to the EmojiInputDialog This allows users to filter the list of displayed emoji by the group to which the emoji belong. --- .../Libraries/LibGUI/EmojiInputDialog.cpp | 53 ++++++++++++++++++- .../Libraries/LibGUI/EmojiInputDialog.gml | 11 ++++ Userland/Libraries/LibGUI/EmojiInputDialog.h | 6 +++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGUI/EmojiInputDialog.cpp b/Userland/Libraries/LibGUI/EmojiInputDialog.cpp index d300c2c588b..f9981b70266 100644 --- a/Userland/Libraries/LibGUI/EmojiInputDialog.cpp +++ b/Userland/Libraries/LibGUI/EmojiInputDialog.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,13 +21,32 @@ #include #include #include -#include +#include +#include #include namespace GUI { +struct EmojiCateogry { + Unicode::EmojiGroup group; + StringView emoji; +}; + +static constexpr auto s_emoji_groups = Array { + EmojiCateogry { Unicode::EmojiGroup::SmileysAndEmotion, "/res/emoji/U+1F600.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::PeopleAndBody, "/res/emoji/U+1FAF3.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::AnimalsAndNature, "/res/emoji/U+1F33B.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::FoodAndDrink, "/res/emoji/U+1F355.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::TravelAndPlaces, "/res/emoji/U+1F3D6.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::Activities, "/res/emoji/U+1F3B3.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::Objects, "/res/emoji/U+1F4E6.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::Symbols, "/res/emoji/U+2764.png"sv }, + EmojiCateogry { Unicode::EmojiGroup::Flags, "/res/emoji/U+1F6A9.png"sv }, +}; + EmojiInputDialog::EmojiInputDialog(Window* parent_window) : Dialog(parent_window) + , m_category_action_group(make()) { auto& main_widget = set_main_widget(); if (!main_widget.load_from_gml(emoji_input_dialog_gml)) @@ -36,9 +57,34 @@ EmojiInputDialog::EmojiInputDialog(Window* parent_window) auto& scrollable_container = *main_widget.find_descendant_of_type_named("scrollable_container"sv); m_search_box = main_widget.find_descendant_of_type_named("search_box"sv); + m_toolbar = main_widget.find_descendant_of_type_named("toolbar"sv); m_emojis_widget = main_widget.find_descendant_of_type_named("emojis"sv); m_emojis = supported_emoji(); + m_category_action_group->set_exclusive(true); + m_category_action_group->set_unchecking_allowed(true); + + for (auto const& category : s_emoji_groups) { + auto name = Unicode::emoji_group_to_string(category.group); + auto tooltip = name.replace("&"sv, "&&"sv, ReplaceMode::FirstOnly); + auto bitmap = Gfx::Bitmap::try_load_from_file(category.emoji).release_value_but_fixme_should_propagate_errors(); + + auto set_filter_action = Action::create_checkable( + tooltip, bitmap, [this, group = category.group](auto& action) { + if (action.is_checked()) + m_selected_category = group; + else + m_selected_category = {}; + + m_search_box->set_text({}, AllowCallback::No); + update_displayed_emoji(); + }, + this); + + m_category_action_group->add_action(*set_filter_action); + m_toolbar->add_action(*set_filter_action); + } + scrollable_container.horizontal_scrollbar().set_visible(false); update_displayed_emoji(); @@ -134,6 +180,11 @@ void EmojiInputDialog::update_displayed_emoji() while (!found_match && (index < m_emojis.size())) { auto& emoji = m_emojis[index++]; + if (m_selected_category.has_value()) { + if (!emoji.emoji.has_value() || emoji.emoji->group != m_selected_category) + continue; + } + if (emoji.emoji.has_value()) found_match = emoji.emoji->name.contains(m_search_box->text(), CaseSensitivity::CaseInsensitive); else diff --git a/Userland/Libraries/LibGUI/EmojiInputDialog.gml b/Userland/Libraries/LibGUI/EmojiInputDialog.gml index d52f7fd47eb..78616f57348 100644 --- a/Userland/Libraries/LibGUI/EmojiInputDialog.gml +++ b/Userland/Libraries/LibGUI/EmojiInputDialog.gml @@ -12,6 +12,17 @@ fixed_height: 22 } + @GUI::ToolbarContainer { + @GUI::Toolbar { + name: "toolbar" + + @GUI::Label { + text: "Category: " + autosize: true + } + } + } + @GUI::ScrollableContainerWidget { name: "scrollable_container" content_widget: @GUI::Widget { diff --git a/Userland/Libraries/LibGUI/EmojiInputDialog.h b/Userland/Libraries/LibGUI/EmojiInputDialog.h index d26c30cc16d..ef4d2722587 100644 --- a/Userland/Libraries/LibGUI/EmojiInputDialog.h +++ b/Userland/Libraries/LibGUI/EmojiInputDialog.h @@ -6,6 +6,8 @@ #pragma once +#include +#include #include #include @@ -30,7 +32,11 @@ private: Vector supported_emoji(); void update_displayed_emoji(); + OwnPtr m_category_action_group; + Optional m_selected_category; + RefPtr m_search_box; + RefPtr m_toolbar; RefPtr m_emojis_widget; Vector m_emojis; String m_selected_emoji_text;