function render_circuit(circ,start_x,start_y) circ.title = circ.title or "" -- local spec = "button["..start_x..","..start_y..";10,1;".. "title_" .. circ.id .. ";"..circ.title.."]" local spec = "image_button["..start_x+1 ..","..start_y..";1,1;circuit_full.png;;;;]" spec = spec .. "label[" .. start_x+2 .. "," .. start_y+0.5 .. ";" .. circ.title .. "]" spec = spec .. "image_button[".. start_x ..","..start_y..";1,1;drop_btn.png;;;;]" return spec,1 end function f_fold(id,x,y,folded) local fold_sign if folded == true then fold_sign = "+" else fold_sign = "-" end local spec = "button["..x..","..y..";1,1;".. "fold_" .. id ..";".. fold_sign.."]" return spec, 1, 0 end function render_lib(lib,start_x,start_y) local xshift = 1 local yshift = 1 local total_yshift = 0 local total_xshift = 0 local id = lib.id lib.title = lib.title or "" lib.folded = lib.folded or false local spec = "" -- fold button local ss,shx,shy = f_fold(id,start_x+total_xshift, start_y+total_yshift, lib.folded) total_xshift = total_xshift+shx total_yshift = total_yshift+shy spec = spec .. ss spec = spec .. "button[".. start_x + total_xshift ..",".. start_y + total_yshift.. ";10,1;".. "title_"..lib.id .. ";"..lib.title.."]" total_xshift = start_x + 1 total_yshift = total_yshift+1 if lib.folded == false then for _,v in ipairs(lib.list) do if v.type == "library" then local sp, ys = render_lib(v, start_x+total_xshift, start_y+total_yshift) spec = spec .. sp total_yshift = total_yshift + ys elseif v.type == "circuit" then local sp, ys = render_circuit(v,start_x+total_xshift, start_y+total_yshift) spec = spec .. sp total_yshift = total_yshift + ys end end end return spec, total_yshift end function traverse_list(list,action) if list == nil then return end for _,v in ipairs(list) do if v.type == "circuit" then action(v) elseif v.type == "library" then action(v) traverse_list(v.list,action) end end end function foreach_id(list,action) if list == nil then return end traverse_list(list, function(elem) action(elem.id) end) end function get_elem_by_id(list,id) local found traverse_list(list,function(e) if e.id == id then found = e end end) return found end minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "mesecons_autotools:library_view" then return end local user = player:get_player_name() -- local stack = player:get_wielded_item() -- local data = stack:get_meta():to_table().fields -- local lib = data.lib -- print("lib="..dump(lib)) -- print("fields="..dump(fields)) -- if fields.quit then return end --[[ lib = lib or { id = "", list = {}, title = "empty" , type = "library" } traverse_list(lib.list,function(elem) print("#") if fields["fold_".. elem.id] == true then elem.folded = not elem.folded end end) data.lib = lib stack:get_meta():from_table({ fields = data}) player:set_wielded_item(stack) local formspec = render_formspec(lib) minetest.show_formspec(user, "mesecons_autotools:library_view", formspec) ]]-- end) function render_formspec(lib) local formspec = "formspec_version[3]".. "size[32,25]" formspec = formspec .. render_lib(lib,1,1) return formspec end lib = { id = "l1", title = "library bla bla ", type = "library", list = { {id = "c1", type="circuit", title="somethign something"}, {id = "c2", type="circuit", title="somethign something2"}, {id = "l2", type="library", title="wooihoihoh/", folded = false, list = { {id = "c11", type="circuit", title="somethign something"}, {id = "c21", type="circuit", title="somethign something2"}, } }, {id = "c111", type="circuit", title="circuit sak/32/d0"}, {id = "c1x", type="circuit", title="somethign something"}, {id = "c2x", type="circuit", title="somethign something2"}, {id = "l2x", type="library", title="wooihoihoh/", folded = false, list = { {id = "c11x", type="circuit", title="somethign something"}, {id = "c21x", type="circuit", title="somethign something2"}, } }, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="circuit sak/32/d0"}, {id = "c111x", type="circuit", title="ostatni ak/32/d0"}, } } function generate_empty_library(file) local lib = { id = file, list = {} , title = "" , type = "library" , folded = false } return lib end function on_place_library(itemstack, player, pointed_thing) local user = player:get_player_name() local stack = player:get_wielded_item() local fields = stack:get_meta():to_table().fields -- print("DU:"..dump(itemstack:get_meta():to_table())) -- print("item stackc:" .. dump(itemstack)) -- if data.count == nil then data.count = 0 end -- data.count = data.count + 1 --[[ local lib = {} if fields.file == nil then fields.file = generate_file_name_library(user) lib = generate_empty_library(fields.file) save_table_to_file(fields.file,lib) end ]]-- stack:get_meta():from_table({ fields = fields}) -- player:set_wielded_item(stack) --lib = lib local formspec = render_formspec(lib) -- print("formtspec="..formspec) minetest.show_formspec(user, "mesecons_autotools:library_view", formspec) end minetest.register_tool("mesecons_autotools:library", { description = "Library of Circuits", inventory_image = "library.png", stack_max = 1, -- on_place = on_place_library, on_use = on_place_library, --[[ on_use = on_use_new_circuit, on_secondary_use = none, ]]-- })