-- Author : Christopher Tse
-- Create Date : 3/28/2020 11:43:45 AM
local ADDON_NAME, Import = ...;
local ChatBubblePool = Import.ChatBubblePool;
local settings;
local smartTargetColoringActive = false;
local savedColor;
local savedRGB;
Import.SharedFunctions = {};
function RPChatBubbles_OnLoad(self, event,...)
self:SetClampedToScreen(true);
self:RegisterEvent("ADDON_LOADED");
self:RegisterEvent("MODIFIER_STATE_CHANGED");
self:RegisterEvent("PLAYER_TARGET_CHANGED");
self:SetBackdrop(BACKDROP_DIALOG_32_32)
self:OnBackdropLoaded()
end
function RPChatBubbles_OnEvent(self, event, ...)
if event == "ADDON_LOADED" and ... == ADDON_NAME then
Import:initSettings();
settings = Import.settings;
sharedFunctions = Import.SharedFunctions;
initMainFrame(self);
for moduleName, moduleStructure in pairs(Import.modules) do
moduleStructure:OnStart();
end
initColorDropdown();
elseif event == "MODIFIER_STATE_CHANGED" then
handleKeyPress();
elseif event == "PLAYER_TARGET_CHANGED" then
checkSmartTargetColoring();
end
end
function RPChatBubbles_createChatBubble()
local bubble = ChatBubblePool.getChatBubble();
local textColor = settings.get("SELECTED_COLOR_RGB");
local selectedColor = settings.get("SELECTED_COLOR");
local GetUnitNameAndColor = Import.SharedFunctions.GetUnitNameAndColor;
local unitID = nil;
if IsShiftKeyDown() then
unitID = "player";
elseif IsControlKeyDown() then
unitID = "target";
end
bubble:SetTextColor(textColor.r,textColor.g,textColor.b);
--If we are trying to populate the name field using shift or control, then enter this block.
--The method used will depend on whether TotalRP3 is installed or not
if unitID then
name, color = GetUnitNameAndColor(unitID);
if name then
bubble:SetName(name);
-- The Color will only be populated if TotalRP3 is enabled.
-- The variable type is the Ellyb Color() class.
if color then
bubble:SetNameColor(color:GetRGB());
end
end
end
end
function RPChatBubbles_toggleVisibility()
if settings.get("IS_FRAME_VISIBLE") then
settings.set("IS_FRAME_VISIBLE", false);
else
settings.set("IS_FRAME_VISIBLE", true);
end
SetVisibility(MainFrame, settings.get("IS_FRAME_VISIBLE"));
end
function RPChatBubbles_showSettingsPanel(self, event, ...)
Import.ShowSettingsPanel();
end
function Import.SharedFunctions.GetUnitNameAndColor(unitID)
return UnitName(unitID), nil;
end
----------------------------------------------------------
function initMainFrame(self)
self:RegisterForDrag("LeftButton");
self:SetScript("OnDragStart", function(self)
self:StartMoving();
end);
self:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing();
end);
SetVisibility(self, settings.get("IS_FRAME_VISIBLE"));
end
function handleKeyPress()
if settings.get("CREATE_BUTTON_EXTRA_TEXT") then
if IsShiftKeyDown() then
CreateButton:SetText("Create (Self)");
elseif IsControlKeyDown() then
CreateButton:SetText("Create (Target)");
else
CreateButton:SetText("Create");
end
end
checkSmartTargetColoring();
end
function checkSmartTargetColoring()
if not settings.get("SMART_COLORING") then
return
end
if IsShiftKeyDown() or IsControlKeyDown() and SayColorSelected() then
if not smartTargetColoringActive then
smartTargetColoringActive = true;
savedColor = settings.get("SELECTED_COLOR");
savedRGB = settings.get("SELECTED_COLOR_RGB");
end
if IsControlKeyDown() and UnitExists("target") then
if UnitIsPlayer("target") then
selectColor(nil,"Say",ChatTypeInfo["SAY"],nil);
else
selectColor(nil,"Say (NPC)",ChatTypeInfo["MONSTER_SAY"],nil);
end
elseif IsShiftKeyDown() then
selectColor(nil,"Say",ChatTypeInfo["SAY"],nil);
else
selectColor(nil,savedColor,savedRGB,nil);
end
elseif smartTargetColoringActive and not IsControlKeyDown() then
smartTargetColoringActive = false;
selectColor(nil,savedColor,savedRGB,nil);
end
end
function SayColorSelected()
selectedColor = settings.get("SELECTED_COLOR");
return selectedColor == "Say" or selectedColor == "Say (NPC)";
end
function initColorDropdown()
local dropdown = ColorDropdownButton;
UIDropDownMenu_SetWidth(dropdown, 28);
UIDropDownMenu_Initialize(dropdown, function(self, menu, level)
addMenuItem("Say",ChatTypeInfo["SAY"]);
addMenuItem("Say (NPC)",ChatTypeInfo["MONSTER_SAY"]);
addMenuItem("Emote",ChatTypeInfo["EMOTE"]);
addMenuItem("Yell",ChatTypeInfo["YELL"]);
addMenuItem("Whisper",ChatTypeInfo["WHISPER"]);
addMenuItem("Custom",nil,true);
end)
local rgb = settings.get("SELECTED_COLOR_RGB");
if rgb then
ColorSwatchTex:SetColorTexture(rgb.r,rgb.g,rgb.b);
end
end
function addMenuItem(text, color, custom)
local info = UIDropDownMenu_CreateInfo();
info.text, info.arg1, info.arg2 = text, text, color;
if custom then
info.hasColorSwatch = true;
local rgb = settings.get("CUSTOM_COLOR");
info.r, info.g, info.b = rgb.r, rgb.g, rgb.b;
info.swatchFunc = setCustomColor;
info.cancelFunc = cancelCustomColor;
info.func = startCustomColorPicking;
else
info.colorCode = "|cFF" .. rgbToHex(color);
info.func = selectColor
end
if settings.get("SELECTED_COLOR") == text then
info.checked = true;
end
UIDropDownMenu_AddButton(info);
end
function rgbToHex(color)
return string.format("%02x%02x%02x", color.r*255, color.g*255, color.b*255)
end
function selectColor(self,channelColor,rgb,checked)
settings.set("SELECTED_COLOR", channelColor);
settings.set("SELECTED_COLOR_RGB", rgb);
ColorSwatchTex:SetColorTexture(rgb.r,rgb.g,rgb.b);
end
function startCustomColorPicking(self)
previousSelection = settings.get("SELECTED_COLOR");
previousColor = settings.get("SELECTED_COLOR_RGB");
UIDropDownMenuButton_OpenColorPicker(self);
end
function setCustomColor(previousSelection)
local rgb = {}
if previousSelection then
rgb = previousSelection
else
rgb.r, rgb.g, rgb.b = ColorPickerFrame:GetColorRGB()
end
selectColor(nil,"Custom",rgb);
settings.set("CUSTOM_COLOR", rgb);
end
function cancelCustomColor()
settings.set("SELECTED_COLOR", previousSelection);
settings.set("SELECTED_COLOR_RGB", previousColor);
end
function SetVisibility(self, visible)
if visible then
self:SetAlpha(1.0);
removeVisibilityScripts(MainFrame);
removeVisibilityScripts(CreateButton);
removeVisibilityScripts(SettingsButton);
removeVisibilityScripts(HideButton);
removeVisibilityScripts(ColorDropdownButton);
HideButtonTexture:SetTexture("Interface/Addons/RoleplayChatBubbles/button/UI-hideButton");
else
self:SetAlpha(0.5);
addVisibilityScripts(MainFrame);
addVisibilityScripts(CreateButton);
addVisibilityScripts(SettingsButton);
addVisibilityScripts(HideButton);
addVisibilityScripts(ColorDropdownButton);
HideButtonTexture:SetTexture("Interface/Addons/RoleplayChatBubbles/button/UI-showButton");
end
end
function removeVisibilityScripts(frame)
frame:SetScript("OnEnter",nil);
frame:SetScript("OnLeave",nil);
end
function addVisibilityScripts(frame)
frame:SetScript("OnEnter",ShowRPCMainFrame);
frame:SetScript("OnLeave",HideRPCMainFrame);
end
function ShowRPCMainFrame(self, event, ...)
MainFrame:SetAlpha(0.5);
end
function HideRPCMainFrame(self, event, ...)
MainFrame:SetAlpha(0);
end
Import.modules = {};