Add screenshots and a README to display them.

This commit is contained in:
Signal 2026-02-15 19:20:34 -05:00
parent ce6cb893bf
commit 48ffa74bfd
12 changed files with 229 additions and 168 deletions

26
README.md Normal file
View file

@ -0,0 +1,26 @@
# Screenshots
- Meta menu:
![Meta menu](screenshots/meta.png)
- Server list:
![Servers menu](screenshots/servers.png)
- Content menu:
![Content menu](screenshots/content.png)
- ContentDB menu:
![ContentDB menu](screenshots/contentdb.png)
- Settings menu:
![Settings menu](screenshots/settings.png)
- Credits menu:
![Credits menu](screenshots/credits.png)

View file

@ -373,7 +373,7 @@ fs_hypertext.__index = fs_hypertext
setmetatable(fs_hypertext, { setmetatable(fs_hypertext, {
__call = function(_, x, y, w, h, txt) __call = function(_, x, y, w, h, txt)
local e = {x = x, y = y, w = w, h = h, txt = txt, _styles = {}} local e = {x = x, y = y, w = w, h = h, txt = txt, _styles = {}}
e.__id = "_"..minetest.get_us_time().."_"..math.random(1, 100000) e.__id = new_id()
setmetatable(e, fs_hypertext) setmetatable(e, fs_hypertext)
table.insert(ctx, e) table.insert(ctx, e)
return e return e
@ -747,7 +747,7 @@ fs_scrollbar.__index = fs_scrollbar
setmetatable(fs_scrollbar, { setmetatable(fs_scrollbar, {
__call = function(_, x, y, w, h, orientation, value) __call = function(_, x, y, w, h, orientation, value)
local e = {x = x, y = y, w = w, h = h, orientation = orientation or "vertical", value = value or "", _styles = {}} local e = {x = x, y = y, w = w, h = h, orientation = orientation or "vertical", value = value or "", _styles = {}}
e.__id = "_"..minetest.get_us_time().."_"..math.random(1, 100000) e.__id = new_id()
setmetatable(e, fs_scrollbar) setmetatable(e, fs_scrollbar)
ctx[#ctx +1] = e ctx[#ctx +1] = e
return e return e

View file

@ -259,7 +259,7 @@ function show_online_content_menu(content)
show_type = imfs.state("all"), show_type = imfs.state("all"),
content_shown = imfs.state(), content_shown = imfs.state(),
page = imfs.state(1), page = imfs.state(1),
current_package = imfs.state(), detail = imfs.state(),
}) })
end end

BIN
screenshots/content.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
screenshots/contentdb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 KiB

BIN
screenshots/credits.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
screenshots/meta.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
screenshots/servers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

BIN
screenshots/settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View file

@ -35,7 +35,11 @@ return function(state)
imfs.row(0.15, 0.05, "100% - 0.3", "100% - 0.13") imfs.row(0.15, 0.05, "100% - 0.3", "100% - 0.13")
local show_type = state.show_type() local show_type = state.show_type()
imfs.button(0, 0, "1x", "100%", "All") imfs.button(0, 0, "1x", "100%", "All")
:style(show_type == "all" and style_borderless_alt or style_borderless) :style(
show_type == "all"
and style_borderless_alt
or style_borderless
)
:style("hovered", style_borderless_hovered) :style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered) :style("pressed", style_borderless_hovered)
:onclick(function() :onclick(function()
@ -52,7 +56,11 @@ return function(state)
end) end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color) imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Games") imfs.button(0, 0, "1x", "100%", "Games")
:style(show_type == "games" and style_borderless_alt or style_borderless) :style(
show_type == "games"
and style_borderless_alt
or style_borderless
)
:style("hovered", style_borderless_hovered) :style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered) :style("pressed", style_borderless_hovered)
:onclick(function() :onclick(function()
@ -69,7 +77,11 @@ return function(state)
end) end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color) imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Mods") imfs.button(0, 0, "1x", "100%", "Mods")
:style(show_type == "mods" and style_borderless_alt or style_borderless) :style(
show_type == "mods"
and style_borderless_alt
or style_borderless
)
:style("hovered", style_borderless_hovered) :style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered) :style("pressed", style_borderless_hovered)
:onclick(function() :onclick(function()
@ -86,7 +98,11 @@ return function(state)
end) end)
imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color) imfs.box(0, 0, 0.1, "100%", theme.styles.container.border_color)
imfs.button(0, 0, "1x", "100%", "Texture Packs") imfs.button(0, 0, "1x", "100%", "Texture Packs")
:style(show_type == "texturepacks" and style_borderless_alt or style_borderless) :style(
show_type == "texturepacks"
and style_borderless_alt
or style_borderless
)
:style("hovered", style_borderless_hovered) :style("hovered", style_borderless_hovered)
:style("pressed", style_borderless_hovered) :style("pressed", style_borderless_hovered)
:onclick(function() :onclick(function()
@ -157,8 +173,15 @@ return function(state)
return imfs.end_() return imfs.end_()
end end
if state.detail() then
imfs.button(1, 2, 3, 0.75, "Back")
:onclick(function()
state.detail(false)
end)
else
local content = state.content_shown() local content = state.content_shown()
local num_per_page = math.floor((size.x + 0.5) / 5.5) * math.floor((size.y - 1.05) / 3.5) local num_per_page =
math.floor((size.x + 0.5) / 5.5) * math.floor((size.y - 1.05) / 3.5)
local excess_x = (size.x + 0.5) % 5.5 local excess_x = (size.x + 0.5) % 5.5
local excess_y = (size.y - 1.05) % 3.5 local excess_y = (size.y - 1.05) % 3.5
imfs.scroll_container(0, 1.05, "100%", "100% - 1.55", "horizontal", 0, "") imfs.scroll_container(0, 1.05, "100%", "100% - 1.55", "horizontal", 0, "")
@ -214,7 +237,7 @@ return function(state)
bgcolor = "#0004" bgcolor = "#0004"
}) })
:onclick(function() :onclick(function()
state.detail(pkg)
end) end)
imfs.group_end() imfs.group_end()
x = x + 5.5 x = x + 5.5
@ -226,6 +249,7 @@ return function(state)
end end
imfs.scroll_container_end() imfs.scroll_container_end()
end
return imfs.end_() return imfs.end_()
end end

