You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DiesalLibs/DiesalStyle-2.0/DiesalStyle-2.0.lua

1287 lines
50 KiB

local MAJOR, MINOR = "DiesalStyle-2.0", 1
---@alias Diesal.Style DiesalStyle-2.0
---@class DiesalStyle-2.0
local DiesalStyle, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not DiesalStyle then
return
end -- No Upgrade needed.
-- ~~| Libraries |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local DiesalTools = LibStub("DiesalTools-2.0")
local LibSharedMedia = LibStub("LibSharedMedia-3.0")
-- ~~| Lib Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local GetIconCoords, HSL = DiesalTools.GetIconCoords, DiesalTools.HSL
-- ~~| Lua Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local type, select, pairs, tonumber = type, select, pairs, tonumber
local next = next
local format, sub = string.format, string.sub
local min, max = math.min, math.max
-- ~~| WoW Upvalues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local errorhandler = geterrorhandler()
-- ~~| DiesalStyle Values |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---@type { [string]: { [string]: string } }
DiesalStyle.Media = DiesalStyle.Media or {}
DiesalStyle.ReleasedTextures = DiesalStyle.ReleasedTextures or {}
DiesalStyle.TextureFrame = DiesalStyle.TextureFrame or CreateFrame("Frame")
DiesalStyle.TextureFrame:Hide()
DiesalStyle.Colors = DiesalStyle.Colors or {}
DiesalStyle.Formatters = DiesalStyle.Formatters or {}
-- ~~| DiesalStyle UpValues |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local AddonName = ...
---@type table<Diesal.Style.Texture, boolean>
local ReleasedTextures = DiesalStyle.ReleasedTextures
local TextureFrame = DiesalStyle.TextureFrame
local Media = DiesalStyle.Media
local Colors = DiesalStyle.Colors
local Formatters = DiesalStyle.Formatters
-- ~~| Locals |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local OUTLINES = { "_LEFT", "_RIGHT", "_TOP", "_BOTTOM" }
---@diagnostic disable-next-line: undefined-global
local MEDIA_PATH = MEDIA_PATH
or type(AddonName) == "table" and string.format("Interface\\AddOns\\Media\\")
or AddonName == "DiesalLibs" and string.format("Interface\\AddOns\\%s\\%s\\Media\\", AddonName, MAJOR)
or string.format("Interface\\AddOns\\%s\\Libs\\%s\\Media\\", AddonName, MAJOR)
local DEFAULT_COLOR = "FFFFFF"
local DEFAULT_GRADIENT_ORIENTATION = "horizontal"
local DEFAULT_LAYER = "ARTWORK"
-- ~~| Local Methods |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local function addMedia(mediaType, name, mediaFile)
Media[mediaType] = Media[mediaType] or {}
-- update or create new media entry
Media[mediaType][name] = MEDIA_PATH .. mediaFile
end
local function getMedia(mediaType, name)
if not Media[mediaType] then
error("media type: " .. mediaType .. " does not exist", 2)
return
end
if not Media[mediaType][name] then
error('media: "' .. name .. '" does not exist', 2)
return
end
return Media[mediaType][name]
end
local function newTexture()
local nt = next(ReleasedTextures)
if not nt then
nt = TextureFrame:CreateTexture() --[[@as Diesal.Style.Texture]]
else
nt:Show()
ReleasedTextures[nt] = nil
end
return nt
end
local function releaseTexture(texture)
-- reset texture
texture:ClearAllPoints()
texture:SetDrawLayer("ARTWORK", 0)
-- texture:SetTexCoord(0,1,0,1)
-- specific order based on testing! for a close as possible full texture reset
-- texture:SetGradientAlpha('HORIZONTAL',1,1,1,1,1,1,1,1)
-- texture:SetColorTexture(0,0,0,0)
-- texture:SetTexture()
-- texture:SetVertexColor(1,1,1,1)
texture:SetParent(TextureFrame)
texture:Hide()
texture.style = nil
if ReleasedTextures[texture] then
error("Attempt to Release a texture that is already released", 2)
end
ReleasedTextures[texture] = true
end
local function GetBlizzColorValues(value)
if not value then
return
end
if type(value) == "table" and #value >= 3 then
return value[1] / 255, value[2] / 255, value[3] / 255
elseif type(value) == "string" then
return tonumber(sub(value, 1, 2), 16) / 255, tonumber(sub(value, 3, 4), 16) / 255,
tonumber(sub(value, 5, 6), 16) / 255
end
end
local function formatCoords(coords)
if type(coords) ~= "table" then
return
end
if #coords == 5 then
return { GetIconCoords(coords[1], coords[2], coords[3], coords[4], coords[5]) }
else
return coords
end
end
local function formatFile(file)
if type(file) ~= "string" and type(file) ~= "number" then
return
end
return Media.texture[file] or file
end
local function formatPosition(position)
if type(position) ~= "table" and type(position) ~= "number" then
return
end
return type(position) == "number" and { position, position, position, position } or position
end
---@param orientation string
local function formatOrientation(orientation)
if type(orientation) ~= "string" then
return
end
return orientation:upper()
end
local function formatAlpha(alpha)
if type(alpha) ~= "table" and type(alpha) ~= "number" then
return
end
return type(alpha) == "number" and { alpha, alpha } or alpha
end
local function CreateColorDiesal(r, g, b, a)
return {
r = r or 0,
g = g or 0,
b = b or 0,
a = a or 1,
}
end
-- error handling
local function setColor(texture, r, g, b, a)
local status, err = pcall(texture.SetColorTexture, texture, r, g, b, a)
if not status then
errorhandler(
'error in "' .. (texture.style.name or "texture") .. '" ' .. texture.style.mode .. " or alpha setting", r, g,
b,
a)
end
end
local function setGradient(texture, orientation, r1, g1, b1, a1, r2, g2, b2, a2)
local status, err = pcall(texture.SetGradient, texture, orientation, CreateColorDiesal(r1, g1, b1, a1),
CreateColorDiesal(r2, g2, b2, a2))
if not status then
errorhandler('error in "' ..
(texture.style.name or "texture") .. '" ' .. texture.style.mode .. " or alpha setting.")
end
end
-- ~~| Media |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
do -- | Set Colors |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
do -- google material colors
Colors.red_50 = "fde0dc"
Colors.red_100 = "f9bdbb"
Colors.red_200 = "f69988"
Colors.red_300 = "f36c60"
Colors.red_400 = "e84e40"
Colors.red_500 = "e51c23"
Colors.red_600 = "dd191d"
Colors.red_700 = "d01716"
Colors.red_800 = "c41411"
Colors.red_900 = "b0120a"
Colors.red_A100 = "FF8A80"
Colors.red_A200 = "FF5252"
Colors.red_A400 = "FF1744"
Colors.red_A700 = "D50000"
Colors.pink_50 = "fce4ec"
Colors.pink_100 = "f8bbd0"
Colors.pink_200 = "f48fb1"
Colors.pink_300 = "f06292"
Colors.pink_400 = "ec407a"
Colors.pink_500 = "e91e63"
Colors.pink_600 = "d81b60"
Colors.pink_700 = "c2185b"
Colors.pink_800 = "ad1457"
Colors.pink_900 = "880e4f"
Colors.pink_A100 = "FF80AB"
Colors.pink_A200 = "FF4081"
Colors.pink_A400 = "F50057"
Colors.pink_A700 = "C51162"
Colors.purple_50 = "f3e5f5"
Colors.purple_100 = "e1bee7"
Colors.purple_200 = "ce93d8"
Colors.purple_300 = "ba68c8"
Colors.purple_400 = "ab47bc"
Colors.purple_500 = "9c27b0"
Colors.purple_600 = "8e24aa"
Colors.purple_700 = "7b1fa2"
Colors.purple_800 = "6a1b9a"
Colors.purple_900 = "4a148c"
Colors.purple_A100 = "EA80FC"
Colors.purple_A200 = "E040FB"
Colors.purple_A400 = "D500F9"
Colors.purple_A700 = "AA00FF"
Colors.dark_purple_50 = "ede7f6"
Colors.dark_purple_100 = "d1c4e9"
Colors.dark_purple_200 = "b39ddb"
Colors.dark_purple_300 = "9575cd"
Colors.dark_purple_400 = "7e57c2"
Colors.dark_purple_500 = "673ab7"
Colors.dark_purple_600 = "5e35b1"
Colors.dark_purple_700 = "512da8"
Colors.dark_purple_800 = "4527a0"
Colors.dark_purple_900 = "311b92"
Colors.dark_purple_A100 = "B388FF"
Colors.dark_purple_A200 = "7C4DFF"
Colors.dark_purple_A400 = "651FFF"
Colors.dark_purple_A700 = "6200EA"
Colors.indigo_50 = "e8eaf6"
Colors.indigo_100 = "c5cae9"
Colors.indigo_200 = "9fa8da"
Colors.indigo_300 = "7986cb"
Colors.indigo_400 = "5c6bc0"
Colors.indigo_500 = "3f51b5"
Colors.indigo_600 = "3949ab"
Colors.indigo_700 = "303f9f"
Colors.indigo_800 = "283593"
Colors.indigo_900 = "1a237e"
Colors.indigo_A100 = "8C9EFF"
Colors.indigo_A200 = "536DFE"
Colors.indigo_A400 = "3D5AFE"
Colors.indigo_A700 = "304FFE"
Colors.blue_50 = "e7e9fd"
Colors.blue_100 = "d0d9ff"
Colors.blue_200 = "afbfff"
Colors.blue_300 = "91a7ff"
Colors.blue_400 = "738ffe"
Colors.blue_500 = "5677fc"
Colors.blue_600 = "4e6cef"
Colors.blue_700 = "455ede"
Colors.blue_800 = "3b50ce"
Colors.blue_900 = "2a36b1"
Colors.blue_A100 = "82B1FF"
Colors.blue_A200 = "448AFF"
Colors.blue_A400 = "2979FF"
Colors.blue_A700 = "2962FF"
Colors.light_blue_50 = "e1f5fe"
Colors.light_blue_100 = "b3e5fc"
Colors.light_blue_200 = "81d4fa"
Colors.light_blue_300 = "4fc3f7"
Colors.light_blue_400 = "29b6f6"
Colors.light_blue_500 = "03a9f4"
Colors.light_blue_600 = "039be5"
Colors.light_blue_700 = "0288d1"
Colors.light_blue_800 = "0277bd"
Colors.light_blue_900 = "01579b"
Colors.light_blue_A100 = "80D8FF"
Colors.light_blue_A200 = "40C4FF"
Colors.light_blue_A400 = "00B0FF"
Colors.light_blue_A700 = "0091EA"
Colors.cyan_50 = "e0f7fa"
Colors.cyan_100 = "b2ebf2"
Colors.cyan_200 = "80deea"
Colors.cyan_300 = "4dd0e1"
Colors.cyan_400 = "26c6da"
Colors.cyan_500 = "00bcd4"
Colors.cyan_600 = "00acc1"
Colors.cyan_700 = "0097a7"
Colors.cyan_800 = "00838f"
Colors.cyan_900 = "006064"
Colors.cyan_A100 = "84FFFF"
Colors.cyan_A200 = "18FFFF"
Colors.cyan_A400 = "00E5FF"
Colors.cyan_A700 = "00B8D4"
Colors.teal_50 = "e0f2f1"
Colors.teal_100 = "b2dfdb"
Colors.teal_200 = "80cbc4"
Colors.teal_300 = "4db6ac"
Colors.teal_400 = "26a69a"
Colors.teal_500 = "009688"
Colors.teal_600 = "00897b"
Colors.teal_700 = "00796b"
Colors.teal_800 = "00695c"
Colors.teal_900 = "004d40"
Colors.teal_A100 = "A7FFEB"
Colors.teal_A200 = "64FFDA"
Colors.teal_A400 = "1DE9B6"
Colors.teal_A700 = "00BFA5"
Colors.green_50 = "d0f8ce"
Colors.green_100 = "a3e9a4"
Colors.green_200 = "72d572"
Colors.green_300 = "42bd41"
Colors.green_400 = "2baf2b"
Colors.green_500 = "4CAF50"
Colors.green_600 = "0a8f08"
Colors.green_700 = "0a7e07"
Colors.green_800 = "056f00"
Colors.green_900 = "0d5302"
Colors.green_A100 = "B9F6CA"
Colors.green_A200 = "69F0AE"
Colors.green_A400 = "00E676"
Colors.green_A700 = "00C853"
Colors.light_green_50 = "f1f8e9"
Colors.light_green_100 = "dcedc8"
Colors.light_green_200 = "c5e1a5"
Colors.light_green_300 = "aed581"
Colors.light_green_400 = "9ccc65"
Colors.light_green_500 = "8bc34a"
Colors.light_green_600 = "7cb342"
Colors.light_green_700 = "689f38"
Colors.light_green_800 = "558b2f"
Colors.light_green_900 = "33691e"
Colors.light_green_A100 = "CCFF90"
Colors.light_green_A200 = "B2FF59"
Colors.light_green_A400 = "76FF03"
Colors.light_green_A700 = "64DD17"
Colors.lime_50 = "f9fbe7"
Colors.lime_100 = "f0f4c3"
Colors.lime_200 = "e6ee9c"
Colors.lime_300 = "dce775"
Colors.lime_400 = "d4e157"
Colors.lime_500 = "cddc39"
Colors.lime_600 = "c0ca33"
Colors.lime_700 = "afb42b"
Colors.lime_800 = "9e9d24"
Colors.lime_900 = "827717"
Colors.lime_A100 = "F4FF81"
Colors.lime_A200 = "EEFF41"
Colors.lime_A400 = "C6FF00"
Colors.lime_A700 = "AEEA00"
Colors.yellow_50 = "fffde7"
Colors.yellow_100 = "fff9c4"
Colors.yellow_200 = "fff59d"
Colors.yellow_300 = "fff176"
Colors.yellow_400 = "ffee58"
Colors.yellow_500 = "ffeb3b"
Colors.yellow_600 = "fdd835"
Colors.yellow_700 = "fbc02d"
Colors.yellow_800 = "f9a825"
Colors.yellow_900 = "f57f17"
Colors.yellow_A100 = "FFFF8D"
Colors.yellow_A200 = "FFFF00"
Colors.yellow_A400 = "FFEA00"
Colors.yellow_A700 = "FFD600"
Colors.amber_50 = "fff8e1"
Colors.amber_100 = "ffecb3"
Colors.amber_200 = "ffe082"
Colors.amber_300 = "ffd54f"
Colors.amber_400 = "ffca28"
Colors.amber_500 = "ffc107"
Colors.amber_600 = "ffb300"
Colors.amber_700 = "ffa000"
Colors.amber_800 = "ff8f00"
Colors.amber_900 = "ff6f00"
Colors.amber_A100 = "FFE57F"
Colors.amber_A200 = "FFD740"
Colors.amber_A400 = "FFC400"
Colors.amber_A700 = "FFAB00"
Colors.orange_50 = "fff3e0"
Colors.orange_100 = "ffe0b2"
Colors.orange_200 = "ffcc80"
Colors.orange_300 = "ffb74d"
Colors.orange_400 = "ffa726"
Colors.orange_500 = "ff9800"
Colors.orange_600 = "fb8c00"
Colors.orange_700 = "f57c00"
Colors.orange_800 = "ef6c00"
Colors.orange_900 = "e65100"
Colors.orange_A100 = "FFD180"
Colors.orange_A200 = "FFAB40"
Colors.orange_A400 = "FF9100"
Colors.orange_A700 = "FF6D00"
Colors.deep_orange_50 = "fbe9e7"
Colors.deep_orange_100 = "ffccbc"
Colors.deep_orange_200 = "ffab91"
Colors.deep_orange_300 = "ff8a65"
Colors.deep_orange_400 = "ff7043"
Colors.deep_orange_500 = "ff5722"
Colors.deep_orange_600 = "f4511e"
Colors.deep_orange_700 = "e64a19"
Colors.deep_orange_800 = "d84315"
Colors.deep_orange_900 = "bf360c"
Colors.deep_orange_A100 = "FF9E80"
Colors.deep_orange_A200 = "FF6E40"
Colors.deep_orange_A400 = "FF3D00"
Colors.deep_orange_A700 = "DD2C00"
Colors.brown_50 = "efebe9"
Colors.brown_100 = "d7ccc8"
Colors.brown_200 = "bcaaa4"
Colors.brown_300 = "a1887f"
Colors.brown_400 = "8d6e63"
Colors.brown_500 = "795548"
Colors.brown_600 = "6d4c41"
Colors.brown_700 = "5d4037"
Colors.brown_800 = "4e342e"
Colors.brown_900 = "3e2723"
Colors.gray_50 = "fafafa"
Colors.gray_100 = "f5f5f5"
Colors.gray_200 = "eee"
Colors.gray_300 = "e0e0e0"
Colors.gray_400 = "bdbdbd"
Colors.gray_500 = "9e9e9e"
Colors.gray_600 = "757575"
Colors.gray_700 = "616161"
Colors.gray_800 = "424242"
Colors.gray_900 = "212121"
Colors.blue_gray_50 = "eceff1"
Colors.blue_gray_100 = "cfd8dc"
Colors.blue_gray_200 = "b0bec5"
Colors.blue_gray_300 = "90a4ae"
Colors.blue_gray_400 = "78909c"
Colors.blue_gray_500 = "607d8b"
Colors.blue_gray_600 = "546e7a"
Colors.blue_gray_700 = "455a64"
Colors.blue_gray_800 = "37474f"
Colors.blue_gray_900 = "263238"
end
do -- Base UI Colors
Colors.UI_Hue = 210
Colors.UI_Saturation = 0.24
Colors.UI_TEXT = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.9)
-- level 1
Colors.UI_100 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.03) -- BG
Colors.UI_150 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.05)
-- level 2
Colors.UI_200 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.07)
-- level 3
Colors.UI_300 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.12)
Colors.UI_300_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.12), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.11) }
Colors.UI_350 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.15)
Colors.UI_350_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.17), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.14) }
-- level 4
Colors.UI_400 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.20)
Colors.UI_400_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.20), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.17) }
Colors.UI_450_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.24), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.20) }
-- level 5
Colors.UI_500 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.29)
Colors.UI_500_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.29), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.26) }
Colors.UI_600_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.35), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.32) }
-- font Colors -35
Colors.UI_F450 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.75)
Colors.UI_F350 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.60)
Colors.UI_1000 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 1)
Colors.UI_A900 = HSL(Colors.UI_Hue, 1, 0.7)
Colors.UI_A800 = HSL(Colors.UI_Hue, 1, 0.65)
Colors.UI_A700 = HSL(Colors.UI_Hue, 1, 0.6)
Colors.UI_A600 = HSL(Colors.UI_Hue, 1, 0.55)
Colors.UI_A500 = HSL(Colors.UI_Hue, 1, 0.5)
Colors.UI_A400 = HSL(Colors.UI_Hue, 1, 0.45)
Colors.UI_A300 = HSL(Colors.UI_Hue, 1, 0.4)
Colors.UI_A200 = HSL(Colors.UI_Hue, 1, 0.35)
Colors.UI_A100 = HSL(Colors.UI_Hue, 1, 0.3)
end
-- Class Colors
do
Colors.WARRIOR = "c79c6e"
Colors.PALADIN = "f58cba"
Colors.HUNTER = "abd473"
Colors.ROGUE = "fff569"
Colors.PRIEST = "ffffff"
Colors.DEATHKNIGHT = "c41f3b"
Colors.SHAMAN = "0070de"
Colors.MAGE = "69ccf0"
Colors.WARLOCK = "9482c9"
Colors.MONK = "00ff96"
Colors.DRUID = "ff7d0a"
Colors.DEMONHUNTER = "a330c9"
Colors.EVOKER = "33937f"
end
end
do -- | Text Formatters |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Formatters.tooltip = "|cff" .. Colors.gray_50 .. "%s\n|cff" .. Colors.yellow_500 .. "%s"
end
DiesalFontNormal = CreateFont("DiesalFontNormal")
DiesalFontNormal:SetFont("Fonts\\OpenSans-Regular.ttf", 11, "")
DiesalFontAwesomeRegular = CreateFont("DiesalFontAwesomeRegular")
DiesalFontAwesomeRegular:SetFont("Fonts\\FontAwesomeProRegular.otf", 11, "")
DiesalFontNormalOutline = CreateFont("DiesalFontNormalOutline")
DiesalFontNormalOutline:SetFont("Fonts\\OpenSans-Regular.ttf", 11, "OUTLINE")
for _, fontName in pairs(GetFonts()) do
if fontName == "FontAwesome_L" and FontAwesome_L then
local file, height, flags = (FontAwesome_L --[[@as Font]]):GetFont()
if file then
DiesalFontAwesomeRegular:SetFont(file, 11, flags or "")
end
end
end
local bytemarkers = { { 0x7FF, 192 }, { 0xFFFF, 224 }, { 0x1FFFFF, 240 } }
---@param decimal number
function DiesalStyle:UTF8(decimal)
if decimal < 128 then
return string.char(decimal)
end
local charbytes = {}
for bytes, vals in ipairs(bytemarkers) do
if decimal <= vals[1] then
for b = bytes + 1, 2, -1 do
local mod = decimal % 64
decimal = (decimal - mod) / 64
charbytes[b] = string.char(128 + mod)
end
charbytes[1] = string.char(vals[2] + decimal)
break
end
end
return table.concat(charbytes)
end
-- ~~| DiesalStyle API |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--[[
Texture style table format
style.layer BACKGROUND | BORDER | ARTWORK | OVERLAY | HIGHLIGHT (texture in this layer is automatically shown when the mouse is over the containing Frame)
**FontStrings always appear on top of all textures in a given draw layer. avoid using sublayer
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
style.alpha alpha [0 - 1]
style.alphaEnd alpha [0 - 1]
style.color hexColor | {Red, Green, Blue} [0-255]
style.colorEnd hexColor | {Red, Green, Blue} [0-255]
style.gradient VERTICAL | HORIZONTAL
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
style.texFile texture fileName
style.texTile true | false
style.texCoord {left, right, top, bottom} [0-1] | {column,row,size,textureWidth,TextureHeight}
style.texColor hexColor | {Red,Green,Blue} [0-255]
style.texColorAlpha alpha [0 - 1]
-- ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
style.offset offset | {Left, Right, Top, Bottom}
style.width width
style.height height
]]
-- type = 'fill',
-- layer = 'BACKGROUND',
--
-- gradient = {'VERTICAL','744d00','996600'}
-- gradient_orientation = 'VERTICAL'|'HORIZONTAL ',
-- gradient_color = {colorStart,colorEnd},
--
-- image = {'texture-file', {left,right,top,bottom}, color, tiling_h, tiling_v}
-- image_file = 'texture-file'
-- image_coords = {left,right,top,bottom} | {row, coloumn, size, image width, image height }
-- image_color = "FFFFFF"
-- image_tiling = {'HORIZNONTAL','VERTICAL'}
--
-- color = 'FFFFFF',
-- alpha = 1 | {1,1}
--
-- position = 0 | {0,0,0,0}
---@alias r number
---@alias g number
---@alias b number
---@class Diesal.Style.RGB : { [1]: r, [2]: g, [3]: b }
---@alias left number
---@alias right number
---@alias top number
---@alias bottom number
---@alias column number
---@alias row number
---@alias textureWidth number
---@alias textureHeight number
---@alias hexString string
---@alias Diesal.Style.Color hexString | Diesal.Style.RGB
---@class Diesal.Style.TexCoord : { [1]: left, [2]: right, [3]: top, [4]: bottom }
---@class Diesal.Style.TexCoord2 : { [1]: column, [2]: row, [3]: size, [4]: textureWidth, [5]: textureHeight }
--[[
Missing required fields in type `Diesal.Style.Style`:
`layer`, `alpha`, `alphaEnd`, `color`, `colorEnd`, `gradient`, `gradient_alpha`, `gradient_orientation`, `gradient_color`, `name`, `debug`, `texFile`, `texTile`, `texCoord`, `texColor`, `texColorAlpha`, `type`, `offset`
]]
---@class Diesal.Style.Style
---@field layer? 'BACKGROUND' | 'BORDER' | 'ARTWORK' | 'OVERLAY' | 'HIGHLIGHT'
---@field alpha? number
---@field alphaEnd? number
---@field color? Diesal.Style.Color
---@field colorEnd? Diesal.Style.Color
---@field gradient? { [1]: 'VERTICAL' | 'HORIZONTAL', [2]: string, [3]: string }
---@field gradient_alpha? number
---@field gradient_orientation? 'VERTICAL' | 'HORIZONTAL'
---@field gradient_color? {[1]: Diesal.Style.Color, [2]: Diesal.Style.Color }
---@field image? { [1]: string, [2]: Diesal.Style.TexCoord, [3]: Diesal.Style.Color, [4]: WrapMode, [5]: WrapMode }
---@field image_file? string
---@field image_coords? Diesal.Style.TexCoord | Diesal.Style.TexCoord2
---@field image_color? hexString
---@field image_tiling? { [1]: WrapMode, [2]: WrapMode }
---@field name? string
---@field debug? boolean
---@field texCoord? Diesal.Style.TexCoord | Diesal.Style.TexCoord2
---@field texColor? Diesal.Style.Color
---@field texColorAlpha? number
---@field type "texture" | "outline" | "shadow" | "font"
---@field offset? number | { [1]: left, [2]: right, [3]: top, [4]: bottom }
---@field width? number
---@field height? number
---@field position? Diesal.Style.TexCoord
---@field clear? boolean
---@class Diesal.Style.Texture.Style : Diesal.Style.Style
---@field alpha { [1]: number, [2]: number }
---@field image { file: number|string, coords: Diesal.Style.TexCoord, color: Diesal.Style.Color, tiling: { [1]: WrapMode, [2]: WrapMode } }
---@field gradient { orientation: 'VERTICAL' | 'HORIZONTAL', color: { [1]: Diesal.Style.Color, [2]: Diesal.Style.Color } }
---@field mode string
---@class Diesal.Style.Texture : Texture
---@field style Diesal.Style.Texture.Style?
---@class Diesal.Style.Stylesheet : {[string]: Diesal.Style.Style | Diesal.Style.Texture.Style}
---@param texture Texture
---@param style Diesal.Style.Style
function DiesalStyle:StyleTexture(texture, style)
-- | Setup Texture.style |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if not texture.style or style.clear then
---@diagnostic disable-next-line: missing-fields, inject-field
texture.style = {}
end
-- debugging
texture.style.name = style.name or texture.style.name
texture.style.debug = style.debug or texture.style.debug
-- | Format Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Gradient ~~~~~~~~~~~~~~~~~~~~~~~~~
if style.gradient and type(style.gradient) == "table" then
local orientation = formatOrientation(style.gradient[1])
if orientation then
texture.style.gradient = {
orientation = orientation,
color = style.gradient[2] and style.gradient[3] and { style.gradient[2], style.gradient[3] },
}
end
end
local orientation = formatOrientation(style.gradient_orientation)
if orientation then
style.gradient_orientation = orientation -- fuck you
end
if not texture.style.gradient and (style.gradient_orientation or style.gradient_alpha or style.gradient_color) then
texture.style.gradient = {}
end
-- Image ~~~~~~~~~~~~~~~~~~~~~~~~~
if style.image and type(style.image) == "table" then
local file = formatFile(style.image[1])
local coords = formatCoords(style.image[2])
if file and coords then
texture.style.image = {
file = file,
coords = coords,
color = style.image[3],
tiling = { style.image[4], style.image[5] },
}
end
end
if not texture.style.image and style.image_file then
texture.style.image = {}
end
-- | Update Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
texture.style.layer = style.layer or texture.style.layer or DEFAULT_LAYER
texture.style.position = formatPosition(style.position) or texture.style.position or { 0, 0, 0, 0 }
texture.style.width = style.width or texture.style.width
texture.style.height = style.height or texture.style.height
texture.style.color = style.color or texture.style.color
texture.style.alpha = formatAlpha(style.alpha) or texture.style.alpha or { 1, 1 }
-- gradient
if texture.style.gradient then
texture.style.gradient.orientation = style.gradient_orientation or texture.style.gradient.orientation or
DEFAULT_GRADIENT_ORIENTATION
texture.style.gradient.color = style.gradient_color or texture.style.gradient.color or
{ DEFAULT_COLOR, DEFAULT_COLOR }
end
-- image
if texture.style.image then
texture.style.image.file = formatFile(style.image_file) or texture.style.image.file
texture.style.image.coords = formatCoords(style.image_coords) or texture.style.image.coords or { 0, 1, 0, 1 }
texture.style.image.color = style.image_color or texture.style.image.color
texture.style.image.tiling = style.image_tiling or texture.style.image.tiling
end
-- | Apply Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- layer
texture:SetDrawLayer(texture.style.layer, 0)
-- position
texture:ClearAllPoints() -- clear offsets
if texture.style.position[1] then
texture:SetPoint("LEFT", -texture.style.position[1], 0)
end
if texture.style.position[2] then
texture:SetPoint("RIGHT", texture.style.position[2], 0)
end
if texture.style.position[3] then
texture:SetPoint("TOP", 0, texture.style.position[3])
end
if texture.style.position[4] then
texture:SetPoint("BOTTOM", 0, -texture.style.position[4])
end
-- size
if texture.style.width then
texture:SetWidth(texture.style.width)
end
if texture.style.height then
texture:SetHeight(texture.style.height)
end
if style.debug then
print(texture:GetHeight(), texture.style.position[1], texture.style.position[2], texture.style.position[3],
texture.style.position[4])
end
-- [1] Texture > [2] gradient > [3] color
if texture.style.image then -- [1] Texture
-- set mode
texture.style.mode = "image"
-- clear any old settings
setGradient(texture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1) -- clear gradient
texture:SetColorTexture(1, 1, 1, 1) -- clear color
-- apply settings
texture:SetTexCoord(texture.style.image.coords[1], texture.style.image.coords[2], texture.style.image.coords[3],
texture.style.image.coords[4])
texture:SetTexture(texture.style.image.file, texture.style.image.tiling and texture.style.image.tiling[1],
texture.style.image.tiling and texture.style.image.tiling[2])
texture:SetHorizTile(texture.style.image.tiling[1] and true)
texture:SetVertTile(texture.style.image.tiling[2] and true)
local r, g, b = GetBlizzColorValues(texture.style.image.color)
texture:SetVertexColor(r or 1, g or 1, b or 1, texture.style.alpha[1])
elseif texture.style.gradient then -- [2] gradient
-- set mode
texture.style.mode = "gradient"
-- clear any old settings
texture:SetTexture() -- clear image
texture:SetColorTexture(1, 1, 1, 1) -- clear color
-- apply settings
local r1, g1, b1 = GetBlizzColorValues(texture.style.gradient.color
[texture.style.gradient.orientation == "HORIZONTAL" and 1 or 2])
local r2, g2, b2 = GetBlizzColorValues(texture.style.gradient.color
[texture.style.gradient.orientation == "HORIZONTAL" and 2 or 1])
local a1, a2 = texture.style.alpha[texture.style.gradient.orientation == "HORIZONTAL" and 1 or 2],
texture.style.alpha[texture.style.gradient.orientation == "HORIZONTAL" and 2 or 1]
setGradient(texture, texture.style.gradient.orientation, r1, g1, b1, a1, r2, g2, b2, a2)
elseif texture.style.color then -- [3] color
-- set mode
texture.style.mode = "color"
-- clear any old settings
texture:SetTexture() -- clear image
setGradient(texture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1) -- clear gradient
-- apply settings
local r, g, b = GetBlizzColorValues(texture.style.color)
setColor(texture, r, g, b, texture.style.alpha[1])
else
-- set mode
texture.style.mode = "none!"
-- clear the texture
texture:SetTexture() -- clear image
setGradient(texture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
texture:SetColorTexture(0, 0, 0, 0) -- clear color
end
end
---@param leftTexture Diesal.Style.Texture
---@param rightTexture Diesal.Style.Texture
---@param topTexture Diesal.Style.Texture
---@param bottomTexture Diesal.Style.Texture
---@param style Diesal.Style.Style
function DiesalStyle:StyleOutline(leftTexture, rightTexture, topTexture, bottomTexture, style)
-- | Setup Texture.style |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if not leftTexture.style or style.clear then
---@diagnostic disable-next-line: missing-fields
leftTexture.style = {}
rightTexture.style = leftTexture.style
topTexture.style = leftTexture.style
bottomTexture.style = leftTexture.style
end
local texture = leftTexture
-- debugging
texture.style.name = style.name or texture.style.name
texture.style.debug = style.debug or texture.style.debug
-- | Format Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if style.gradient and type(style.gradient) == "table" then
texture.style.gradient = {
orientation = style.gradient[1]:upper(),
color = style.gradient[2] and style.gradient[3] and { style.gradient[2], style.gradient[3] },
}
end
style.gradient_orientation = style.gradient_orientation and
style.gradient_orientation:upper() --formatOrientation(style.gradient_orientation) -- fuck you
if not texture.style.gradient and (style.gradient_orientation or style.gradient_alpha or style.gradient_color) then
texture.style.gradient = {}
end
-- | Update Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
texture.style.layer = style.layer or texture.style.layer or DEFAULT_LAYER
texture.style.position = formatPosition(style.position) or texture.style.position or { 0, 0, 0, 0 }
texture.style.width = style.width or texture.style.width
texture.style.height = style.height or texture.style.height
texture.style.color = style.color or texture.style.color
texture.style.alpha = formatAlpha(style.alpha) or texture.style.alpha or { 1, 1 }
-- gradient
if texture.style.gradient then
texture.style.gradient.orientation = style.gradient_orientation or texture.style.gradient.orientation or
DEFAULT_GRADIENT_ORIENTATION
texture.style.gradient.color = style.gradient_color or texture.style.gradient.color or
{ DEFAULT_COLOR, DEFAULT_COLOR }
end
-- | Apply Settings |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- layer
leftTexture:SetDrawLayer(texture.style.layer, 0)
rightTexture:SetDrawLayer(texture.style.layer, 0)
topTexture:SetDrawLayer(texture.style.layer, 0)
bottomTexture:SetDrawLayer(texture.style.layer, 0)
-- position
leftTexture:ClearAllPoints()
rightTexture:ClearAllPoints()
topTexture:ClearAllPoints()
bottomTexture:ClearAllPoints()
if texture.style.position[1] then
leftTexture:SetPoint("LEFT", -texture.style.position[1], 0)
else
leftTexture:SetPoint("RIGHT", -texture.style.width, 0)
end
if texture.style.position[3] then
leftTexture:SetPoint("TOP", 0, texture.style.position[3])
end
if texture.style.position[4] then
leftTexture:SetPoint("BOTTOM", 0, -texture.style.position[4])
end
if texture.style.position[2] then
rightTexture:SetPoint("RIGHT", texture.style.position[2], 0)
else
rightTexture:SetPoint("LEFT", texture.style.width - (texture.style.position[1] + 1), 0)
end
if texture.style.position[3] then
rightTexture:SetPoint("TOP", 0, texture.style.position[3])
end
if texture.style.position[4] then
rightTexture:SetPoint("BOTTOM", 0, -texture.style.position[4])
end
if texture.style.position[1] then
topTexture:SetPoint("LEFT", -texture.style.position[1] + 1, 0)
end
if texture.style.position[2] then
topTexture:SetPoint("RIGHT", texture.style.position[2] - 1, 0)
end
if texture.style.position[3] then
topTexture:SetPoint("TOP", 0, texture.style.position[3])
else
topTexture:SetPoint("BOTTOM", 0, texture.style.height - 1)
end
if texture.style.position[1] then
bottomTexture:SetPoint("LEFT", -texture.style.position[1] + 1, 0)
end
if texture.style.position[2] then
bottomTexture:SetPoint("RIGHT", texture.style.position[2] - 1, 0)
end
if texture.style.position[4] then
bottomTexture:SetPoint("BOTTOM", 0, -texture.style.position[4])
else
bottomTexture:SetPoint("TOP", 0, -(texture.style.height + 1) + (texture.style.position[3] + 2))
end
-- size
leftTexture:SetWidth(1)
if texture.style.height then
leftTexture:SetHeight(texture.style.height)
end
rightTexture:SetWidth(1)
if texture.style.height then
rightTexture:SetHeight(texture.style.height)
end
topTexture:SetHeight(1)
if texture.style.width then
topTexture:SetWidth(texture.style.width - 2)
end
bottomTexture:SetHeight(1)
if texture.style.width then
bottomTexture:SetWidth(texture.style.width - 2)
end
-- texture
if texture.style.gradient then
-- set mode
texture.style.mode = "gradient"
-- clear any old settings
leftTexture:SetTexture() -- clear image
-- leftTexture:SetAlpha(1) -- reset alpha
rightTexture:SetTexture() -- clear image
-- rightTexture:SetAlpha(1) -- reset alpha
topTexture:SetTexture() -- clear image
-- topTexture:SetAlpha(1) -- reset alpha
bottomTexture:SetTexture() -- clear image
-- bottomTexture:SetAlpha(1) -- reset alpha
local r1, g1, b1, r2, g2, b2, a1, a2
if texture.style.gradient.orientation == "HORIZONTAL" then
-- clear settings
setGradient(leftTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
setGradient(rightTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
topTexture:SetColorTexture(1, 1, 1, 1) -- clear color
bottomTexture:SetColorTexture(1, 1, 1, 1) -- clear color
-- aply settings
r1, g1, b1 = GetBlizzColorValues(texture.style.gradient.color[1])
r2, g2, b2 = GetBlizzColorValues(texture.style.gradient.color[2])
a1, a2 = texture.style.alpha[1], texture.style.alpha[2]
setColor(leftTexture, r1, g1, b1, a1)
setColor(rightTexture, r2, g2, b2, a2)
setGradient(topTexture, "HORIZONTAL", r1, g1, b1, a1, r2, g2, b2, a2)
setGradient(bottomTexture, "HORIZONTAL", r1, g1, b1, a1, r2, g2, b2, a2)
elseif texture.style.gradient.orientation == "VERTICAL" then
-- clear settings
leftTexture:SetColorTexture(1, 1, 1, 1) -- clear color
rightTexture:SetColorTexture(1, 1, 1, 1) -- clear color
setGradient(topTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
setGradient(bottomTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
-- aply settings
r1, g1, b1 = GetBlizzColorValues(texture.style.gradient.color[2])
r2, g2, b2 = GetBlizzColorValues(texture.style.gradient.color[1])
a1, a2 = texture.style.alpha[2], texture.style.alpha[1]
setColor(topTexture, r2, g2, b2, a2)
setColor(bottomTexture, r1, g1, b1, a1)
setGradient(leftTexture, "VERTICAL", r1, g1, b1, a1, r2, g2, b2, a2)
setGradient(rightTexture, "VERTICAL", r1, g1, b1, a1, r2, g2, b2, a2)
else
texture.style.mode = "gradient: no orientation!"
-- should never be here
end
elseif texture.style.color then
-- set mode
texture.style.mode = "color"
-- clear any old settings
setGradient(leftTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
setGradient(rightTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
setGradient(topTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
setGradient(bottomTexture, "HORIZONTAL", 1, 1, 1, 1, 1, 1, 1, 1)
-- apply settings
local r, g, b = GetBlizzColorValues(texture.style.color)
setColor(leftTexture, r, g, b, texture.style.alpha[1])
setColor(rightTexture, r, g, b, texture.style.alpha[1])
setColor(topTexture, r, g, b, texture.style.alpha[1])
setColor(bottomTexture, r, g, b, texture.style.alpha[1])
else
-- set mode
texture.style.mode = "none!"
-- clear the texture
leftTexture:SetTexture() -- clear image
setGradient(leftTexture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
leftTexture:SetColorTexture(0, 0, 0, 0) -- clear color
rightTexture:SetTexture() -- clear image
setGradient(rightTexture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
rightTexture:SetColorTexture(0, 0, 0, 0) -- clear color
topTexture:SetTexture() -- clear image
setGradient(topTexture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
topTexture:SetColorTexture(0, 0, 0, 0) -- clear color
bottomTexture:SetTexture() -- clear image
setGradient(bottomTexture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
bottomTexture:SetColorTexture(0, 0, 0, 0) -- clear color
end
end
---@class Diesal.Style.ShadowStyle : Diesal.Style.Style
---@field edgeFile? string
---@field edgeSize? number
---@field red? number
---@field green? number
---@field blue? number
---@class Diesal.Style.Shadow : Frame, BackdropTemplate
---@field style Diesal.Style.ShadowStyle
---@class Diesal.Style.ShadowObject : Diesal.GUI.ObjectBase
---@field shadow Diesal.Style.Shadow
---@param object Diesal.Style.ShadowObject
---@param frame Frame
---@param style Diesal.Style.ShadowStyle
function DiesalStyle:StyleShadow(object, frame, style)
object.shadow = object.shadow or CreateFrame("Frame", nil, frame)
object.shadow:Show()
if not object.shadow.style or style.clear then
object.shadow.style = {}
end
local shadowStyle = object.shadow.style
-- ~~ Format New Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local red, green, blue = DiesalTools.GetColor(style.color)
local offset = style.offset and type(style.offset) == "number" and
{ style.offset, style.offset, style.offset, style.offset } or style.offset
-- Setting ~~~~~~~~~~~~~~~~~~~~~~~ New Setting ~~~~~~~~~~~~~~~ Old Setting ~~~~~~~~~~~~~~~~~ Default ~~~~~~~~~~~~~~~~~~
shadowStyle.edgeFile = style.edgeFile or shadowStyle.edgeFile or
[[Interface\Buttons\WHITE8X8]] -- getMedia("border", "shadow")
shadowStyle.edgeSize = style.edgeSize or shadowStyle.edgeSize or 5
shadowStyle.red = red or shadowStyle.red or 0
shadowStyle.green = green or shadowStyle.green or 0
shadowStyle.blue = blue or shadowStyle.blue or 0
shadowStyle.alpha = style.alpha or shadowStyle.alpha or 0.45
shadowStyle.offset = offset or shadowStyle.offset or { 0, 0, 0, 0 }
-- ~~ Apply Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if shadowStyle.offset[1] then
object.shadow:SetPoint("LEFT", -shadowStyle.offset[1], 0)
end
if shadowStyle.offset[2] then
object.shadow:SetPoint("RIGHT", shadowStyle.offset[2], 0)
end
if shadowStyle.offset[3] then
object.shadow:SetPoint("TOP", 0, shadowStyle.offset[3])
end
if shadowStyle.offset[4] then
object.shadow:SetPoint("BOTTOM", 0, -shadowStyle.offset[4])
end
--object.shadow:SetBackdrop({ bgFile = [[Interface\Buttons\WHITE8X8]], edgeFile = shadowStyle.edgeFile, edgeSize = shadowStyle.edgeSize })
--object.shadow:SetBackdropColor(shadowStyle.red, shadowStyle.green, shadowStyle.blue, 0)
--object.shadow:SetBackdropBorderColor(shadowStyle.red, shadowStyle.green, shadowStyle.blue, shadowStyle.alpha)
end
--[[ Font style table format
TODO style.offset ( offset|{ Left, Right, Top, Bottom })
TODO style.width ( width )
TODO style.height ( height )
style.font ( Path to a font file )
style.fontSize ( Size (point size) of the font to be displayed (in pixels) )
style.flags ( Additional properties specified by one or more of the following tokens: MONOCHROME, OUTLINE | THICKOUTLINE ) (comma delimitered string)
style.alpha ( alpha )
style.color ( hexColor|{ Red, Green, Blue } [0-255])
style.lineSpacing ( number - Sets the font instance's amount of spacing between lines)
]]
---@class Diesal.Style.FontStyle
---@field font string
---@field filename string
---@field fontSize number
---@field flags string
---@field alpha number
---@field color Diesal.Style.Color
---@field lineSpacing number
---@field red number
---@field green number
---@field blue number
---@class Diesal.Style.FontString : FontString
---@field style Diesal.Style.FontStyle
---@param fontInstance Diesal.Style.FontString
---@param name string
---@param style Diesal.Style.FontStyle
function DiesalStyle:StyleFont(fontInstance, name, style)
local filename, fontSize, flags = fontInstance:GetFont()
local red, green, blue, alpha = fontInstance:GetTextColor()
local lineSpacing = fontInstance:GetSpacing()
-- Fallback to DiesalFontNormal for Patch 8.1
if not filename then
filename, fontSize, flags = DiesalFontNormal:GetFont()
red, green, blue, alpha = DiesalFontNormal:GetTextColor()
lineSpacing = DiesalFontNormal:GetSpacing()
end
---@diagnostic disable-next-line: assign-type-mismatch
style.red, style.green, style.blue = DiesalTools.GetColor(style.color)
-- ~~ Set Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
style.filename = style.filename or filename
style.fontSize = style.fontSize or fontSize
style.flags = style.flags or flags
style.red = style.red or red
style.green = style.green or green
style.blue = style.blue or blue
style.alpha = style.alpha or alpha
style.lineSpacing = style.lineSpacing or lineSpacing
-- ~~ Apply Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fontInstance:SetFont(style.filename, style.fontSize, style.flags)
fontInstance:SetTextColor(style.red, style.green, style.blue, style.alpha)
fontInstance:SetSpacing(style.lineSpacing)
fontInstance.style = style
end
---@param object Diesal.GUI.ObjectBase
---@param name string
---@param style Diesal.Style.Style
function DiesalStyle:UpdateObjectStyle(object, name, style)
if not style or type(style) ~= "table" then
return
end
if type(name) ~= "string" then
return
end
-- ~~ Clear Texture ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if style.clear then
-- clear texture
if object.textures[name] then
DiesalStyle:ReleaseTexture(object, name)
end
-- clear OUTLINE
for i = 1, #OUTLINES do
if object.textures[name .. OUTLINES[i]] then
DiesalStyle:ReleaseTexture(object, name .. OUTLINES[i])
end
end
end
-- add texture name to style for better debugging
style.name = name
-- ~~ Get styleType ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if not style.type then
return
end
local styleType = DiesalTools.Capitalize(style.type)
if not DiesalStyle["Style" .. styleType] then
geterrorhandler()(style.type .. " is not a valid style type")
return
end
-- ~~ Get Frame ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
local framename = name:match("^[ \t]*([%w%d%_]*)")
local frame = object[framename]
if not frame then
return
end
-- ~~ Style ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if styleType == "Texture" then
local texture = object.textures[name]
if not texture then
texture = newTexture()
object.textures[name] = texture
end
texture:SetParent(frame)
DiesalStyle:StyleTexture(texture, style)
return
end
if styleType == "Outline" then
local textures = {}
for i = 1, #OUTLINES do
local texture = object.textures[name .. OUTLINES[i]]
if type(texture) == "nil" then
texture = newTexture()
object.textures[name .. OUTLINES[i]] = texture
end
texture:SetParent(frame)
textures[i] = texture
end
DiesalStyle:StyleOutline(textures[1], textures[2], textures[3], textures[4], style)
return
end
if styleType == "Shadow" then
---@cast object Diesal.Style.ShadowObject
DiesalStyle:StyleShadow(object, frame, style --[[ @as Diesal.Style.ShadowStyle ]])
return
end
if styleType == "Font" then
DiesalStyle:StyleFont(frame, name, style --[[ @as Diesal.Style.FontStyle ]])
end
end
---@param object Diesal.GUI.ObjectBase
---@param name string
---@param style Diesal.Style.Style
function DiesalStyle:SetObjectStyle(object, name, style)
if not style or type(style) ~= "table" then
return
end
if type(name) ~= "string" then
return
end
-- clear texture
if object.textures[name] then
DiesalStyle:ReleaseTexture(object, name)
end
-- clear OUTLINE
for i = 1, #OUTLINES do
if object.textures[name .. OUTLINES[i]] then
DiesalStyle:ReleaseTexture(object, name .. OUTLINES[i])
end
end
-- Set object style
DiesalStyle:UpdateObjectStyle(object, name, style)
end
---@param object Diesal.GUI.ObjectBase
---@param Stylesheet Diesal.Style.Stylesheet
function DiesalStyle:UpdateObjectStylesheet(object, Stylesheet)
if not Stylesheet or type(Stylesheet) ~= "table" then
return
end
if not object.textures then
object.textures = {}
end
for name, style in pairs(Stylesheet) do
self:UpdateObjectStyle(object, name, style)
end
end
---@param object Diesal.GUI.ObjectBase
---@param Stylesheet Diesal.Style.Stylesheet
function DiesalStyle:SetObjectStylesheet(object, Stylesheet)
if not object.textures then
object.textures = {}
end
DiesalStyle:ReleaseTextures(object)
for name, style in pairs(Stylesheet) do
self:UpdateObjectStyle(object, name, style)
end
end
---@param object Diesal.GUI.ObjectBase
---@param name string
function DiesalStyle:ReleaseTexture(object, name)
if not object or not object.textures or not object.textures[name] then
error("No such texture on ojbect", 2)
return
end
releaseTexture(object.textures[name])
object.textures[name] = nil
end
---@param object Diesal.GUI.ObjectBase
function DiesalStyle:ReleaseTextures(object)
for name, texture in pairs(object.textures) do
releaseTexture(texture)
object.textures[name] = nil
end
end
---@param mediaType string
---@param name string
---@param mediaFile string
function DiesalStyle:AddMedia(mediaType, name, mediaFile)
addMedia(mediaType, name, mediaFile)
end