diff --git a/Userland/Applications/PixelPaint/MainWidget.cpp b/Userland/Applications/PixelPaint/MainWidget.cpp index 7a40901222..5cdc1b78a1 100644 --- a/Userland/Applications/PixelPaint/MainWidget.cpp +++ b/Userland/Applications/PixelPaint/MainWidget.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include namespace PixelPaint { @@ -61,16 +62,16 @@ MainWidget::MainWidget() }; m_tab_widget->on_tab_close_click = [&](auto& widget) { - auto& image_editor = verify_cast(widget); - - if (m_tab_widget->children().size() == 1) { - m_layer_list_widget->set_image(nullptr); - m_layer_properties_widget->set_layer(nullptr); + if (request_close()) { + auto& image_editor = verify_cast(widget); + m_tab_widget->deferred_invoke([&] { + m_tab_widget->remove_tab(image_editor); + if (m_tab_widget->children().size() == 1) { + m_layer_list_widget->set_image(nullptr); + m_layer_properties_widget->set_layer(nullptr); + } + }); } - - m_tab_widget->deferred_invoke([&] { - m_tab_widget->remove_tab(image_editor); - }); }; m_tab_widget->on_change = [&](auto& widget) { @@ -173,8 +174,9 @@ void MainWidget::initialize_menubar(GUI::Window& window) return; m_tab_widget->on_tab_close_click(*active_widget); })); - file_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) { - GUI::Application::the()->quit(); + file_menu.add_action(GUI::CommonActions::make_quit_action([this](auto&) { + if (request_close()) + GUI::Application::the()->quit(); })); auto& edit_menu = window.add_menu("&Edit"); @@ -748,6 +750,24 @@ void MainWidget::create_default_image() editor.set_active_layer(bg_layer); } +bool MainWidget::request_close() +{ + if (m_tab_widget->children().is_empty()) + return true; + + auto result = GUI::MessageBox::show(window(), "Save before closing?", "Save changes", GUI::MessageBox::Type::Warning, GUI::MessageBox::InputType::YesNoCancel); + + if (result == GUI::MessageBox::ExecYes) { + m_save_image_as_action->activate(); + return true; + } + + if (result == GUI::MessageBox::ExecNo) + return true; + + return false; +} + ImageEditor* MainWidget::current_image_editor() { if (!m_tab_widget->active_widget()) diff --git a/Userland/Applications/PixelPaint/MainWidget.h b/Userland/Applications/PixelPaint/MainWidget.h index 58cf0e2f26..991bd8429f 100644 --- a/Userland/Applications/PixelPaint/MainWidget.h +++ b/Userland/Applications/PixelPaint/MainWidget.h @@ -35,6 +35,7 @@ public: void open_image_fd(int fd, String const& path); void create_default_image(); + bool request_close(); private: MainWidget(); diff --git a/Userland/Applications/PixelPaint/main.cpp b/Userland/Applications/PixelPaint/main.cpp index c2897b961e..5d9fa0bf03 100644 --- a/Userland/Applications/PixelPaint/main.cpp +++ b/Userland/Applications/PixelPaint/main.cpp @@ -68,8 +68,15 @@ int main(int argc, char** argv) window->set_icon(app_icon.bitmap_for_size(16)); auto& main_widget = window->set_main_widget(); + main_widget.initialize_menubar(*window); + window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision { + if (main_widget.request_close()) + return GUI::Window::CloseRequestDecision::Close; + return GUI::Window::CloseRequestDecision::StayOpen; + }; + auto& statusbar = *main_widget.find_descendant_of_type_named("statusbar"); app->on_action_enter = [&statusbar](GUI::Action& action) {