/Tukui/modules/chat/chatframes.lua

http://github.com/Asphyxia/Tukui · Lua · 222 lines · 203 code · 13 blank · 6 comment · 8 complexity · 5785f11d6c99772be622fb260832d754 MD5 · raw file

  1. local T, C, L = unpack(select(2, ...)) -- Import: T - functions, constants, variables; C - config; L - locales
  2. if C["chat"].enable ~= true then return end
  3. local TukuiChat = CreateFrame("Frame")
  4. local _G = _G
  5. local origs = {}
  6. local type = type
  7. local dummy = T.dummy
  8. -- move these to kill.lua when implemented
  9. FriendsMicroButton:Kill()
  10. ChatFrameMenuButton:Kill()
  11. -- function to rename channel and other stuff
  12. local AddMessage = function(self, text, ...)
  13. if(type(text) == "string") then
  14. text = text:gsub('|h%[(%d+)%. .-%]|h', '|h[%1]|h')
  15. end
  16. return origs[self](self, text, ...)
  17. end
  18. -- Shortcut channel name
  19. _G.CHAT_BATTLEGROUND_GET = "|Hchannel:Battleground|h"..L.chat_BATTLEGROUND_GET.."|h %s:\32"
  20. _G.CHAT_BATTLEGROUND_LEADER_GET = "|Hchannel:Battleground|h"..L.chat_BATTLEGROUND_LEADER_GET.."|h %s:\32"
  21. _G.CHAT_BN_WHISPER_GET = L.chat_BN_WHISPER_GET.." %s:\32"
  22. _G.CHAT_GUILD_GET = "|Hchannel:Guild|h"..L.chat_GUILD_GET.."|h %s:\32"
  23. _G.CHAT_OFFICER_GET = "|Hchannel:o|h"..L.chat_OFFICER_GET.."|h %s:\32"
  24. _G.CHAT_PARTY_GET = "|Hchannel:Party|h"..L.chat_PARTY_GET.."|h %s:\32"
  25. _G.CHAT_PARTY_GUIDE_GET = "|Hchannel:party|h"..L.chat_PARTY_GUIDE_GET.."|h %s:\32"
  26. _G.CHAT_PARTY_LEADER_GET = "|Hchannel:party|h"..L.chat_PARTY_LEADER_GET.."|h %s:\32"
  27. _G.CHAT_RAID_GET = "|Hchannel:raid|h"..L.chat_RAID_GET.."|h %s:\32"
  28. _G.CHAT_RAID_LEADER_GET = "|Hchannel:raid|h"..L.chat_RAID_LEADER_GET.."|h %s:\32"
  29. _G.CHAT_RAID_WARNING_GET = L.chat_RAID_WARNING_GET.." %s:\32"
  30. _G.CHAT_SAY_GET = "%s:\32"
  31. _G.CHAT_WHISPER_GET = L.chat_WHISPER_GET.." %s:\32"
  32. _G.CHAT_YELL_GET = "%s:\32"
  33. -- color afk, dnd, gm
  34. _G.CHAT_FLAG_AFK = "|cffFF0000"..L.chat_FLAG_AFK.."|r "
  35. _G.CHAT_FLAG_DND = "|cffE7E716"..L.chat_FLAG_DND.."|r "
  36. _G.CHAT_FLAG_GM = "|cff4154F5"..L.chat_FLAG_GM.."|r "
  37. -- customize online/offline msg
  38. _G.ERR_FRIEND_ONLINE_SS = "|Hplayer:%s|h[%s]|h "..L.chat_ERR_FRIEND_ONLINE_SS.."!"
  39. _G.ERR_FRIEND_OFFLINE_S = "%s "..L.chat_ERR_FRIEND_OFFLINE_S.."!"
  40. -- set the chat style
  41. local function StyleChat(frame)
  42. local id = frame:GetID()
  43. local chat = frame:GetName()
  44. local tab = _G[chat.."Tab"]
  45. local tabtext = _G[chat.."TabText"]
  46. local editbox = _G[chat.."EditBox"]
  47. tab:SetAlpha(1)
  48. tab.SetAlpha = T.dummy
  49. tab:HookScript("OnClick", function() editbox:Hide() end)
  50. if C["chat"].background ~= true then
  51. tabtext:Hide()
  52. tab:HookScript("OnEnter", function() tabtext:Show() end)
  53. tab:HookScript("OnLeave", function() tabtext:Hide() end)
  54. end
  55. tabtext:SetFont(C.media.pixelfont, C["datatext"].fontsize, "MONOCHROMEOUTLINE")
  56. if id < 11 then
  57. tabtext:SetTextColor(unpack(C["datatext"].color))
  58. tabtext.SetTextColor = T.dummy
  59. end
  60. tabtext:SetShadowOffset(0, 0)
  61. tabtext:ClearAllPoints()
  62. tabtext:Point("CENTER", tab, "CENTER", 0, -2)
  63. _G[chat]:SetFont(C.media.font, 12)
  64. _G[chat]:SetClampRectInsets(0,0,0,0)
  65. _G[chat]:SetClampedToScreen(false)
  66. _G[chat]:SetFading(false)
  67. for j = 1, #CHAT_FRAME_TEXTURES do
  68. _G[chat..CHAT_FRAME_TEXTURES[j]]:SetTexture(nil)
  69. end
  70. local textures = {
  71. "TabLeft", "TabMiddle", "TabRight", "TabSelectedLeft", "TabSelectedMiddle", "TabSelectedRight", "TabHighlightLeft",
  72. "TabHighlightMiddle", "TabHighlightRight", "TabSelectedLeft", "TabSelectedMiddle", "TabSelectedRight", "ButtonFrameUpButton",
  73. "ButtonFrameDownButton", "ButtonFrameBottomButton", "ButtonFrameMinimizeButton", "ButtonFrame",
  74. "EditBoxFocusLeft", "EditBoxFocusMid", "EditBoxFocusRight",
  75. }
  76. for i = 1, getn(textures) do
  77. _G[chat..textures[i]]:Kill()
  78. end
  79. local a, b, c = select(6, editbox:GetRegions()) a:Kill() b:Kill() c:Kill()
  80. editbox:SetAltArrowKeyMode(false)
  81. editbox:Hide()
  82. editbox:HookScript("OnEditFocusLost", function(self) self:Hide() end)
  83. editbox:ClearAllPoints()
  84. editbox:Point("TOPLEFT", TukuiInfoLeft, 2, -2)
  85. editbox:Point("BOTTOMRIGHT", TukuiInfoLeft, -2, 2)
  86. local EditBoxBackground = CreateFrame("frame", "TukuiChatEditBoxBackground", editbox)
  87. EditBoxBackground:CreatePanel("Default", 1, 1, "LEFT", editbox, "LEFT", 0, 0)
  88. EditBoxBackground:ClearAllPoints()
  89. EditBoxBackground:SetAllPoints(TukuiInfoLeft)
  90. EditBoxBackground:SetFrameStrata("LOW")
  91. EditBoxBackground:SetFrameLevel(1)
  92. local function colorize(r,g,b)
  93. EditBoxBackground:SetBackdropBorderColor(r, g, b)
  94. end
  95. -- update border color according where we talk
  96. hooksecurefunc("ChatEdit_UpdateHeader", function()
  97. local type = editbox:GetAttribute("chatType")
  98. if ( type == "CHANNEL" ) then
  99. local id = GetChannelName(editbox:GetAttribute("channelTarget"))
  100. if id == 0 then
  101. colorize(unpack(C["media"].bordercolor))
  102. else
  103. colorize(ChatTypeInfo[type..id].r,ChatTypeInfo[type..id].g,ChatTypeInfo[type..id].b)
  104. end
  105. else
  106. colorize(ChatTypeInfo[type].r,ChatTypeInfo[type].g,ChatTypeInfo[type].b)
  107. end
  108. end)
  109. if _G[chat] ~= _G["ChatFrame2"] then
  110. origs[_G[chat]] = _G[chat].AddMessage
  111. _G[chat].AddMessage = AddMessage
  112. end
  113. frame.skinned = true
  114. end
  115. -- Setup chatframes 1 to 10 on login.
  116. local function SetupChat(self)
  117. for i = 1, NUM_CHAT_WINDOWS do
  118. local chat = _G[format("ChatFrame%s", i)]
  119. local id = chat:GetID()
  120. local _, fontsize = FCF_GetChatWindowInfo(id)
  121. FCF_SetChatWindowFontSize(nil, chat, fontsize)
  122. StyleChat(chat)
  123. end
  124. -- Remember last channel
  125. ChatTypeInfo.WHISPER.sticky = 1
  126. ChatTypeInfo.BN_WHISPER.sticky = 1
  127. ChatTypeInfo.OFFICER.sticky = 1
  128. ChatTypeInfo.RAID_WARNING.sticky = 1
  129. ChatTypeInfo.CHANNEL.sticky = 1
  130. end
  131. local function ChatPosition(self)
  132. for i = 1, NUM_CHAT_WINDOWS do
  133. local chat = _G[format("ChatFrame%s", i)]
  134. if i == 1 then
  135. chat:ClearAllPoints()
  136. chat:Point("TOPLEFT", TukuiTabsLeftBackground, "BOTTOMLEFT", 0, -4)
  137. chat:Point("BOTTOMRIGHT", TukuiInfoLeft, "TOPRIGHT", 0, 4)
  138. elseif i == 4 then
  139. if C["chat"].rightchat == true then
  140. if not chat.isDocked then
  141. chat:ClearAllPoints()
  142. chat:Point("TOPLEFT", TukuiTabsRightBackground, "BOTTOMLEFT", 0, -4)
  143. chat:Point("BOTTOMRIGHT", TukuiInfoRight, "TOPRIGHT", 0, 4)
  144. else
  145. FCF_UnDockFrame(chat)
  146. FCF_SetTabPosition(chat, 0)
  147. chat:ClearAllPoints()
  148. chat:Point("TOPLEFT", TukuiTabsRightBackground, "BOTTOMLEFT", 0, -4)
  149. chat:Point("BOTTOMRIGHT", TukuiInfoRight, "TOPRIGHT", 0, 4)
  150. end
  151. else
  152. FCF_DockFrame(chat)
  153. end
  154. end
  155. FCF_SavePositionAndDimensions(chat)
  156. end
  157. end
  158. hooksecurefunc("FCF_DockFrame", ChatPosition)
  159. hooksecurefunc("FCF_UnDockFrame", ChatPosition)
  160. local function ToastFramePosition(self)
  161. BNToastFrame:HookScript("OnShow", function(self)
  162. self:ClearAllPoints()
  163. self:Point("BOTTOMLEFT", TukuiChatBackgroundLeft, "TOPLEFT", 0, 3)
  164. end)
  165. end
  166. TukuiChat:RegisterEvent("ADDON_LOADED")
  167. TukuiChat:RegisterEvent("UPDATE_CHAT_WINDOWS")
  168. TukuiChat:RegisterEvent("PLAYER_ENTERING_WORLD")
  169. TukuiChat:SetScript("OnEvent", function(self, event, addon)
  170. if event == "ADDON_LOADED" then
  171. if addon == "Blizzard_CombatLog" then
  172. self:UnregisterEvent("ADDON_LOADED")
  173. SetupChat(self)
  174. end
  175. elseif event == "PLAYER_ENTERING_WORLD" then
  176. ChatPosition(self)
  177. ToastFramePosition(self)
  178. elseif event == "UPDATE_CHAT_WINDOWS" then
  179. ChatPosition(self)
  180. end
  181. end)
  182. -- Setup temp chat (BN, WHISPER) when needed.
  183. local function SetupTempChat(id)
  184. local frame = FCF_GetCurrentChatFrame()
  185. if frame.skinned == true then return end
  186. StyleChat(frame)
  187. end
  188. hooksecurefunc("FCF_OpenTemporaryWindow", SetupTempChat)