Update rich text example

This commit is contained in:
Insality
2023-02-08 21:54:32 +02:00
parent 5e92cf5ffc
commit a1d138522e
4 changed files with 40 additions and 46 deletions

View File

@@ -64,16 +64,25 @@ end
function RichText:_get_settings()
return {
width = self.root_size.x,
adjust_scale = 1,
parent = self.root,
width = self.root_size.x,
height = self.root_size.y,
text_prefab = self.text_prefab,
node_prefab = self.icon_prefab,
size = gui.get_scale(self.text_prefab).x,
shadow = gui.get_shadow(self.text_prefab),
outline = gui.get_outline(self.text_prefab),
size = gui.get_scale(self.text_prefab).x,
text_scale = gui.get_scale(self.text_prefab),
text_leading = gui.get_leading(self.text_prefab),
is_multiline = gui.get_line_break(self.text_prefab),
combine_words = false,
image_pixel_grid_snap = false,
node_scale = gui.get_scale(self.icon_prefab),
image_scale = gui.get_scale(self.icon_prefab),
default_animation = gui.get_flipbook(self.icon_prefab),
--combine_words = true,
}
end

View File

@@ -54,7 +54,6 @@ local V3_ZERO = vmath.vector3(0)
---@field shadow vector4
---@field outline vector4
---@field position vector3
---@field line_spacing number
---@field image_pixel_grid_snap boolean
---@field combine_words boolean
---@field default_animation string
@@ -146,15 +145,11 @@ local function get_text_metrics(word, previous_word, settings)
local previous_word_metrics = resource.get_text_metrics(font_resource, previous_word.text)
local union_metrics = resource.get_text_metrics(font_resource, previous_word.text .. text)
print("prev word metrics", previous_word_metrics.width, previous_word.text)
print("union", union_metrics.width, previous_word.text .. text)
print("current width", metrics.width, text)
local without_previous_width = metrics.width
metrics.width = (union_metrics.width - previous_word_metrics.width) * word_scale_x
-- Since the several characters can be ajusted to fit the space between the previous word and this word
-- For example: chars: [.,?!]
metrics.offset_x = metrics.width - without_previous_width
print("with prev word offset", metrics.offset_x, previous_word.text, text)
end
end
@@ -202,22 +197,6 @@ end
function M.create(text, settings)
assert(text, "You must provide a text")
---@class rich_text.settings
settings = settings or {}
settings.adjust_scale = 1
settings.position = settings.position or V3_ZERO
settings.line_spacing = settings.line_spacing or 1
settings.image_pixel_grid_snap = settings.image_pixel_grid_snap or false
settings.combine_words = settings.combine_words or false
settings.default_animation = settings.default_animation or nil
settings.node_prefab = settings.node_prefab
settings.text_prefab = settings.text_prefab
settings.text_leading = gui.get_leading(settings.text_prefab)
settings.text_scale = gui.get_scale(settings.text_prefab)
settings.node_scale = gui.get_scale(settings.node_prefab)
settings.is_multiline = gui.get_line_break(settings.text_prefab)
settings.parent = settings.parent
-- default settings for a word
-- will be assigned to each word unless tags override the values
local font = gui.get_font(settings.text_prefab)
@@ -518,18 +497,17 @@ end
function M.adjust_to_area(words, settings, lines_metrics)
local last_line_metrics = lines_metrics
local area_size = gui.get_size(settings.parent)
if not settings.is_multiline then
if lines_metrics.text_width > area_size.x then
last_line_metrics = M.set_text_scale(words, settings, area_size.x / lines_metrics.text_width)
if lines_metrics.text_width > settings.width then
last_line_metrics = M.set_text_scale(words, settings, settings.width / lines_metrics.text_width)
end
else
-- Multiline adjusting is very tricky stuff...
-- It's do a lot of calculations, beware!
if lines_metrics.text_width > area_size.x or lines_metrics.text_height > area_size.y then
local scale_koef = math.sqrt(area_size.y / lines_metrics.text_height)
if lines_metrics.text_width * scale_koef > area_size.x then
scale_koef = math.sqrt(area_size.x / lines_metrics.text_width)
if lines_metrics.text_width > settings.width or lines_metrics.text_height > settings.height then
local scale_koef = math.sqrt(settings.height / lines_metrics.text_height)
if lines_metrics.text_width * scale_koef > settings.width then
scale_koef = math.sqrt(settings.width / lines_metrics.text_width)
end
local adjust_scale = math.min(scale_koef, 1)