Fix "TODO read modinfo" in modmanager to improve ui usability

This commit is contained in:
sapier 2013-11-10 19:37:45 +01:00
parent d75b1718f8
commit 0f9440fa61
4 changed files with 130 additions and 17 deletions

@ -205,6 +205,62 @@ function tbl.formspec_escape(text)
return text return text
end end
function tbl.splittext(text,charlimit)
local retval = {}
local current_idx = 1
local start,stop = string.find(text," ",current_idx)
local nl_start,nl_stop = string.find(text,"\n",current_idx)
local gotnewline = false
if nl_start ~= nil and (start == nil or nl_start < start) then
start = nl_start
stop = nl_stop
gotnewline = true
end
local last_line = ""
while start ~= nil do
if string.len(last_line) + (stop-start) > charlimit then
table.insert(retval,last_line)
last_line = ""
end
if last_line ~= "" then
last_line = last_line .. " "
end
last_line = last_line .. string.sub(text,current_idx,stop -1)
if gotnewline then
table.insert(retval,last_line)
last_line = ""
gotnewline = false
end
current_idx = stop+1
start,stop = string.find(text," ",current_idx)
nl_start,nl_stop = string.find(text,"\n",current_idx)
if nl_start ~= nil and (start == nil or nl_start < start) then
start = nl_start
stop = nl_stop
gotnewline = true
end
end
--add last part of text
if string.len(last_line) + (string.len(text) - current_idx) > charlimit then
table.insert(retval,last_line)
table.insert(retval,string.sub(text,current_idx))
else
last_line = last_line .. " " .. string.sub(text,current_idx)
table.insert(retval,last_line)
end
return retval
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
if minetest then if minetest then

@ -235,13 +235,14 @@ function modmgr.tab()
local retval = local retval =
"vertlabel[0,-0.25;".. fgettext("MODS") .. "]" .. "vertlabel[0,-0.25;".. fgettext("MODS") .. "]" ..
"label[0.8,-0.25;".. fgettext("Installed Mods:") .. "]" .. "label[0.8,-0.25;".. fgettext("Installed Mods:") .. "]" ..
"textlist[0.75,0.25;4.5,4.3;modlist;" .. "textlist[0.75,0.25;4.5,4;modlist;" ..
modmgr.render_modlist(modmgr.global_mods) .. modmgr.render_modlist(modmgr.global_mods) ..
";" .. modmgr.selected_mod .. "]" ";" .. modmgr.selected_mod .. "]"
retval = retval .. retval = retval ..
"button[1,4.85;2,0.5;btn_mod_mgr_install_local;".. fgettext("Install") .. "]" .. "label[0.8,4.2;" .. fgettext("Add mod:") .. "]" ..
"button[3,4.85;2,0.5;btn_mod_mgr_download;".. fgettext("Download") .. "]" "button[0.75,4.85;1.8,0.5;btn_mod_mgr_install_local;".. fgettext("Local install") .. "]" ..
"button[2.45,4.85;3.05,0.5;btn_mod_mgr_download;".. fgettext("Online mod repository") .. "]"
local selected_mod = nil local selected_mod = nil
@ -250,25 +251,66 @@ function modmgr.tab()
end end
if selected_mod ~= nil then if selected_mod ~= nil then
if selected_mod.is_modpack then local modscreenshot = nil
retval = retval
.. "button[10,4.85;2,0.5;btn_mod_mgr_rename_modpack;" .. --check for screenshot beeing available
fgettext("Rename") .. "]" local screenshotfilename = selected_mod.path .. DIR_DELIM .. "screenshot.png"
local error = nil
screenshotfile,error = io.open(screenshotfilename,"r")
if error == nil then
screenshotfile:close()
modscreenshot = screenshotfilename
end
if modscreenshot == nil then
modscreenshot = modstore.basetexturedir .. "no_screenshot.png"
end
retval = retval
.. "image[5.5,0;3,2;" .. modscreenshot .. "]"
.. "label[8.25,0.6;" .. selected_mod.name .. "]"
local descriptionlines = nil
error = nil
local descriptionfilename = selected_mod.path .. "description.txt"
descriptionfile,error = io.open(descriptionfilename,"r")
if error == nil then
descriptiontext = descriptionfile:read("*all")
descriptionlines = engine.splittext(descriptiontext,42)
descriptionfile:close()
else else
--show dependencies descriptionlines = {}
retval = retval .. table.insert(descriptionlines,fgettext("No mod description available"))
"label[6,1.9;".. fgettext("Depends:") .. "]" .. end
"textlist[6,2.4;5.7,2;deplist;"
retval = retval ..
"label[5.5,1.7;".. fgettext("Mod information:") .. "]" ..
"textlist[5.5,2.2;6.2,2.4;description;"
for i=1,#descriptionlines,1 do
retval = retval .. engine.formspec_escape(descriptionlines[i]) .. ","
end
if selected_mod.is_modpack then
retval = retval .. ";0]" ..
"button[10,4.85;2,0.5;btn_mod_mgr_rename_modpack;" ..
fgettext("Rename") .. "]"
retval = retval .. "button[5.5,4.85;4.5,0.5;btn_mod_mgr_delete_mod;"
.. fgettext("Uninstall selected modpack") .. "]"
else
--show dependencies
retval = retval .. ",Depends:,"
toadd = modmgr.get_dependencies(selected_mod.path) toadd = modmgr.get_dependencies(selected_mod.path)
retval = retval .. toadd .. ";0;true,false]" retval = retval .. toadd .. ";0]"
--TODO read modinfo retval = retval .. "button[5.5,4.85;4.5,0.5;btn_mod_mgr_delete_mod;"
.. fgettext("Uninstall selected mod") .. "]"
end end
--show delete button
retval = retval .. "button[8,4.85;2,0.5;btn_mod_mgr_delete_mod;"
.. fgettext("Delete") .. "]"
end end
return retval return retval
end end

@ -100,6 +100,8 @@ Mod directory structure
mods mods
|-- modname |-- modname
| |-- depends.txt | |-- depends.txt
| |-- screenshot.png
| |-- description.txt
| |-- init.lua | |-- init.lua
| |-- textures | |-- textures
| | |-- modname_stuff.png | | |-- modname_stuff.png
@ -121,6 +123,12 @@ depends.txt:
to a single modname. Their meaning is that if the specified mod to a single modname. Their meaning is that if the specified mod
is missing, that does not prevent this mod from being loaded. is missing, that does not prevent this mod from being loaded.
screenshot.png:
A screenshot shown in modmanager within mainmenu.
description.txt:
File containing desctiption to be shown within mainmenu.
optdepends.txt: optdepends.txt:
An alternative way of specifying optional dependencies. An alternative way of specifying optional dependencies.
Like depends.txt, a single line contains a single modname. Like depends.txt, a single line contains a single modname.

@ -721,8 +721,15 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
scrollbar->setPos(data->listbox_scroll[fname_w]); scrollbar->setPos(data->listbox_scroll[fname_w]);
} }
} }
else {
gui::IGUIScrollBar *scrollbar = getListboxScrollbar(e);
if (scrollbar) {
scrollbar->setPos(0);
}
}
if (str_initial_selection != "") if ((str_initial_selection != "") &&
(str_initial_selection != "0"))
e->setSelected(stoi(str_initial_selection.c_str())-1); e->setSelected(stoi(str_initial_selection.c_str())-1);
m_listboxes.push_back(std::pair<FieldSpec,gui::IGUIListBox*>(spec,e)); m_listboxes.push_back(std::pair<FieldSpec,gui::IGUIListBox*>(spec,e));