1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:37:35 +00:00

PixelPaint: Propagate errors in {flip,crop,rotate,resize} functions

We now propagate errors when using the {Layer,Image}::flip(),
{Layer,Image}::crop(), {Layer,Image}::rotate() and
{Layer,Image}::resize() functions.

We handle these errors by show an error DialogBox with the error's
message.

This removes 8 FIXMEs:))
This commit is contained in:
Baitinq 2022-12-20 17:17:51 +01:00 committed by Sam Atkins
parent 65b420f996
commit e89c649be1
6 changed files with 232 additions and 67 deletions

View file

@ -15,6 +15,7 @@
#include "FilterParams.h"
#include "LevelsDialog.h"
#include "ResizeImageDialog.h"
#include <AK/String.h>
#include <Applications/PixelPaint/PixelPaintWindowGML.h>
#include <LibConfig/Client.h>
#include <LibCore/Debounce.h>
@ -565,14 +566,22 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
"Flip Image &Vertically", g_icon_bag.edit_flip_vertical, [&](auto&) {
auto* editor = current_image_editor();
VERIFY(editor);
editor->image().flip(Gfx::Orientation::Vertical);
auto image_flip_or_error = editor->image().flip(Gfx::Orientation::Vertical);
if (image_flip_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to flip image: {}", image_flip_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Flip Image Vertically"sv);
}));
m_image_menu->add_action(GUI::Action::create(
"Flip Image &Horizontally", g_icon_bag.edit_flip_horizontal, [&](auto&) {
auto* editor = current_image_editor();
VERIFY(editor);
editor->image().flip(Gfx::Orientation::Horizontal);
auto image_flip_or_error = editor->image().flip(Gfx::Orientation::Horizontal);
if (image_flip_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to flip image: {}", image_flip_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Flip Image Horizontally"sv);
}));
m_image_menu->add_separator();
@ -581,7 +590,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
[&](auto&) {
auto* editor = current_image_editor();
VERIFY(editor);
editor->image().rotate(Gfx::RotationDirection::CounterClockwise);
auto image_rotate_or_error = editor->image().rotate(Gfx::RotationDirection::CounterClockwise);
if (image_rotate_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to rotate image: {}", image_rotate_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Rotate Image Counterclockwise"sv);
}));
@ -589,7 +602,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
[&](auto&) {
auto* editor = current_image_editor();
VERIFY(editor);
editor->image().rotate(Gfx::RotationDirection::Clockwise);
auto image_rotate_or_error = editor->image().rotate(Gfx::RotationDirection::Clockwise);
if (image_rotate_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to rotate image: {}", image_rotate_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Rotate Image Clockwise"sv);
}));
m_image_menu->add_separator();
@ -599,7 +616,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
VERIFY(editor);
auto dialog = PixelPaint::ResizeImageDialog::construct(editor->image().size(), &window);
if (dialog->exec() == GUI::Dialog::ExecResult::OK) {
editor->image().resize(dialog->desired_size(), dialog->scaling_mode());
auto image_resize_or_error = editor->image().resize(dialog->desired_size(), dialog->scaling_mode());
if (image_resize_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to resize image: {}", image_resize_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Resize Image"sv);
}
}));
@ -611,7 +632,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
if (editor->image().selection().is_empty())
return;
auto crop_rect = editor->image().rect().intersected(editor->image().selection().bounding_rect());
editor->image().crop(crop_rect);
auto image_crop_or_error = editor->image().crop(crop_rect);
if (image_crop_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to crop image: {}", image_crop_or_error.error().string_literal())));
return;
}
editor->image().selection().clear();
editor->did_complete_action("Crop Image to Selection"sv);
}));
@ -625,7 +650,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
if (!content_bounding_rect.has_value())
return;
editor->image().crop(content_bounding_rect.value());
auto image_crop_or_error = editor->image().crop(content_bounding_rect.value());
if (image_crop_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to crop image: {}", image_crop_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Crop Image to Content"sv);
}));
@ -833,7 +862,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
auto active_layer = editor->active_layer();
if (!active_layer)
return;
active_layer->flip(Gfx::Orientation::Vertical);
auto layer_flip_or_error = active_layer->flip(Gfx::Orientation::Vertical);
if (layer_flip_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to flip layer: {}", layer_flip_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Flip Layer Vertically"sv);
}));
m_layer_menu->add_action(GUI::Action::create(
@ -843,7 +876,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
auto active_layer = editor->active_layer();
if (!active_layer)
return;
active_layer->flip(Gfx::Orientation::Horizontal);
auto layer_flip_or_error = active_layer->flip(Gfx::Orientation::Horizontal);
if (layer_flip_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to flip layer: {}", layer_flip_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Flip Layer Horizontally"sv);
}));
m_layer_menu->add_separator();
@ -855,7 +892,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
auto active_layer = editor->active_layer();
if (!active_layer)
return;
active_layer->rotate(Gfx::RotationDirection::CounterClockwise);
auto layer_rotate_or_error = active_layer->rotate(Gfx::RotationDirection::CounterClockwise);
if (layer_rotate_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to rotate layer: {}", layer_rotate_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Rotate Layer Counterclockwise"sv);
}));
@ -866,7 +907,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
auto active_layer = editor->active_layer();
if (!active_layer)
return;
active_layer->rotate(Gfx::RotationDirection::Clockwise);
auto layer_rotate_or_error = active_layer->rotate(Gfx::RotationDirection::Clockwise);
if (layer_rotate_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to rotate layer: {}", layer_rotate_or_error.error().string_literal())));
return;
}
editor->did_complete_action("Rotate Layer Clockwise"sv);
}));
@ -881,7 +926,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
return;
auto intersection = editor->image().rect().intersected(editor->image().selection().bounding_rect());
auto crop_rect = intersection.translated(-active_layer->location());
active_layer->crop(crop_rect);
auto layer_crop_or_error = active_layer->crop(crop_rect);
if (layer_crop_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to crop layer: {}", layer_crop_or_error.error().string_literal())));
return;
}
active_layer->set_location(intersection.location());
editor->image().selection().clear();
editor->did_complete_action("Crop Layer to Selection"sv);
@ -896,7 +945,11 @@ ErrorOr<void> MainWidget::initialize_menubar(GUI::Window& window)
auto content_bounding_rect = active_layer->nonempty_content_bounding_rect();
if (!content_bounding_rect.has_value())
return;
active_layer->crop(content_bounding_rect.value());
auto layer_crop_or_error = active_layer->crop(content_bounding_rect.value());
if (layer_crop_or_error.is_error()) {
GUI::MessageBox::show_error(&window, MUST(String::formatted("Failed to crop layer: {}", layer_crop_or_error.error().string_literal())));
return;
}
active_layer->set_location(content_bounding_rect->location());
editor->did_complete_action("Crop Layer to Content"sv);
}));