From 3eb363f813bfc4fbca250579848532ef296b3077 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 16 May 2018 21:52:12 +0100 Subject: Add updating to online content browser --- builtin/mainmenu/dlg_contentstore.lua | 106 +++++++++++++++++++++----------- builtin/mainmenu/pkgmgr.lua | 111 +++++++++++++++++++++------------- 2 files changed, 139 insertions(+), 78 deletions(-) (limited to 'builtin') diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua index e3505456e..2c9e80e15 100644 --- a/builtin/mainmenu/dlg_contentstore.lua +++ b/builtin/mainmenu/dlg_contentstore.lua @@ -15,6 +15,30 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +local store = {} +local package_dialog = {} + +local search_string = "" +local cur_page = 1 +local num_per_page = 5 +local filter_type = 1 +local filter_types_titles = { + fgettext("All packages"), + fgettext("Games"), + fgettext("Mods"), + fgettext("Texture packs"), +} + +local filter_types_type = { + nil, + "game", + "mod", + "txp", +} + + + + local function download_package(param) if core.download_file(param.package.url, param.filename) then return { @@ -39,7 +63,9 @@ local function start_install(calling_dialog, package) local function callback(result) if result.successful then - local path, msg = pkgmgr.install(result.package.type, result.filename, result.package.name) + local path, msg = pkgmgr.install(result.package.type, + result.filename, result.package.name, + result.package.path) if not path then gamedata.errormessage = msg else @@ -69,6 +95,7 @@ local function start_install(calling_dialog, package) end set_def("description", result.package.short_description) set_def("author", result.package.author) + conf:set("release", result.package.release) conf:write() end end @@ -85,7 +112,7 @@ local function start_install(calling_dialog, package) end if not core.handle_async(download_package, params, callback) then - minetest.log("error", "ERROR: async event failed") + core.log("error", "ERROR: async event failed") gamedata.errormessage = fgettext("Failed to download $1", package.name) end @@ -111,19 +138,35 @@ local function start_install(calling_dialog, package) end -local package_dialog = {} - function package_dialog.get_formspec() local package = package_dialog.package + store.update_paths() + local formspec = { - "size[8,4;true]", + "size[9,4;true]", "label[2.5,0.2;", core.formspec_escape(package.title), "]", - "textarea[0.2,1;8,3;;;", core.formspec_escape(package.short_description), "]", + "textarea[0.2,1;9,3;;;", core.formspec_escape(package.short_description), "]", "button[0,0;2,1;back;", fgettext("Back"), "]", - "button[6,0;2,1;install;", fgettext("Install"), "]", } + if not package.path then + formspec[#formspec + 1] = "button[7,0;2,1;install;" + formspec[#formspec + 1] = fgettext("Install") + formspec[#formspec + 1] = "]" + elseif package.installed_release < package.release then + formspec[#formspec + 1] = "button[7,0;2,1;install;" + formspec[#formspec + 1] = fgettext("Update") + formspec[#formspec + 1] = "]" + formspec[#formspec + 1] = "button[7,1;2,1;uninstall;" + formspec[#formspec + 1] = fgettext("Uninstall") + formspec[#formspec + 1] = "]" + else + formspec[#formspec + 1] = "button[7,0;2,1;uninstall;" + formspec[#formspec + 1] = fgettext("Uninstall") + formspec[#formspec + 1] = "]" + end + -- TODO: screenshots return table.concat(formspec, "") @@ -136,7 +179,15 @@ function package_dialog.handle_submit(this, fields, tabname, tabdata) end if fields.install then - start_install(package_dialog.package) + start_install(this, package_dialog.package) + return true + end + + if fields.uninstall then + local dlg_delmod = create_delete_content_dlg(package_dialog.package) + dlg_delmod:set_parent(this) + this:hide() + dlg_delmod:show() return true end @@ -151,28 +202,6 @@ function package_dialog.create(package) nil) end - - - -local store = {} -local search_string = "" -local cur_page = 1 -local num_per_page = 5 -local filter_type = 1 -local filter_types_titles = { - fgettext("All packages"), - fgettext("Games"), - fgettext("Mods"), - fgettext("Texture packs"), -} - -local filter_types_type = { - nil, - "game", - "mod", - "txp", -} - function store.load() store.packages_full = core.get_package_list() store.packages = store.packages_full @@ -209,6 +238,7 @@ function store.update_paths() if content and content.author == package.author then package.path = content.path + package.installed_release = content.release else package.path = nil end @@ -301,17 +331,23 @@ function store.get_formspec() formspec[#formspec + 1] = "]" -- buttons - if package.path then - formspec[#formspec + 1] = "button[6,0;1.5,1;uninstall_" + if not package.path then + formspec[#formspec + 1] = "button[6,0;1.5,1;install_" formspec[#formspec + 1] = tostring(i) formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("Uninstall") + formspec[#formspec + 1] = fgettext("Install") formspec[#formspec + 1] = "]" - else + elseif package.installed_release < package.release then formspec[#formspec + 1] = "button[6,0;1.5,1;install_" formspec[#formspec + 1] = tostring(i) formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("Install") + formspec[#formspec + 1] = fgettext("Update") + formspec[#formspec + 1] = "]" + else + formspec[#formspec + 1] = "button[6,0;1.5,1;uninstall_" + formspec[#formspec + 1] = tostring(i) + formspec[#formspec + 1] = ";" + formspec[#formspec + 1] = fgettext("Uninstall") formspec[#formspec + 1] = "]" end formspec[#formspec + 1] = "button[7.5,0;1.5,1;view_" diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua index b83488848..2730612e9 100644 --- a/builtin/mainmenu/pkgmgr.lua +++ b/builtin/mainmenu/pkgmgr.lua @@ -32,6 +32,7 @@ function get_mods(path,retval,modpack) toadd.name = name toadd.author = mod_conf.author + toadd.release = tonumber(mod_conf.release or "0") toadd.path = prefix toadd.type = "mod" @@ -74,6 +75,7 @@ function pkgmgr.get_texture_packs() retval[#retval + 1] = { name = item, author = conf:get("author"), + release = tonumber(conf:get("release") or "0"), list_name = name, type = "txp", path = path, @@ -336,90 +338,113 @@ function pkgmgr.get_worldconfig(worldpath) end -------------------------------------------------------------------------------- -function pkgmgr.install_dir(type, path, basename) +function pkgmgr.install_dir(type, path, basename, targetpath) local basefolder = pkgmgr.get_base_folder(path) - local targetpath + -- There's no good way to detect a texture pack, so let's just assume + -- it's correct for now. if type == "txp" then if basefolder and basefolder.type ~= "invalid" and basefolder.type ~= "txp" then return nil, fgettext("Unable to install a $1 as a texture pack", basefolder.type) end local from = basefolder and basefolder.path or path - targetpath = core.get_texturepath() .. DIR_DELIM .. basename - core.copy_dir(from, targetpath) + if targetpath then + core.delete_dir(targetpath) + core.create_dir(targetpath) + else + targetpath = core.get_texturepath() .. DIR_DELIM .. basename + end + if not core.copy_dir(from, targetpath) then + return nil, + fgettext("Failed to install $1 to $2", basename, targetpath) + end return targetpath, nil elseif not basefolder then return nil, fgettext("Unable to find a valid mod or modpack") end + -- + -- Get destination + -- if basefolder.type == "modpack" then if type ~= "mod" then return nil, fgettext("Unable to install a modpack as a $1", type) end - local clean_path = nil - if basename ~= nil then - clean_path = "mp_" .. basename - end - - if clean_path == nil then - clean_path = get_last_folder(cleanup_path(basefolder.path)) - end - - if clean_path ~= nil then - targetpath = core.get_modpath() .. DIR_DELIM .. clean_path - if not core.copy_dir(basefolder.path,targetpath) then + -- Get destination name for modpack + if targetpath then + core.delete_dir(targetpath) + core.create_dir(targetpath) + else + local clean_path = nil + if basename ~= nil then + clean_path = "mp_" .. basename + end + if not clean_path then + clean_path = get_last_folder(cleanup_path(basefolder.path)) + end + if clean_path then + targetpath = core.get_modpath() .. DIR_DELIM .. clean_path + else return nil, - fgettext("Failed to install $1 to $2", basename, targetpath) + fgettext("Install Mod: unable to find suitable foldername for modpack $1", + modfilename) end - else - return nil, - fgettext("Install Mod: unable to find suitable foldername for modpack $1", - modfilename) end - - pkgmgr.refresh_globals() - elseif basefolder.type == "mod" then if type ~= "mod" then return nil, fgettext("Unable to install a mod as a $1", type) end - local targetfolder = basename - if targetfolder == nil then - targetfolder = pkgmgr.identify_modname(basefolder.path,"init.lua") - end + if targetpath then + core.delete_dir(targetpath) + core.create_dir(targetpath) + else + local targetfolder = basename + if targetfolder == nil then + targetfolder = pkgmgr.identify_modname(basefolder.path, "init.lua") + end - --if heuristic failed try to use current foldername - if targetfolder == nil then - targetfolder = get_last_folder(basefolder.path) - end + -- If heuristic failed try to use current foldername + if targetfolder == nil then + targetfolder = get_last_folder(basefolder.path) + end - if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then - targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder - core.copy_dir(basefolder.path, targetpath) - else - return nil, fgettext("Install Mod: unable to find real modname for: $1", modfilename) + if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then + targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder + else + return nil, fgettext("Install Mod: unable to find real modname for: $1", modfilename) + end end - pkgmgr.refresh_globals() - elseif basefolder.type == "game" then if type ~= "game" then return nil, fgettext("Unable to install a game as a $1", type) end - targetpath = core.get_gamepath() .. DIR_DELIM .. basename - core.copy_dir(basefolder.path, targetpath) + if targetpath then + core.delete_dir(targetpath) + core.create_dir(targetpath) + else + targetpath = core.get_gamepath() .. DIR_DELIM .. basename + end + end + + -- Copy it + if not core.copy_dir(basefolder.path, targetpath) then + return nil, + fgettext("Failed to install $1 to $2", basename, targetpath) end + pkgmgr.refresh_globals() + return targetpath, nil end -------------------------------------------------------------------------------- -function pkgmgr.install(type, modfilename, basename) +function pkgmgr.install(type, modfilename, basename, dest) local archive_info = pkgmgr.identify_filetype(modfilename) local path = pkgmgr.extract(archive_info) @@ -430,7 +455,7 @@ function pkgmgr.install(type, modfilename, basename) archive_info.type) end - local targetpath, msg = pkgmgr.install_dir(type, path, basename) + local targetpath, msg = pkgmgr.install_dir(type, path, basename, dest) core.delete_dir(path) return targetpath, msg end -- cgit v1.2.3