mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:17:34 +00:00
PixelPaint: Propagate errors when creating images or layers
This fixes a dozen release_value_but_fixme_should_propage_errors
This commit is contained in:
parent
25f2e4981c
commit
0ca1247a7f
3 changed files with 54 additions and 24 deletions
|
@ -145,7 +145,7 @@ static constexpr int s_zoom_level_fit_height = 9;
|
||||||
static constexpr int s_zoom_level_fit_image = 10;
|
static constexpr int s_zoom_level_fit_image = 10;
|
||||||
// Note: Update these together! ^
|
// Note: Update these together! ^
|
||||||
|
|
||||||
void MainWidget::initialize_menubar(GUI::Window& window)
|
ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
{
|
{
|
||||||
auto& file_menu = window.add_menu("&File");
|
auto& file_menu = window.add_menu("&File");
|
||||||
|
|
||||||
|
@ -153,8 +153,18 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
"&New Image...", { Mod_Ctrl, Key_N }, g_icon_bag.filetype_pixelpaint, [&](auto&) {
|
"&New Image...", { Mod_Ctrl, Key_N }, g_icon_bag.filetype_pixelpaint, [&](auto&) {
|
||||||
auto dialog = PixelPaint::CreateNewImageDialog::construct(&window);
|
auto dialog = PixelPaint::CreateNewImageDialog::construct(&window);
|
||||||
if (dialog->exec() == GUI::Dialog::ExecResult::OK) {
|
if (dialog->exec() == GUI::Dialog::ExecResult::OK) {
|
||||||
auto image = PixelPaint::Image::try_create_with_size(dialog->image_size()).release_value_but_fixme_should_propagate_errors();
|
auto image_result = PixelPaint::Image::try_create_with_size(dialog->image_size());
|
||||||
auto bg_layer = PixelPaint::Layer::try_create_with_size(*image, image->size(), "Background").release_value_but_fixme_should_propagate_errors();
|
if (image_result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Failed to create image with size {}, error: {}", dialog->image_size(), image_result.error()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto image = image_result.release_value();
|
||||||
|
auto bg_layer_result = PixelPaint::Layer::try_create_with_size(*image, image->size(), "Background");
|
||||||
|
if (bg_layer_result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Failed to create layer with size {}, error: {}", image->size(), bg_layer_result.error()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto bg_layer = bg_layer_result.release_value();
|
||||||
image->add_layer(*bg_layer);
|
image->add_layer(*bg_layer);
|
||||||
auto background_color = dialog->background_color();
|
auto background_color = dialog->background_color();
|
||||||
if (background_color != Gfx::Color::Transparent)
|
if (background_color != Gfx::Color::Transparent)
|
||||||
|
@ -174,7 +184,10 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
|
|
||||||
m_new_image_from_clipboard_action = GUI::Action::create(
|
m_new_image_from_clipboard_action = GUI::Action::create(
|
||||||
"&New Image from Clipboard", { Mod_Ctrl | Mod_Shift, Key_V }, g_icon_bag.new_clipboard, [&](auto&) {
|
"&New Image from Clipboard", { Mod_Ctrl | Mod_Shift, Key_V }, g_icon_bag.new_clipboard, [&](auto&) {
|
||||||
create_image_from_clipboard();
|
auto result = create_image_from_clipboard();
|
||||||
|
if (result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Failed to create image from clipboard: {}", result.error()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
m_open_image_action = GUI::CommonActions::make_open_action([&](auto&) {
|
m_open_image_action = GUI::CommonActions::make_open_action([&](auto&) {
|
||||||
|
@ -314,7 +327,10 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
m_paste_action = GUI::CommonActions::make_paste_action([&](auto&) {
|
m_paste_action = GUI::CommonActions::make_paste_action([&](auto&) {
|
||||||
auto* editor = current_image_editor();
|
auto* editor = current_image_editor();
|
||||||
if (!editor) {
|
if (!editor) {
|
||||||
create_image_from_clipboard();
|
auto result = create_image_from_clipboard();
|
||||||
|
if (result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Failed to create image from clipboard: {}", result.error()));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +338,12 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto layer = PixelPaint::Layer::try_create_with_bitmap(editor->image(), *bitmap, "Pasted layer").release_value_but_fixme_should_propagate_errors();
|
auto layer_result = PixelPaint::Layer::try_create_with_bitmap(editor->image(), *bitmap, "Pasted layer");
|
||||||
|
if (layer_result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Could not create bitmap when pasting: {}", layer_result.error()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto layer = layer_result.release_value();
|
||||||
editor->image().add_layer(*layer);
|
editor->image().add_layer(*layer);
|
||||||
editor->set_active_layer(layer);
|
editor->set_active_layer(layer);
|
||||||
editor->image().selection().clear();
|
editor->image().selection().clear();
|
||||||
|
@ -556,7 +577,7 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
}));
|
}));
|
||||||
m_image_menu->add_separator();
|
m_image_menu->add_separator();
|
||||||
|
|
||||||
m_image_menu->add_action(GUI::Action::create("Rotate Image &Counterclockwise", { Mod_Ctrl | Mod_Shift, Key_LessThan }, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-ccw.png"sv).release_value_but_fixme_should_propagate_errors(),
|
m_image_menu->add_action(GUI::Action::create("Rotate Image &Counterclockwise", { Mod_Ctrl | Mod_Shift, Key_LessThan }, TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-ccw.png"sv)),
|
||||||
[&](auto&) {
|
[&](auto&) {
|
||||||
auto* editor = current_image_editor();
|
auto* editor = current_image_editor();
|
||||||
VERIFY(editor);
|
VERIFY(editor);
|
||||||
|
@ -564,7 +585,7 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
editor->did_complete_action("Rotate Image Counterclockwise"sv);
|
editor->did_complete_action("Rotate Image Counterclockwise"sv);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
m_image_menu->add_action(GUI::Action::create("Rotate Image Clock&wise", { Mod_Ctrl | Mod_Shift, Key_GreaterThan }, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-cw.png"sv).release_value_but_fixme_should_propagate_errors(),
|
m_image_menu->add_action(GUI::Action::create("Rotate Image Clock&wise", { Mod_Ctrl | Mod_Shift, Key_GreaterThan }, TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-cw.png"sv)),
|
||||||
[&](auto&) {
|
[&](auto&) {
|
||||||
auto* editor = current_image_editor();
|
auto* editor = current_image_editor();
|
||||||
VERIFY(editor);
|
VERIFY(editor);
|
||||||
|
@ -750,7 +771,12 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
auto& next_active_layer = editor->image().layer(active_layer_index > 0 ? active_layer_index - 1 : 0);
|
auto& next_active_layer = editor->image().layer(active_layer_index > 0 ? active_layer_index - 1 : 0);
|
||||||
editor->set_active_layer(&next_active_layer);
|
editor->set_active_layer(&next_active_layer);
|
||||||
} else {
|
} else {
|
||||||
auto layer = PixelPaint::Layer::try_create_with_size(editor->image(), editor->image().size(), "Background").release_value_but_fixme_should_propagate_errors();
|
auto layer_result = PixelPaint::Layer::try_create_with_size(editor->image(), editor->image().size(), "Background");
|
||||||
|
if (layer_result.is_error()) {
|
||||||
|
GUI::MessageBox::show_error(&window, DeprecatedString::formatted("Failed to create layer with size {}, error: {}", editor->image().size(), layer_result.error()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto layer = layer_result.release_value();
|
||||||
editor->image().add_layer(move(layer));
|
editor->image().add_layer(move(layer));
|
||||||
editor->layers_did_change();
|
editor->layers_did_change();
|
||||||
m_layer_list_widget->select_top_layer();
|
m_layer_list_widget->select_top_layer();
|
||||||
|
@ -822,7 +848,7 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
}));
|
}));
|
||||||
m_layer_menu->add_separator();
|
m_layer_menu->add_separator();
|
||||||
|
|
||||||
m_layer_menu->add_action(GUI::Action::create("Rotate Layer &Counterclockwise", Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-ccw.png"sv).release_value_but_fixme_should_propagate_errors(),
|
m_layer_menu->add_action(GUI::Action::create("Rotate Layer &Counterclockwise", TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-ccw.png"sv)),
|
||||||
[&](auto&) {
|
[&](auto&) {
|
||||||
auto* editor = current_image_editor();
|
auto* editor = current_image_editor();
|
||||||
VERIFY(editor);
|
VERIFY(editor);
|
||||||
|
@ -833,7 +859,7 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
editor->did_complete_action("Rotate Layer Counterclockwise"sv);
|
editor->did_complete_action("Rotate Layer Counterclockwise"sv);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
m_layer_menu->add_action(GUI::Action::create("Rotate Layer Clock&wise", Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-cw.png"sv).release_value_but_fixme_should_propagate_errors(),
|
m_layer_menu->add_action(GUI::Action::create("Rotate Layer Clock&wise", TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-rotate-cw.png"sv)),
|
||||||
[&](auto&) {
|
[&](auto&) {
|
||||||
auto* editor = current_image_editor();
|
auto* editor = current_image_editor();
|
||||||
VERIFY(editor);
|
VERIFY(editor);
|
||||||
|
@ -967,6 +993,8 @@ void MainWidget::initialize_menubar(GUI::Window& window)
|
||||||
|
|
||||||
toolbar.add_separator();
|
toolbar.add_separator();
|
||||||
toolbar.add_action(*m_levels_dialog_action);
|
toolbar.add_action(*m_levels_dialog_action);
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::set_actions_enabled(bool enabled)
|
void MainWidget::set_actions_enabled(bool enabled)
|
||||||
|
@ -1006,11 +1034,11 @@ void MainWidget::open_image(Core::File& file)
|
||||||
m_layer_list_widget->set_image(&image);
|
m_layer_list_widget->set_image(&image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::create_default_image()
|
ErrorOr<void> MainWidget::create_default_image()
|
||||||
{
|
{
|
||||||
auto image = Image::try_create_with_size({ 510, 356 }).release_value_but_fixme_should_propagate_errors();
|
auto image = TRY(Image::try_create_with_size({ 510, 356 }));
|
||||||
|
|
||||||
auto bg_layer = Layer::try_create_with_size(*image, image->size(), "Background").release_value_but_fixme_should_propagate_errors();
|
auto bg_layer = TRY(Layer::try_create_with_size(*image, image->size(), "Background"));
|
||||||
image->add_layer(*bg_layer);
|
image->add_layer(*bg_layer);
|
||||||
bg_layer->content_bitmap().fill(Color::Transparent);
|
bg_layer->content_bitmap().fill(Color::Transparent);
|
||||||
|
|
||||||
|
@ -1020,18 +1048,19 @@ void MainWidget::create_default_image()
|
||||||
editor.set_title("Untitled");
|
editor.set_title("Untitled");
|
||||||
editor.set_active_layer(bg_layer);
|
editor.set_active_layer(bg_layer);
|
||||||
editor.set_unmodified();
|
editor.set_unmodified();
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::create_image_from_clipboard()
|
ErrorOr<void> MainWidget::create_image_from_clipboard()
|
||||||
{
|
{
|
||||||
auto bitmap = GUI::Clipboard::the().fetch_data_and_type().as_bitmap();
|
auto bitmap = GUI::Clipboard::the().fetch_data_and_type().as_bitmap();
|
||||||
if (!bitmap) {
|
if (!bitmap) {
|
||||||
GUI::MessageBox::show(window(), "There is no image in a clipboard to paste."sv, "PixelPaint"sv, GUI::MessageBox::Type::Warning);
|
return Error::from_string_view("There is no image in a clipboard to paste."sv);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto image = PixelPaint::Image::try_create_with_size(bitmap->size()).release_value_but_fixme_should_propagate_errors();
|
auto image = TRY(PixelPaint::Image::try_create_with_size(bitmap->size()));
|
||||||
auto layer = PixelPaint::Layer::try_create_with_bitmap(image, *bitmap, "Pasted layer").release_value_but_fixme_should_propagate_errors();
|
auto layer = TRY(PixelPaint::Layer::try_create_with_bitmap(image, *bitmap, "Pasted layer"));
|
||||||
image->add_layer(*layer);
|
image->add_layer(*layer);
|
||||||
|
|
||||||
auto& editor = create_new_editor(*image);
|
auto& editor = create_new_editor(*image);
|
||||||
|
@ -1039,6 +1068,7 @@ void MainWidget::create_image_from_clipboard()
|
||||||
|
|
||||||
m_layer_list_widget->set_image(image);
|
m_layer_list_widget->set_image(image);
|
||||||
m_layer_list_widget->set_selected_layer(layer);
|
m_layer_list_widget->set_selected_layer(layer);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MainWidget::request_close()
|
bool MainWidget::request_close()
|
||||||
|
|
|
@ -38,10 +38,10 @@ class MainWidget : public GUI::Widget {
|
||||||
public:
|
public:
|
||||||
virtual ~MainWidget() {};
|
virtual ~MainWidget() {};
|
||||||
|
|
||||||
void initialize_menubar(GUI::Window&);
|
ErrorOr<void> initialize_menubar(GUI::Window&);
|
||||||
|
|
||||||
void open_image(Core::File&);
|
void open_image(Core::File&);
|
||||||
void create_default_image();
|
ErrorOr<void> create_default_image();
|
||||||
|
|
||||||
bool request_close();
|
bool request_close();
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ private:
|
||||||
|
|
||||||
ImageEditor* current_image_editor();
|
ImageEditor* current_image_editor();
|
||||||
ImageEditor& create_new_editor(NonnullRefPtr<Image>);
|
ImageEditor& create_new_editor(NonnullRefPtr<Image>);
|
||||||
void create_image_from_clipboard();
|
ErrorOr<void> create_image_from_clipboard();
|
||||||
|
|
||||||
void image_editor_did_update_undo_stack();
|
void image_editor_did_update_undo_stack();
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
|
|
||||||
auto main_widget = TRY(window->try_set_main_widget<PixelPaint::MainWidget>());
|
auto main_widget = TRY(window->try_set_main_widget<PixelPaint::MainWidget>());
|
||||||
|
|
||||||
main_widget->initialize_menubar(*window);
|
TRY(main_widget->initialize_menubar(*window));
|
||||||
|
|
||||||
window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision {
|
window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision {
|
||||||
if (main_widget->request_close())
|
if (main_widget->request_close())
|
||||||
|
@ -79,7 +79,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||||
return 1;
|
return 1;
|
||||||
main_widget->open_image(response.value());
|
main_widget->open_image(response.value());
|
||||||
} else {
|
} else {
|
||||||
main_widget->create_default_image();
|
TRY(main_widget->create_default_image());
|
||||||
}
|
}
|
||||||
|
|
||||||
return app->exec();
|
return app->exec();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue