diff --git a/res/layouts/pages/content.xml b/res/layouts/pages/content.xml index c4ff39e2..37025c69 100644 --- a/res/layouts/pages/content.xml +++ b/res/layouts/pages/content.xml @@ -1,13 +1,41 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layouts/pages/content.xml.lua b/res/layouts/pages/content.xml.lua index 0eae8c00..3f1903f3 100644 --- a/res/layouts/pages/content.xml.lua +++ b/res/layouts/pages/content.xml.lua @@ -5,9 +5,28 @@ function on_open(params) refresh() end +-- add - packs to be added to the world (after apply) +-- rem - packs that should be removed from the world (after apply) add_packs = {} rem_packs = {} +-- included - connected packs to the world +-- excluded - packs that are not connected to the world +packs_included = {} +packs_excluded = {} + +packs_info = {} + +local function include(id, is_include) + if is_include then + table.insert(packs_included, id) + table.remove_value(packs_excluded, id) + else + table.insert(packs_excluded, id) + table.remove_value(packs_included, id) + end +end + function apply() core.reconfig_packs(add_packs, rem_packs) if mode ~= "world" then @@ -15,8 +34,70 @@ function apply() end end +function reposition_func(_pack) + local INTERVAL = 2 + local STEP = 1 + local SIZE = 80 + + local tbl = nil + if table.has(packs_included, _pack) then + tbl = packs_included + elseif table.has(packs_excluded, _pack) then + tbl = packs_excluded + else + tbl = packs_excluded + local packinfo = pack.get_info(_pack) + packinfo[packinfo.id] = {packinfo.id, packinfo.title} + table.insert(packs_excluded, packinfo.id) + end + + local indx = table.index(tbl, _pack) - 1 + local pos = {0, (SIZE + INTERVAL) * indx + STEP} + + return pos[1], pos[2] +end + + +function refresh_search() + local search_text = document.search_textbox.text:lower() + + local new_included = table.copy(packs_included) + local new_excluded = table.copy(packs_excluded) + + local function score(pack_name) + if pack_name:lower():find(search_text) then + return 1 + end + return 0 + end + + local function sorting(a, b) + local score_a = score(packs_info[a][2]) + local score_b = score(packs_info[b][2]) + + if score_a ~= score_b then + return score_a > score_b + else + return packs_info[a][2] < packs_info[b][2] + end + end + + table.sort(new_included, sorting) + table.sort(new_excluded, sorting) + + packs_included = new_included + packs_excluded = new_excluded + + for _, id in ipairs(table.merge(table.copy(packs_included), packs_excluded)) do + local content = document["pack_" .. id] + content:reposition() + end +end + + function refresh_changes() document.apply_btn.enabled = (#add_packs>0) or (#rem_packs>0) + refresh_search() end function move_pack(id) @@ -24,23 +105,61 @@ function move_pack(id) if table.has(add_packs, id) then document["pack_"..id]:moveInto(document.packs_add) table.remove_value(add_packs, id) + include(id, false) -- cancel pack removal elseif table.has(rem_packs, id) then document["pack_"..id]:moveInto(document.packs_cur) table.remove_value(rem_packs, id) + include(id, true) -- add pack elseif table.has(packs_installed, id) then document["pack_"..id]:moveInto(document.packs_add) table.insert(rem_packs, id) + include(id, false) -- remove pack else document["pack_"..id]:moveInto(document.packs_cur) table.insert(add_packs, id) + include(id, true) end refresh_changes() end -function place_pack(panel, packinfo, callback) +function move_left() + for _, id in pairs(table.copy(packs_excluded)) do + if not document["pack_"..id].enabled then goto continue end + + include(id, true) + table.insert(add_packs, id) + table.remove_value(rem_packs, id) + document["pack_"..id]:moveInto(document.packs_cur) + + ::continue:: + end + + refresh_changes() +end + +function move_right() + for _, id in pairs(table.copy(packs_included)) do + if not document["pack_"..id].enabled then goto continue end + + include(id, false) + + if table.has(packs_installed, id) then + table.insert(rem_packs, id) + end + + table.remove_value(add_packs, id) + document["pack_"..id]:moveInto(document.packs_add) + + ::continue:: + end + + refresh_changes() +end + +function place_pack(panel, packinfo, callback, position_func) if packinfo.error then callback = nil end @@ -50,6 +169,7 @@ function place_pack(panel, packinfo, callback) packinfo.id_verbose = packinfo.id end packinfo.callback = callback + packinfo.position_func = position_func or function () end panel:add(gui.template("pack", packinfo)) if not callback then document["pack_"..packinfo.id].enabled = false @@ -76,15 +196,30 @@ function check_dependencies(packinfo) return end +function check_deleted() + for i = 1, math.max(#packs_included, #packs_excluded) do + local pack = packs_included[i] + if pack and not table.has(packs_all, pack) then + table.remove(packs_included, i) + table.insert(rem_packs, pack) + end + + pack = packs_excluded[i] + if pack and not table.has(packs_all, pack) then + table.remove(packs_excluded, i) + table.insert(rem_packs, pack) + end + end +end + function refresh() packs_installed = pack.get_installed() packs_available = pack.get_available() base_packs = pack.get_base_packs() packs_all = {unpack(packs_installed)} required = {} - for i,k in ipairs(packs_available) do - table.insert(packs_all, k) - end + + table.merge(packs_all, packs_available) local packs_cur = document.packs_cur local packs_add = document.packs_add @@ -105,20 +240,14 @@ function refresh() end local packinfos = pack.get_info(packids) - for i,id in ipairs(packs_installed) do - local packinfo = packinfos[id] - packinfo.index = i - callback = not table.has(base_packs, id) and string.format('move_pack("%s")', id) or nil - packinfo.error = check_dependencies(packinfo) - place_pack(packs_cur, packinfo, callback) + for _,id in ipairs(base_packs) do + local packinfo = pack.get_info(id) + packs_info[id] = {packinfo.id, packinfo.title} end - for i,id in ipairs(packs_available) do - local packinfo = packinfos[id] - packinfo.index = i - callback = string.format('move_pack("%s")', id) - packinfo.error = check_dependencies(packinfo) - place_pack(packs_add, packinfo, callback) + for _,id in ipairs(packs_all) do + local packinfo = pack.get_info(id) + packs_info[id] = {packinfo.id, packinfo.title} end for i,id in ipairs(packs_installed) do @@ -127,6 +256,26 @@ function refresh() end end + if #packs_excluded == 0 then packs_excluded = table.copy(packs_available) end + if #packs_included == 0 then packs_included = table.copy(packs_installed) end + + for i,id in ipairs(packs_installed) do + local packinfo = packinfos[id] + packinfo.index = i + callback = not table.has(base_packs, id) and string.format('move_pack("%s")', id) or nil + packinfo.error = check_dependencies(packinfo) + place_pack(packs_cur, packinfo, callback, string.format('reposition_func("%s")', packinfo.id)) + end + + for i,id in ipairs(packs_available) do + local packinfo = packinfos[id] + packinfo.index = i + callback = string.format('move_pack("%s")', id) + packinfo.error = check_dependencies(packinfo) + place_pack(packs_add, packinfo, callback, string.format('reposition_func("%s")', packinfo.id)) + end + + check_deleted() apply_movements(packs_cur, packs_add) refresh_changes() end diff --git a/res/layouts/pages/new_world.xml.lua b/res/layouts/pages/new_world.xml.lua index 25e6f424..0dafa505 100644 --- a/res/layouts/pages/new_world.xml.lua +++ b/res/layouts/pages/new_world.xml.lua @@ -28,7 +28,8 @@ function on_open() document.content_btn.text = string.format( "%s [%s]", gui.str("Content", "menu"), #pack.get_installed() ) - if settings.generator == nil then + + if settings.generator == nil or generation.get_generators()[settings.generator] == nil then settings.generator = generation.get_default_generator() end document.generator_btn.text = string.format( diff --git a/res/layouts/templates/pack.xml b/res/layouts/templates/pack.xml index 5eb2f74c..3b24aa96 100644 --- a/res/layouts/templates/pack.xml +++ b/res/layouts/templates/pack.xml @@ -1,4 +1,4 @@ - + diff --git a/res/preload.json b/res/preload.json index fb202291..e2369e0c 100644 --- a/res/preload.json +++ b/res/preload.json @@ -19,7 +19,10 @@ "gui/cross", "gui/refresh", "gui/folder_icon", - "gui/settings_icon" + "gui/settings_icon", + "gui/check_mark", + "gui/left_arrow", + "gui/right_arrow" ], "fonts": [ { diff --git a/res/textures/gui/check_mark.png b/res/textures/gui/check_mark.png new file mode 100644 index 00000000..61e61711 Binary files /dev/null and b/res/textures/gui/check_mark.png differ diff --git a/res/textures/gui/left_arrow.png b/res/textures/gui/left_arrow.png new file mode 100644 index 00000000..0d719ff2 Binary files /dev/null and b/res/textures/gui/left_arrow.png differ diff --git a/res/textures/gui/loupe.png b/res/textures/gui/loupe.png new file mode 100644 index 00000000..1b8a946b Binary files /dev/null and b/res/textures/gui/loupe.png differ diff --git a/res/textures/gui/right_arrow.png b/res/textures/gui/right_arrow.png new file mode 100644 index 00000000..e34208bd Binary files /dev/null and b/res/textures/gui/right_arrow.png differ