From ff7190c65df10ae4ec2b9e9bbb7168f8dac1828a Mon Sep 17 00:00:00 2001 From: praxis <889+praxis@noreply.octowow.st> Date: Sun, 13 Sep 2026 09:53:43 +0000 Subject: [PATCH] Add skins/blizzard/professions.lua --- skins/blizzard/professions.lua | 280 +++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 skins/blizzard/professions.lua diff --git a/skins/blizzard/professions.lua b/skins/blizzard/professions.lua new file mode 100644 index 0000000..e647913 --- /dev/null +++ b/skins/blizzard/professions.lua @@ -0,0 +1,280 @@ +pfUI:RegisterSkin("Profession", "vanilla:tbc", function () + local rawborder, border = GetBorderSize() + local bpad = rawborder > 1 and border - GetPerfectPixel() or GetPerfectPixel() + + local frames = { + ["TradeSkill"] = { "Blizzard_TradeSkillUI", "TRADE_SKILLS_DISPLAYED", "TradeSkillSkill", "MAX_TRADE_SKILL_REAGENTS" }, + ["Craft"] = { "Blizzard_CraftUI", "CRAFTS_DISPLAYED", "Craft", "MAX_CRAFT_REAGENTS" }, + } + + for name, ext in pairs(frames) do + local name = name + local ext = ext + local addon = ext[1] + local displayed = ext[2] + local template = ext[3] + local maxreagents = ext[4] + local frame = name .. "Frame" + + HookAddonOrVariable(addon, function() + local SetSelection = frame.."_SetSelection" + -- Turtle WoW uses "SkillIcon"/"SkillName" instead of "Icon"/"Name" + local icon = _G[template.."Icon"] or _G[template.."SkillIcon"] + local seltitle = _G[template.."Name"] or _G[template.."SkillName"] + local reagentlabel = _G[name.."ReagentLabel"] + local collapseall = _G[name.."CollapseAllButton"] + local detailscroll = _G[name.."DetailScrollFrame"] + local detailscrollchild = _G[name.."DetailScrollChildFrame"] + local detailscrollbar = _G[name.."DetailScrollFrameScrollBar"] + local rankbar = _G[name.."RankFrame"] + local decrease = _G[name.."DecrementButton"] + local increase = _G[name.."IncrementButton"] + local inputbox = _G[name.."InputBox"] + local cancel = _G[name.."CancelButton"] + local create = _G[name.."CreateButton"] + local createall = _G[name.."CreateAllButton"] + local subclassdropdown = _G[name.."SubClassDropDown"] + local invslotdropdown = _G[name.."InvSlotDropDown"] + local scrollbar = _G[name.."ListScrollFrameScrollBar"] + local scrollframe = _G[name.."ListScrollFrame"] + local close = _G[frame.."CloseButton"] + local title = _G[frame.."TitleText"] + local points = _G[frame.."PointsText"] + local requiretext = _G[name .. "RequirementText"] + -- Turtle WoW: TradeSkillFrameSearchBox / CraftFrameSearchBox + local search = _G[name .. "FrameEditBox"] or _G[name .. "FrameSearchBox"] + + local frame = _G[frame] + + StripTextures(frame) + CreateBackdrop(frame, nil, nil, .75) + CreateBackdropShadow(frame) + + frame:SetWidth(676) + frame:SetHeight(440) + frame:DisableDrawLayer("BACKGROUND") + EnableMovable(frame) + + title:ClearAllPoints() + title:SetPoint("TOP", 0, -10) + title:SetTextColor(1,1,1,1) + SkinCloseButton(close, frame, -6, -6) + + do -- left pane + StripTextures(scrollframe) + SkinScrollbar(scrollbar) + + scrollframe:ClearAllPoints() + scrollframe:SetPoint("TOPLEFT", 10, -65) + scrollframe:SetWidth(300) + scrollframe:SetHeight(365) + + local backdrop = CreateFrame("Frame", scrollframe:GetName().."Backdrop", frame) + CreateBackdrop(backdrop, nil, nil, .75) + scrollframe.backdrop = backdrop.backdrop + scrollframe.backdrop:SetPoint("TOPLEFT", scrollframe, "TOPLEFT", -5, 5) + scrollframe.backdrop:SetPoint("BOTTOMRIGHT", scrollframe, "BOTTOMRIGHT", 26, -5) + + _G[template..1]:ClearAllPoints() + _G[template..1]:SetPoint("TOPLEFT", scrollframe, "TOPLEFT", 0, 0) + + StripTextures(collapseall) + SkinCollapseButton(collapseall, true) + collapseall:ClearAllPoints() + collapseall:SetPoint("BOTTOMLEFT", scrollframe, "TOPLEFT", -5, 5) + + if invslotdropdown then + SkinDropDown(invslotdropdown) + invslotdropdown:ClearAllPoints() + invslotdropdown:SetPoint("BOTTOMRIGHT", scrollframe.backdrop, "TOPRIGHT", 15, 0) + + SkinDropDown(subclassdropdown) + subclassdropdown:ClearAllPoints() + subclassdropdown:SetPoint("RIGHT", invslotdropdown, "LEFT", 27, 0) + end + end + + do -- right pane + StripTextures(detailscroll) + StripTextures(detailscrollchild) + SkinScrollbar(detailscrollbar) + + local backdrop = CreateFrame("Frame", nil, frame) + CreateBackdrop(backdrop, nil, nil, .75) + detailscroll.backdrop = backdrop.backdrop + + detailscroll.backdrop:SetPoint("TOPLEFT", detailscroll, "TOPLEFT", -5, 5) + detailscroll.backdrop:SetPoint("BOTTOMRIGHT", detailscroll, "BOTTOMRIGHT", 26, -5) + + StripTextures(_G[name.."RankFrameBorder"]) + CreateBackdrop(rankbar, nil, true) + rankbar:SetStatusBarTexture(pfUI.media["img:bar"]) + rankbar:ClearAllPoints() + rankbar:SetPoint("TOPLEFT", detailscroll.backdrop, "TOPLEFT", 0, 25) + rankbar:SetPoint("BOTTOMRIGHT", detailscroll.backdrop, "TOPRIGHT", 0, 6) + + if decrease and increase then + SkinArrowButton(decrease, "left", 18) + SkinArrowButton(increase, "right", 18) + end + + if inputbox then + inputbox:DisableDrawLayer("BACKGROUND") + CreateBackdrop(inputbox) + SetAllPointsOffset(inputbox.backdrop, inputbox, .2) + inputbox:SetJustifyH("CENTER") + inputbox:SetWidth(36) + end + + SkinButton(cancel) + cancel:ClearAllPoints() + cancel:SetPoint("TOPRIGHT", detailscroll.backdrop, "BOTTOMRIGHT", 0, -5) + + SkinButton(create) + create:ClearAllPoints() + create:SetPoint("RIGHT", cancel, "LEFT", -2*bpad, 0) + + SkinButton(createall) + StripTextures(_G[name.."ExpandButtonFrame"]) + + detailscroll:ClearAllPoints() + detailscroll:SetPoint("TOPLEFT", 346, -65) + detailscroll:SetWidth(299) + detailscroll:SetHeight(338) + + -- skin buttons + for i = 1, _G[maxreagents] do + local name = name.."Reagent" .. i + local item = _G[name] + local icon = _G[name.."IconTexture"] + local count = _G[name.."Count"] + local title = _G[name.."Name"] + local size = item:GetHeight() - 10 + + StripTextures(item) + CreateBackdrop(item, nil, nil, .75) + SetAllPointsOffset(item.backdrop, item, 4) + SetHighlight(item) + + icon:SetWidth(size) + icon:SetHeight(size) + icon:ClearAllPoints() + icon:SetPoint("LEFT", 5, 0) + icon:SetTexCoord(.08, .92, .08, .92) + icon:SetParent(item.backdrop) + icon:SetDrawLayer("OVERLAY") + + count:SetParent(item.backdrop) + count:SetDrawLayer("OVERLAY") + count:ClearAllPoints() + count:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 0, 0) + + title:SetParent(item.backdrop) + title:SetDrawLayer("OVERLAY") + end + + if points then + points:ClearAllPoints() + points:SetPoint("RIGHT", create, "LEFT", -20, 0) + end + + StripTextures(icon) + icon:ClearAllPoints() + icon:SetPoint("TOPLEFT", 5, -5) + SkinButton(icon, nil, nil, nil, nil, true) + icon:SetPushedTexture(nil) + + seltitle:SetJustifyV("TOP") + seltitle:SetTextColor(.8,.8,.8,1) + + reagentlabel:ClearAllPoints() + reagentlabel:SetPoint("TOPLEFT", seltitle, "BOTTOMLEFT", -45, -15) + reagentlabel:SetTextColor(1,1,1,1) + + local scanner = libtipscan:GetScanner(name) + hooksecurefunc(SetSelection, function(id) + if id and id ~= 0 then + detailscroll:Show() + HandleIcon(icon, icon:GetNormalTexture()) + + if name == "TradeSkill" then + local itemlink = GetTradeSkillItemLink(id) + if not itemlink then return end + local _, _, link = string.find(itemlink, "(item:%d+:%d+:%d+:%d+)") + + local off = requiretext and requiretext:GetHeight() or 1 + reagentlabel:SetPoint("TOPLEFT", seltitle, "BOTTOMLEFT", -45, -15-off) + + if link then + scanner:SetHyperlink(link) + seltitle:SetHeight(0) + seltitle:SetText(scanner:FontString()) + + if seltitle:GetHeight() < 30 then + seltitle:SetHeight(35) + end + else + detailscroll:Hide() + end + end + end + end) + end + + -- Compatibility + if search then -- tbc / turtle wow + _G[displayed] = 21 + scrollframe:SetHeight(338) + + local rank = _G[name.."RankFrameSkillRank"] + if rank then + rank:ClearAllPoints() + rank:SetPoint("CENTER", rankbar, "CENTER", 0, 0) + end + + -- Turtle WoW: MatsCheckButton + SkillCheckButton + -- standard TBC: AvailableFilterCheckButton + local available = _G[frame:GetName().."AvailableFilterCheckButton"] + or _G[name.."MatsCheckButton"] + or _G[name.."FrameMatsCheckButton"] + local available2 = _G[name.."SkillCheckButton"] + or _G[name.."FrameSkillCheckButton"] + if available then + SkinCheckbox(available) + available:ClearAllPoints() + available:SetPoint("BOTTOMLEFT", scrollframe.backdrop, "TOPLEFT", -4, 2) + end + if available2 then + SkinCheckbox(available2) + available2:ClearAllPoints() + available2:SetPoint("LEFT", available, "RIGHT", 90, 0) + end + + search:DisableDrawLayer("BACKGROUND") + CreateBackdrop(search, nil, nil, 1) + search.backdrop:SetAllPoints(search) + search:SetTextInsets(5, 5, 5, 5) + search:SetHeight(22) + search:ClearAllPoints() + search:SetPoint("TOPLEFT", scrollframe.backdrop, "BOTTOMLEFT", 0, -5) + search:SetPoint("TOPRIGHT", scrollframe.backdrop, "BOTTOMRIGHT", 0, -5) + + local craft_filter = CraftFrameFilterDropDown + if craft_filter then + SkinDropDown(craft_filter) + craft_filter:ClearAllPoints() + craft_filter:SetPoint("BOTTOMRIGHT", scrollframe.backdrop, "TOPRIGHT", 15, 0) + end + else -- vanilla (no search) + _G[displayed] = 23 + end + + -- build remaining tradeskills + for i = 9, _G[displayed] do + local button = _G[template..i] or CreateFrame("Button", template..i, frame, template.."ButtonTemplate") + button:SetPoint("TOPLEFT", _G[template..i - 1], "BOTTOMLEFT") + end + for i = 1, _G[displayed] do SkinCollapseButton(_G[template..i]) end + end) + end +end) \ No newline at end of file