diff --git a/Userland/Games/Flood/SettingsDialog.cpp b/Userland/Games/Flood/SettingsDialog.cpp index 4a09a1c81a..e63e5ef9c6 100644 --- a/Userland/Games/Flood/SettingsDialog.cpp +++ b/Userland/Games/Flood/SettingsDialog.cpp @@ -17,7 +17,15 @@ #include #include -SettingsDialog::SettingsDialog(GUI::Window* parent, size_t board_rows, size_t board_columns) +ErrorOr> SettingsDialog::try_create(GUI::Window* parent, size_t board_rows, size_t board_columns) +{ + auto settings_widget = GUI::Widget::construct(); + TRY(settings_widget->load_from_gml(settings_dialog_gml)); + auto settings_dialog = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SettingsDialog(move(settings_widget), move(parent), move(board_rows), move(board_columns)))); + return settings_dialog; +} + +SettingsDialog::SettingsDialog(NonnullRefPtr settings_widget, GUI::Window* parent, size_t board_rows, size_t board_columns) : GUI::Dialog(parent) , m_board_rows(board_rows) , m_board_columns(board_columns) @@ -27,29 +35,28 @@ SettingsDialog::SettingsDialog(GUI::Window* parent, size_t board_rows, size_t bo set_icon(parent->icon()); set_resizable(false); - auto main_widget = set_main_widget().release_value_but_fixme_should_propagate_errors(); - main_widget->load_from_gml(settings_dialog_gml).release_value_but_fixme_should_propagate_errors(); + set_main_widget(settings_widget); - auto board_rows_spinbox = main_widget->find_descendant_of_type_named("board_rows_spinbox"); + auto board_rows_spinbox = settings_widget->find_descendant_of_type_named("board_rows_spinbox"); board_rows_spinbox->set_value(m_board_rows); board_rows_spinbox->on_change = [&](auto value) { m_board_rows = value; }; - auto board_columns_spinbox = main_widget->find_descendant_of_type_named("board_columns_spinbox"); + auto board_columns_spinbox = settings_widget->find_descendant_of_type_named("board_columns_spinbox"); board_columns_spinbox->set_value(m_board_columns); board_columns_spinbox->on_change = [&](auto value) { m_board_columns = value; }; - auto cancel_button = main_widget->find_descendant_of_type_named("cancel_button"); + auto cancel_button = settings_widget->find_descendant_of_type_named("cancel_button"); cancel_button->on_click = [this](auto) { done(ExecResult::Cancel); }; - auto ok_button = main_widget->find_descendant_of_type_named("ok_button"); + auto ok_button = settings_widget->find_descendant_of_type_named("ok_button"); ok_button->on_click = [this](auto) { done(ExecResult::OK); }; diff --git a/Userland/Games/Flood/SettingsDialog.h b/Userland/Games/Flood/SettingsDialog.h index 8b8f366f0a..95dde32476 100644 --- a/Userland/Games/Flood/SettingsDialog.h +++ b/Userland/Games/Flood/SettingsDialog.h @@ -10,13 +10,14 @@ #include class SettingsDialog : public GUI::Dialog { - C_OBJECT(SettingsDialog) + C_OBJECT_ABSTRACT(SettingsDialog) public: + static ErrorOr> try_create(GUI::Window* parent, size_t board_rows, size_t board_columns); size_t board_rows() const { return m_board_rows; } size_t board_columns() const { return m_board_columns; } private: - SettingsDialog(GUI::Window* parent, size_t board_rows, size_t board_columns); + SettingsDialog(NonnullRefPtr settings_widget, GUI::Window* parent, size_t board_rows, size_t board_columns); size_t m_board_rows; size_t m_board_columns; diff --git a/Userland/Games/Flood/main.cpp b/Userland/Games/Flood/main.cpp index 7488154b26..2611684f5b 100644 --- a/Userland/Games/Flood/main.cpp +++ b/Userland/Games/Flood/main.cpp @@ -108,7 +108,13 @@ ErrorOr serenity_main(Main::Arguments arguments) update(); auto change_settings = [&] { - auto settings_dialog = SettingsDialog::construct(window, board_rows, board_columns); + auto settings_dialog_or_error = SettingsDialog::try_create(window, board_rows, board_columns); + if (settings_dialog_or_error.is_error()) { + GUI::MessageBox::show(window, "Failed to load the settings window"sv, "Unable to Open Settings"sv, GUI::MessageBox::Type::Error); + return; + } + + auto settings_dialog = settings_dialog_or_error.release_value(); if (settings_dialog->exec() != GUI::Dialog::ExecResult::OK) return;