|
|
|
|
-- 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
|