addon/Addon/Code/EncounterFrame.lua
Roman Jaroš f37808207e
All checks were successful
forgejo/Czech Quests/addon/pipeline/head This commit looks good
Refactor and improve encounter data handling and formatting
2025-04-19 00:42:06 +02:00

241 lines
6.9 KiB
Lua
Executable file

local _, addon = ...
local EncounterFrame = CreateFrame("Frame", nil)
EncounterFrame:Hide()
addon.EncounterFrame = EncounterFrame
EncounterFrame.headers = {}
local NEXT_HEADER_ID = 0
function EncounterFrame:Init()
local frame = self
if not EncounterJournal or not EncounterJournal.encounter or not EncounterJournal.encounter.info then
return
end
local scrollFrame = CreateFrame("ScrollFrame", "$parentOverviewScrollFrame", EncounterJournal.encounter.info, "ScrollFrameTemplate")
scrollFrame:SetSize(330, 370)
scrollFrame:SetPoint("TOPLEFT", EncounterJournal.encounter.info.overviewScroll, "TOPLEFT", 0, -7)
scrollFrame.scrollBarX = -25
scrollFrame.scrollBarTopY = -6
scrollFrame.scrollBarBottomY = 6
frame:SetParent(scrollFrame)
frame:SetSize(scrollFrame:GetWidth() - 10, 1)
frame:Show()
scrollFrame:SetScrollChild(frame)
frame.summary = addon.API.CreateCzechFont(
frame,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_NAME,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_SIZE
)
frame.summary:SetTextColor(0.251, 0.145, 0.012)
frame.summary:SetPoint("TOPLEFT", frame, "TOPLEFT", 2, 0)
frame.summary:SetWidth(scrollFrame:GetWidth() - 10)
frame:UpdateSettings()
frame:InitTab()
end
function EncounterFrame:UpdateSettings()
local frame = self
addon.API.UpdateCzechFont(
frame.summary,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_NAME,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_SIZE
)
for _, header in ipairs(self.headers) do
addon.API.UpdateCzechFont(
header.description,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_NAME,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_SIZE
)
end
end
function EncounterFrame:InitTab()
local frame = self
local tab = CreateFrame("Button", "EncounterJournalCustomTab", EncounterJournal.encounter.info, "EncounterTabTemplate")
tab:SetPoint("TOP", EncounterJournal.encounter.info.modelTab, "BOTTOM", -3, -12)
tab:SetSize(50, 40)
tab.tooltip = "Taktika"
local selected = tab:CreateTexture(nil, "BACKGROUND")
selected:SetTexture("Interface\\EncounterJournal\\UI-EncounterJournalTextures")
selected:SetAllPoints(tab)
selected:SetBlendMode("ADD")
selected:SetDrawLayer("OVERLAY")
selected:SetTexCoord(0, 0.126953125, 0.90234375, 0.9599609375)
selected:Hide()
tab.selected = selected
function tab:SetActive(enable)
self:SetEnabled(enable);
self:GetDisabledTexture():SetDesaturated(not enable);
end
function tab:SetHighlight(enable)
if not enable then
self.selected:Hide();
else
self.selected:Show();
end
end
frame.tab = tab
end
function EncounterFrame:CreateHeader()
local frame = self
local id = NEXT_HEADER_ID + 1
NEXT_HEADER_ID = id
local HeaderFrame = CreateFrame("FRAME", "CzechQuestsEncounterHeader" .. id, frame, "EncounterInfoTemplate")
HeaderFrame:SetSize(self:GetParent():GetWidth() - 10, 30)
addon.API.UpdateCzechFont(
HeaderFrame.description,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_NAME,
CzechQuestsAddon_Store.config.ENCOUNTER_TEXT_FONT_SIZE
)
HeaderFrame.button.abilityIcon:Hide()
HeaderFrame.button.portrait:Hide()
HeaderFrame.button.icon2:Hide()
HeaderFrame.button.icon3:Hide()
HeaderFrame.button.icon4:Hide()
HeaderFrame.button.expandedIcon:SetText("+")
HeaderFrame.expanded = false
HeaderFrame.empty = false
HeaderFrame.button.title:SetPoint("TOPLEFT", HeaderFrame, "TOPLEFT", 30, -7);
HeaderFrame.button.title:SetWidth(self:GetParent():GetWidth() - 110)
for i = 1, #HeaderFrame.Bullets do
HeaderFrame.Bullets[i]:Hide()
end
wipe(HeaderFrame.Bullets)
for _, icon in ipairs(HeaderFrame.button.icons) do
icon:Hide()
end
HeaderFrame.description:SetWidth(HeaderFrame:GetWidth() - 20)
HeaderFrame.description:Hide()
HeaderFrame.overviewDescription:Hide()
HeaderFrame.descriptionBG:Hide()
HeaderFrame.descriptionBGBottom:Hide()
function HeaderFrame:Open()
local header = self
header.button.expandedIcon:SetText("-")
if (header.empty == false) then
header.description:Show()
header.descriptionBG:Show()
header.descriptionBGBottom:Show()
end
end
function HeaderFrame:Close()
local header = self
header.button.expandedIcon:SetText("+")
header.description:Hide()
header.descriptionBG:Hide()
header.descriptionBGBottom:Hide()
end
HeaderFrame.button:SetScript("OnClick", function(self)
local header = self:GetParent()
header.expanded = not header.expanded
EncounterJournal_UpdateButtonState(header.button)
if header.expanded then
header:Open()
else
header:Close()
end
frame:ToggleHeader(header)
end)
return HeaderFrame
end
function EncounterFrame:UpdateHeaderPositions()
local yOffset = -40
local function updatePosition(headers)
for _, header in ipairs(headers) do
header:SetPoint("BOTTOMRIGHT", self.summary, "BOTTOMRIGHT", 0, yOffset)
if header.expanded then
yOffset = yOffset - header.description:GetHeight()
if header.empty == false then
yOffset = yOffset - 50
else
yOffset = yOffset - 30
end
if header.children and #header.children > 0 then
yOffset = updatePosition(header.children)
end
else
yOffset = yOffset - 30
end
end
return yOffset
end
updatePosition(self.headers)
end
function EncounterFrame:ToggleHeader(header)
if header.expanded and header.children then
for _, child in ipairs(header.children) do
child:Show()
end
end
if not header.expanded and header.children then
local function hideChildren(children)
for _, child in ipairs(children) do
child.expanded = false
child:Close()
child:Hide()
if child.children then
hideChildren(child.children)
end
end
end
hideChildren(header.children)
end
self:UpdateHeaderPositions()
end
function EncounterFrame:ClearHeaders()
local function clear(headers)
for _, header in ipairs(headers) do
header:Hide()
header:SetParent(nil)
if header.children and #header.children > 0 then
clear(header.children)
end
header = nil
end
wipe(headers)
end
clear(self.headers)
end