mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-11 21:52:53 +00:00
Past a few hundred matches, the search is no longer useful, and takes an excessive amount of time to recalculate the column widths by measuring thousands of pieces of text. 250 seems like a reasonable arbitrary limit, and keeps things nice and snappy. :^)
80 lines
2.7 KiB
C++
80 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "CharacterMapWidget.h"
|
|
#include "SearchCharacters.h"
|
|
#include <AK/URL.h>
|
|
#include <LibConfig/Client.h>
|
|
#include <LibCore/ArgsParser.h>
|
|
#include <LibCore/System.h>
|
|
#include <LibDesktop/Launcher.h>
|
|
#include <LibGUI/Application.h>
|
|
#include <LibGUI/Icon.h>
|
|
#include <LibGUI/Window.h>
|
|
#include <LibGfx/Font/FontDatabase.h>
|
|
#include <LibMain/Main.h>
|
|
|
|
static void search_and_print_results(DeprecatedString 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(" - "sv);
|
|
builder.append(display_name);
|
|
outln(builder.string_view());
|
|
result_count++;
|
|
return IterationDecision::Continue;
|
|
});
|
|
|
|
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_domain("CharacterMap");
|
|
|
|
TRY(Desktop::Launcher::add_allowed_handler_with_only_specific_urls("/bin/Help", { URL::create_with_file_scheme("/usr/share/man/man1/CharacterMap.md") }));
|
|
TRY(Desktop::Launcher::seal_allowlist());
|
|
|
|
TRY(Core::System::pledge("stdio recvfd sendfd rpath"));
|
|
TRY(Core::System::unveil("/res", "r"));
|
|
TRY(Core::System::unveil(nullptr, nullptr));
|
|
|
|
DeprecatedString 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-character-map"sv));
|
|
auto window = TRY(GUI::Window::try_create());
|
|
window->set_title("Character Map");
|
|
window->set_icon(app_icon.bitmap_for_size(16));
|
|
window->resize(600, 400);
|
|
|
|
auto character_map_widget = TRY(window->set_main_widget<CharacterMapWidget>());
|
|
character_map_widget->initialize_menubar(*window);
|
|
|
|
auto font_query = Config::read_string("CharacterMap"sv, "History"sv, "Font"sv, Gfx::FontDatabase::the().default_font_query());
|
|
character_map_widget->set_font(Gfx::FontDatabase::the().get_by_name(font_query));
|
|
|
|
window->show();
|
|
return app->exec();
|
|
}
|