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.

296 lines
8.5 KiB

-- Customize Font
---- 1. Support LibSharedMedia
---- 1. Font Select and Comparison UI (Accessed via Settings)
--- Color defined in ThemeUtil.lua
local _, addon = ...
local API = addon.API;
local FontUtil = {};
addon.FontUtil = FontUtil;
local AUTO_SCALING_MIN_HEIGHT = 9;
local DEFAULT_FONT_FILE = {
roman = "Interface/AddOns/DialogueUI/Fonts/frizqt__.ttf", --Friz Quadrata
korean = "Fonts/2002.TTF",
simplifiedchinese = "Fonts/ARKai_T.ttf",
traditionalchinese = "Fonts/blei00d.TTF",
russian = "Interface/AddOns/DialogueUI/Fonts/frizqt___cyr.ttf",
};
local NUMBER_FONT_FILE = {
roman = "Interface/AddOns/DialogueUI/Fonts/ARIALN.ttf",
korean = "Fonts/2002.TTF",
simplifiedchinese = "Fonts/ARHei.ttf",
traditionalchinese = "Fonts/arheiuhk_bd.TTF",
russian = "Interface/AddOns/DialogueUI/Fonts/ARIALN.ttf",
};
local HEIGHT_1 = {10, 12, 14, 16};
local HEIGHT_2 = {8, 10, 12, 12};
local FONT_OBJECT_HEIGHT = {
--FontObjectName = {10, 12, 14, 16} --Paragraph Font Size as Base
DUIFont_Quest_Title_18 = {14, 18, 18, 18},
DUIFont_Quest_Title_16 = {12, 16, 16, 16},
DUIFont_Quest_SubHeader = HEIGHT_1,
DUIFont_Quest_Paragraph = HEIGHT_1,
DUIFont_Quest_Gossip = HEIGHT_1,
DUIFont_Quest_Quest = HEIGHT_1,
DUIFont_Quest_Disabled = HEIGHT_1,
DUIFont_Settings_Disabled = HEIGHT_1,
DUIFont_Item = HEIGHT_2,
DUIFont_ItemSelect = HEIGHT_2,
DUIFont_Hotkey = HEIGHT_2,
DUIFont_QuestType_Left = HEIGHT_2,
DUIFont_QuestType_Right = HEIGHT_2,
DUIFont_Tooltip_Large = HEIGHT_1,
DUIFont_Tooltip_Medium = HEIGHT_2,
DUIFont_Tooltip_Small = HEIGHT_2,
DUIFont_ItemCount = {8, 10, 10, 12},
DUIFont_MenuButton_Normal = HEIGHT_1,
DUIFont_MenuButton_Highlight = HEIGHT_1,
};
local IS_NUMBER_FONT = {
DUIFont_ItemCount = true,
};
do
local CLIENT_ALPHABET;
local AlphabetLocales = {
roman = {"enUS", "frFR", "deDE", "esES", "esMX", "ptBR", "itIT"},
korean = {"koKR"},
simplifiedchinese = {"zhCN"},
traditionalchinese = {"zhTW"},
russian = {"ruRU"},
};
function FontUtil:GetAlphabetForCurrentClient()
if not CLIENT_ALPHABET then
local clientLocale = GetLocale() or "enUS";
for alphabet, locales in pairs(AlphabetLocales) do
for _, locale in ipairs(locales) do
if clientLocale == locale then
CLIENT_ALPHABET = alphabet;
break
end
end
end
if not CLIENT_ALPHABET then
CLIENT_ALPHABET = "roman";
end
AlphabetLocales = nil;
end
return CLIENT_ALPHABET
end
end
function FontUtil:GetDefaultFont()
local alphabet = self:GetAlphabetForCurrentClient();
return DEFAULT_FONT_FILE[alphabet];
end
function FontUtil:GetUserFont()
if true then
return self:GetDefaultFont();
end
end
function FontUtil:GetUserNumberFont()
local alphabet = self:GetAlphabetForCurrentClient();
return NUMBER_FONT_FILE[alphabet];
end
function FontUtil:GetInstalledFont()
if self.installedFontGetter then
local fontData = self.installedFontGetter();
return fontData
end
end
do --Auto Downsize Font To Fit Into Region (Derivative of AutoScalingFontStringMixin, Blizzard_SharedXML/SecureUtil)
local Round = API.Round;
local AutoScalingFontStringMixin = {};
function AutoScalingFontStringMixin:SetText(fontString, text)
fontString:SetText(text);
self:ScaleTextToFit(fontString);
end
function AutoScalingFontStringMixin:GetFontHeight(fontString)
local _, height = fontString:GetFont();
return Round(height);
end
function AutoScalingFontStringMixin:ScaleTextToFit(fontString)
local baseLineHeight = self:GetFontHeight(fontString);
local tryHeight = baseLineHeight;
local minLineHeight = AUTO_SCALING_MIN_HEIGHT;
local stringWidth = fontString:GetUnboundedStringWidth() / fontString:GetTextScale();
if stringWidth > 0 then
local maxLines = fontString:GetMaxLines();
if maxLines == 0 then
maxLines = Round(fontString:GetHeight() / (baseLineHeight + fontString:GetSpacing()));
end
local targetScale = fontString:GetWidth() * maxLines / stringWidth;
if targetScale >= 1 then
tryHeight = baseLineHeight;
else
tryHeight = Round(targetScale * baseLineHeight);
if tryHeight < minLineHeight then
tryHeight = minLineHeight;
end
end
end
while tryHeight >= minLineHeight do
local scale = tryHeight / baseLineHeight;
fontString:SetTextScale(scale);
if fontString:IsTruncated() then
tryHeight = tryHeight - 1;
else
break
end
end
end
function FontUtil:SetAutoScalingText(fontString, text)
AutoScalingFontStringMixin:SetText(fontString, text)
end
end
do
local DEFAULT_FONT_SIZE = 0;
local FONT_SIZE_ID = 1;
local FONT_DATA_ID = FONT_SIZE_ID + 1;
local FONT_SIZE_INDEX = {
[0] = 10,
[1] = 12,
[2] = 14,
[3] = 16,
};
function FontUtil:SetFontSizeByID(id)
if not (id and FONT_SIZE_INDEX[id]) then return end;
FONT_SIZE_ID = id;
FONT_DATA_ID = FONT_SIZE_ID + 1;
if FONT_SIZE_INDEX[id] == DEFAULT_FONT_SIZE then return end;
local fontSize = FONT_SIZE_INDEX[id];
DEFAULT_FONT_SIZE = fontSize;
local k = FONT_DATA_ID;
local _G = _G;
local textFontFile = self:GetUserFont();
for fontName, v in pairs(FONT_OBJECT_HEIGHT) do
local _, _, flags = _G[fontName]:GetFont();
local fontFile;
if IS_NUMBER_FONT[fontName] then
fontFile = FontUtil:GetUserNumberFont();
else
fontFile = textFontFile;
end
_G[fontName]:SetFont(fontFile, v[k], flags);
end
if fontSize >= 16 then
AUTO_SCALING_MIN_HEIGHT = 10;
else
AUTO_SCALING_MIN_HEIGHT = 9;
end
addon.CallbackRegistry:Trigger("FontSizeChanged", fontSize, id);
end
function FontUtil:SetFontByFile(textFontFile)
local k = FONT_DATA_ID;
local _G = _G;
for fontName, v in pairs(FONT_OBJECT_HEIGHT) do
local _, _, flags = _G[fontName]:GetFont();
local fontFile;
if IS_NUMBER_FONT[fontName] then
fontFile = FontUtil:GetUserNumberFont();
else
fontFile = textFontFile;
end
_G[fontName]:SetFont(fontFile, v[k], flags);
end
addon.CallbackRegistry:Trigger("FontSizeChanged", DEFAULT_FONT_SIZE, FONT_SIZE_ID);
end
end
do
local function Settings_FontSizeBase(dbValue)
FontUtil:SetFontSizeByID(dbValue);
end
addon.CallbackRegistry:Register("SettingChanged.FontSizeBase", Settings_FontSizeBase);
end
do --Check LibSharedMedia
local DropDownMenu;
local function CheckLib()
local libName = "LibSharedMedia-3.0";
local silent = true;
local lib = LibStub and LibStub.GetLibrary and LibStub:GetLibrary(libName, silent);
if lib then
FontUtil.installedFontGetter = function()
local data = lib:HashTable("font");
local list = lib:List("font");
local fontData = {};
local n = 0;
for _, fontName in ipairs(list) do
if data[fontName] then
n = n + 1;
fontData[n] = {fontName, data[fontName]};
end
end
return fontData
end
local fontList = FontUtil:GetInstalledFont();
if fontList and #fontList > 1 then
DropDownMenu = addon.GetDropDownMenu();
DropDownMenu:SetContent(fontList)
end
else
end
end
--addon.CallbackRegistry:Register("PLAYER_ENTERING_WORLD", CheckLib);
end