mirror of
https://github.com/Insality/druid
synced 2025-09-27 10:02:19 +02:00
Update rich text example
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user