Files
QuestLogHeaderExpander/QuestLogHeaderExpander.lua
T

230 lines
6.0 KiB
Lua
Executable File

-- QuestLogHeaderExpander.lua
-- Interface: 16001
local addon = CreateFrame("Frame")
local button
local modeSetting
--------------------------------------------------
-- Saved variables / modes
--------------------------------------------------
local DEFAULTS = {
mode = "default",
lastState = nil,
}
local MODES = {
{ value = "default", label = "Default" },
{ value = "collapsed", label = "Always collapsed" },
{ value = "expanded", label = "Always expanded" },
-- Not working, to fix later
-- { value = "remember", label = "Remember previous state" },
}
local function InitDB()
QuestLogHeaderExpanderDB = QuestLogHeaderExpanderDB or {}
for k, v in pairs(DEFAULTS) do
if QuestLogHeaderExpanderDB[k] == nil then
QuestLogHeaderExpanderDB[k] = v
end
end
end
local function GetMode()
return QuestLogHeaderExpanderDB.mode
end
local function SetMode(value)
if modeSetting then
modeSetting:SetValue(value)
else
QuestLogHeaderExpanderDB.mode = value
end
end
--------------------------------------------------
-- Helpers
--------------------------------------------------
local function AreAllHeadersExpanded()
for i = 1, C_QuestLog.GetNumQuestLogEntries() do
local info = C_QuestLog.GetInfo(i)
if info and info.isHeader and info.isCollapsed then
return false
end
end
return true
end
local searchBoxHooked = false
local function ResizeSearchBox()
local sb = QuestScrollFrame and QuestScrollFrame.SearchBox
if not sb then return end
if sb:GetWidth() ~= 150 then
sb:SetWidth(150)
end
if not searchBoxHooked then
searchBoxHooked = true
sb:HookScript("OnShow", ResizeSearchBox)
end
end
local function UpdateButton()
if not button then return end
ResizeSearchBox()
local text = AreAllHeadersExpanded() and "- All" or "+ All"
if button:GetText() ~= text then
button:SetText(text)
end
end
local function SetAllHeaders(expand)
if expand then
ExpandQuestHeader(0)
else
CollapseQuestHeader(0)
end
end
local function ApplyDefaultState()
local mode = GetMode()
local target
if mode == "expanded" or mode == "collapsed" then
target = mode
-- elseif mode == "remember" then
-- target = QuestLogHeaderExpanderDB.lastState
end
if target then
SetAllHeaders(target == "expanded")
end
end
--------------------------------------------------
-- Context menu and options menu
--------------------------------------------------
local function ShowContextMenu(owner)
if not MenuUtil then return end
MenuUtil.CreateContextMenu(owner, function(_, root)
root:CreateTitle("When the map opens")
for _, opt in ipairs(MODES) do
root:CreateRadio(
opt.label,
function() return GetMode() == opt.value end,
function() SetMode(opt.value) end
)
end
end)
end
local function CreateOptionsPanel()
if not (Settings and Settings.RegisterVerticalLayoutCategory) then return end
local category = Settings.RegisterVerticalLayoutCategory("Quest Log Header Expander")
modeSetting = Settings.RegisterAddOnSetting(
category,
"QuestLogHeaderExpander_MODE",
"mode",
QuestLogHeaderExpanderDB,
Settings.VarType.String,
"Quest header behaviour",
DEFAULTS.mode
)
local function GetOptions()
local container = Settings.CreateControlTextContainer()
for _, opt in ipairs(MODES) do
container:Add(opt.value, opt.label)
end
return container:GetData()
end
Settings.CreateDropdown(
category,
modeSetting,
GetOptions,
"What the quest log headers do each time the map is opened."
)
Settings.RegisterAddOnCategory(category)
addon.category = category
end
--------------------------------------------------
-- Create Button
--------------------------------------------------
local function CreateExpandButton()
if button then return end
local parent = QuestMapFrame and QuestMapFrame.QuestsFrame
if not parent then return end
button = CreateFrame("Button", "QuestLogHeaderExpanderButton", parent, "UIPanelButtonTemplate")
button:SetSize(50, 20)
if QuestLogQuestCount then
button:SetPoint("RIGHT", QuestLogQuestCount, "RIGHT", 54, 0)
else
button:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -10, 24)
end
button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
button:SetScript("OnClick", function(self, mouseButton)
if mouseButton == "RightButton" then
ShowContextMenu(self)
return
end
local expanding = not AreAllHeadersExpanded()
SetAllHeaders(expanding)
QuestLogHeaderExpanderDB.lastState = expanding and "expanded" or "collapsed"
end)
button:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText("Quest Headers")
GameTooltip:AddLine("Left click to toggle all zone headers.", 1, 1, 1, true)
GameTooltip:AddLine("Right click for options.", 1, 1, 1, true)
GameTooltip:Show()
end)
button:SetScript("OnLeave", GameTooltip_Hide)
-- Re-apply the chosen state whenever the map opens. Deferred a frame so it runs after Blizzard's own "expand current zone" logic.
QuestMapFrame:HookScript("OnShow", function()
C_Timer.After(0, ApplyDefaultState)
end)
UpdateButton()
end
--------------------------------------------------
-- Events
--------------------------------------------------
addon:RegisterEvent("PLAYER_LOGIN")
addon:RegisterEvent("QUEST_LOG_UPDATE")
addon:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGIN" then
self:UnregisterEvent("PLAYER_LOGIN")
InitDB()
CreateOptionsPanel()
CreateExpandButton()
else
UpdateButton()
end
end)