forked from Mirrorlandia_minetest/minetest
ContentDB: Add overwrite dialog when content is already installed (#10768)
This commit is contained in:
parent
dd5a732fa9
commit
edd0836011
@ -437,12 +437,53 @@ function install_dialog.create(package, raw_deps)
|
|||||||
install_dialog.package = package
|
install_dialog.package = package
|
||||||
install_dialog.raw_deps = raw_deps
|
install_dialog.raw_deps = raw_deps
|
||||||
install_dialog.will_install_deps = true
|
install_dialog.will_install_deps = true
|
||||||
return dialog_create("package_view",
|
return dialog_create("install_dialog",
|
||||||
install_dialog.get_formspec,
|
install_dialog.get_formspec,
|
||||||
install_dialog.handle_submit,
|
install_dialog.handle_submit,
|
||||||
nil)
|
nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local confirm_overwrite = {}
|
||||||
|
function confirm_overwrite.get_formspec()
|
||||||
|
local package = confirm_overwrite.package
|
||||||
|
|
||||||
|
return "size[11.5,4.5,true]" ..
|
||||||
|
"label[2,2;" ..
|
||||||
|
fgettext("\"$1\" already exists. Would you like to overwrite it?", package.name) .. "]"..
|
||||||
|
"style[install;bgcolor=red]" ..
|
||||||
|
"button[3.25,3.5;2.5,0.5;install;" .. fgettext("Overwrite") .. "]" ..
|
||||||
|
"button[5.75,3.5;2.5,0.5;cancel;" .. fgettext("Cancel") .. "]"
|
||||||
|
end
|
||||||
|
|
||||||
|
function confirm_overwrite.handle_submit(this, fields)
|
||||||
|
if fields.cancel then
|
||||||
|
this:delete()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if fields.install then
|
||||||
|
this:delete()
|
||||||
|
confirm_overwrite.callback()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function confirm_overwrite.create(package, callback)
|
||||||
|
assert(type(package) == "table")
|
||||||
|
assert(type(callback) == "function")
|
||||||
|
|
||||||
|
confirm_overwrite.package = package
|
||||||
|
confirm_overwrite.callback = callback
|
||||||
|
return dialog_create("confirm_overwrite",
|
||||||
|
confirm_overwrite.get_formspec,
|
||||||
|
confirm_overwrite.handle_submit,
|
||||||
|
nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function get_file_extension(path)
|
local function get_file_extension(path)
|
||||||
local parts = path:split(".")
|
local parts = path:split(".")
|
||||||
return parts[#parts]
|
return parts[#parts]
|
||||||
@ -858,14 +899,37 @@ function store.handle_submit(this, fields)
|
|||||||
assert(package)
|
assert(package)
|
||||||
|
|
||||||
if fields["install_" .. i] then
|
if fields["install_" .. i] then
|
||||||
local deps = get_raw_dependencies(package)
|
local install_parent
|
||||||
if deps and has_hard_deps(deps) then
|
if package.type == "mod" then
|
||||||
local dlg = install_dialog.create(package, deps)
|
install_parent = core.get_modpath()
|
||||||
|
elseif package.type == "game" then
|
||||||
|
install_parent = core.get_gamepath()
|
||||||
|
elseif package.type == "txp" then
|
||||||
|
install_parent = core.get_texturepath()
|
||||||
|
else
|
||||||
|
error("Unknown package type: " .. package.type)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function on_confirm()
|
||||||
|
local deps = get_raw_dependencies(package)
|
||||||
|
if deps and has_hard_deps(deps) then
|
||||||
|
local dlg = install_dialog.create(package, deps)
|
||||||
|
dlg:set_parent(this)
|
||||||
|
this:hide()
|
||||||
|
dlg:show()
|
||||||
|
else
|
||||||
|
queue_download(package)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not package.path and core.is_dir(install_parent .. DIR_DELIM .. package.name) then
|
||||||
|
local dlg = confirm_overwrite.create(package, on_confirm)
|
||||||
dlg:set_parent(this)
|
dlg:set_parent(this)
|
||||||
this:hide()
|
this:hide()
|
||||||
dlg:show()
|
dlg:show()
|
||||||
else
|
else
|
||||||
queue_download(package)
|
on_confirm()
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
@ -67,6 +67,8 @@ core.copy_dir(source,destination,keep_soure) (possible in async calls)
|
|||||||
^ destination folder
|
^ destination folder
|
||||||
^ keep_source DEFAULT true --> if set to false source is deleted after copying
|
^ keep_source DEFAULT true --> if set to false source is deleted after copying
|
||||||
^ returns true/false
|
^ returns true/false
|
||||||
|
core.is_dir(path) (possible in async calls)
|
||||||
|
^ returns true if path is a valid dir
|
||||||
core.extract_zip(zipfile,destination) [unzip within path required]
|
core.extract_zip(zipfile,destination) [unzip within path required]
|
||||||
^ zipfile to extract
|
^ zipfile to extract
|
||||||
^ destination folder to extract to
|
^ destination folder to extract to
|
||||||
|
@ -803,6 +803,15 @@ int ModApiMainMenu::l_copy_dir(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
int ModApiMainMenu::l_is_dir(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *path = luaL_checkstring(L, 1);
|
||||||
|
|
||||||
|
lua_pushboolean(L, fs::IsDir(path));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
int ModApiMainMenu::l_extract_zip(lua_State *L)
|
int ModApiMainMenu::l_extract_zip(lua_State *L)
|
||||||
{
|
{
|
||||||
@ -1139,6 +1148,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
|
|||||||
API_FCT(create_dir);
|
API_FCT(create_dir);
|
||||||
API_FCT(delete_dir);
|
API_FCT(delete_dir);
|
||||||
API_FCT(copy_dir);
|
API_FCT(copy_dir);
|
||||||
|
API_FCT(is_dir);
|
||||||
API_FCT(extract_zip);
|
API_FCT(extract_zip);
|
||||||
API_FCT(may_modify_path);
|
API_FCT(may_modify_path);
|
||||||
API_FCT(get_mainmenu_path);
|
API_FCT(get_mainmenu_path);
|
||||||
@ -1172,6 +1182,7 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
|
|||||||
API_FCT(create_dir);
|
API_FCT(create_dir);
|
||||||
API_FCT(delete_dir);
|
API_FCT(delete_dir);
|
||||||
API_FCT(copy_dir);
|
API_FCT(copy_dir);
|
||||||
|
API_FCT(is_dir);
|
||||||
//API_FCT(extract_zip); //TODO remove dependency to GuiEngine
|
//API_FCT(extract_zip); //TODO remove dependency to GuiEngine
|
||||||
API_FCT(may_modify_path);
|
API_FCT(may_modify_path);
|
||||||
API_FCT(download_file);
|
API_FCT(download_file);
|
||||||
|
@ -132,6 +132,8 @@ private:
|
|||||||
|
|
||||||
static int l_copy_dir(lua_State *L);
|
static int l_copy_dir(lua_State *L);
|
||||||
|
|
||||||
|
static int l_is_dir(lua_State *L);
|
||||||
|
|
||||||
static int l_extract_zip(lua_State *L);
|
static int l_extract_zip(lua_State *L);
|
||||||
|
|
||||||
static int l_may_modify_path(lua_State *L);
|
static int l_may_modify_path(lua_State *L);
|
||||||
|
Loading…
Reference in New Issue
Block a user