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.

391 lines
12 KiB

local MAJOR, MINOR = "OmniCDC", 4
local OmniCDC, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not OmniCDC then
return
end
--
-- Font
--
OmniCDC.GameFontNormal = CreateFont("GameFontNormal-OmniCD")
OmniCDC.GameFontNormal:CopyFontObject("GameFontNormal")
OmniCDC.GameFontHighlight = CreateFont("GameFontHighlight-OmniCD")
OmniCDC.GameFontHighlight:CopyFontObject("GameFontHighlight")
OmniCDC.GameFontDisabled = CreateFont("GameFontDisable-OmniCD")
OmniCDC.GameFontDisabled:CopyFontObject("GameFontDisable")
OmniCDC.GameFontNormalSmall = CreateFont("GameFontNormalSmall-OmniCD")
OmniCDC.GameFontNormalSmall:CopyFontObject("GameFontNormalSmall")
OmniCDC.GameFontHighlightSmall = CreateFont("GameFontHighlightSmall-OmniCD")
OmniCDC.GameFontHighlightSmall:CopyFontObject("GameFontHighlightSmall")
OmniCDC.defaultFonts = {}
if LOCALE_koKR then -- "Fonts\\2002.TTF"
OmniCDC.defaultFonts.option = {"기본 글꼴", 12, "NONE", 0, 0, 0, 1, -1}
OmniCDC.defaultFonts.optionSmall = {"기본 글꼴", 10, "NONE", 0, 0, 0, 1, -1}
elseif LOCALE_zhCN then -- "Fonts\\ARKai_T.ttf"
OmniCDC.defaultFonts.option = {"默认", 15, "NONE", 0, 0, 0, 1, -1}
OmniCDC.defaultFonts.optionSmall = {"默认", 12, "NONE", 0, 0, 0, 1, -1}
elseif LOCALE_zhTW then -- "Fonts\\blei00d.TTF"
OmniCDC.defaultFonts.option = {"預設", 15, "NONE", 0, 0, 0, 1, -1}
OmniCDC.defaultFonts.optionSmall = {"預設", 13, "NONE", 0, 0, 0, 1, -1}
elseif LOCALE_ruRU then -- "Fonts\\FRIZQT__.TTF"
OmniCDC.defaultFonts.option = {"PT Sans Narrow", 12, "NONE", 0, 0, 0, 1, -1}
OmniCDC.defaultFonts.optionSmall = {"PT Sans Narrow", 10, "NONE", 0, 0, 0, 1, -1}
else
OmniCDC.defaultFonts.option = {"PT Sans Narrow", 12, "NONE", 0, 0, 0, 1, -1}
OmniCDC.defaultFonts.optionSmall = {"PT Sans Narrow", 10, "NONE", 0, 0, 0, 1, -1}
end
function OmniCDC.SetFontProperties(fontString, db)
local LSM = LibStub("LibSharedMedia-3.0")
if LSM then
local font, size, flag, r, g, b, ofsX, ofsY = unpack(db)
local fontPath = LSM:Fetch("font", font)
if fontPath then -- fallbacks to default fonts
fontString:SetShadowOffset(ofsX, ofsY)
fontString:SetShadowColor(r, g, b, ofsX == 0 and ofsY == 0 and 0 or 1)
-- DF, WOTLKC 30401, ClassicEra 11404
flag = flag == "NONE" and (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE or (WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC and select(4, GetBuildInfo()) >= 30401) or (WOW_PROJECT_ID == WOW_PROJECT_CLASSIC and select(4, GetBuildInfo()) >= 11404)) and "" or flag
fontString:SetFont(fontPath, size, flag)
end
end
end
function OmniCDC.SetOptionFontDefaults(option, optionSmall)
if OmniCDC.isFontSet then
return
end
option = option or OmniCDC.defaultFonts.option
optionSmall = optionSmall or OmniCDC.defaultFonts.optionSmall
OmniCDC.SetFontProperties(OmniCDC.GameFontNormal, option)
OmniCDC.SetFontProperties(OmniCDC.GameFontHighlight, option)
OmniCDC.SetFontProperties(OmniCDC.GameFontDisabled, option)
OmniCDC.SetFontProperties(OmniCDC.GameFontNormalSmall, optionSmall)
OmniCDC.SetFontProperties(OmniCDC.GameFontHighlightSmall, optionSmall)
-- Set tooltip font
local AceConfigDialog = LibStub("AceConfigDialog-3.0-OmniCD")
if AceConfigDialog then
for i = 1, 13 do
if i > 3 then
AceConfigDialog.tooltip:AddLine(" ")
else
AceConfigDialog.tooltip:AddDoubleLine(" ", " ")
end
end
for i = 1, select("#", AceConfigDialog.tooltip:GetRegions()) do
local region = select(i, AceConfigDialog.tooltip:GetRegions())
if region and region:GetObjectType() == "FontString" then
OmniCDC.SetFontProperties(region, option)
end
end
end
OmniCDC.isFontSet = true
end
--
-- Backdrop
--
OmniCDC.backdropStyle = {}
local textureUVs = {
"TopLeftCorner",
"TopRightCorner",
"BottomLeftCorner",
"BottomRightCorner",
"TopEdge",
"BottomEdge",
"LeftEdge",
"RightEdge",
"Center"
}
function OmniCDC.GetPixelMult()
local _, screenheight = GetPhysicalScreenSize()
local uiUnitFactor = 768 / screenheight
local uiScale = UIParent:GetScale()
return uiUnitFactor / uiScale, uiUnitFactor
end
function OmniCDC.SetBackdrop(frame, style, bgFile, edgeFile, edgeSize, force)
if not OmniCDC.pixelMult then
OmniCDC.pixelMult = OmniCDC.GetPixelMult()
end
style = style or "default"
local backdrop = OmniCDC.backdropStyle[style]
if not backdrop or force then
-- ACD is never called before opening the option panel. ACD:Open() will set ACDPixelMult value
backdrop = {
bgFile = bgFile or "Interface\\BUTTONS\\White8x8",
edgeFile = edgeFile or "Interface\\BUTTONS\\White8x8",
edgeSize = (edgeSize or 1) * (style == "ACD" and OmniCDC.ACDPixelMult or OmniCDC.pixelMult),
}
OmniCDC.backdropStyle[style] = backdrop
end
frame:SetBackdrop(backdrop)
for _, pieceName in ipairs(textureUVs) do
local region = frame[pieceName]
if region then
region:SetTexelSnappingBias(0.0)
region:SetSnapToPixelGrid(false)
end
end
end
function OmniCDC.GetBackdropStyle(key)
return OmniCDC.backdropStyle[key]
end
--
-- StaticPopup
--
OmniCDC.StaticPopupDialogs = {}
local function Button_OnLeave(self)
self:SetBackdropBorderColor(0, 0, 0)
end
local function Button_OnEnter(self)
local r, g, b = GetClassColor(select(2, UnitClass("player")))
self:SetBackdropBorderColor(r, g, b)
end
function OmniCDC.GetStaticPopup()
local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
frame:Hide()
frame:SetPoint("CENTER", UIParent, "CENTER")
frame:SetSize(320, 72)
frame:SetFrameStrata("TOOLTIP")
OmniCDC.SetBackdrop(frame, "dialog", "Interface\\DialogFrame\\UI-DialogBox-Background-Dark")
frame:SetBackdropBorderColor(0, 0, 0)
frame:SetScript("OnKeyDown", function(self, key)
if key == "ESCAPE" then
self:SetPropagateKeyboardInput(false)
if self.cancel:IsShown() then
self.cancel:Click()
else
self:Hide()
end
else
self:SetPropagateKeyboardInput(true)
end
end)
local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight-OmniCD")
text:SetSize(290, 0)
text:SetPoint("TOP", 0, -16)
frame.text = text
local function newButton(name)
local button = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
button:SetSize(128, 21)
OmniCDC.SetBackdrop(button)
button:SetBackdropColor(0.2, 0.2, 0.2, 1)
button:SetBackdropBorderColor(0, 0, 0, 1)
button:SetScript("OnEnter", Button_OnEnter)
button:SetScript("OnLeave", Button_OnLeave)
button:SetNormalFontObject("GameFontNormal-OmniCD")
button:SetHighlightFontObject("GameFontHighlight-OmniCD")
button:SetText(name)
return button
end
local accept = newButton(ACCEPT)
accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
frame.accept = accept
local cancel = newButton(CANCEL)
cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0)
frame.cancel = cancel
local alt = newButton(OKAY)
alt:SetWidth(86)
alt:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16)
frame.alt = alt
return frame
end
local function StaticPopup_OnShow(self)
local info = self.info
local OnShow = info.OnShow
if OnShow then
OnShow(self, self.data, self.data2)
end
end
local function StaticPopup_OnHide(self)
local info = self.info
local OnHide = info.OnHide
if OnHide then
OnHide(self, self.data, self.data2)
end
end
local function StaticPopup_OnAccept(self)
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
local frame = self:GetParent()
local info = frame.info
local OnAccept = info.OnAccept
local keepVisible
if OnAccept then
keepVisible = OnAccept(self, frame.data, frame.data2)
end
if not keepVisible then
frame:Hide()
self:SetScript("OnClick", nil)
frame.cancel:SetScript("OnClick", nil)
frame.alt:SetScript("OnClick", nil)
end
end
local function StaticPopup_OnCancel(self)
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
local frame = self:GetParent()
local info = frame.info
local OnCancel = info.OnCancel
if OnCancel then
OnCancel(self, frame.data, frame.data2)
end
frame:Hide()
self:SetScript("OnClick", nil)
frame.accept:SetScript("OnClick", nil)
frame.alt:SetScript("OnClick", nil)
end
local function StaticPopup_OnAlt(self)
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION)
local frame = self:GetParent()
local info = frame.info
local OnAlt = info.OnAlt
if OnAlt then
OnAlt(self, frame.data, frame.data2)
end
frame:Hide()
self:SetScript("OnClick", nil)
frame.accept:SetScript("OnClick", nil)
frame.cancel:SetScript("OnClick", nil)
end
function OmniCDC.StaticPopup_Show(which, text_arg1, text_arg2, data, data2)
local frame = OmniCDC.popup
if not frame then
frame = OmniCDC.GetStaticPopup()
OmniCDC.popup = frame
end
local info = OmniCDC.StaticPopupDialogs[which]
local message = format(info.text, text_arg1 or "", text_arg2 or "")
frame.text:SetText(message)
local height = 61 + frame.text:GetHeight()
frame:SetHeight(height)
if info.button3 then
frame.accept:SetWidth(86)
frame.cancel:SetWidth(86)
frame.accept:ClearAllPoints()
frame.cancel:ClearAllPoints()
frame.accept:SetPoint("RIGHT", frame.alt, "LEFT", -6, 0)
frame.cancel:SetPoint("LEFT", frame.alt, "RIGHT", 6, 0)
frame.alt:Show()
else
frame.accept:SetWidth(128)
frame.cancel:SetWidth(128)
frame.accept:ClearAllPoints()
frame.cancel:ClearAllPoints()
frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
frame.cancel:SetPoint("LEFT", frame.accept, "RIGHT", 13, 0)
frame.alt:Hide()
end
frame.info = info
frame.data = data
frame.data2 = data2
frame.accept:SetText(info.button1 or ACCEPT)
frame.cancel:SetText(info.button2 or CANCEL)
frame.alt:SetText(info.button3 or OKAY)
frame:SetScript("OnShow", StaticPopup_OnShow)
frame:SetScript("OnHide", StaticPopup_OnHide)
frame.accept:SetScript("OnClick", StaticPopup_OnAccept)
frame.cancel:SetScript("OnClick", StaticPopup_OnCancel)
frame.alt:SetScript("OnClick", StaticPopup_OnAlt)
frame:Show()
end
function OmniCDC.GetStaticPopupDialog(key)
return OmniCDC.StaticPopupDialogs[key]
end
--
-- Flash Button
--
local function FlashButton_OnLeave(self)
local fadeIn = self.fadeIn
if fadeIn:IsPlaying() then
fadeIn:Stop()
end
self.fadeOut:Play()
end
local function FlashButton_OnEnter(self)
PlaySound(1217)
local fadeOut = self.fadeOut
if fadeOut:IsPlaying() then
fadeOut:Stop()
end
self.fadeIn:Play()
end
function OmniCDC.CreateFlashButton(parent, text, width, height, style)
local Button = CreateFrame("Button", nil, parent, BackdropTemplateMixin and "BackdropTemplate" or nil)
Button:SetSize(width or 80, height or 20)
OmniCDC.SetBackdrop(Button, style)
Button:SetBackdropColor(0.725, 0.008, 0.008)
Button:SetBackdropBorderColor(0, 0, 0)
Button:SetScript("OnEnter", FlashButton_OnEnter)
Button:SetScript("OnLeave", FlashButton_OnLeave)
Button:SetNormalFontObject("GameFontHighlight-OmniCD")
-- Button:SetHighlightFontObject("GameFontHighlight-OmniCD")
Button:SetText(text or "")
Button.bg = Button:CreateTexture(nil, "BORDER")
if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then
Button.bg:SetAllPoints()
else
Button.bg:SetTexelSnappingBias(0.0)
Button.bg:SetSnapToPixelGrid(false)
Button.bg:SetPoint("TOPLEFT", Button.TopEdge, "BOTTOMLEFT")
Button.bg:SetPoint("BOTTOMRIGHT", Button.BottomEdge, "TOPRIGHT")
end
Button.bg:SetColorTexture(0.0, 0.6, 0.4)
Button.bg:Hide()
Button.fadeIn = Button.bg:CreateAnimationGroup()
Button.fadeIn:SetScript("OnPlay", function() Button.bg:Show() end)
local fadeIn = Button.fadeIn:CreateAnimation("Alpha")
fadeIn:SetFromAlpha(0)
fadeIn:SetToAlpha(1)
fadeIn:SetDuration(0.4)
fadeIn:SetSmoothing("OUT")
Button.fadeOut = Button.bg:CreateAnimationGroup()
Button.fadeOut:SetScript("OnFinished", function() Button.bg:Hide() end)
local fadeOut = Button.fadeOut:CreateAnimation("Alpha")
fadeOut:SetFromAlpha(1)
fadeOut:SetToAlpha(0)
fadeOut:SetDuration(0.3)
fadeOut:SetSmoothing("OUT")
return Button
end