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.

249 lines
8.8 KiB

local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local P = Cell.pixelPerfectFuncs
local lastShownTab
local optionsFrame = Cell.CreateFrame("CellOptionsFrame", Cell.frames.mainFrame, 432, 401)
Cell.frames.optionsFrame = optionsFrame
PixelUtil.SetPoint(optionsFrame, "CENTER", CellParent, "CENTER", 1, -1)
optionsFrame:SetFrameStrata("DIALOG")
optionsFrame:SetFrameLevel(520)
optionsFrame:SetClampedToScreen(true)
optionsFrame:SetClampRectInsets(0, 0, 40, 0)
optionsFrame:SetMovable(true)
local function RegisterDragForOptionsFrame(frame)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function()
optionsFrame:StartMoving()
optionsFrame:SetUserPlaced(false)
end)
frame:SetScript("OnDragStop", function()
optionsFrame:StopMovingOrSizing()
P.PixelPerfectPoint(optionsFrame)
P.SavePosition(optionsFrame, CellDB["optionsFramePosition"])
end)
end
-------------------------------------------------
-- button group
-------------------------------------------------
local generalBtn, appearanceBtn, clickCastingsBtn, aboutBtn, layoutsBtn, indicatorsBtn, debuffsBtn, utilitiesBtn, closeBtn
local function CreateTabButtons()
generalBtn = Cell.CreateButton(optionsFrame, L["General"], "accent-hover", {105, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
appearanceBtn = Cell.CreateButton(optionsFrame, L["Appearance"], "accent-hover", {105, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
layoutsBtn = Cell.CreateButton(optionsFrame, L["Layouts"], "accent-hover", {105, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
clickCastingsBtn = Cell.CreateButton(optionsFrame, L["Click-Castings"], "accent-hover", {120, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
indicatorsBtn = Cell.CreateButton(optionsFrame, L["Indicators"], "accent-hover", {105, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
debuffsBtn = Cell.CreateButton(optionsFrame, L["Raid Debuffs"], "accent-hover", {120, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
utilitiesBtn = Cell.CreateButton(optionsFrame, L["Utilities"], "accent-hover", {105, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
aboutBtn = Cell.CreateButton(optionsFrame, L["About"], "accent-hover", {86, 20}, false, false, "CELL_FONT_WIDGET_TITLE", "CELL_FONT_WIDGET_TITLE_DISABLE")
closeBtn = Cell.CreateButton(optionsFrame, "×", "red", {20, 20}, false, false, "CELL_FONT_SPECIAL", "CELL_FONT_SPECIAL")
closeBtn:SetScript("OnClick", function()
optionsFrame:Hide()
end)
-- line 1
layoutsBtn:SetPoint("BOTTOMLEFT", optionsFrame, "TOPLEFT", 0, P.Scale(-1))
indicatorsBtn:SetPoint("BOTTOMLEFT", layoutsBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
debuffsBtn:SetPoint("BOTTOMLEFT", indicatorsBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
utilitiesBtn:SetPoint("BOTTOMLEFT", debuffsBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
utilitiesBtn:SetPoint("BOTTOMRIGHT", optionsFrame, "TOPRIGHT", 0, P.Scale(-1))
-- line 2
generalBtn:SetPoint("BOTTOMLEFT", layoutsBtn, "TOPLEFT", 0, P.Scale(-1))
appearanceBtn:SetPoint("BOTTOMLEFT", generalBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
clickCastingsBtn:SetPoint("BOTTOMLEFT", appearanceBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
aboutBtn:SetPoint("BOTTOMLEFT", clickCastingsBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
closeBtn:SetPoint("BOTTOMLEFT", aboutBtn, "BOTTOMRIGHT", P.Scale(-1), 0)
closeBtn:SetPoint("BOTTOMRIGHT", utilitiesBtn, "TOPRIGHT", 0, P.Scale(-1))
RegisterDragForOptionsFrame(generalBtn)
RegisterDragForOptionsFrame(appearanceBtn)
RegisterDragForOptionsFrame(layoutsBtn)
RegisterDragForOptionsFrame(clickCastingsBtn)
RegisterDragForOptionsFrame(indicatorsBtn)
RegisterDragForOptionsFrame(debuffsBtn)
RegisterDragForOptionsFrame(utilitiesBtn)
RegisterDragForOptionsFrame(aboutBtn)
generalBtn.id = "general"
appearanceBtn.id = "appearance"
layoutsBtn.id = "layouts"
clickCastingsBtn.id = "clickCastings"
indicatorsBtn.id = "indicators"
debuffsBtn.id = "debuffs"
utilitiesBtn.id = "utilities"
aboutBtn.id = "about"
local tabHeight = {
["general"] = 535,
["appearance"] = 665,
["layouts"] = 550,
["clickCastings"] = 592,
["indicators"] = 607,
["debuffs"] = 521,
["utilities"] = 400,
["about"] = 650,
}
local function ShowTab(tab)
if lastShownTab ~= tab then
P.Height(optionsFrame, tabHeight[tab])
Cell.Fire("ShowOptionsTab", tab)
lastShownTab = tab
end
end
local function OnEnter(b)
if b.id == utilitiesBtn.id then
F.ShowUtilityList(b)
else
F.HideUtilityList()
end
if utilitiesBtn.timer then
utilitiesBtn.timer:Cancel()
utilitiesBtn.timer = nil
end
end
local function OnLeave(b)
if b.id == utilitiesBtn.id then
utilitiesBtn.timer = C_Timer.NewTicker(0.5, function()
if not F.IsUtilityListMouseover() then
F.HideUtilityList()
utilitiesBtn.timer:Cancel()
utilitiesBtn.timer = nil
end
end)
end
end
Cell.CreateButtonGroup({generalBtn, appearanceBtn, layoutsBtn, clickCastingsBtn, indicatorsBtn, debuffsBtn, utilitiesBtn, aboutBtn}, ShowTab, nil, nil, OnEnter, OnLeave)
end
-------------------------------------------------
-- show & hide
-------------------------------------------------
local init
local function Init()
if not init then
init = true
P.Resize(optionsFrame)
P.Reborder(optionsFrame, true)
CreateTabButtons()
F.CreateUtilityList(utilitiesBtn)
end
end
function F.ShowOptionsFrame()
Init()
if optionsFrame:IsShown() then
optionsFrame:Hide()
return
end
if not lastShownTab then
generalBtn:Click()
end
optionsFrame:Show()
end
optionsFrame:SetScript("OnShow", function()
if not P.LoadPosition(optionsFrame, CellDB["optionsFramePosition"]) then
P.PixelPerfectPoint(optionsFrame)
end
end)
optionsFrame:SetScript("OnHide", function()
-- stolen from dbm
if not InCombatLockdown() and not UnitAffectingCombat("player") and not IsFalling() then
F.Debug("|cffbbbbbbCellOptionsFrame_OnHide: |cffff7777collectgarbage")
collectgarbage("collect")
-- UpdateAddOnMemoryUsage() -- stuck like hell
end
end)
-- optionsFrame:SetScript("OnShow", function()
-- P.PixelPerfectPoint(optionsFrame)
-- end)
-- for Raid Debuffs import
function F.ShowRaidDebuffsTab()
Init()
optionsFrame:Show()
debuffsBtn:Click()
end
-- for layout import
function F.ShowLayousTab()
Init()
optionsFrame:Show()
layoutsBtn:Click()
end
function F.ShowUtilitiesTab()
Init()
optionsFrame:Show()
utilitiesBtn:Click()
end
-------------------------------------------------
-- InCombatLockdown
-------------------------------------------------
local protectedFrames = {}
function F.ApplyCombatProtectionToFrame(f, x1, y1, x2, y2)
tinsert(protectedFrames, f)
Cell.CreateCombatMask(f, x1, y1, x2, y2)
if InCombatLockdown() then
f.combatMask:Show()
end
f:HookScript("OnShow", function()
if InCombatLockdown() then
f.combatMask:Show()
end
end)
end
local protectedWidgets = {}
function F.ApplyCombatProtectionToWidget(widget)
tinsert(protectedWidgets, widget)
if InCombatLockdown() then
widget:SetEnabled(false)
end
end
optionsFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
optionsFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
optionsFrame:SetScript("OnEvent", function(self, event)
if event == "PLAYER_REGEN_DISABLED" then
for _, f in pairs(protectedFrames) do
f.combatMask:Show()
end
for _, w in pairs(protectedWidgets) do
w:SetEnabled(false)
end
elseif event == "PLAYER_REGEN_ENABLED" then
for _, f in pairs(protectedFrames) do
f.combatMask:Hide()
end
for _, w in pairs(protectedWidgets) do
w:SetEnabled(true)
end
end
end)
-------------------------------------------------
-- callbacks
-------------------------------------------------
local function UpdatePixelPerfect()
P.Resize(optionsFrame)
end
Cell.RegisterCallback("UpdatePixelPerfect", "OptionsFrame_UpdatePixelPerfect", UpdatePixelPerfect)