a-planet-alive/mods/gui/smart_inventory/pages/doc.lua

139 lines
4.5 KiB
Lua

local doc_addon = smart_inventory.doc_addon
if not smart_inventory.doc_items_mod then
return
end
local COLOR_NOT_VIEWED = "#00FFFF" -- cyan
local COLOR_VIEWED = "#FFFFFF" -- white
local COLOR_HIDDEN = "#999999" -- gray
local COLOR_ERROR = "#FF0000" -- red
local function update_entry_list(state, selected_eid)
local playername = state.location.rootState.location.player
local category_id, category
category_id = state:get("category"):getSelected()
if category_id then
category = doc_addon.get_category_list()[category_id]
end
if not category then
return
end
local total = doc.get_entry_count(category.cid)
local revealed = doc.get_revealed_count(playername, category.cid)
local viewed = doc.get_viewed_count(playername, category.cid)
local hidden = total - revealed
local new = total - viewed - hidden
state:get("lbl_category"):setText(category.data.def.description)
state:get("lbl_viewed"):setText(minetest.colorize(COLOR_VIEWED,"Viewed: "..viewed.."/"..revealed))
state:get("lbl_hidden"):setText(minetest.colorize(COLOR_HIDDEN,"Hidden: "..hidden.."/"..total))
state:get("lbl_new"):setText(minetest.colorize(COLOR_NOT_VIEWED,"New: "..new))
local entries_box = state:get("entries")
entries_box:clearItems()
state.param.doc_entry_list = {}
for _, edata in ipairs(category.entries) do
local viewedprefix
if doc.entry_revealed(playername, category.cid, edata.eid) then
if doc.entry_viewed(playername, category.cid, edata.eid) then
viewedprefix = COLOR_VIEWED
else
viewedprefix = COLOR_NOT_VIEWED
end
local name = edata.data.name
if name == nil or name == "" then
name = edata.eid
end
local idx = entries_box:addItem(viewedprefix..name)
table.insert(state.param.doc_entry_list, edata)
if selected_eid == edata.eid then
entries_box:setSelected(idx)
end
end
end
end
local function doc_callback(state)
local playername = state.location.rootState.location.player
state:label(0, 0, "lbl_category", "")
state:background(0,0,20,0.5,"cat_bg", "halo.png")
-- state:label(0, 0.5, "lbl_revealed", "")
state:label(0, 0.5, "lbl_viewed", "")
state:label(3, 0.5, "lbl_new", "")
state:label(0, 1, "lbl_hidden", "")
local category_box = state:listbox(0, 1.5, 4.8, 2, "category", nil, false)
category_box:onClick(function(self, state, player)
update_entry_list(state)
end)
state:listbox(0, 4, 4.8, 6, "entries", nil, false):onDoubleClick(function(self, state, player)
local playername = state.location.rootState.location.player
local selected = self:getSelected()
local doc_entry = state.param.doc_entry_list[selected]
if doc_entry then
doc.mark_entry_as_viewed(playername, doc_entry.cid, doc_entry.eid)
state:get("code").edata = doc_entry
doc.data.players[playername].galidx = 1
update_entry_list(state)
end
end)
local codebox = state:element("code", { name = "code", code = "" })
codebox:onBuild(function(self)
if self.edata then
local state = self.root
local playername = state.location.rootState.location.player
self.data.code = "container[5.5,0]".. self.edata.cid_data.def.build_formspec(self.edata.data.data, playername).."container_end[]"
else
self.data.code = ""
end
end)
-- to trigger the page update
codebox:onSubmit(function(self, state)
-- select the right category
for idx, category in ipairs(doc_addon.get_category_list()) do
if category.cid == self.edata.cid then
state:get("category"):setSelected(idx)
break
end
end
-- update page for new category
update_entry_list(state, self.edata.eid)
end)
state:onInput(function(state, fields, player)
if fields.doc_button_gallery_prev then
if doc.data.players[playername].galidx - doc.data.players[playername].galrows > 0 then
doc.data.players[playername].galidx = doc.data.players[playername].galidx - doc.data.players[playername].galrows
end
elseif fields.doc_button_gallery_next then
if doc.data.players[playername].galidx + doc.data.players[playername].galrows <= doc.data.players[playername].maxgalidx then
doc.data.players[playername].galidx = doc.data.players[playername].galidx + doc.data.players[playername].galrows
end
end
end)
-- fill category table
for _, category in ipairs(doc_addon.get_category_list()) do
category_box:addItem(category.data.def.name)
end
end
smart_inventory.register_page({
name = "doc",
icon = "doc_awards_icon_generic.png",
tooltip = "Ingame documentation",
smartfs_callback = doc_callback,
sequence = 30,
on_button_click = update_entry_list,
})