]> git.lizzy.rs Git - worldedit.git/commitdiff
worldedit_gui: Improve behaviour of all input fields
authorsfan5 <sfan5@live.de>
Thu, 19 Dec 2019 17:20:24 +0000 (18:20 +0100)
committersfan5 <sfan5@live.de>
Thu, 19 Dec 2019 17:20:24 +0000 (18:20 +0100)
continuation of 45acf09e4a3ea7ed563d2d43cc63425b04fc63ef

worldedit_gui/functionality.lua

index 7c9d587998d5f985953f8e123428f3d24f1dad38..1efed10e27450277227dcf434446a3b43651276e 100644 (file)
@@ -52,8 +52,8 @@ end
 \r
 -- display node (or unknown_node image otherwise) at specified pos in formspec\r
 local formspec_node = function(pos, nodename)\r
-       if nodename then\r
-               local ndef = minetest.registered_nodes[nodename] or {}\r
+       local ndef = nodename and minetest.registered_nodes[nodename]\r
+       if nodename and ndef then\r
                return string.format("item_image[%s;1,1;%s]", pos, nodename) ..\r
                        string.format("tooltip[%s;1,1;%s]", pos, minetest.formspec_escape(ndef.description))\r
        else\r
@@ -63,7 +63,7 @@ end
 \r
 -- two further priv helpers\r
 local function we_privs(command)\r
-       return minetest.chatcommands["/" .. command].privs\r
+       return worldedit.registered_commands[command].privs\r
 end\r
 \r
 local function combine_we_privs(list)\r
@@ -74,6 +74,64 @@ local function combine_we_privs(list)
        return combine_privs(unpack(args))\r
 end\r
 \r
