From 116919b3ac9f578db33ace262b18cc2512a02337 Mon Sep 17 00:00:00 2001 From: praxis <889+praxis@noreply.octowow.st> Date: Sun, 13 Sep 2026 09:51:21 +0000 Subject: [PATCH] Add modules/chatcopy.lua --- modules/chatcopy.lua | 156 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 modules/chatcopy.lua diff --git a/modules/chatcopy.lua b/modules/chatcopy.lua new file mode 100644 index 0000000..11da75e --- /dev/null +++ b/modules/chatcopy.lua @@ -0,0 +1,156 @@ +pfUI:RegisterModule("chatcopy", "vanilla:tbc", function () + local limit = 100 + local f = CreateFrame("Frame") + f:RegisterEvent("PLAYER_ENTERING_WORLD") + f:SetScript("OnEvent", function() + if not pfUI.chat then return end + + local button = CreateFrame("Button", "pfChatCopyButton", pfUI.chat.left.panelTop) + button:SetPoint("TOPRIGHT", 0, 0) + button:RegisterForClicks("LeftButtonUp", "RightButtonUp") + button:SetWidth(16) + button:SetHeight(16) + button:SetAlpha(.25) + button.icon = button:CreateTexture(nil,"BACKGROUND") + button.icon:SetTexture("Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") + button.icon:SetAllPoints() + + button:SetScript("OnClick", function() + if arg1 == "LeftButton" then + this.state = not this.state + + for i=1, _G.NUM_CHAT_WINDOWS do + local frame = _G["ChatFrame"..i] + local scroll = frame.scroll + + if scroll and this.state then + scroll:Show() + elseif scroll then + scroll:Hide() + end + end + + if this.state then + button.icon:SetTexture("Interface\\Buttons\\UI-GuildButton-PublicNote-Up") + else + button.icon:SetTexture("Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") + end + elseif arg1 == "RightButton" then + if ChatMenu:IsShown() then + ChatMenu:Hide() + else + ChatMenu:Show() + ChatMenu:ClearAllPoints() + ChatMenu:SetPoint("BOTTOMLEFT", this, "TOPRIGHT", 0, 0) + end + end + end) + + button:SetScript("OnEnter", function() + this:SetAlpha(1) + end) + + button:SetScript("OnLeave", function() + this:SetAlpha(.4) + end) + + for i=1, _G.NUM_CHAT_WINDOWS do + local frame = _G["ChatFrame"..i] + local name = frame:GetName() + + local combat = 0 + for i, msg in pairs(frame.messageTypeList) do + if strfind(msg, "SPELL", 1) or strfind(msg, "COMBAT", 1) then + combat = combat + 1 + end + end + + if combat < 5 then + -- initialize message cache + local history = {} + local AddMessage = frame.AddMessage + frame.AddMessage = function(self,msg,r,g,b) + if msg and r and g and b then + local col = rgbhex(r,g,b) + table.insert(history, 1, col..string.gsub(msg, "|r", col)) + elseif msg then + table.insert(history, 1, "|cffffffff"..msg) + end + + if history[limit] then + table.remove(history, limit) + end + AddMessage(self,msg,r,g,b) + end + + -- read chat defaults + local font, size, flags = frame:GetFont() + + -- build the frames + local scroll = CreateScrollFrame("ChatFrameScroll"..i, frame) + scroll:SetAllPoints(frame) + scroll.tex = scroll:CreateTexture(nil, "BACKGROUND") + scroll.tex:SetTexture(0,0,0,.95) + scroll.tex:SetPoint("TOPLEFT", -3, 3) + scroll.tex:SetPoint("BOTTOMRIGHT", 3, -3) + scroll:Hide() + + local editbox = CreateFrame("EditBox", "pfChatCopyBox" .. i, scroll) + editbox:SetHeight(frame:GetHeight()) + editbox:SetWidth(frame:GetWidth()) + editbox:SetAllPoints(scroll) + editbox:SetTextColor(1,1,1,1) + editbox:SetFontObject(ChatFontNormal) + editbox:SetFont(font, size, flags) + editbox:SetAutoFocus(true) + editbox:SetMultiLine(true) + editbox:SetMaxLetters(0) + + editbox:SetScript("OnMouseDown", function() + editbox.hasFocus = true + end) + + editbox:SetScript("OnEscapePressed", function() + if editbox.hasFocus then + editbox:HighlightText(0, 0) + editbox:ClearFocus() + editbox.hasFocus = false + else + editbox:GetParent():Hide() + pfChatCopyButton.icon:SetTexture("Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") + pfChatCopyButton.state = false + end + end) + + scroll:SetScrollChild(editbox) + scroll:SetScript("OnShow", function() + editbox:SetText("") + for i=limit,0,-1 do + if history[i] then + editbox:Insert("\n" .. history[i]) + end + end + + editbox:SetScript("OnUpdate", function() + if not this.count then this.count = 0 end + + scroll:UpdateScrollChildRect() + scroll:SetVerticalScroll(scroll:GetVerticalScrollRange()) + scroll:Scroll() + this.count = this.count + 1 + + -- the scroll frame takes a while to update + if this.count >= 3 then + this:SetScript("OnUpdate", nil) + this.count = 0 + end + end) + end) + + frame.scroll = scroll + end + end + + this:UnregisterAllEvents() + end) +end)