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
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", UIParent, "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"] = 569,
|
|
["appearance"] = 665,
|
|
["layouts"] = 530,
|
|
["clickCastings"] = 592,
|
|
["indicators"] = 607,
|
|
["debuffs"] = 521,
|
|
["utilities"] = 400,
|
|
["about"] = 600,
|
|
}
|
|
|
|
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)
|
|
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)
|