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