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

1288 lines
50 KiB

1 year ago
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 = ...
11 months ago
---@type table<Diesal.Style.Texture, boolean>
1 year ago
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" }
11 months ago
---@diagnostic disable-next-line: undefined-global
1 year ago
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()
11 months ago
local nt = next(ReleasedTextures)
if not nt then
nt = TextureFrame:CreateTexture() --[[@as Diesal.Style.Texture]]
1 year ago
else
11 months ago
nt:Show()
ReleasedTextures[nt] = nil
1 year ago
end
11 months ago
return nt
1 year ago
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
5 months ago
return tonumber(sub(value, 1, 2), 16) / 255, tonumber(sub(value, 3, 4), 16) / 255,
tonumber(sub(value, 5, 6), 16) / 255
1 year ago
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
8 months ago
local function CreateColorDiesal(r, g, b, a)
1 year ago
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
5 months ago
errorhandler(
'error in "' .. (texture.style.name or "texture") .. '" ' .. texture.style.mode .. " or alpha setting", r, g,
b,
a)
1 year ago
end
end
local function setGradient(texture, orientation, r1, g1, b1, a1, r2, g2, b2, a2)
5 months ago
local status, err = pcall(texture.SetGradient, texture, orientation, CreateColorDiesal(r1, g1, b1, a1),
CreateColorDiesal(r2, g2, b2, a2))
1 year ago
if not status then
5 months ago
errorhandler('error in "' ..
(texture.style.name or "texture") .. '" ' .. texture.style.mode .. " or alpha setting.")
1 year ago
end
end
-- ~~| Media |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 months ago
do -- | Set Colors |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 year ago
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)
5 months ago
Colors.UI_300_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.12), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.11) }
1 year ago
Colors.UI_350 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.15)
5 months ago
Colors.UI_350_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.17), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.14) }
1 year ago
-- level 4
Colors.UI_400 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.20)
5 months ago
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) }
1 year ago
-- level 5
Colors.UI_500 = HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.29)
5 months ago
Colors.UI_500_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.29), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.26) }
1 year ago
5 months ago
Colors.UI_600_GR = { HSL(Colors.UI_Hue, Colors.UI_Saturation, 0.35), HSL(Colors.UI_Hue, Colors.UI_Saturation,
0.32) }
1 year ago
-- 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
8 months ago
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
5 months ago
local file, height, flags = (FontAwesome_L --[[@as Font]]):GetFont()
8 months ago
if file then
5 months ago
DiesalFontAwesomeRegular:SetFont(file, 11, flags or "")
8 months ago
end
1 year ago
end
8 months ago
end
local bytemarkers = { { 0x7FF, 192 }, { 0xFFFF, 224 }, { 0x1FFFFF, 240 } }
11 months ago
8 months ago
---@param decimal number
function DiesalStyle:UTF8(decimal)
if decimal < 128 then
return string.char(decimal)
11 months ago
end
8 months ago
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
11 months ago
end
end
8 months ago
return table.concat(charbytes)
11 months ago
end
1 year ago
-- ~~| 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 }
11 months ago
---@field image { file: number|string, coords: Diesal.Style.TexCoord, color: Diesal.Style.Color, tiling: { [1]: WrapMode, [2]: WrapMode } }
1 year ago
---@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
11 months ago
1 year ago
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
5 months ago
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 }
1 year ago
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
5 months ago
print(texture:GetHeight(), texture.style.position[1], texture.style.position[2], texture.style.position[3],
texture.style.position[4])
1 year ago
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
5 months ago
texture:SetColorTexture(1, 1, 1, 1) -- clear color
1 year ago
-- apply settings
5 months ago
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])
1 year ago
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
5 months ago
texture:SetTexture() -- clear image
1 year ago
texture:SetColorTexture(1, 1, 1, 1) -- clear color
-- apply settings
5 months ago
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]
1 year ago
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
5 months ago
texture:SetTexture() -- clear image
1 year ago
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
5 months ago
texture:SetTexture() -- clear image
1 year ago
setGradient(texture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
5 months ago
texture:SetColorTexture(0, 0, 0, 0) -- clear color
1 year ago
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
5 months ago
style.gradient_orientation = style.gradient_orientation and
style.gradient_orientation:upper() --formatOrientation(style.gradient_orientation) -- fuck you
1 year ago
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
5 months ago
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 }
1 year ago
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
5 months ago
leftTexture:SetTexture() -- clear image
1 year ago
-- leftTexture:SetAlpha(1) -- reset alpha
5 months ago
rightTexture:SetTexture() -- clear image
1 year ago
-- rightTexture:SetAlpha(1) -- reset alpha
5 months ago
topTexture:SetTexture() -- clear image
1 year ago
-- 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)
5 months ago
topTexture:SetColorTexture(1, 1, 1, 1) -- clear color
1 year ago
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
5 months ago
leftTexture:SetColorTexture(1, 1, 1, 1) -- clear color
1 year ago
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
5 months ago
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
1 year ago
setGradient(bottomTexture, "HORIZONTAL", 0, 0, 0, 0, 0, 0, 0, 0) -- clear gradient
5 months ago
bottomTexture:SetColorTexture(0, 0, 0, 0) -- clear color
1 year ago
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)
5 months ago
object.shadow = object.shadow or CreateFrame("Frame", nil, frame)
1 year ago
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)
5 months ago
local offset = style.offset and type(style.offset) == "number" and
{ style.offset, style.offset, style.offset, style.offset } or style.offset
1 year ago
-- Setting ~~~~~~~~~~~~~~~~~~~~~~~ New Setting ~~~~~~~~~~~~~~~ Old Setting ~~~~~~~~~~~~~~~~~ Default ~~~~~~~~~~~~~~~~~~
5 months ago
shadowStyle.edgeFile = style.edgeFile or shadowStyle.edgeFile or
[[Interface\Buttons\WHITE8X8]] -- getMedia("border", "shadow")
8 months ago
shadowStyle.edgeSize = style.edgeSize or shadowStyle.edgeSize or 5
1 year ago
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
8 months ago
shadowStyle.offset = offset or shadowStyle.offset or { 0, 0, 0, 0 }
1 year ago
-- ~~ 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
8 months ago
--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)
1 year ago
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]]
11 months ago
if type(texture) == "nil" then
1 year ago
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
11 months ago
---@cast object Diesal.Style.ShadowObject
11 months ago
DiesalStyle:StyleShadow(object, frame, style --[[ @as Diesal.Style.ShadowStyle ]])
1 year ago
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