implement FontManager

This commit is contained in:
PeaAshMeter 2025-12-14 23:04:52 +03:00
parent 00f3db4ff9
commit 29e001e20f
2 changed files with 88 additions and 0 deletions

View File

@ -6,6 +6,7 @@
Tree = {
assets = (require "lib.utils.asset_bundle"):load()
}
Tree.fonts = (require "lib.utils.font_manager"):load("WDXL_Lubrifont_TC") -- дефолтный шрифт
Tree.panning = require "lib/panning"
Tree.controls = require "lib.controls"
Tree.level = (require "lib.level.level").new("procedural", "flower_plains") -- для теста у нас только один уровень, который сразу же загружен

View File

@ -0,0 +1,87 @@
--- @alias FontVariant "smallest" | "small" | "medium" | "large" | "headline"
--- @class TextTheme
--- @field private _sizes {[FontVariant]: integer}
local theme = {
_sizes = {
smallest = 10,
small = 12,
medium = 14,
large = 16,
headline = 20,
}
}
theme.__index = theme
--- @param loader fun(size: integer): love.Font?
function theme.new(loader)
local t = {}
for tag, size in pairs(theme._sizes) do
local f = loader(size)
if not f then return nil end
t[tag] = f
end
return setmetatable(t, theme)
end
--- @param variant FontVariant
--- @return love.Font
function theme:getVariant(variant)
return self[variant]
end
----------------------------------------------------------
--- A singleton to handle fonts
--- @class FontManager
--- @field private _themes table
local FontManager = {
_themes = {}
}
--- @param name string
--- @param size integer
function FontManager.newFont(name, size)
local err = function()
print("[FontManager]: font " .. name .. " not found!")
end
local fontDir = Tree.assets.files.fonts[name]
if not fontDir then return err() end
local font = fontDir.font
if not font then return err() end
return love.graphics.newFont(font, size)
end
--- @param name string
--- @return TextTheme?
function FontManager:loadTheme(name)
self._themes[name] = theme.new(
function(size)
return self.newFont(name, size)
end
)
return self._themes[name]
end
--- @param name string
--- @return TextTheme?
function FontManager:getTheme(name)
return self._themes[name]
end
--- initial setup
--- @param defaultFontName string
function FontManager:load(defaultFontName)
local t = self:loadTheme(defaultFontName)
if not t then
print("[FontManager]: default font " .. defaultFontName .. " is missing")
return self
end
local f = t:getVariant("medium")
love.graphics.setFont(f)
return self
end
return FontManager