From 0061af170fda70f2c52d2a7f6ba2dc28bf00c948 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Wed, 16 Feb 2022 10:12:46 -0500 Subject: [PATCH] FontEditor: Add a search box to filter Unicode blocks --- .../Applications/FontEditor/FontEditor.cpp | 42 +++++++++++++++---- Userland/Applications/FontEditor/FontEditor.h | 4 ++ .../FontEditor/FontEditorWindow.gml | 16 +++++-- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/Userland/Applications/FontEditor/FontEditor.cpp b/Userland/Applications/FontEditor/FontEditor.cpp index 82f17bbaef..bf64ecaf0c 100644 --- a/Userland/Applications/FontEditor/FontEditor.cpp +++ b/Userland/Applications/FontEditor/FontEditor.cpp @@ -134,6 +134,8 @@ FontEditorWidget::FontEditorWidget() m_fixed_width_checkbox = *find_descendant_of_type_named("fixed_width_checkbox"); m_font_metadata_groupbox = *find_descendant_of_type_named("font_metadata_groupbox"); m_unicode_block_listview = *find_descendant_of_type_named("unicode_block_listview"); + m_search_textbox = *find_descendant_of_type_named("search_textbox"); + m_unicode_block_container = *find_descendant_of_type_named("unicode_block_container"); m_glyph_editor_widget = m_glyph_editor_container->add(); m_glyph_map_widget = glyph_map_container.add(); @@ -435,24 +437,46 @@ FontEditorWidget::FontEditorWidget() }; auto unicode_blocks = Unicode::block_display_names(); - m_unicode_block_listview->on_activation = [this, unicode_blocks](auto& index) { - if (index.row() > 0) - m_range = unicode_blocks[index.row() - 1].code_point_range; - else - m_range = { 0x0000, 0x10FFFF }; - m_glyph_map_widget->set_active_range(m_range); - }; - m_unicode_block_list.append("Show All"); for (auto& block : unicode_blocks) m_unicode_block_list.append(block.display_name); m_unicode_block_model = GUI::ItemListModel::create(m_unicode_block_list); - m_unicode_block_listview->set_model(*m_unicode_block_model); + m_filter_model = MUST(GUI::FilteringProxyModel::create(*m_unicode_block_model)); + m_filter_model->set_filter_term(""); + + m_unicode_block_listview->on_activation = [this, unicode_blocks](auto& index) { + auto mapped_index = m_filter_model->map(index); + if (mapped_index.row() > 0) + m_range = unicode_blocks[mapped_index.row() - 1].code_point_range; + else + m_range = { 0x0000, 0x10FFFF }; + m_glyph_map_widget->set_active_range(m_range); + }; + m_unicode_block_listview->set_model(*m_filter_model); m_unicode_block_listview->set_activates_on_selection(true); m_unicode_block_listview->horizontal_scrollbar().set_visible(false); m_unicode_block_listview->set_cursor(m_unicode_block_model->index(0, 0), GUI::AbstractView::SelectionUpdate::Set); + m_search_textbox->on_return_pressed = [this] { + if (!m_unicode_block_listview->selection().is_empty()) + m_unicode_block_listview->activate_selected(); + }; + + m_search_textbox->on_down_pressed = [this] { + m_unicode_block_listview->move_cursor(GUI::AbstractView::CursorMovement::Down, GUI::AbstractView::SelectionUpdate::Set); + }; + + m_search_textbox->on_up_pressed = [this] { + m_unicode_block_listview->move_cursor(GUI::AbstractView::CursorMovement::Up, GUI::AbstractView::SelectionUpdate::Set); + }; + + m_search_textbox->on_change = [this] { + m_filter_model->set_filter_term(m_search_textbox->text()); + if (m_filter_model->row_count() != 0) + m_unicode_block_listview->set_cursor(m_filter_model->index(0, 0), GUI::AbstractView::SelectionUpdate::Set); + }; + GUI::Application::the()->on_action_enter = [this](GUI::Action& action) { auto text = action.status_tip(); if (text.is_empty()) diff --git a/Userland/Applications/FontEditor/FontEditor.h b/Userland/Applications/FontEditor/FontEditor.h index 90e1c2a92f..1d013190cb 100644 --- a/Userland/Applications/FontEditor/FontEditor.h +++ b/Userland/Applications/FontEditor/FontEditor.h @@ -10,6 +10,7 @@ #include "UndoGlyph.h" #include #include +#include #include #include #include @@ -111,6 +112,7 @@ private: RefPtr m_font_preview_window; RefPtr m_left_column_container; RefPtr m_glyph_editor_container; + RefPtr m_unicode_block_container; RefPtr m_weight_combobox; RefPtr m_slope_combobox; RefPtr m_spacing_spinbox; @@ -121,10 +123,12 @@ private: RefPtr m_glyph_editor_present_checkbox; RefPtr m_name_textbox; RefPtr m_family_textbox; + RefPtr m_search_textbox; RefPtr m_fixed_width_checkbox; RefPtr m_font_metadata_groupbox; RefPtr m_unicode_block_listview; RefPtr m_unicode_block_model; + RefPtr m_filter_model; String m_path; Vector m_font_weight_list; diff --git a/Userland/Applications/FontEditor/FontEditorWindow.gml b/Userland/Applications/FontEditor/FontEditorWindow.gml index cf6b1185ba..a1bbf7c9ed 100644 --- a/Userland/Applications/FontEditor/FontEditorWindow.gml +++ b/Userland/Applications/FontEditor/FontEditorWindow.gml @@ -219,9 +219,19 @@ } } - @GUI::ListView { - name: "unicode_block_listview" - max_width: 175 + @GUI::Widget { + name: "unicode_block_container" + fixed_width: 175 + layout: @GUI::VerticalBoxLayout {} + + @GUI::TextBox { + name: "search_textbox" + placeholder: "Search" + } + + @GUI::ListView { + name: "unicode_block_listview" + } } } }