diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua index c1bbc0ae42..ef634867a0 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -47,9 +47,49 @@ local tabs = { } -------------------------------------------------------------------------------- +local function show_exit_dialog(tabview, show_dialog) + tabview:hide() + local dlg = dialog_create( + "mainmenu_quit_confirm", + function() + return "size[10,3,true]" .. + "label[0.5,0.5;" .. fgettext("Are you sure you want to quit?") .. "]" .. + "checkbox[0.5,1;cb_show_dialog;" .. fgettext("Always show this dialog.") .. ";" .. tostring(show_dialog) .. "]" .. + "style[btn_quit_confirm_yes;bgcolor=red]" .. + "button[0.5,2.0;2.5,0.5;btn_quit_confirm_yes;" .. fgettext("Quit") .. "]" .. + "button[7.0,2.0;2.5,0.5;btn_quit_confirm_cancel;" .. fgettext("Cancel") .. "]" + end, + function(this, fields) + if fields.cb_show_dialog ~= nil then + core.settings:set_bool("enable_esc_dialog", core.is_yes(fields.cb_show_dialog)) + return false + elseif fields.btn_quit_confirm_yes then + this:delete() + core.close() + return true + elseif fields.btn_quit_confirm_cancel or fields.key_escape or fields.quit then + this:delete() + if tabview and tabview.show then + tabview:show() + end + return true + end + end, + nil + ) + dlg:set_parent(tabview) + dlg:show() +end + local function main_event_handler(tabview, event) if event == "MenuQuit" then - core.close() + local show_dialog = core.settings:get_bool("enable_esc_dialog") + if not ui.childlist["mainmenu_quit_confirm"] and show_dialog then + show_exit_dialog(tabview, show_dialog) + else + core.close() + end + return true end return true end diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index aad629900a..3c53830895 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -158,6 +158,9 @@ autojump (Automatic jumping) bool false # On touchscreens, this only affects digging. safe_dig_and_place (Safe digging and placing) bool false +# Enable a confirmation dialog before closing. +enable_esc_dialog (Confirmation dialog before closing) bool true + [*Keyboard and Mouse] # Invert vertical mouse movement. diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index c27da7988e..9c0e2aa743 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -370,6 +370,7 @@ void set_default_settings() settings->setDefault("toggle_sneak_key", "false"); settings->setDefault("toggle_aux1_key", "false"); settings->setDefault("autojump", bool_to_cstr(has_touch)); + settings->setDefault("enable_esc_dialog", "true"); settings->setDefault("continuous_forward", "false"); settings->setDefault("enable_joysticks", "false"); settings->setDefault("joystick_id", "0");