Files
florian.berthold d915f6b844
release / release (push) Successful in 5s
coa.20: restore bigger window + relocate char-view professions
- Re-applied the window enlargement (832x555, more rows) - user accepts the AuctionFrame
  art seam in exchange for the bigger frame.
- Char-view professions (Prof1-8) moved out of the cramped bottom Cooking/FirstAid row
  into the open middle-left gap (2 rows of 4) so they stop overlapping/overflowing.
2026-05-29 20:30:29 +02:00

307 lines
7.9 KiB
Lua

local addonName = ...
local addon = _G[addonName]
local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
local WHITE = "|cFFFFFFFF"
local GREEN = "|cFF00FF00"
local PETS_PER_PAGE = 12
local selectedID
local currentPetType
local currentPage
local currentPetName
addon.Pets = {}
local ns = addon.Pets -- ns = namespace
function ns:OnEnter(frame)
local id = frame.spellID
if id then
AltoTooltip:SetOwner(frame, "ANCHOR_LEFT");
AltoTooltip:ClearLines();
AltoTooltip:SetHyperlink("spell:" ..id);
AltoTooltip:Show();
end
end
function ns:OnClick(frame, button)
if frame.spellID and ( button == "LeftButton" ) and ( IsShiftKeyDown() ) then
local chat = ChatEdit_GetLastActiveWindow()
if chat:IsShown() then
local link = DataStore:GetCompanionLink(frame.spellID)
if link then
chat:Insert(link)
end
end
end
frame:SetChecked(true);
local offset = (currentPage-1) * PETS_PER_PAGE
selectedID = offset + frame:GetID()
ns:UpdatePets()
end
local function OnChangePetView(self)
local value = self.value
UIDropDownMenu_SetSelectedValue(AltoholicFramePets_SelectPetView, value);
if value == 1 or value == 3 then
AltoholicFrameClasses:Hide()
AltoholicFramePetsNormal:Show()
AltoholicFramePetsAllInOne:Hide()
else
AltoholicFrameClasses:Show()
AltoholicFramePetsNormal:Hide()
AltoholicFramePetsAllInOne:Show()
end
AltoholicFramePets:Show()
if value == 1 then
ns:SetType("CRITTER")
elseif value == 2 then
table.sort(DataStore:GetCompanionList(), function(a, b)
local textA = GetSpellInfo(a) or ""
local textB = GetSpellInfo(b) or ""
return textA < textB
end)
ns:UpdatePetsAllInOne()
elseif value == 3 then
ns:SetType("MOUNT")
elseif value == 4 then
table.sort(DataStore:GetMountList(), function(a, b)
local textA = GetSpellInfo(a) or ""
local textB = GetSpellInfo(b) or ""
return textA < textB
end)
ns:UpdatePetsAllInOne()
end
end
function ns:DropDownPets_Initialize()
local info = UIDropDownMenu_CreateInfo();
info.text = COMPANIONS
info.value = 1
info.func = OnChangePetView
info.checked = nil;
info.icon = nil;
UIDropDownMenu_AddButton(info, 1);
info.text = format("%s %s(%s)", COMPANIONS, GREEN, L["All-in-one"])
info.value = 2
info.func = OnChangePetView
info.checked = nil;
info.icon = nil;
UIDropDownMenu_AddButton(info, 1);
info.text = MOUNTS
info.value = 3
info.func = OnChangePetView
info.checked = nil;
info.icon = nil;
UIDropDownMenu_AddButton(info, 1);
info.text = format("%s %s(%s)", MOUNTS, GREEN, L["All-in-one"])
info.value = 4
info.func = OnChangePetView
info.checked = nil;
info.icon = nil;
UIDropDownMenu_AddButton(info, 1);
end
local function SetPage(pageNum)
currentPage = pageNum
local character = addon.Tabs.Characters:GetCurrent()
local pets = DataStore:GetPets(character, currentPetType)
if currentPage == 1 then
AltoholicFramePetsNormalPrevPage:Disable()
else
AltoholicFramePetsNormalPrevPage:Enable()
end
local maxPages = 1
if pets then
maxPages = ceil(DataStore:GetNumPets(pets) / PETS_PER_PAGE)
if maxPages == 0 then
maxPages = 1
end
end
if currentPage == maxPages then
AltoholicFramePetsNormalNextPage:Disable()
else
AltoholicFramePetsNormalNextPage:Enable()
end
AltoholicFramePetsNormal_PageNumber:SetText(format(MERCHANT_PAGE_NUMBER, currentPage, maxPages ))
ns:UpdatePets()
end
function ns:GoToPreviousPage()
SetPage(currentPage - 1)
end
function ns:GoToNextPage()
SetPage(currentPage + 1)
end
function ns:SetType(petType)
selectedID = 1
currentPetType = petType
SetPage(1)
end
function ns:UpdatePets()
local DS = DataStore
local character = addon.Tabs.Characters:GetCurrent()
local pets = DS:GetPets(character, currentPetType)
if not pets or (DS:GetNumPets(pets) == 0) then -- added this test as simply addressing the table seems to make it grow, I'd assume this is due to AceDB magic value ['*'].
for i = 1, PETS_PER_PAGE do
local button = _G["AltoholicFramePetsNormal_Button" .. i];
if currentPetType == "MOUNT" then
button:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Mounts]])
else
button:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Companions]])
end
button:Disable();
button:SetChecked(false);
end
return
end
local offset = (currentPage-1) * PETS_PER_PAGE
for i = 1, PETS_PER_PAGE do
local index = offset + i
local button = _G["AltoholicFramePetsNormal_Button" .. i];
local modelID, name, spellID, icon = DS:GetPetInfo(pets, index)
if icon and spellID then -- if there's a pet .. texture & enable it
button:SetNormalTexture(icon);
button:Enable()
button.spellID = spellID
else
button.spellID = nil
if currentPetType == "MOUNT" then
button:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Mounts]])
else
button:SetDisabledTexture([[Interface\PetPaperDollFrame\UI-PetFrame-Slots-Companions]])
end
button:Disable();
end
modelID = tonumber(modelID)
if selectedID and (index == selectedID) and modelID then
button:SetChecked(true); -- check only if it's the selected button and it has a model id
AltoholicFramePetsNormal_PetName:SetText(name)
AltoholicFramePetsNormal_ModelFrame:SetCreature(modelID);
else
button:SetChecked(false);
end
end
end
function ns:UpdatePetsAllInOne()
local VisibleLines = 10
local frame = "AltoholicFramePetsAllInOne"
local entry = frame.."Entry"
local offset = FauxScrollFrame_GetOffset( _G[ frame.."ScrollFrame" ] );
local mode = UIDropDownMenu_GetSelectedValue(AltoholicFramePets_SelectPetView);
local petList, petType
local DS = DataStore
if mode == 2 then
petList = DS:GetCompanionList()
petType = "CRITTER"
elseif mode == 4 then
petList = DS:GetMountList()
petType = "MOUNT"
end
local realm, account = addon:GetCurrentRealm()
local character
for i=1, VisibleLines do
local line = i + offset
if line <= #petList then -- if the line is visible
local spellID
spellID = petList[line]
local petName, _, petTexture = GetSpellInfo(spellID)
if petName then
_G[entry..i.."Name"]:SetText(WHITE .. petName)
_G[entry..i.."Name"]:SetJustifyH("LEFT")
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 15, 0)
end
for j = 1, 10 do
local itemName = entry.. i .. "Item" .. j;
local itemButton = _G[itemName]
local itemTexture = _G[itemName .. "_Background"]
local classButton = _G["AltoholicFrameClassesItem" .. j]
if classButton.CharName then
character = DS:GetCharacter(classButton.CharName, realm, account)
itemButton:SetScript("OnEnter", function(self) ns:OnEnter(self) end)
itemTexture:SetTexture(petTexture)
if DS:IsPetKnown(character, petType, spellID) then
itemTexture:SetVertexColor(1.0, 1.0, 1.0);
_G[itemName .. "Name"]:SetText("\124TInterface\\RaidFrame\\ReadyCheck-Ready:14\124t")
else
itemTexture:SetVertexColor(0.4, 0.4, 0.4);
_G[itemName .. "Name"]:SetText("\124TInterface\\RaidFrame\\ReadyCheck-NotReady:14\124t")
end
itemButton.spellID = spellID
itemButton:Show()
else
itemButton.spellID = nil
itemButton:Hide()
end
end
_G[ entry..i ]:Show()
else
_G[ entry..i ]:Hide()
end
end
FauxScrollFrame_Update( _G[ frame.."ScrollFrame" ], #petList, VisibleLines, 41);
end
local function ScanHunter()
-- this is a specific function to scan hunter pet talents
-- DEFAULT_CHAT_FRAME:AddMessage("Scanning Pet " .. currentPetName)
end
function ns:OnChange()
-- this event is triggered too often for our needs, some filtering is required to avoid scanning pet data too often
if arg1 ~= "player" then return end
local name = UnitName("pet")
if not name or name == UNKNOWN then return end -- if there's a usable pet name ..
if not currentPetName then -- not set ? initial scan
currentPetName = name
ScanHunter()
elseif currentPetName ~= name then -- already set, has it changed ? re-scan
currentPetName = name
ScanHunter()
end
end