diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2023-05-10 17:00:50 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-05-13 12:53:49 +0200 |
commit | 6212e5b1f0ec9cd242dbf1f434f2f3d6b73a5bff (patch) | |
tree | cc37c1595654cef78bd6b8cdb60f9ffdf2133c0c | |
parent | ea8bcb2f30bd2ab020a56368484ba7c0401fc398 (diff) | |
download | serenity-6212e5b1f0ec9cd242dbf1f434f2f3d6b73a5bff.zip |
FontEditor: Don't crash on missing icons
Instead of crashing on failed icon loading with TRY(), let's report
missing but non-critical resources in detail and gracefully move on.
-rw-r--r-- | Userland/Applications/FontEditor/MainWidget.cpp | 24 | ||||
-rw-r--r-- | Userland/Applications/FontEditor/MainWidget.h | 3 | ||||
-rw-r--r-- | Userland/Applications/FontEditor/Resources.h | 54 | ||||
-rw-r--r-- | Userland/Applications/FontEditor/main.cpp | 2 |
4 files changed, 72 insertions, 11 deletions
diff --git a/Userland/Applications/FontEditor/MainWidget.cpp b/Userland/Applications/FontEditor/MainWidget.cpp index c6a282b75d..f7a17b3449 100644 --- a/Userland/Applications/FontEditor/MainWidget.cpp +++ b/Userland/Applications/FontEditor/MainWidget.cpp @@ -46,6 +46,8 @@ namespace FontEditor { +Resources g_resources; + static constexpr Array pangrams = { "quick fox jumps nightly above wizard"sv, "five quacking zephyrs jolt my wax bed"sv, @@ -110,7 +112,7 @@ ErrorOr<RefPtr<GUI::Window>> MainWidget::create_preview_window() ErrorOr<void> MainWidget::create_actions() { - m_new_action = GUI::Action::create("&New Font...", { Mod_Ctrl, Key_N }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-font.png"sv)), [this](auto&) { + m_new_action = GUI::Action::create("&New Font...", { Mod_Ctrl, Key_N }, g_resources.new_font, [this](auto&) { if (!request_close()) return; auto new_font_wizard = NewFontDialog::construct(window()); @@ -202,7 +204,7 @@ ErrorOr<void> MainWidget::create_actions() update_statusbar(); }); - m_open_preview_action = GUI::Action::create("&Preview Font", { Mod_Ctrl, Key_P }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/find.png"sv)), [this](auto&) { + m_open_preview_action = GUI::Action::create("&Preview Font", { Mod_Ctrl, Key_P }, g_resources.preview_font, [this](auto&) { if (!m_font_preview_window) { if (auto maybe_window = create_preview_window(); maybe_window.is_error()) show_error(maybe_window.release_error(), "Creating preview window failed"sv); @@ -273,7 +275,7 @@ ErrorOr<void> MainWidget::create_actions() m_show_system_emoji_action->set_checked(show_system_emoji); m_show_system_emoji_action->set_status_tip("Show or hide system emoji"); - m_go_to_glyph_action = GUI::Action::create("&Go to Glyph...", { Mod_Ctrl, Key_G }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/go-to.png"sv)), [this](auto&) { + m_go_to_glyph_action = GUI::Action::create("&Go to Glyph...", { Mod_Ctrl, Key_G }, g_resources.go_to_glyph, [this](auto&) { String input; if (GUI::InputBox::show(window(), input, {}, "Go to glyph"sv, GUI::InputType::NonemptyText, "Hexadecimal"sv) == GUI::InputBox::ExecResult::OK) { auto maybe_code_point = AK::StringUtils::convert_to_uint_from_hex(input); @@ -288,12 +290,12 @@ ErrorOr<void> MainWidget::create_actions() }); m_go_to_glyph_action->set_status_tip("Go to the specified code point"); - m_previous_glyph_action = GUI::Action::create("Pre&vious Glyph", { Mod_Alt, Key_Left }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/go-back.png"sv)), [this](auto&) { + m_previous_glyph_action = GUI::Action::create("Pre&vious Glyph", { Mod_Alt, Key_Left }, g_resources.previous_glyph, [this](auto&) { m_glyph_map_widget->select_previous_existing_glyph(); }); m_previous_glyph_action->set_status_tip("Seek the previous visible glyph"); - m_next_glyph_action = GUI::Action::create("&Next Glyph", { Mod_Alt, Key_Right }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/go-forward.png"sv)), [this](auto&) { + m_next_glyph_action = GUI::Action::create("&Next Glyph", { Mod_Alt, Key_Right }, g_resources.next_glyph, [this](auto&) { m_glyph_map_widget->select_next_existing_glyph(); }); m_next_glyph_action->set_status_tip("Seek the next visible glyph"); @@ -321,12 +323,12 @@ ErrorOr<void> MainWidget::create_actions() m_glyph_editor_scale_actions.add_action(*m_scale_fifteen_action); m_glyph_editor_scale_actions.set_exclusive(true); - m_paint_glyph_action = GUI::Action::create_checkable("Paint Glyph", { Mod_Ctrl, KeyCode::Key_J }, TRY(Gfx::Bitmap::load_from_file("/res/icons/pixelpaint/pen.png"sv)), [this](auto&) { + m_paint_glyph_action = GUI::Action::create_checkable("Paint Glyph", { Mod_Ctrl, KeyCode::Key_J }, g_resources.paint_glyph, [this](auto&) { m_glyph_editor_widget->set_mode(GlyphEditorWidget::Paint); }); m_paint_glyph_action->set_checked(true); - m_move_glyph_action = GUI::Action::create_checkable("Move Glyph", { Mod_Ctrl, KeyCode::Key_K }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/selection-move.png"sv)), [this](auto&) { + m_move_glyph_action = GUI::Action::create_checkable("Move Glyph", { Mod_Ctrl, KeyCode::Key_K }, g_resources.move_glyph, [this](auto&) { m_glyph_editor_widget->set_mode(GlyphEditorWidget::Move); }); @@ -342,15 +344,15 @@ ErrorOr<void> MainWidget::create_actions() m_glyph_editor_widget->rotate_90(Gfx::RotationDirection::Clockwise); }); - m_flip_horizontal_action = GUI::Action::create("Flip Horizontally", { Mod_Ctrl | Mod_Shift, Key_Q }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/edit-flip-horizontal.png"sv)), [this](auto&) { + m_flip_horizontal_action = GUI::Action::create("Flip Horizontally", { Mod_Ctrl | Mod_Shift, Key_Q }, g_resources.flip_horizontally, [this](auto&) { m_glyph_editor_widget->flip(Gfx::Orientation::Horizontal); }); - m_flip_vertical_action = GUI::Action::create("Flip Vertically", { Mod_Ctrl | Mod_Shift, Key_W }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/edit-flip-vertical.png"sv)), [this](auto&) { + m_flip_vertical_action = GUI::Action::create("Flip Vertically", { Mod_Ctrl | Mod_Shift, Key_W }, g_resources.flip_vertically, [this](auto&) { m_glyph_editor_widget->flip(Gfx::Orientation::Vertical); }); - m_copy_text_action = GUI::Action::create("Copy as Te&xt", { Mod_Ctrl, Key_T }, TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/edit-copy.png"sv)), [this](auto&) { + m_copy_text_action = GUI::Action::create("Copy as Te&xt", { Mod_Ctrl, Key_T }, g_resources.copy_as_text, [this](auto&) { StringBuilder builder; auto selection = m_glyph_map_widget->selection().normalized(); for (auto code_point = selection.start(); code_point < selection.start() + selection.size(); ++code_point) { @@ -740,7 +742,7 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window) TRY(view_menu->try_add_action(*m_show_system_emoji_action)); TRY(view_menu->try_add_separator()); auto scale_menu = TRY(view_menu->try_add_submenu("&Scale"_short_string)); - scale_menu->set_icon(TRY(Gfx::Bitmap::load_from_file("/res/icons/16x16/scale.png"sv))); + scale_menu->set_icon(g_resources.scale_editor); TRY(scale_menu->try_add_action(*m_scale_five_action)); TRY(scale_menu->try_add_action(*m_scale_ten_action)); TRY(scale_menu->try_add_action(*m_scale_fifteen_action)); diff --git a/Userland/Applications/FontEditor/MainWidget.h b/Userland/Applications/FontEditor/MainWidget.h index dccad65f6d..273ee5369f 100644 --- a/Userland/Applications/FontEditor/MainWidget.h +++ b/Userland/Applications/FontEditor/MainWidget.h @@ -7,6 +7,7 @@ #pragma once +#include "Resources.h" #include "UndoSelection.h" #include <LibGUI/ActionGroup.h> #include <LibGUI/FilteringProxyModel.h> @@ -17,6 +18,8 @@ namespace FontEditor { +extern Resources g_resources; + class GlyphEditorWidget; class MainWidget final : public GUI::Widget { diff --git a/Userland/Applications/FontEditor/Resources.h b/Userland/Applications/FontEditor/Resources.h new file mode 100644 index 0000000000..8a038cabb8 --- /dev/null +++ b/Userland/Applications/FontEditor/Resources.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGfx/Bitmap.h> + +namespace FontEditor { + +struct Resources final { + static Resources create() + { + Resources resources; + + auto load_bitmap = [](StringView path) -> RefPtr<Gfx::Bitmap> { + auto bitmap = Gfx::Bitmap::load_from_file(path); + if (!bitmap.is_error()) + return bitmap.release_value(); + warnln("Loading Gfx::Bitmap \"{}\" failed: {}", path, bitmap.release_error()); + return nullptr; + }; + + resources.copy_as_text = load_bitmap("/res/icons/16x16/edit-copy.png"sv); + resources.flip_horizontally = load_bitmap("/res/icons/16x16/edit-flip-horizontal.png"sv); + resources.flip_vertically = load_bitmap("/res/icons/16x16/edit-flip-vertical.png"sv); + resources.go_to_glyph = load_bitmap("/res/icons/16x16/go-to.png"sv); + resources.move_glyph = load_bitmap("/res/icons/16x16/selection-move.png"sv); + resources.new_font = load_bitmap("/res/icons/16x16/filetype-font.png"sv); + resources.next_glyph = load_bitmap("/res/icons/16x16/go-forward.png"sv); + resources.paint_glyph = load_bitmap("/res/icons/pixelpaint/pen.png"sv); + resources.preview_font = load_bitmap("/res/icons/16x16/find.png"sv); + resources.previous_glyph = load_bitmap("/res/icons/16x16/go-back.png"sv); + resources.scale_editor = load_bitmap("/res/icons/16x16/scale.png"sv); + + return resources; + } + + RefPtr<Gfx::Bitmap> copy_as_text; + RefPtr<Gfx::Bitmap> flip_horizontally; + RefPtr<Gfx::Bitmap> flip_vertically; + RefPtr<Gfx::Bitmap> go_to_glyph; + RefPtr<Gfx::Bitmap> move_glyph; + RefPtr<Gfx::Bitmap> new_font; + RefPtr<Gfx::Bitmap> next_glyph; + RefPtr<Gfx::Bitmap> paint_glyph; + RefPtr<Gfx::Bitmap> preview_font; + RefPtr<Gfx::Bitmap> previous_glyph; + RefPtr<Gfx::Bitmap> scale_editor; +}; + +} diff --git a/Userland/Applications/FontEditor/main.cpp b/Userland/Applications/FontEditor/main.cpp index 22bd4a1297..822148dc06 100644 --- a/Userland/Applications/FontEditor/main.cpp +++ b/Userland/Applications/FontEditor/main.cpp @@ -23,6 +23,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) auto app = TRY(GUI::Application::create(arguments)); + FontEditor::g_resources = FontEditor::Resources::create(); + TRY(Desktop::Launcher::add_allowed_handler_with_only_specific_urls("/bin/Help", { URL::create_with_file_scheme("/usr/share/man/man1/Applications/FontEditor.md") })); TRY(Desktop::Launcher::seal_allowlist()); |