mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 02:08:12 +03:00
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.
This commit is contained in:
parent
273045d40e
commit
7c9ad6cc2f
Notes:
sideshowbarker
2024-07-17 07:20:28 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/7c9ad6cc2f Pull-request: https://github.com/SerenityOS/serenity/pull/15159 Reviewed-by: https://github.com/linusg ✅
@ -11,6 +11,8 @@
|
|||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <AK/Utf32View.h>
|
#include <AK/Utf32View.h>
|
||||||
#include <LibCore/DirIterator.h>
|
#include <LibCore/DirIterator.h>
|
||||||
|
#include <LibGUI/Action.h>
|
||||||
|
#include <LibGUI/ActionGroup.h>
|
||||||
#include <LibGUI/BoxLayout.h>
|
#include <LibGUI/BoxLayout.h>
|
||||||
#include <LibGUI/Button.h>
|
#include <LibGUI/Button.h>
|
||||||
#include <LibGUI/EmojiInputDialog.h>
|
#include <LibGUI/EmojiInputDialog.h>
|
||||||
@ -19,13 +21,32 @@
|
|||||||
#include <LibGUI/Frame.h>
|
#include <LibGUI/Frame.h>
|
||||||
#include <LibGUI/ScrollableContainerWidget.h>
|
#include <LibGUI/ScrollableContainerWidget.h>
|
||||||
#include <LibGUI/TextBox.h>
|
#include <LibGUI/TextBox.h>
|
||||||
#include <LibUnicode/CharacterTypes.h>
|
#include <LibGUI/Toolbar.h>
|
||||||
|
#include <LibGfx/Bitmap.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
namespace GUI {
|
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)
|
EmojiInputDialog::EmojiInputDialog(Window* parent_window)
|
||||||
: Dialog(parent_window)
|
: Dialog(parent_window)
|
||||||
|
, m_category_action_group(make<ActionGroup>())
|
||||||
{
|
{
|
||||||
auto& main_widget = set_main_widget<Frame>();
|
auto& main_widget = set_main_widget<Frame>();
|
||||||
if (!main_widget.load_from_gml(emoji_input_dialog_gml))
|
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<GUI::ScrollableContainerWidget>("scrollable_container"sv);
|
auto& scrollable_container = *main_widget.find_descendant_of_type_named<GUI::ScrollableContainerWidget>("scrollable_container"sv);
|
||||||
m_search_box = main_widget.find_descendant_of_type_named<GUI::TextBox>("search_box"sv);
|
m_search_box = main_widget.find_descendant_of_type_named<GUI::TextBox>("search_box"sv);
|
||||||
|
m_toolbar = main_widget.find_descendant_of_type_named<GUI::Toolbar>("toolbar"sv);
|
||||||
m_emojis_widget = main_widget.find_descendant_of_type_named<GUI::Widget>("emojis"sv);
|
m_emojis_widget = main_widget.find_descendant_of_type_named<GUI::Widget>("emojis"sv);
|
||||||
m_emojis = supported_emoji();
|
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);
|
scrollable_container.horizontal_scrollbar().set_visible(false);
|
||||||
update_displayed_emoji();
|
update_displayed_emoji();
|
||||||
|
|
||||||
@ -134,6 +180,11 @@ void EmojiInputDialog::update_displayed_emoji()
|
|||||||
while (!found_match && (index < m_emojis.size())) {
|
while (!found_match && (index < m_emojis.size())) {
|
||||||
auto& emoji = m_emojis[index++];
|
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())
|
if (emoji.emoji.has_value())
|
||||||
found_match = emoji.emoji->name.contains(m_search_box->text(), CaseSensitivity::CaseInsensitive);
|
found_match = emoji.emoji->name.contains(m_search_box->text(), CaseSensitivity::CaseInsensitive);
|
||||||
else
|
else
|
||||||
|
@ -12,6 +12,17 @@
|
|||||||
fixed_height: 22
|
fixed_height: 22
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GUI::ToolbarContainer {
|
||||||
|
@GUI::Toolbar {
|
||||||
|
name: "toolbar"
|
||||||
|
|
||||||
|
@GUI::Label {
|
||||||
|
text: "Category: "
|
||||||
|
autosize: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@GUI::ScrollableContainerWidget {
|
@GUI::ScrollableContainerWidget {
|
||||||
name: "scrollable_container"
|
name: "scrollable_container"
|
||||||
content_widget: @GUI::Widget {
|
content_widget: @GUI::Widget {
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/Optional.h>
|
||||||
|
#include <AK/OwnPtr.h>
|
||||||
#include <LibGUI/Dialog.h>
|
#include <LibGUI/Dialog.h>
|
||||||
#include <LibUnicode/Emoji.h>
|
#include <LibUnicode/Emoji.h>
|
||||||
|
|
||||||
@ -30,7 +32,11 @@ private:
|
|||||||
Vector<Emoji> supported_emoji();
|
Vector<Emoji> supported_emoji();
|
||||||
void update_displayed_emoji();
|
void update_displayed_emoji();
|
||||||
|
|
||||||
|
OwnPtr<ActionGroup> m_category_action_group;
|
||||||
|
Optional<Unicode::EmojiGroup> m_selected_category;
|
||||||
|
|
||||||
RefPtr<TextBox> m_search_box;
|
RefPtr<TextBox> m_search_box;
|
||||||
|
RefPtr<Toolbar> m_toolbar;
|
||||||
RefPtr<Widget> m_emojis_widget;
|
RefPtr<Widget> m_emojis_widget;
|
||||||
Vector<Emoji> m_emojis;
|
Vector<Emoji> m_emojis;
|
||||||
String m_selected_emoji_text;
|
String m_selected_emoji_text;
|
||||||
|
Loading…
Reference in New Issue
Block a user