mtmenu/views/content.lua
2026-02-10 21:46:25 -05:00

236 lines
10 KiB
Lua

local function search_content(state, search)
local out = {}
for i = 1, #state.content do
local pkg = state.content[i]
if pkg.name:find(search, 1, true) then
out[#out + 1] = pkg
end
end
return out
end
return function(state)
imfs.begin(size.x, size.y)
:padding(0, 0)
:bgcolor(theme.styles.bg_color, true)
if not state.content then
state.content = package.all()
state.content_shown._val = state.content
end
local current_package = state.current_package()
imfs.box(0, 0, "100%", current_package and 1 or 2, theme.styles.container.bg_color)
imfs.row(0.2, 0.125, "100% - 0.4", 0.75)
:gap(0.1)
theme.field(0, 0, "1x", "100%", state.search)
:onchange(function(value)
state.search = value
end)
:onenter(function()
state.page(1)
state.content_shown(search_content(state, state.search))
end)
imfs.button(0, 0, 0.75, 0.75)
:image(theme.icon("search"))
:style({
bgimg = theme.get_background_image("button"),
bgimg_middle = theme.styles.button.border_width,
})
:tooltip("Search content")
:onclick(function()
state.page(1)
state.content_shown(search_content(state, state.search))
end)
imfs.button(0, 0, 0.75, 0.75)
:image(theme.icon("cancel"))
:style({
bgimg = theme.get_background_image("button"),
bgimg_middle = theme.styles.button.border_width,
})
:tooltip("Clear search")
:onclick(function()
state.search = ""
state.page(1)
state.content_shown(state.content)
end)
imfs.button(0, 0, 3.5, 0.75, "Check for updates")
:onclick(function()
end)
imfs.button(0, 0, 2, 0.75, "Back")
:onclick(function()
if current_package then
state.current_package(false)
else
show_meta_menu()
end
end)
imfs.row_end()
imfs.box(0, 0.95, "100%", 0.1, theme.styles.container.border_color)
if current_package then
imfs.hypertext(0.25, 1.05, "100% - 0.5", "100% - 1.05", "\
<global color="..theme.styles.text_color..">\
<tag name=action color="..theme.styles.link_color.." hovercolor="..theme.styles.link_color_hovered..">\
"..markdown_to_hypertext(read_file(current_package.path.."/README.md") or ""))
else
imfs.row(0.2, 1.125, "100% - 0.4", 0.75)
:gap(0.1)
imfs.group(0, 0, "1x", 0.75)
imfs.image(0, 0, "100%", "100%", theme.get_background_image("button"), "8,8")
imfs.row(0.15, 0.05, "100% - 0.3", "100% - 0.13")
local show_type = state.show_type()
imfs.button(0, 0, "1x", "100%", "All")
:style(show_type == "all" and style_borderless_alt or style_borderless)
:style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered)
:onclick(function()
if show_type ~= "all" then
state.show_type("all")
state.page(1)
state.content = package.all()
if state.search ~= "" then
state.content_shown(search_content(state, state.search))
else
state.content_shown(state.content)
end
end
end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Games")
:style(show_type == "games" and style_borderless_alt or style_borderless)
:style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered)
:onclick(function()
if show_type ~= "games" then
state.show_type("games")
state.page(1)
state.content = package.games()
if state.search ~= "" then
state.content_shown(search_content(state, state.search))
else
state.content_shown(state.content)
end
end
end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Mods")
:style(show_type == "mods" and style_borderless_alt or style_borderless)
:style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered)
:onclick(function()
if show_type ~= "mods" then
state.show_type("mods")
state.page(1)
state.content = package.mods()
if state.search ~= "" then
state.content_shown(search_content(state, state.search))
else
state.content_shown(state.content)
end
end
end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Texture Packs")
:style(show_type == "texturepacks" and style_borderless_alt or style_borderless)
:style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered)
:onclick(function()
if show_type ~= "texturepacks" then
state.show_type("texturepacks")
state.page(1)
state.content = package.texturepacks()
if state.search ~= "" then
state.content_shown(search_content(state, state.search))
else
state.content_shown(state.content)
end
end
end)
imfs.row_end()
imfs.group_end()
imfs.button(0, 0, 3.5, 0.75, "Browse online content...")
:onclick(function()
show_online_content_menu()
end)
imfs.button(0, 0, 2.5, 0.75, "New package...")
:onclick(function()
end)
imfs.row_end()
imfs.box(0, 1.95, "100%", 0.1, theme.styles.container.border_color)
local content = state.content_shown()
if #content == 0 then
imfs.hypertext(0, 2.05, "100%", 2, [[
<global halign=center valign=middle color=#444>
<style size=36><b>No results.</b></style>
]])
else
local num_per_page = math.floor(size.x / 3) * math.floor((size.y - 2) / 3)
local pages = math.ceil(#content / num_per_page)
imfs.scroll_container(0, 2.05, "100%", "100% - 2.55", "horizontal", 0, "")
:scrollbar(function()
imfs.scrollbar(-800, -800, 0, 0, "horizontal", state.page)
:options({
min = 1,
max = pages,
smallstep = 1
})
:onchange(function(action, value)
if action == "CHG" then
state.page(value)
end
end)
end)
local x = 0
local y = 0
local start = (state.page() - 1) * num_per_page
for i = start + 1, start + num_per_page do
local pkg = content[i]
if not pkg then break end
if not pkg.icon then
pkg.icon = pkg.type == "game" and pkg.path.."/menu/icon.png" or pkg.path.."/icon.png"
if not file_exists(pkg.icon) then
pkg.icon = theme.icon("menu_content")
end
end
imfs.button(x + 0.125, y, 2.5, 2.5)
:image(pkg.icon)
:tooltip(pkg.title ~= "" and pkg.title or pkg.name)
:onclick(function()
state.current_package(pkg)
end)
x = x + 3
if x + 2.5 > size.x then
x = 0
y = y + 3
end
end
imfs.scroll_container_end()
imfs.row(0, "100% - 0.375", "100%", 0.25)
:align("center")
for i = 1, pages do
imfs.button(0, 0, 0.25, 0.25)
:image(theme.icon(i == state.page() and "circle_active" or "circle"))
:onclick(function()
state.page(i)
end)
end
imfs.row_end()
end
end
return imfs.end_()
end