tab_content.lua 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. -- Luanti
  2. -- Copyright (C) 2014 sapier
  3. -- Copyright (C) 2018 rubenwardy <rw@rubenwardy.com>
  4. -- SPDX-License-Identifier: LGPL-2.1-or-later
  5. local function get_content_icons(packages_with_updates)
  6. local ret = {}
  7. for _, content in ipairs(packages_with_updates) do
  8. ret[content.virtual_path or content.path] = { type = "update" }
  9. end
  10. return ret
  11. end
  12. local packages_raw, packages
  13. local function update_packages()
  14. pkgmgr.load_all()
  15. packages_raw = {}
  16. table.insert_all(packages_raw, pkgmgr.games)
  17. table.insert_all(packages_raw, pkgmgr.texture_packs)
  18. table.insert_all(packages_raw, pkgmgr.global_mods:get_list())
  19. local function get_data()
  20. return packages_raw
  21. end
  22. local function is_equal(element, uid) --uid match
  23. return (element.type == "game" and element.id == uid) or
  24. element.name == uid
  25. end
  26. packages = filterlist.create(get_data, pkgmgr.compare_package,
  27. is_equal, nil, {})
  28. end
  29. local function on_change(type)
  30. if type == "ENTER" then
  31. mm_game_theme.set_engine()
  32. update_packages()
  33. end
  34. end
  35. local function get_formspec(tabview, name, tabdata)
  36. if not packages then
  37. update_packages()
  38. end
  39. if not tabdata.selected_pkg then
  40. tabdata.selected_pkg = 1
  41. end
  42. local use_technical_names = core.settings:get_bool("show_technical_names")
  43. local packages_with_updates = update_detector.get_all()
  44. local update_icons = get_content_icons(packages_with_updates)
  45. local update_count = #packages_with_updates
  46. local contentdb_label
  47. if update_count == 0 then
  48. contentdb_label = fgettext("Browse online content")
  49. else
  50. contentdb_label = fgettext("Browse online content [$1]", update_count)
  51. end
  52. local retval = {
  53. "label[0.4,0.4;", fgettext("Installed Packages:"), "]",
  54. "tablecolumns[color;tree;image,align=inline,width=1.5",
  55. ",tooltip=", fgettext("Update available?"),
  56. ",0=", core.formspec_escape(defaulttexturedir .. "blank.png"),
  57. ",4=", core.formspec_escape(defaulttexturedir .. "cdb_update_cropped.png"),
  58. ";text]",
  59. "table[0.4,0.8;6.3,4.8;pkglist;",
  60. pkgmgr.render_packagelist(packages, use_technical_names, update_icons),
  61. ";", tabdata.selected_pkg, "]",
  62. "button[0.4,5.8;6.3,0.9;btn_contentdb;", contentdb_label, "]"
  63. }
  64. local selected_pkg
  65. if filterlist.size(packages) >= tabdata.selected_pkg then
  66. selected_pkg = packages:get_list()[tabdata.selected_pkg]
  67. end
  68. if selected_pkg then
  69. -- Check for screenshot being available
  70. local screenshotfilename = selected_pkg.path .. DIR_DELIM .. "screenshot.png"
  71. local screenshotfile, error = io.open(screenshotfilename, "r")
  72. local modscreenshot
  73. if not error then
  74. screenshotfile:close()
  75. modscreenshot = screenshotfilename
  76. else
  77. modscreenshot = defaulttexturedir .. "no_screenshot.png"
  78. end
  79. local desc = fgettext("No package description available")
  80. if selected_pkg.description and selected_pkg.description:trim() ~= "" then
  81. desc = core.formspec_escape(selected_pkg.description)
  82. end
  83. local info = core.get_content_info(selected_pkg.path)
  84. local title_and_name
  85. if selected_pkg.type == "game" then
  86. title_and_name = selected_pkg.title or selected_pkg.name
  87. else
  88. title_and_name = (selected_pkg.title or selected_pkg.name) .. "\n" ..
  89. core.colorize("#BFBFBF", selected_pkg.name)
  90. end
  91. local desc_height = 3.2
  92. if selected_pkg.is_modpack then
  93. desc_height = 2.1
  94. table.insert_all(retval, {
  95. "button[7.1,4.7;8,0.9;btn_mod_mgr_rename_modpack;",
  96. fgettext("Rename"), "]"
  97. })
  98. elseif selected_pkg.type == "mod" then
  99. -- Show dependencies for mods
  100. desc = desc .. "\n\n"
  101. local toadd_hard = table.concat(info.depends or {}, "\n")
  102. local toadd_soft = table.concat(info.optional_depends or {}, "\n")
  103. if toadd_hard == "" and toadd_soft == "" then
  104. desc = desc .. fgettext("No dependencies.")
  105. else
  106. if toadd_hard ~= "" then
  107. desc = desc ..fgettext("Dependencies:") ..
  108. "\n" .. toadd_hard
  109. end
  110. if toadd_soft ~= "" then
  111. if toadd_hard ~= "" then
  112. desc = desc .. "\n\n"
  113. end
  114. desc = desc .. fgettext("Optional dependencies:") ..
  115. "\n" .. toadd_soft
  116. end
  117. end
  118. elseif selected_pkg.type == "txp" then
  119. desc_height = 2.1
  120. if selected_pkg.enabled then
  121. table.insert_all(retval, {
  122. "button[7.1,4.7;8,0.9;btn_mod_mgr_disable_txp;",
  123. fgettext("Disable Texture Pack"), "]"
  124. })
  125. else
  126. table.insert_all(retval, {
  127. "button[7.1,4.7;8,0.9;btn_mod_mgr_use_txp;",
  128. fgettext("Use Texture Pack"), "]"
  129. })
  130. end
  131. end
  132. table.insert_all(retval, {
  133. "image[7.1,0.2;3,2;", core.formspec_escape(modscreenshot), "]",
  134. "label[10.5,1;", core.formspec_escape(title_and_name), "]",
  135. "box[7.1,2.4;8,", tostring(desc_height), ";#000]",
  136. "textarea[7.1,2.4;8,", tostring(desc_height), ";;;", desc, "]",
  137. })
  138. if core.may_modify_path(selected_pkg.path) then
  139. table.insert_all(retval, {
  140. "button[7.1,5.8;4,0.9;btn_mod_mgr_delete_mod;",
  141. fgettext("Uninstall"), "]"
  142. })
  143. end
  144. if update_icons[selected_pkg.virtual_path or selected_pkg.path] then
  145. table.insert_all(retval, {
  146. "button[11.1,5.8;4,0.9;btn_mod_mgr_update;",
  147. fgettext("Update"), "]"
  148. })
  149. end
  150. end
  151. return table.concat(retval)
  152. end
  153. local function handle_doubleclick(pkg)
  154. if pkg.type == "txp" then
  155. if core.settings:get("texture_path") == pkg.path then
  156. core.settings:set("texture_path", "")
  157. else
  158. core.settings:set("texture_path", pkg.path)
  159. end
  160. packages = nil
  161. pkgmgr.reload_texture_packs()
  162. mm_game_theme.init()
  163. mm_game_theme.set_engine()
  164. end
  165. end
  166. local function handle_buttons(tabview, fields, tabname, tabdata)
  167. if fields.pkglist then
  168. local event = core.explode_table_event(fields.pkglist)
  169. tabdata.selected_pkg = event.row
  170. if event.type == "DCL" then
  171. handle_doubleclick(packages:get_list()[tabdata.selected_pkg])
  172. end
  173. return true
  174. end
  175. if fields.btn_contentdb then
  176. local dlg = create_contentdb_dlg()
  177. dlg:set_parent(tabview)
  178. tabview:hide()
  179. dlg:show()
  180. packages = nil
  181. return true
  182. end
  183. if fields.btn_mod_mgr_rename_modpack then
  184. local mod = packages:get_list()[tabdata.selected_pkg]
  185. local dlg_renamemp = create_rename_modpack_dlg(mod)
  186. dlg_renamemp:set_parent(tabview)
  187. tabview:hide()
  188. dlg_renamemp:show()
  189. packages = nil
  190. return true
  191. end
  192. if fields.btn_mod_mgr_delete_mod then
  193. local mod = packages:get_list()[tabdata.selected_pkg]
  194. local dlg_delmod = create_delete_content_dlg(mod)
  195. dlg_delmod:set_parent(tabview)
  196. tabview:hide()
  197. dlg_delmod:show()
  198. packages = nil
  199. return true
  200. end
  201. if fields.btn_mod_mgr_update then
  202. local pkg = packages:get_list()[tabdata.selected_pkg]
  203. local dlg = create_contentdb_dlg(nil, pkgmgr.get_contentdb_id(pkg))
  204. dlg:set_parent(tabview)
  205. tabview:hide()
  206. dlg:show()
  207. packages = nil
  208. return true
  209. end
  210. if fields.btn_mod_mgr_use_txp or fields.btn_mod_mgr_disable_txp then
  211. local txp_path = ""
  212. if fields.btn_mod_mgr_use_txp then
  213. txp_path = packages:get_list()[tabdata.selected_pkg].path
  214. end
  215. core.settings:set("texture_path", txp_path)
  216. packages = nil
  217. pkgmgr.reload_texture_packs()
  218. mm_game_theme.init()
  219. mm_game_theme.set_engine()
  220. return true
  221. end
  222. return false
  223. end
  224. return {
  225. name = "content",
  226. caption = function()
  227. local update_count = core.settings:get_bool("contentdb_enable_updates_indicator") and update_detector.get_count() or 0
  228. if update_count == 0 then
  229. return fgettext("Content")
  230. else
  231. return fgettext("Content [$1]", update_count)
  232. end
  233. end,
  234. cbf_formspec = get_formspec,
  235. cbf_button_handler = handle_buttons,
  236. on_change = on_change
  237. }