1
0
Fork 0
forked from Simnation/Main
Main/resources/[tools]/NativeUI/elements/UIResText.lua
2025-06-07 08:51:21 +02:00

199 lines
No EOL
5.7 KiB
Lua

UIResText = setmetatable({}, UIResText)
UIResText.__index = UIResText
UIResText.__call = function() return "Text" end
function GetCharacterCount(str)
local characters = 0
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
local a = c:byte(1, -1)
if a ~= nil then
characters = characters + 1
end
end
return characters
end
function GetByteCount(str)
local bytes = 0
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
local a,b,c,d = c:byte(1, -1)
if a ~= nil then
bytes = bytes + 1
end
if b ~= nil then
bytes = bytes + 1
end
if c ~= nil then
bytes = bytes + 1
end
if d ~= nil then
bytes = bytes + 1
end
end
return bytes
end
function AddLongStringForAscii(str)
local maxbytelength = 99
for i = 0, GetCharacterCount(str), 99 do
AddTextComponentSubstringPlayerName(string.sub(str, i, math.min(maxbytelength, GetCharacterCount(str) - i))) --needs changed
end
end
function AddLongStringForUtf8(str)
local maxbytelength = 99
local bytecount = GetByteCount(str)
if bytecount < maxbytelength then
AddTextComponentSubstringPlayerName(str)
return
end
local startIndex = 0
for i = 0, GetCharacterCount(str), 1 do
local length = i - startIndex
if GetByteCount(string.sub(str, startIndex, length)) > maxbytelength then
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, length - 1))
i = i - 1
startIndex = startIndex + (length - 1)
end
end
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, GetCharacterCount(str) - startIndex))
end
function AddLongString(str)
local bytecount = GetByteCount(str)
if bytecount == GetCharacterCount(str) then
AddLongStringForAscii(str)
else
AddLongStringForUtf8(str)
end
end
function MeasureStringWidthNoConvert(str, font, scale)
BeginTextCommandWidth("STRING")
AddLongString(str)
SetTextFont(font or 0)
SetTextScale(1.0, scale or 0)
return EndTextCommandGetWidth(true)
end
function MeasureStringWidth(str, font, scale)
return MeasureStringWidthNoConvert(str, font, scale) * 1920
end
function UIResText.New(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap)
local _UIResText = {
_Text = tostring(Text) or "",
X = tonumber(X) or 0,
Y = tonumber(Y) or 0,
Scale = tonumber(Scale) or 0,
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
Font = tonumber(Font) or 0,
Alignment = Alignment or nil,
DropShadow = Dropshadow or nil,
Outline = Outline or nil,
WordWrap = tonumber(WordWrap) or 0,
}
return setmetatable(_UIResText, UIResText)
end
function UIResText:Position(X, Y)
if tonumber(X) and tonumber(Y) then
self.X = tonumber(X)
self.Y = tonumber(Y)
else
return {X = self.X, Y = self.Y}
end
end
function UIResText:Colour(R, G, B, A)
if tonumber(R) and tonumber(G) and tonumber(B) and tonumber(A) then
self._Colour.R = tonumber(R)
self._Colour.B = tonumber(B)
self._Colour.G = tonumber(G)
self._Colour.A = tonumber(A)
else
return self._Colour
end
end
function UIResText:Text(Text)
if tostring(Text) and Text ~= nil then
self._Text = tostring(Text)
else
return self._Text
end
end
function UIResText:Draw()
local Position = self:Position()
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
SetTextFont(self.Font)
SetTextScale(1.0, self.Scale)
SetTextColour(self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
if self.DropShadow then
SetTextDropShadow()
end
if self.Outline then
SetTextOutline()
end
if self.Alignment ~= nil then
if self.Alignment == 1 or self.Alignment == "Center" or self.Alignment == "Centre" then
SetTextCentre(true)
elseif self.Alignment == 2 or self.Alignment == "Right" then
SetTextRightJustify(true)
SetTextWrap(0, Position.X)
end
end
if tonumber(self.WordWrap) then
if tonumber(self.WordWrap) ~= 0 then
SetTextWrap(Position.X, Position.X + (tonumber(self.WordWrap) / Resolution.Width))
end
end
BeginTextCommandDisplayText("STRING")
AddLongString(self._Text)
EndTextCommandDisplayText(Position.X, Position.Y)
end
function RenderText(Text, X, Y, Font, Scale, R, G, B, A, Alignment, DropShadow, Outline, WordWrap)
Text = tostring(Text)
X, Y = FormatXWYH(X, Y)
SetTextFont(Font or 0)
SetTextScale(1.0, Scale or 0)
SetTextColour(R or 255, G or 255, B or 255, A or 255)
if DropShadow then
SetTextDropShadow()
end
if Outline then
SetTextOutline()
end
if Alignment ~= nil then
if Alignment == 1 or Alignment == "Center" or Alignment == "Centre" then
SetTextCentre(true)
elseif Alignment == 2 or Alignment == "Right" then
SetTextRightJustify(true)
SetTextWrap(0, X)
end
end
if tonumber(WordWrap) then
if tonumber(WordWrap) ~= 0 then
WordWrap, _ = FormatXWYH(WordWrap, 0)
SetTextWrap(WordWrap, X - WordWrap)
end
end
BeginTextCommandDisplayText("STRING")
AddLongString(Text)
EndTextCommandDisplayText(X, Y)
end