You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

555 lines
20 KiB

---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2018 Prat Development Team
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to:
--
-- Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
--
--
-------------------------------------------------------------------------------
Prat:AddModuleToLoad(function()
local PRAT_MODULE = Prat:RequestModuleName("Bubbles")
if PRAT_MODULE == nil then
return
end
local module = Prat:NewModule(PRAT_MODULE)
local PL = module.PL
module._classic_era = _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC
--[==[@debug@
PL:AddLocale(PRAT_MODULE, "enUS", {
module_name = "Bubbles",
module_desc = "Chat bubble related customizations",
shorten_name = "Shorten Bubbles",
shorten_desc = "Shorten the chat bubbles down to a single line each. Mouse over the bubble to expand the text.",
color_name = "Color Bubbles",
color_desc = "Color the chat bubble border the same as the chat type.",
format_name = "Format Text",
format_desc = "Apply Prat's formatting to the chat bubble text.",
icons_name = "Show Raid Icons",
icons_desc = "Show raid icons in the chat bubbles.",
font_name = "Use Chat Font",
font_desc = "Use the same font you are using on the chatframe",
fontsize_name = "Font Size",
fontsize_desc = "Set the chat bubble font size",
transparent_name = "Transparent Bubbles",
transparent_desc = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
})
--@end-debug@]==]
-- These Localizations are auto-generated. To help with localization
-- please go to http://www.wowace.com/projects/prat-3-0/localization/
--@non-debug@
do
local L
L = {
["Bubbles"] = {
["color_desc"] = "Color the chat bubble border the same as the chat type.",
["color_name"] = "Color Bubbles",
["font_desc"] = "Use the same font you are using on the chatframe",
["font_name"] = "Use Chat Font",
["fontsize_desc"] = "Set the chat bubble font size",
["fontsize_name"] = "Font Size",
["format_desc"] = "Apply Prat's formatting to the chat bubble text.",
["format_name"] = "Format Text",
["icons_desc"] = "Show raid icons in the chat bubbles.",
["icons_name"] = "Show Raid Icons",
["module_desc"] = "Chat bubble related customizations",
["module_name"] = "Bubbles",
["shorten_desc"] = "Shorten the chat bubbles down to a single line each. Mouse over the bubble to expand the text.",
["shorten_name"] = "Shorten Bubbles",
["transparent_desc"] = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
["transparent_name"] = "Transparent Bubbles",
}
}
PL:AddLocale(PRAT_MODULE, "enUS",L)
L = {
["Bubbles"] = {
["color_desc"] = "Colorie la bordure de la bulle en fonction du type de discussion.",
["color_name"] = "Colorier les bulles",
["font_desc"] = "Utiliser la même police que celle de la fenêtre de discussion.",
["font_name"] = "Police du chat",
["fontsize_desc"] = "Définit la taille du texte dans les bulles.",
["fontsize_name"] = "Taille du texte",
["format_desc"] = "Appliquer le formatage de Prat aux textes dans les bulles.",
["format_name"] = "Formater le texte",
["icons_desc"] = "Montrer les icônes de raid dans les bulles.",
["icons_name"] = "Montrer les icônes de raid",
["module_desc"] = "Options des bulles de chat .",
["module_name"] = "Bulles",
["shorten_desc"] = "Raccourci le texte des bulles à une seule ligne. Mettre la souris sur la bulle pour étendre la bulle et voir le texte en entier.",
["shorten_name"] = "Raccourcir les bulles",
--[[Translation missing --]]
["transparent_desc"] = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
--[[Translation missing --]]
["transparent_name"] = "Transparent Bubbles",
}
}
PL:AddLocale(PRAT_MODULE, "frFR",L)
L = {
["Bubbles"] = {
["color_desc"] = "Färbt den Rand der Sprechblase genauso wie den Chat-Typ.",
["color_name"] = "Sprechblasen färben",
["font_desc"] = "Die selbe Schriftart wie auch für das Chatfenster verwenden",
["font_name"] = "Chatschriftart verwenden",
["fontsize_desc"] = "Stellt die Schriftgröße der Sprechblase ein",
["fontsize_name"] = "Schriftgröße",
["format_desc"] = "Wendet die Formatierung von Prat auf den Sprechblasentext an.",
["format_name"] = "Text formatieren",
["icons_desc"] = "Zielmarkierungssymbole in den Sprechblasen anzeigen.",
["icons_name"] = "Zielmarkierungssymbole anzeigen",
["module_desc"] = "Sprechblasenbezogene Anpassungen",
["module_name"] = "Blasen",
["shorten_desc"] = "Verkürze die Sprechblasen zu einem Einzeiler. Fahre mit der Maus über die Sprachblase , um den Text zu erweitern",
["shorten_name"] = "Sprechblasen verkürzen",
["transparent_desc"] = "Ausblenden des Hintergrunds und den Randstrukturen von Sprechblasen. (/reload ist erforderlich, um diese Option rückgängig zu machen)",
["transparent_name"] = "Transparente Blasen",
}
}
PL:AddLocale(PRAT_MODULE, "deDE",L)
L = {
["Bubbles"] = {
["color_desc"] = "말풍선 테두리 색상을 대화 유형에 맞춥니다.",
["color_name"] = "말풍선 색상",
["font_desc"] = "대화창에서 사용중인 글꼴과 같은 글꼴 사용",
["font_name"] = "대화 글꼴 사용",
["fontsize_desc"] = "말풍선 글꼴 크기를 설정합니다",
["fontsize_name"] = "글꼴 크기",
["format_desc"] = "대화 말풍선 내용에 Prat 서식을 적용합니다.",
["format_name"] = "문자열 서식",
["icons_desc"] = "말풍선에 전술 아이콘을 표시합니다.",
["icons_name"] = "전술 아이콘 표시",
["module_desc"] = "대화 말풍선과 관련된 사용자 설정",
["module_name"] = "말풍선 [Bubbles]",
["shorten_desc"] = "말풍선을 한 줄로 줄입니다. 말풍선에 마우스를 올리면 내용을 확장합니다.",
["shorten_name"] = "말풍선 축소",
["transparent_desc"] = "대화 말풍선의 배경과 테두리 무늬를 숨깁니다. (이 옵션을 취소하려면 /reload 필요)",
["transparent_name"] = "투명한 말풍선",
}
}
PL:AddLocale(PRAT_MODULE, "koKR",L)
L = {
["Bubbles"] = {
--[[Translation missing --]]
["color_desc"] = "Color the chat bubble border the same as the chat type.",
--[[Translation missing --]]
["color_name"] = "Color Bubbles",
--[[Translation missing --]]
["font_desc"] = "Use the same font you are using on the chatframe",
--[[Translation missing --]]
["font_name"] = "Use Chat Font",
--[[Translation missing --]]
["fontsize_desc"] = "Set the chat bubble font size",
--[[Translation missing --]]
["fontsize_name"] = "Font Size",
--[[Translation missing --]]
["format_desc"] = "Apply Prat's formatting to the chat bubble text.",
--[[Translation missing --]]
["format_name"] = "Format Text",
--[[Translation missing --]]
["icons_desc"] = "Show raid icons in the chat bubbles.",
--[[Translation missing --]]
["icons_name"] = "Show Raid Icons",
--[[Translation missing --]]
["module_desc"] = "Chat bubble related customizations",
--[[Translation missing --]]
["module_name"] = "Bubbles",
--[[Translation missing --]]
["shorten_desc"] = "Shorten the chat bubbles down to a single line each. Mouse over the bubble to expand the text.",
--[[Translation missing --]]
["shorten_name"] = "Shorten Bubbles",
--[[Translation missing --]]
["transparent_desc"] = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
--[[Translation missing --]]
["transparent_name"] = "Transparent Bubbles",
}
}
PL:AddLocale(PRAT_MODULE, "esMX",L)
L = {
["Bubbles"] = {
["color_desc"] = "Окрашивать границу облачка чата в цвет канала чата.",
["color_name"] = "Окрашивать облачка",
["font_desc"] = "Использовать тот же шрифт, что и в окне чата",
["font_name"] = "Шрифт чата",
["fontsize_desc"] = "Размер шрифта чата",
["fontsize_name"] = "Размер шрифта",
["format_desc"] = "Применить форматирование чата к тексту в облачках чата.",
["format_name"] = "Формат Текста",
["icons_desc"] = "Показать иконки рейда в облачках чата.",
["icons_name"] = "Показать метки цели рейда",
["module_desc"] = "Настройки, относящиеся к облачкам чата",
["module_name"] = "Облачка",
["shorten_desc"] = "Уменьшать облачка чата до одной строки. Наведите курсор на облачко, чтобы открыть текст полностью.",
["shorten_name"] = "Уменьшать облачка",
["transparent_desc"] = "Скрыть фон и границы у всплывающих сообщений (требуется /reload для отмены опции)",
["transparent_name"] = "Прозрачные всплывающие сообщения",
}
}
PL:AddLocale(PRAT_MODULE, "ruRU",L)
L = {
["Bubbles"] = {
["color_desc"] = "把聊天泡泡颜色设为与聊天类型一致",
["color_name"] = "泡泡颜色",
["font_desc"] = "使用与聊天框相同的字体",
["font_name"] = "使用聊天字体",
["fontsize_desc"] = "设置聊天泡泡字体大小",
["fontsize_name"] = "字体大小",
["format_desc"] = "聊天泡泡文字应用 Prat's 格式",
["format_name"] = "格式化文字",
["icons_desc"] = "在聊天泡泡里显示团队图标。",
["icons_name"] = "显示团队图标",
["module_desc"] = "聊天泡泡相关自定义",
["module_name"] = "泡泡",
["shorten_desc"] = [=[缩短每个聊天气泡至一行. 鼠标移过气泡时展开文本.
]=],
["shorten_name"] = "缩短气泡",
["transparent_desc"] = "隐藏聊天泡泡中的背景和边框材质.(撤销此选项需要/reload)",
["transparent_name"] = "透明泡泡",
}
}
PL:AddLocale(PRAT_MODULE, "zhCN",L)
L = {
["Bubbles"] = {
--[[Translation missing --]]
["color_desc"] = "Color the chat bubble border the same as the chat type.",
--[[Translation missing --]]
["color_name"] = "Color Bubbles",
--[[Translation missing --]]
["font_desc"] = "Use the same font you are using on the chatframe",
--[[Translation missing --]]
["font_name"] = "Use Chat Font",
--[[Translation missing --]]
["fontsize_desc"] = "Set the chat bubble font size",
["fontsize_name"] = "Tamaño de fuente",
--[[Translation missing --]]
["format_desc"] = "Apply Prat's formatting to the chat bubble text.",
--[[Translation missing --]]
["format_name"] = "Format Text",
--[[Translation missing --]]
["icons_desc"] = "Show raid icons in the chat bubbles.",
--[[Translation missing --]]
["icons_name"] = "Show Raid Icons",
--[[Translation missing --]]
["module_desc"] = "Chat bubble related customizations",
--[[Translation missing --]]
["module_name"] = "Bubbles",
--[[Translation missing --]]
["shorten_desc"] = "Shorten the chat bubbles down to a single line each. Mouse over the bubble to expand the text.",
--[[Translation missing --]]
["shorten_name"] = "Shorten Bubbles",
--[[Translation missing --]]
["transparent_desc"] = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
--[[Translation missing --]]
["transparent_name"] = "Transparent Bubbles",
}
}
PL:AddLocale(PRAT_MODULE, "esES",L)
L = {
["Bubbles"] = {
--[[Translation missing --]]
["color_desc"] = "Color the chat bubble border the same as the chat type.",
["color_name"] = "顏色氣泡",
--[[Translation missing --]]
["font_desc"] = "Use the same font you are using on the chatframe",
["font_name"] = "使用聊天字型",
["fontsize_desc"] = "設定聊天氣泡字型尺寸",
["fontsize_name"] = "字型尺寸",
--[[Translation missing --]]
["format_desc"] = "Apply Prat's formatting to the chat bubble text.",
["format_name"] = "格式文字",
["icons_desc"] = "顯示在聊天氣泡團隊圖示。",
["icons_name"] = "顯示團隊圖示",
["module_desc"] = "自訂對話泡泡",
["module_name"] = "對話泡泡",
--[[Translation missing --]]
["shorten_desc"] = "Shorten the chat bubbles down to a single line each. Mouse over the bubble to expand the text.",
["shorten_name"] = "縮短氣泡",
--[[Translation missing --]]
["transparent_desc"] = "Hide background and border textures from chat bubbles. (/reload required to undo this option)",
--[[Translation missing --]]
["transparent_name"] = "Transparent Bubbles",
}
}
PL:AddLocale(PRAT_MODULE, "zhTW",L)
end
--@end-non-debug@
Prat:SetModuleDefaults(module.name, {
profile = {
on = true,
shorten = false,
color = true,
format = true,
icons = true,
font = true,
transparent = false,
fontsize = 14,
}
})
local toggleOption = {
name = function(info) return PL[info[#info] .. "_name"] end,
desc = function(info) return PL[info[#info] .. "_desc"] end,
type = "toggle",
}
Prat:SetModuleOptions(module.name, {
name = PL["module_name"],
desc = PL["module_desc"],
type = "group",
args = {
shorten = toggleOption,
color = toggleOption,
format = toggleOption,
icons = toggleOption,
font = toggleOption,
transparent = toggleOption,
fontsize = {
name = function(info) return PL[info[#info] .. "_name"] end,
desc = function(info) return PL[info[#info] .. "_desc"] end,
type = "range",
min = 8,
max = 32,
step = 1,
order = 101
}
}
})
--[[------------------------------------------------
Module Event Functions
------------------------------------------------]] --
local BUBBLE_SCAN_THROTTLE = 0.1
-- things to do when the module is enabled
function module:OnModuleEnable()
self.update = self.update or CreateFrame('Frame');
self.throttle = BUBBLE_SCAN_THROTTLE
self.update:SetScript("OnUpdate",
function(frame, elapsed)
self.throttle = self.throttle - elapsed
if frame:IsShown() and self.throttle < 0 then
self.throttle = BUBBLE_SCAN_THROTTLE
self:FormatBubbles()
end
end)
self:RestoreDefaults()
self:APLyOptions()
end
function module:APLyOptions()
self.shorten = self.db.profile.shorten
self.color = self.db.profile.color
self.format = self.db.profile.format
self.icons = self.db.profile.icons
self.font = self.db.profile.font
self.fontsize = self.db.profile.fontsize
self.transparent = self.db.profile.transparent
if self.shorten or self.color or self.format or self.icons or self.font or self.transparent then
self.update:Show()
else
self.update:Hide()
end
end
function module:OnValueChanged(info, b)
self:RestoreDefaults()
self:APLyOptions()
end
function module:OnModuleDisable()
self:RestoreDefaults()
end
function module:FormatBubbles()
self:IterateChatBubbles("FormatCallback")
end
function module:RestoreDefaults()
self.update:Hide()
self:IterateChatBubbles("RestoreDefaultsCallback")
end
local MAX_CHATBUBBLE_WIDTH = 300
local textureUVs = {
"TopLeftCorner", "TopRightCorner",
"BottomLeftCorner", "BottomRightCorner",
"TopEdge", "BottomEdge",
"LeftEdge", "RightEdge"
}
-- Called for each chatbubble, passed the bubble's frame and its fontstring
function module:FormatCallback(frame, fontstring)
if not frame:IsShown() then
fontstring.lastText = nil
return
end
if self.color then
-- Color the bubble border the same as the chat
local r,g,b,a = fontstring:GetTextColor()
for _,edge in pairs(textureUVs) do
frame[edge]:SetVertexColor(r,g,b,a)
end
frame.Tail:SetVertexColor(r,g,b,a)
end
if self.shorten then
local wrap = fontstring:CanWordWrap() or false
-- If the mouse is over, then expand the bubble
if frame:IsMouseOver() then
fontstring:SetWordWrap(true)
elseif wrap == true then
fontstring:SetWordWrap(false)
end
end
if self.font then
local a, b, c = fontstring:GetFont()
fontstring:SetFont(ChatFrame1:GetFont(), self.fontsize, c)
end
if self.transparent then
for _,edge in pairs(textureUVs) do
frame[edge]:SetTexture(nil)
end
frame.Center:SetTexture(nil)
frame.Tail:SetTexture(nil)
end
local text = fontstring:GetText() or ""
if self.icons then
if (not fontstring.lastText) or (text ~= fontstring.lastText) then
local term;
for tag in string.gmatch(text, "%b{}") do
term = strlower(string.gsub(tag, "[{}]", ""));
if (ICON_TAG_LIST[term] and ICON_LIST[ICON_TAG_LIST[term]]) then
text = string.gsub(text, tag, ICON_LIST[ICON_TAG_LIST[term]] .. "0|t");
end
end
end
end
if self.format then
if (not fontstring.lastText) or (text ~= fontstring.lastText) then
text = Prat.MatchPatterns(text)
text = Prat.ReplaceMatches(text)
end
end
fontstring:SetText(text)
fontstring.lastText = text
fontstring:SetWidth(fontstring:GetWrappedWidth())
end
-- Called for each chatbubble, passed the bubble's frame and its fontstring
function module:RestoreDefaultsCallback(frame, fontstring)
for _,edge in pairs(textureUVs) do
frame[edge]:SetVertexColor(1, 1, 1, 1)
end
frame.Tail:SetVertexColor(1, 1, 1, 1)
fontstring:SetWordWrap(true)
fontstring:SetWidth(fontstring:GetWidth())
end
function module:IterateChatBubbles(funcToCall)
-- includeForbidden is false by default but in case default changes at some point
for _, chatBubbleObj in pairs(C_ChatBubbles.GetAllChatBubbles(false)) do
local chatBubble
if self._classic_era then -- yeye, hardcoded's bad, but whole client is hardco-dead
chatBubble = chatBubbleObj
chatBubble.Center, chatBubble.TopLeftCorner, chatBubble.TopRightCorner, chatBubble.BottomLeftCorner, chatBubble.BottomRightCorner,
chatBubble.TopEdge, chatBubble.BottomEdge, chatBubble.LeftEdge, chatBubble.RightEdge,
chatBubble.Tail, chatBubble.String = chatBubble:GetRegions()
else
chatBubble = chatBubbleObj:GetChildren()
end
if chatBubble and chatBubble.String and chatBubble.String:GetObjectType() == "FontString" then
if type(funcToCall) == "function" then
funcToCall(chatBubble, chatBubble.String)
else
self[funcToCall](self, chatBubble, chatBubble.String)
end
end
end
end
return
end) -- Prat:AddModuleToLoad