+-- functions that handle value changing & page reshowing (without submitting)\r
+local function copy_changes(name, fields, def)\r
+       for field, into in pairs(def) do\r
+               if into ~= true and fields[field] then\r
+                       local value = tostring(fields[field])\r
+                       if into == gui_axis1 or into == gui_axis2 then\r
+                               into[name] = axis_indices[value]\r
+                       elseif into == gui_angle then\r
+                               into[name] = angle_indices[value]\r
+                       else\r
+                               into[name] = value\r
+                       end\r
+               end\r
+       end\r
+end\r
+\r
+local function handle_changes(name, identifier, fields, def)\r
+       local any = false\r
+       for field, into in pairs(def) do\r
+               if fields.key_enter_field == field then\r
+                       any = true\r
+               end\r
+               -- first condition: buttons (value not saved)\r
+               -- others: dropdowns which will be sent when their value changes\r
+               if into == true or into == gui_axis1 or into == gui_axis2 or into == gui_angle then\r
+                       if fields[field] then\r
+                               any = true\r
+                       end\r
+               end\r
+       end\r
+       if not any then\r
+               return false\r
+       end\r
+\r
+       any = false\r
+       for field, into in pairs(def) do\r
+               if into ~= true and fields[field] then\r
+                       local value = tostring(fields[field])\r
+                       if into == gui_axis1 or into == gui_axis2 then\r
+                               into[name] = axis_indices[value]\r
+                       elseif into == gui_angle then\r
+                               into[name] = angle_indices[value]\r
+                       else\r
+                               into[name] = value\r
+                       end\r
+\r
+                       if into == gui_nodename1 or into == gui_nodename2 then\r
+                               any = true\r
+                       end\r
+               end\r
+       end\r
+       -- Only nodename fields change based on the value, so only re-show the page if necessary\r
+       if any then\r
+               worldedit.show_page(name, identifier)\r
+       end\r
+       return true\r
+end\r
+\r
 worldedit.register_gui_function("worldedit_gui_about", {\r
        name = "About",\r
        privs = {interact=true},\r
@@ -186,13 +244,15 @@ worldedit.register_gui_function("worldedit_gui_set", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_set", function(name, fields)\r
-       local ret = false\r
-       if fields.worldedit_gui_set_search or fields.key_enter_field == "worldedit_gui_set_node" then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_set_node)\r
-               worldedit.show_page(name, "worldedit_gui_set")\r
-               ret = true -- fallthrough\r
-       end\r
+       local cg = {\r
+               worldedit_gui_set_search = true,\r
+               worldedit_gui_set_node = gui_nodename1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_set", fields, cg)\r
        if fields.worldedit_gui_set_submit then\r
+               copy_changes(name, fields, cg)\r
+               worldedit.show_page(name, "worldedit_gui_set")\r
+\r
                local n = worldedit.normalize_nodename(gui_nodename1[name])\r
                if n then\r
                        minetest.chatcommands["/set"].func(name, n)\r
@@ -223,16 +283,17 @@ worldedit.register_gui_function("worldedit_gui_replace", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_replace", function(name, fields)\r
-       local ret = false\r
-       if fields.worldedit_gui_replace_search_search or fields.worldedit_gui_replace_replace_search\r
-               or table.indexof({"worldedit_gui_replace_search", "worldedit_gui_replace_replace"}, fields.key_enter_field) ~= -1 then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_replace_search)\r
-               gui_nodename2[name] = tostring(fields.worldedit_gui_replace_replace)\r
+       local cg = {\r
+               worldedit_gui_replace_search_search = true,\r
+               worldedit_gui_replace_replace_search = true,\r
+               worldedit_gui_replace_search = gui_nodename1,\r
+               worldedit_gui_replace_replace = gui_nodename2,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_replace", fields, cg)\r
+       if fields.worldedit_gui_replace_submit or fields.worldedit_gui_replace_submit_inverse then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_replace")\r
 \r
-               ret = true -- fallthrough\r
-       end\r
-       if fields.worldedit_gui_replace_submit or fields.worldedit_gui_replace_submit_inverse then\r
                local submit = "replace"\r
                if fields.worldedit_gui_replace_submit_inverse then\r
                        submit = "replaceinverse"\r
@@ -255,9 +316,11 @@ worldedit.register_gui_function("worldedit_gui_sphere_dome", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,5]" .. worldedit.get_formspec_header("worldedit_gui_sphere_dome") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_sphere_dome_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_sphere_dome_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_sphere_dome_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        string.format("field[0.5,2.5;4,0.8;worldedit_gui_sphere_dome_radius;Radius;%s]", minetest.formspec_escape(radius)) ..\r
+                       "field_close_on_enter[worldedit_gui_sphere_dome_radius;false]" ..\r
                        "button_exit[0,3.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow;Hollow Sphere]" ..\r
                        "button_exit[3.5,3.5;3,0.8;worldedit_gui_sphere_dome_submit_solid;Solid Sphere]" ..\r
                        "button_exit[0,4.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow_dome;Hollow Dome]" ..\r
@@ -266,32 +329,32 @@ worldedit.register_gui_function("worldedit_gui_sphere_dome", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_sphere_dome", function(name, fields)\r
-       if fields.worldedit_gui_sphere_dome_search\r
-       or fields.worldedit_gui_sphere_dome_submit_hollow or fields.worldedit_gui_sphere_dome_submit_solid\r
+       local cg = {\r
+               worldedit_gui_sphere_dome_search = true,\r
+               worldedit_gui_sphere_dome_node = gui_nodename1,\r
+               worldedit_gui_sphere_dome_radius = gui_distance2,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_sphere_dome", fields, cg)\r
+       if fields.worldedit_gui_sphere_dome_submit_hollow or fields.worldedit_gui_sphere_dome_submit_solid\r
        or fields.worldedit_gui_sphere_dome_submit_hollow_dome or fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_sphere_dome_node)\r
-               gui_distance2[name] = tostring(fields.worldedit_gui_sphere_dome_radius)\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_sphere_dome")\r
 \r
-               local submit = nil\r
-               if fields.worldedit_gui_sphere_dome_submit_hollow then\r
-                       submit = "hollowsphere"\r
-               elseif fields.worldedit_gui_sphere_dome_submit_solid then\r
+               local submit = "hollowsphere"\r
+               if fields.worldedit_gui_sphere_dome_submit_solid then\r
                        submit = "sphere"\r
                elseif fields.worldedit_gui_sphere_dome_submit_hollow_dome then\r
                        submit = "hollowdome"\r
                elseif fields.worldedit_gui_sphere_dome_submit_solid_dome then\r
                        submit = "dome"\r
                end\r
-               if submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               minetest.chatcommands["/"..submit].func(name, string.format("%s %s", gui_distance2[name], n))\r
-                       end\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       minetest.chatcommands["/"..submit].func(name, string.format("%s %s", gui_distance2[name], n))\r
                end\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_cylinder", {\r
@@ -303,12 +366,16 @@ worldedit.register_gui_function("worldedit_gui_cylinder", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_cylinder") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_cylinder_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_cylinder_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_cylinder_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        string.format("field[0.5,2.5;4,0.8;worldedit_gui_cylinder_length;Length;%s]", minetest.formspec_escape(length)) ..\r
                        string.format("dropdown[4,2.18;2.5;worldedit_gui_cylinder_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
                        string.format("field[0.5,3.5;2,0.8;worldedit_gui_cylinder_radius1;Base Radius;%s]", minetest.formspec_escape(radius1)) ..\r
                        string.format("field[2.5,3.5;2,0.8;worldedit_gui_cylinder_radius2;Top Radius;%s]", minetest.formspec_escape(radius2)) ..\r
+                       "field_close_on_enter[worldedit_gui_cylinder_length;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_cylinder_radius1;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_cylinder_radius2;false]" ..\r
                        "label[0.25,4;Equal base and top radius creates a cylinder,\n"..\r
                                "zero top radius creates a cone.\nConsult documentation for more information.]"..\r
                        "button_exit[0,5.5;3,0.8;worldedit_gui_cylinder_submit_hollow;Hollow Cylinder]" ..\r
@@ -317,36 +384,31 @@ worldedit.register_gui_function("worldedit_gui_cylinder", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_cylinder", function(name, fields)\r
-       if fields.worldedit_gui_cylinder_search\r
-       or fields.worldedit_gui_cylinder_submit_hollow or fields.worldedit_gui_cylinder_submit_solid then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_cylinder_node)\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
-               gui_distance1[name] = tostring(fields.worldedit_gui_cylinder_length)\r
-               gui_distance2[name] = tostring(fields.worldedit_gui_cylinder_radius1)\r
-               gui_distance3[name] = tostring(fields.worldedit_gui_cylinder_radius2)\r
+       local cg = {\r
+               worldedit_gui_cylinder_search = true,\r
+               worldedit_gui_cylinder_node = gui_nodename1,\r
+               worldedit_gui_cylinder_axis = gui_axis1,\r
+               worldedit_gui_cylinder_length = gui_distance1,\r
+               worldedit_gui_cylinder_radius1 = gui_distance2,\r
+               worldedit_gui_cylinder_radius2 = gui_distance3,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_cylinder", fields, cg)\r
+       if fields.worldedit_gui_cylinder_submit_hollow or fields.worldedit_gui_cylinder_submit_solid then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_cylinder")\r
 \r
-               local submit = nil\r
-               if fields.worldedit_gui_cylinder_submit_hollow then\r
-                       submit = "hollowcylinder"\r
-               elseif fields.worldedit_gui_cylinder_submit_solid then\r
+               local submit = "hollowcylinder"\r
+               if fields.worldedit_gui_cylinder_submit_solid then\r
                        submit = "cylinder"\r
                end\r
-               if submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               local args = string.format("%s %s %s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
-                               minetest.chatcommands["/"..submit].func(name, args)\r
-                       end\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       local args = string.format("%s %s %s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
+                       minetest.chatcommands["/"..submit].func(name, args)\r
                end\r
                return true\r
        end\r
-       if fields.worldedit_gui_cylinder_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis]\r
-               worldedit.show_page(name, "worldedit_gui_cylinder")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_pyramid", {\r
@@ -357,42 +419,40 @@ worldedit.register_gui_function("worldedit_gui_pyramid", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_pyramid") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_pyramid_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_pyramid_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_pyramid_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        string.format("field[0.5,2.5;4,0.8;worldedit_gui_pyramid_length;Length;%s]", minetest.formspec_escape(length)) ..\r
                        string.format("dropdown[4,2.18;2.5;worldedit_gui_pyramid_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
+                       "field_close_on_enter[worldedit_gui_pyramid_length;false]" ..\r
                        "button_exit[0,3.5;3,0.8;worldedit_gui_pyramid_submit_hollow;Hollow Pyramid]" ..\r
                        "button_exit[3.5,3.5;3,0.8;worldedit_gui_pyramid_submit_solid;Solid Pyramid]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_pyramid", function(name, fields)\r
-       if fields.worldedit_gui_pyramid_search or fields.worldedit_gui_pyramid_submit_solid or fields.worldedit_gui_pyramid_submit_hollow or fields.worldedit_gui_pyramid_axis then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_pyramid_node)\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
-               gui_distance1[name] = tostring(fields.worldedit_gui_pyramid_length)\r
+       local cg = {\r
+               worldedit_gui_pyramid_search = true,\r
+               worldedit_gui_pyramid_node = gui_nodename1,\r
+               worldedit_gui_pyramid_axis = gui_axis1,\r
+               worldedit_gui_pyramid_length = gui_distance1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_pyramid", fields, cg)\r
+       if fields.worldedit_gui_pyramid_submit_solid or fields.worldedit_gui_pyramid_submit_hollow then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_pyramid")\r
 \r
-               local submit = nil\r
-               if fields.worldedit_gui_pyramid_submit_solid then\r
-                       submit = "pyramid"\r
-               elseif fields.worldedit_gui_pyramid_submit_hollow then\r
+               local submit = "pyramid"\r
+               if fields.worldedit_gui_pyramid_submit_hollow then\r
                        submit = "hollowpyramid"\r
                end\r
-               if submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               minetest.chatcommands["/"..submit].func(name, string.format("%s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], n))\r
-                       end\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       minetest.chatcommands["/"..submit].func(name, string.format("%s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], n))\r
                end\r
                return true\r
        end\r
-       if fields.worldedit_gui_pyramid_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis]\r
-               worldedit.show_page(name, "worldedit_gui_pyramid")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_spiral", {\r
@@ -403,31 +463,39 @@ worldedit.register_gui_function("worldedit_gui_spiral", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_spiral") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_spiral_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_spiral_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_spiral_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        string.format("field[0.5,2.5;4,0.8;worldedit_gui_spiral_length;Side Length;%s]", minetest.formspec_escape(length)) ..\r
                        string.format("field[0.5,3.5;4,0.8;worldedit_gui_spiral_height;Height;%s]", minetest.formspec_escape(height)) ..\r
                        string.format("field[0.5,4.5;4,0.8;worldedit_gui_spiral_space;Wall Spacing;%s]", minetest.formspec_escape(space)) ..\r
+                       "field_close_on_enter[worldedit_gui_spiral_length;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_spiral_height;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_spiral_space;false]" ..\r
                        "button_exit[0,5.5;3,0.8;worldedit_gui_spiral_submit;Spiral]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_spiral", function(name, fields)\r
-       if fields.worldedit_gui_spiral_search or fields.worldedit_gui_spiral_submit then\r
-               gui_nodename1[name] = fields.worldedit_gui_spiral_node\r
-               gui_distance1[name] = tostring(fields.worldedit_gui_spiral_length)\r
-               gui_distance2[name] = tostring(fields.worldedit_gui_spiral_height)\r
-               gui_distance3[name] = tostring(fields.worldedit_gui_spiral_space)\r
+       local cg = {\r
+               worldedit_gui_spiral_search = true,\r
+               worldedit_gui_spiral_node = gui_nodename1,\r
+               worldedit_gui_spiral_length = gui_distance1,\r
+               worldedit_gui_spiral_height = gui_distance2,\r
+               worldedit_gui_spiral_space = gui_distance3,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_spiral", fields, cg)\r
+       if fields.worldedit_gui_spiral_submit then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_spiral")\r
-               if fields.worldedit_gui_spiral_submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               minetest.chatcommands["/spiral"].func(name, string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n))\r
-                       end\r
+\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       minetest.chatcommands["/spiral"].func(name, string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n))\r
                end\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_copy_move", {\r
@@ -439,29 +507,30 @@ worldedit.register_gui_function("worldedit_gui_copy_move", {
                return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_copy_move") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_copy_move_amount;Amount;%s]", minetest.formspec_escape(amount)) ..\r
                        string.format("dropdown[4,1.18;2.5;worldedit_gui_copy_move_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
+                       "field_close_on_enter[worldedit_gui_copy_move_amount;false]" ..\r
                        "button_exit[0,2.5;3,0.8;worldedit_gui_copy_move_copy;Copy Region]" ..\r
                        "button_exit[3.5,2.5;3,0.8;worldedit_gui_copy_move_move;Move Region]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_copy_move", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_copy_move_amount = gui_distance1,\r
+               worldedit_gui_copy_move_axis = gui_axis1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_spiral", fields, cg)\r
        if fields.worldedit_gui_copy_move_copy or fields.worldedit_gui_copy_move_move then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
-               gui_distance1[name] = tostring(fields.worldedit_gui_copy_move_amount)\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_copy_move")\r
-               if fields.worldedit_gui_copy_move_copy then\r
-                       minetest.chatcommands["/copy"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
-               else --fields.worldedit_gui_copy_move_move\r
-                       minetest.chatcommands["/move"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
+\r
+               local submit = "copy"\r
+               if fields.worldedit_gui_copy_move_move then\r
+                       submit = "move"\r
                end\r
+               minetest.chatcommands["/"..submit].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name]))\r
                return true\r
        end\r
-       if fields.worldedit_gui_copy_move_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4\r
-               worldedit.show_page(name, "worldedit_gui_copy_move")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_stack", {\r
@@ -472,24 +541,25 @@ worldedit.register_gui_function("worldedit_gui_stack", {
                return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_stack") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_stack_count;Count;%s]", minetest.formspec_escape(count)) ..\r
                        string.format("dropdown[4,1.18;2.5;worldedit_gui_stack_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) ..\r
+                       "field_close_on_enter[worldedit_gui_stack_count;false]" ..\r
                        "button_exit[0,2.5;3,0.8;worldedit_gui_stack_submit;Stack]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_stack", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_stack_axis = gui_axis1,\r
+               worldedit_gui_stack_count = gui_count1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_stack", fields, cg)\r
        if fields.worldedit_gui_stack_submit then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
-               gui_count1[name] = tostring(fields.worldedit_gui_stack_count)\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_stack")\r
+\r
                minetest.chatcommands["/stack"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_count1[name]))\r
                return true\r
        end\r
-       if fields.worldedit_gui_stack_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis]\r
-               worldedit.show_page(name, "worldedit_gui_stack")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_stretch", {\r
@@ -501,20 +571,28 @@ worldedit.register_gui_function("worldedit_gui_stretch", {
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_stretch_x;Stretch X;%s]", minetest.formspec_escape(stretchx)) ..\r
                        string.format("field[0.5,2.5;4,0.8;worldedit_gui_stretch_y;Stretch Y;%s]", minetest.formspec_escape(stretchy)) ..\r
                        string.format("field[0.5,3.5;4,0.8;worldedit_gui_stretch_z;Stretch Z;%s]", minetest.formspec_escape(stretchz)) ..\r
+                       "field_close_on_enter[worldedit_gui_stretch_x;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_stretch_y;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_stretch_z;false]" ..\r
                        "button_exit[0,4.5;3,0.8;worldedit_gui_stretch_submit;Stretch]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_stretch", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_stretch_x = gui_count1,\r
+               worldedit_gui_stretch_y = gui_count2,\r
+               worldedit_gui_stretch_z = gui_count3,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_stretch", fields, cg)\r
        if fields.worldedit_gui_stretch_submit then\r
-               gui_count1[name] = tostring(fields.worldedit_gui_stretch_x)\r
-               gui_count2[name] = tostring(fields.worldedit_gui_stretch_y)\r
-               gui_count3[name] = tostring(fields.worldedit_gui_stretch_z)\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_stretch")\r
+\r
                minetest.chatcommands["/stretch"].func(name, string.format("%s %s %s", gui_count1[name], gui_count2[name], gui_count3[name]))\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_transpose", {\r
@@ -530,23 +608,18 @@ worldedit.register_gui_function("worldedit_gui_transpose", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_transpose", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_transpose_axis1 = gui_axis1,\r
+               worldedit_gui_transpose_axis2 = gui_axis2,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_transpose", fields, cg)\r
        if fields.worldedit_gui_transpose_submit then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
-               worldedit.show_page(name, "worldedit_gui_transpose")\r
+               copy_changes(name, fields, cg)\r
+\r
                minetest.chatcommands["/transpose"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], axis_values[gui_axis2[name]]))\r
                return true\r
        end\r
-       if fields.worldedit_gui_transpose_axis1 then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1]\r
-               worldedit.show_page(name, "worldedit_gui_transpose")\r
-               return true\r
-       end\r
-       if fields.worldedit_gui_transpose_axis2 then\r
-               gui_axis2[name] = axis_indices[fields.worldedit_gui_transpose_axis2]\r
-               worldedit.show_page(name, "worldedit_gui_transpose")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_flip", {\r
@@ -561,18 +634,18 @@ worldedit.register_gui_function("worldedit_gui_flip", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_flip", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_flip_axis = gui_axis1\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_flip", fields, cg)\r
        if fields.worldedit_gui_flip_submit then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_flip")\r
+\r
                minetest.chatcommands["/flip"].func(name, axis_values[gui_axis1[name]])\r
                return true\r
        end\r
-       if fields.worldedit_gui_flip_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_flip_axis]\r
-               worldedit.show_page(name, "worldedit_gui_flip")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_rotate", {\r
@@ -588,24 +661,19 @@ worldedit.register_gui_function("worldedit_gui_rotate", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_rotate", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_rotate_axis = gui_axis1,\r
+               worldedit_gui_rotate_angle = gui_angle,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_rotate", fields, cg)\r
        if fields.worldedit_gui_rotate_submit then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
-               gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_rotate")\r
+\r
                minetest.chatcommands["/rotate"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], angle_values[gui_angle[name]]))\r
                return true\r
        end\r
-       if fields.worldedit_gui_rotate_axis then\r
-               gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis]\r
-               worldedit.show_page(name, "worldedit_gui_rotate")\r
-               return true\r
-       end\r
-       if fields.worldedit_gui_rotate_angle then\r
-               gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle]\r
-               worldedit.show_page(name, "worldedit_gui_rotate")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_orient", {\r
@@ -620,18 +688,18 @@ worldedit.register_gui_function("worldedit_gui_orient", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_orient", function(name, fields)\r
+       local cg = {\r
+               worldedit_gui_orient_angle = gui_angle,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_orient", fields, cg)\r
        if fields.worldedit_gui_orient_submit then\r
-               gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_orient")\r
+\r
                minetest.chatcommands["/orient"].func(name, tostring(angle_values[gui_angle[name]]))\r
                return true\r
        end\r
-       if fields.worldedit_gui_orient_angle then\r
-               gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle]\r
-               worldedit.show_page(name, "worldedit_gui_orient")\r
-               return true\r
-       end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_fixlight", {\r
@@ -658,6 +726,7 @@ worldedit.register_gui_function("worldedit_gui_suppress", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_suppress") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_suppress_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_suppress_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_suppress_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        "button_exit[0,2.5;3,0.8;worldedit_gui_suppress_submit;Suppress Nodes]"\r
@@ -665,18 +734,22 @@ worldedit.register_gui_function("worldedit_gui_suppress", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_suppress", function(name, fields)\r
-       if fields.worldedit_gui_suppress_search or fields.worldedit_gui_suppress_submit then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_suppress_node)\r
+       local cg = {\r
+               worldedit_gui_suppress_search = true,\r
+               worldedit_gui_suppress_node = gui_nodename1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_suppress", fields, cg)\r
+       if fields.worldedit_gui_suppress_submit then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_suppress")\r
-               if fields.worldedit_gui_suppress_submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               minetest.chatcommands["/suppress"].func(name, n)\r
-                       end\r
+\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       minetest.chatcommands["/suppress"].func(name, n)\r
                end\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_highlight", {\r
@@ -687,6 +760,7 @@ worldedit.register_gui_function("worldedit_gui_highlight", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_highlight") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_highlight_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_highlight_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_highlight_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        "button_exit[0,2.5;3,0.8;worldedit_gui_highlight_submit;Highlight Nodes]"\r
@@ -694,18 +768,22 @@ worldedit.register_gui_function("worldedit_gui_highlight", {
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_highlight", function(name, fields)\r
-       if fields.worldedit_gui_highlight_search or fields.worldedit_gui_highlight_submit then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_highlight_node)\r
+       local cg = {\r
+               worldedit_gui_highlight_search = true,\r
+               worldedit_gui_highlight_node = gui_nodename1,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_highlight", fields, cg)\r
+       if fields.worldedit_gui_highlight_submit then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_highlight")\r
-               if fields.worldedit_gui_highlight_submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               minetest.chatcommands["/highlight"].func(name, n)\r
-                       end\r
+\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       minetest.chatcommands["/highlight"].func(name, n)\r
                end\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_restore", {\r
@@ -723,6 +801,7 @@ worldedit.register_gui_function("worldedit_gui_save_load", {
                local filename = gui_filename[name]\r
                return "size[6,4]" .. worldedit.get_formspec_header("worldedit_gui_save_load") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_save_filename;Filename;%s]", minetest.formspec_escape(filename)) ..\r
+                       "field_close_on_enter[worldedit_gui_save_filename;false]" ..\r
                        "button_exit[0,2.5;3,0.8;worldedit_gui_save_load_submit_save;Save]" ..\r
                        "button_exit[3,2.5;3,0.8;worldedit_gui_save_load_submit_allocate;Allocate]" ..\r
                        "button_exit[0,3.5;3,0.8;worldedit_gui_save_load_submit_load;Load]"\r
@@ -733,6 +812,7 @@ worldedit.register_gui_handler("worldedit_gui_save_load", function(name, fields)
        if fields.worldedit_gui_save_load_submit_save or fields.worldedit_gui_save_load_submit_allocate or fields.worldedit_gui_save_load_submit_load then\r
                gui_filename[name] = tostring(fields.worldedit_gui_save_filename)\r
                worldedit.show_page(name, "worldedit_gui_save_load")\r
+\r
                if fields.worldedit_gui_save_load_submit_save then\r
                        minetest.chatcommands["/save"].func(name, gui_filename[name])\r
                elseif fields.worldedit_gui_save_load_submit_allocate then\r
@@ -746,7 +826,7 @@ worldedit.register_gui_handler("worldedit_gui_save_load", function(name, fields)
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_cube", {\r
-       name = "Cuboid", -- technically the command is misnamed, I know...\r
+       name = "Cube",\r
        privs = combine_we_privs({"hollowcube", "cube"}),\r
        get_formspec = function(name)\r
                local width, height, length = gui_distance1[name], gui_distance2[name], gui_distance3[name]\r
@@ -754,41 +834,45 @@ worldedit.register_gui_function("worldedit_gui_cube", {
                local nodename = worldedit.normalize_nodename(node)\r
                return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_cube") ..\r
                        string.format("field[0.5,1.5;4,0.8;worldedit_gui_cube_node;Name;%s]", minetest.formspec_escape(node)) ..\r
+                       "field_close_on_enter[worldedit_gui_cube_node;false]" ..\r
                        "button[4,1.18;1.5,0.8;worldedit_gui_cube_search;Search]" ..\r
                        formspec_node("5.5,1.1", nodename) ..\r
                        string.format("field[0.5,2.5;1,0.8;worldedit_gui_cube_width;Width;%s]", minetest.formspec_escape(width)) ..\r
                        string.format("field[1.5,2.5;1,0.8;worldedit_gui_cube_height;Height;%s]", minetest.formspec_escape(height)) ..\r
                        string.format("field[2.5,2.5;1,0.8;worldedit_gui_cube_length;Length;%s]", minetest.formspec_escape(length)) ..\r
+                       "field_close_on_enter[worldedit_gui_cube_width;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_cube_height;false]" ..\r
+                       "field_close_on_enter[worldedit_gui_cube_length;false]" ..\r
                        "button_exit[0,3.5;3,0.8;worldedit_gui_cube_submit_hollow;Hollow Cuboid]" ..\r
                        "button_exit[3.5,3.5;3,0.8;worldedit_gui_cube_submit_solid;Solid Cuboid]"\r
        end,\r
 })\r
 \r
 worldedit.register_gui_handler("worldedit_gui_cube", function(name, fields)\r
-       if fields.worldedit_gui_cube_search\r
-       or fields.worldedit_gui_cube_submit_hollow or fields.worldedit_gui_cube_submit_solid then\r
-               gui_nodename1[name] = tostring(fields.worldedit_gui_cube_node)\r
-               gui_distance1[name] = tostring(fields.worldedit_gui_cube_width)\r
-               gui_distance2[name] = tostring(fields.worldedit_gui_cube_height)\r
-               gui_distance3[name] = tostring(fields.worldedit_gui_cube_length)\r
+       local cg = {\r
+               worldedit_gui_cube_search = true,\r
+               worldedit_gui_cube_node = gui_nodename1,\r
+               worldedit_gui_cube_width = gui_distance1,\r
+               worldedit_gui_cube_height = gui_distance2,\r
+               worldedit_gui_cube_length = gui_distance3,\r
+       }\r
+       local ret = handle_changes(name, "worldedit_gui_cube", fields, cg)\r
+       if fields.worldedit_gui_cube_submit_hollow or fields.worldedit_gui_cube_submit_solid then\r
+               copy_changes(name, fields, cg)\r
                worldedit.show_page(name, "worldedit_gui_cube")\r
 \r
-               local submit = nil\r
-               if fields.worldedit_gui_cube_submit_hollow then\r
-                       submit = "hollowcube"\r
-               elseif fields.worldedit_gui_cube_submit_solid then\r
+               local submit = "hollowcube"\r
+               if fields.worldedit_gui_cube_submit_solid then\r
                        submit = "cube"\r
                end\r
-               if submit then\r
-                       local n = worldedit.normalize_nodename(gui_nodename1[name])\r
-                       if n then\r
-                               local args = string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
-                               minetest.chatcommands["/"..submit].func(name, args)\r
-                       end\r
+               local n = worldedit.normalize_nodename(gui_nodename1[name])\r
+               if n then\r
+                       local args = string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], n)\r
+                       minetest.chatcommands["/"..submit].func(name, args)\r
                end\r
                return true\r
        end\r
-       return false\r
+       return ret\r
 end)\r
 \r
 worldedit.register_gui_function("worldedit_gui_clearobjects", {\r