Fix "TODO read modinfo" in modmanager to improve ui usability
authorsapier <Sapier at GMX dot net>
Sun, 10 Nov 2013 18:37:45 +0000 (19:37 +0100)
committersapier <Sapier at GMX dot net>
Sun, 10 Nov 2013 18:37:45 +0000 (19:37 +0100)
builtin/misc_helpers.lua
builtin/modmgr.lua
doc/lua_api.txt
src/guiFormSpecMenu.cpp

index 38909ec1dc5384e9fff01f0133caee7d2d6d4a64..55c5798d7830ea40e11cae3f0af9bb12833a70c3 100644 (file)
@@ -205,6 +205,62 @@ function tbl.formspec_escape(text)
        return text
 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
index d9579c65283366858846d71dfdad334158d72e00..04f19ec86d4404bd453e5f3b9dbc8e46a82f7417 100644 (file)
@@ -235,13 +235,14 @@ function modmgr.tab()
        local retval = 
                "vertlabel[0,-0.25;".. fgettext("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.selected_mod .. "]"
 
        retval = retval ..
-               "button[1,4.85;2,0.5;btn_mod_mgr_install_local;".. fgettext("Install") .. "]" ..
-               "button[3,4.85;2,0.5;btn_mod_mgr_download;".. fgettext("Download") .. "]"
+               "label[0.8,4.2;" .. fgettext("Add mod:") .. "]" .. 
+               "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
                
@@ -250,25 +251,66 @@ function modmgr.tab()
        end
        
        if selected_mod ~= nil then
+               local modscreenshot = nil
+               
+               --check for screenshot beeing available
+               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
+                       descriptionlines = {}
+                       table.insert(descriptionlines,fgettext("No mod description available"))
+               end
+       
+               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 
-                       .. "button[10,4.85;2,0.5;btn_mod_mgr_rename_modpack;" ..
-                                        fgettext("Rename") .. "]"
+                       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 .. 
-                               "label[6,1.9;".. fgettext("Depends:") .. "]" ..
-                               "textlist[6,2.4;5.7,2;deplist;"
+                       --show dependencies
+
+                       retval = retval .. ",Depends:,"
                                
                        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
-               --show delete button
-               retval = retval .. "button[8,4.85;2,0.5;btn_mod_mgr_delete_mod;"
-                               .. fgettext("Delete") .. "]"
        end
        return retval
 end
index c4d12db0f41f917dfc3a8d5cb191cb54024ce0da..db9a5e8fa04a51e9c2c6cd2ae443d398c8f6714b 100644 (file)
@@ -100,6 +100,8 @@ Mod directory structure
 mods
 |-- modname
 |   |-- depends.txt
+|   |-- screenshot.png
+|   |-- description.txt
 |   |-- init.lua
 |   |-- textures
 |   |   |-- modname_stuff.png
@@ -121,6 +123,12 @@ depends.txt:
   to a single modname. Their meaning is that if the specified mod
   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:
   An alternative way of specifying optional dependencies.
   Like depends.txt, a single line contains a single modname.
index e0ef55acd5d70eec1650d404d0b1790ff0f22134..aa1e2d9c99ee0df18018ea0283f1e44da374923c 100644 (file)
@@ -721,8 +721,15 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
                                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);
 
                m_listboxes.push_back(std::pair<FieldSpec,gui::IGUIListBox*>(spec,e));