View file

@ -127,6 +127,17 @@ local function refresh_server_list(state)
nil, nil,
function(result) function(result)
local list = table.copy(state.favorite_servers) local list = table.copy(state.favorite_servers)
local num_servers = #result
local i = 0
while i < num_servers do
i = i + 1
-- Drop incompatible servers. You can't join them,
-- so showing them is rather pointless.
if (result[i].proto_max or version.proto_min) < version.proto_min then
table.remove(result, i)
num_servers = num_servers - 1
end
end
table.insert_all(list, result) table.insert_all(list, result)
state.servers = list state.servers = list
if state.search ~= "" then if state.search ~= "" then
@ -280,19 +291,11 @@ return function(state)
imfs.scope("servers") imfs.scope("servers")
local height = size.y * 0.8 local height = size.y * 0.8
local i = 0 local i = 0
local idx = state.scroll_pos() for idx = state.scroll_pos(), state.scroll_pos() + height / 0.5 do
while true do
-- We must use a while loop here because we skip incompatible servers,
-- and we have no way of knowing how many there will be until we iterate.
if i > math.ceil(height / 0.5) then break end
local x = list[idx] local x = list[idx]
-- End early if we've run out of list. -- End early if we've run out of list.
if not x then break end if not x then break end
-- Skip incompatible servers. You can't join them,
-- so showing them is rather pointless.
if (x.proto_max or version.proto_min) >= version.proto_min then
local ping_lvl = 0 local ping_lvl = 0
local lag = (x.lag or 0) * 1000 + (x.ping or 0) * 250 local lag = (x.lag or 0) * 1000 + (x.ping or 0) * 250
if lag <= 125 then if lag <= 125 then
@ -307,7 +310,7 @@ return function(state)
local name = x.name and x.name:trim() or "" local name = x.name and x.name:trim() or ""
if name == "" then if name == "" then
name = core.colorize("#888", x.address..":"..x.port) name = core.colorize(theme.styles.text_color_muted, x.address..":"..x.port)
end end
imfs.button(0, i * 0.5, "100%", 0.5) imfs.button(0, i * 0.5, "100%", 0.5)
@ -382,8 +385,6 @@ return function(state)
i = i + 1 i = i + 1
end end
idx = idx + 1
end
imfs.scope_end() imfs.scope_end()
@ -467,7 +468,7 @@ return function(state)
end end
if joining == true then if joining == true then
imfs.hypertext(0, 0, "100%", 0.75, "<global valign=middle halign=center color=#aaa>Connecting to server...") imfs.hypertext(0, 0, "100%", 0.75, "<global valign=middle halign=center color=#aaa>Joining server...")
imfs.group(0, 0, "100%", 1.05) imfs.group(0, 0, "100%", 1.05)
imfs.image(0, 0.3, "100%", "100% - 0.3", theme.get_background_image("field")) imfs.image(0, 0.3, "100%", "100% - 0.3", theme.get_background_image("field"))
imfs.label(0.2, 0.125, "Address") imfs.label(0.2, 0.125, "Address")
@ -489,7 +490,7 @@ return function(state)
end) end)
imfs.group_end() imfs.group_end()
else else
imfs.hypertext(0, 0, "100%", 0.75, "<global valign=middle halign=center color=#aaa>Connecting to <b>"..core.hypertext_escape(joining.name or joining.address..":"..joining.port).."</b>...") imfs.hypertext(0, 0, "100%", 0.75, "<global valign=middle halign=center color=#aaa>Joining <b>"..core.hypertext_escape(joining.name or joining.address..":"..joining.port).."</b>...")
end end
theme.field(0, 0, "100%", 0.75, "Username", state.username) theme.field(0, 0, "100%", 0.75, "Username", state.username)

View file

@ -42,10 +42,19 @@ local function search_settings(state, search)
return state.settings, state.categories return state.settings, state.categories
end end
local words = search:lower():trim():split(" ")
local out = {} local out = {}
for category, settings in pairs(state.settings) do for category, settings in pairs(state.settings) do
for i = 1, #settings do for i = 1, #settings do
if settings[i].name:find(search, 1, true) then for j = 1, #words do
local passed = true
if not (settings[i].readable_name:lower():find(words[j], 1, true)
or settings[i].name:find(words[j], 1, true)) then
passed = false
end
if passed then
if not out[category] then if not out[category] then
out[category] = {settings[i]} out[category] = {settings[i]}
else else
@ -54,6 +63,7 @@ local function search_settings(state, search)
end end
end end
end end
end
local categories = {} local categories = {}
for i = 1, #state.categories do for i = 1, #state.categories do