mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 12:48:10 +00:00

This works the same way as the command-line usage, searching against the display name as provided by LibUnicode. I've modified the search loop to cover every possible unicode code-point, since my previous logic was flawed. Code-points are not dense, there are gaps, so simply iterating up to the count of them will skip ones with higher values. Surprisingly, iterating all 1,114,112 of them still runs in a third of a second. Computers are fast!
74 lines
2.3 KiB
C++
74 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "CharacterMapWidget.h"
|
|
#include "SearchCharacters.h"
|
|
#include <LibConfig/Client.h>
|
|
#include <LibCore/ArgsParser.h>
|
|
#include <LibCore/System.h>
|
|
#include <LibGUI/Application.h>
|
|
#include <LibGUI/Icon.h>
|
|
#include <LibGUI/Window.h>
|
|
#include <LibGfx/FontDatabase.h>
|
|
#include <LibMain/Main.h>
|
|
|
|
static void search_and_print_results(String const& query)
|
|
{
|
|
outln("Searching for '{}'", query);
|
|
u32 result_count = 0;
|
|
for_each_character_containing(query, [&](auto code_point, auto& display_name) {
|
|
StringBuilder builder;
|
|
builder.append_code_point(code_point);
|
|
builder.append(" - ");
|
|
builder.append(display_name);
|
|
outln(builder.string_view());
|
|
result_count++;
|
|
});
|
|
|
|
if (result_count == 0)
|
|
outln("No results found.");
|
|
else if (result_count == 1)
|
|
outln("1 result found.");
|
|
else
|
|
outln("{} results found.", result_count);
|
|
}
|
|
|
|
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|
{
|
|
TRY(Core::System::pledge("stdio recvfd sendfd rpath unix"));
|
|
|
|
auto app = TRY(GUI::Application::try_create(arguments));
|
|
Config::pledge_domains("CharacterMap");
|
|
|
|
TRY(Core::System::pledge("stdio recvfd sendfd rpath"));
|
|
TRY(Core::System::unveil("/res", "r"));
|
|
TRY(Core::System::unveil(nullptr, nullptr));
|
|
|
|
String query;
|
|
Core::ArgsParser args_parser;
|
|
args_parser.add_option(query, "Search character names using this query, and print them as a list.", "search", 's', "query");
|
|
args_parser.parse(arguments);
|
|
|
|
if (!query.is_empty()) {
|
|
search_and_print_results(query);
|
|
return 0;
|
|
}
|
|
|
|
auto app_icon = TRY(GUI::Icon::try_create_default_icon("app-keyboard-settings"));
|
|
auto window = TRY(GUI::Window::try_create());
|
|
window->set_title("Character Map");
|
|
window->set_icon(app_icon.bitmap_for_size(16));
|
|
window->resize(400, 400);
|
|
|
|
auto character_map_widget = TRY(window->try_set_main_widget<CharacterMapWidget>());
|
|
character_map_widget->initialize_menubar(*window);
|
|
|
|
auto font_query = Config::read_string("CharacterMap", "History", "Font", Gfx::FontDatabase::the().default_font_query());
|
|
character_map_widget->set_font(Gfx::FontDatabase::the().get_by_name(font_query));
|
|
|
|
window->show();
|
|
return app->exec();
|
|
}
|